注意:這個問題是建立在我的另一個問題: 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