【发布时间】:2018-01-11 19:00:41
【问题描述】:
注意:这个问题是基于我的另一个问题: Two dimensional FFT using python results in slightly shifted frequency
我有一些数据,基本上是一个函数 E(x,y),其中 (x,y) 是 R^2 的(离散)子集,映射到实数。对于 (x,y) 平面,我在 x- 和 y 方向 (0,2) 上的数据点之间具有固定距离。我想使用 python 使用二维快速傅立叶变换 (FFT) 分析我的 E(x,y) 信号的频谱。
据我所知,无论我的信号中实际包含哪些频率,使用 FFT,我只能看到低于 Nyquisit 限制 Ny 的信号,即 Ny = 采样频率 / 2。就我而言,我实际间距为 0,2,导致采样频率为 1 / 0,2 = 5,因此我的 Nyquisit 限制为 Ny = 5 / 2 = 2,5。
如果我的信号的频率确实高于 Nyquisit 限制,它们将被“折叠”回 Nyquisit 域,从而导致错误结果(混叠)。但即使我可能会以太低的频率进行采样,但理论上应该不可能看到任何高于 Niquisit 限制的频率,对吗?
所以这是我的问题:分析我的信号只能导致最大 2.5 的频率,但我显然会得到更高的频率。鉴于我对这里的理论非常确定,我的代码中肯定有一些错误。我将提供一个缩短的代码版本,仅提供此问题的必要信息:
simulationArea =... # length of simulation area in x and y direction
x = np.linspace(0, simulationArea, numberOfGridPointsInX, endpoint=False)
y = x
xx, yy = np.meshgrid(x, y)
Ex = np.genfromtxt('E_field_x100.txt') # this is the actual signal to be analyzed, which may have arbitrary frequencies
FTEx = np.fft.fft2(Ex) # calculating fft coefficients of signal
dx = x[1] - x[0] # calculating spacing of signals in real space. 'print(dx)' results in '0.2'
sampleFrequency = 1.0 / dx
nyquisitFrequency = sampleFrequency / 2.0
half = len(FTEx) / 2
fig, axarr = plt.subplots(2, 1)
im1 = axarr[0, 0].imshow(Ex,
origin='lower',
cmap='jet',
extent=(0, simulationArea, 0, simulationArea))
axarr[0, 0].set_xlabel('X', fontsize=14)
axarr[0, 0].set_ylabel('Y', fontsize=14)
axarr[0, 0].set_title('$E_x$', fontsize=14)
fig.colorbar(im1, ax=axarr[0, 0])
im2 = axarr[1, 0].matshow(2 * abs(FTEx[:half, :half]) / half,
aspect='equal',
origin='lower',
interpolation='nearest')
axarr[1, 0].set_xlabel('Frequency wx')
axarr[1, 0].set_ylabel('Frequency wy')
axarr[1, 0].xaxis.set_ticks_position('bottom')
axarr[1, 0].set_title('$FFT(E_x)$', fontsize=14)
fig.colorbar(im2, ax=axarr[1, 0])
这样的结果是:
这怎么可能?当我对非常简单的信号使用相同的代码时,它工作得很好(例如,具有特定频率的 x 或 y 方向的正弦波)。
【问题讨论】:
-
底部图的轴只是像素,而不是频率!!!关于使用 2D FFT,您还需要了解一些约定,例如如何构建 X 和 Y 频率的向量等,但是在这个答案中,我给出了一个使用复指数和 2D FFT 的非常简单的示例,但是在Matlab:stackoverflow.com/a/39774496/500207 看看你能不能把它改成 Python,如果不能,请告诉我,我会移植它。
-
在 Python 中它更容易一些,因为 Numpy 提供了
fftfreq函数。如果您可以上传Ex的一些(真实或虚假)数据和simulationArea等的完整值集,那么向您展示这应该是什么样子会很容易且令人信服。 -
感谢您的回答!参考您在stackoverflow.com/a/39774496/500207 中的答案,我将如何在python 中正确使用'fftreq',以获得x 和y 的适当频率空间?我想它可以用来转换 'Nfft = 4 * 2 .^ nextpow2(size(im)); imF = fftshift(fft2(im, Nfft(1), Nfft(2))) / numel(im);'进入python代码。