[英]Python: How to interpolate 'unstructured' 2D Fourier transform data
我的目标是对函数的离散连续2D傅里叶变换进行插值。 问题似乎在于,每个维度中的频率都没有严格按升序输出(请参阅此处 )。
fft.fft2
函数接受一个2D数组,在本例中,该数组(我们将其称为A
)的结构使得A[i][j] = fun(x[i], y[j])
, fun
为要转换的功能。 将fft.fft2
应用于A
,输出的数组F
的尺寸与原始数组的尺寸相同,因此对应于F[i][j]
的频率坐标为(w_x[i], w_y[j])
,其中w_x = fft.fftfreq(F.shape[0])
和w_y = fft.fftfreq(F.shape[1])
,这两个都是一维数组,并且不按升序排列。
在wx
和wy
我想对F
(例如对函数finterp
)进行插值finterp(w_x, w_y)
在调用finterp(w_x, w_y)
, w_x
和w_y
在wx
和wy
范围内时返回插值。 。 我研究了scipy.interpolate提供的各种插值方法 ,但是在我看来,它们中的任何一个都不能处理这种类型的数据结构(坐标轴被定义为无序的一维数组和函数值在2D数组中)。
这有点抽象,因此在这里我组成了一个简单的示例,其结构与上述类似。 假设我们希望在给定以下数据的情况下y = [-1, 1]
在x = [-1, 1]
和y = [-1, 1]
x = [-1, 1]
的区域上构造一个连续函数f(x, y) = x + y
:
import numpy as np
# note that below z[i][j] corresponds to what we want f(x[i], y[j]) to be
x = np.array([0, 1, -1])
y = np.array([0, 1, -1])
z = np.array([0, 1, -1],[1, 2, 0],[-1, 0, -2])
我们知道z[i][j]
对应于在x[i], y[j]
处求值的函数。 (a)在给定其原始结构的情况下如何直接对该数据进行插值,或者(b)重新排列数据以使x
和y
升序,而排列的z
使得z[i][j]
等于到在重新排列的x[i], y[j]
处求值的函数?
以下代码显示如何使用fftshift
更改fft2
和fftfreq
的输出,从而使频率轴单调递增。 应用fftshift
,可以使用数组进行插值。 我添加了数组的显示,以便您可以验证数据本身是否不变。 原点从数组的左上角移到数组的中间,将负频率从右侧移到左侧。
import numpy as np
import matplotlib.pyplot as pp
x = np.array([0, 1, -1])
y = np.array([0, 1, -1])
z = np.array([[0, 1, -1],[1, 2, 0],[-1, 0, -2]])
f = np.fft.fft2(z)
w_x = np.fft.fftfreq(f.shape[0])
w_y = np.fft.fftfreq(f.shape[1])
pp.figure()
pp.imshow(np.abs(f))
pp.xticks(np.arange(0,len(w_x)), np.round(w_x,2))
pp.yticks(np.arange(0,len(w_y)), np.round(w_y,2))
f = np.fft.fftshift(f)
w_x = np.fft.fftshift(w_x)
w_y = np.fft.fftshift(w_y)
pp.figure()
pp.imshow(np.abs(f))
pp.xticks(np.arange(0,len(w_x)), np.round(w_x,2))
pp.yticks(np.arange(0,len(w_y)), np.round(w_y,2))
pp.show()
一种替代方法是不使用fftfreq
来确定您的频率,而是手动计算它们。 默认情况下,FFT计算k=[0..N-1]
的DFT。 由于周期性, k
处的DFT等于k+N
和kN
处的DFT时,其输出通常被解释为具有k=[N//2...(N-1)//2]
(但排列不同以匹配k=[0..N-1]
); 这是fftfreq
返回的k
(返回k/N
)。
因此,您可以说
N = f.shape[0]
w_x = np.linspace(0, N, N, endpoint=False) / N
现在,您没有任何负频率,而是具有[0,N-1]/N
范围内的频率。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.