問題一:為什么要在matlab中進行FFT時要用fftshift(fft(fftshift(x)))?
考慮一個長度為L的矩形信號(見下圖1),我們以Δx為采樣間隔進行采樣,因此采樣點數M=L/Δx.或者Δx=L/M。我們假設矩形信號是關於x=0軸對稱的,那么采樣的坐標區間就是[-L/2,...,L/2-Δx],在Matlab中下標索引就是[1,2,...M]。此時我們發現信號的坐標為0的位置(零頻/直流分量)正好在中間,對應Matlab中下標索引為M/2+1;然而Matlab中FFT算法中對應的坐標為0的位置(零頻分量)在下標索引為1的位置,也就是數組的第一個位置[1-2];且FFT后數組中第一個為直流分量,后面前半部分是正頻,后半部分是負頻[2,4]。
那么,這樣就顯然需要一個操作把原本在Matlab下標索引中為M/2+1的位置(代表此處坐標為0)挪到FFT算法所要求的坐標為0的位置,即下標索引為1。而這個操作就是fftshift所干的。而后為了便於顯示要把零頻分量再移回坐標中心,自然就需要再一次使用fftshift/ifftshift(跟采樣點數M為奇偶有關)。如果信號開始就時0位置/時刻,那么也自然就不需要fftshift來在fftshift去了,此時只需要fftshift挪一下零頻分量使他居中便於觀察就行了[2]。同理,逆離散傅里葉變換為ifftshift(ifft(ifftshift(F0)))/dx。
圖一
圖二
圖三
問題二:為什么FFT以后的值乘以采樣間隔Δx/dx才會和解析結果一致?
這是因為在傅里葉變換推導到離散傅里葉變換時沒有加上Δx,因此自然要補上這個結果[1]。
*個人理解,以作記錄。
參考資料:
[1]:Computational fourier optics : a MATLAB tutorial / David G. Voelz. P18-21
[3]:https://www.mathworks.com/matlabcentral/answers/288818-what-s-the-purpose-of-doing-fftshift-twice