注意:这个问题是建立在我的另一个问题: Two dimensional FFT using python results in slightly shifted frequency二维FFT限制
我有一些数据,基本上是一个函数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,但我cleary得到更高的频率。鉴于我对这里的理论非常肯定,我的代码中必然存在一些错误。我公司将提供缩短代码版本,只为这个问题提供必要的信息:
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频率向量等,但在这个答案中,我给出了一个非常简单的例子,它使用了复指数和二维FFT,但是在Matlab:https://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代码。 – Alienbash