關於MATLAB中fft,fftshift,fftshift(fft(fftshift(x))),FFT要乘以dx 等問題理解


問題一:為什么要在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

[2]:https://www.gaussianwaves.com/2015/11/interpreting-fft-results-complex-dft-frequency-bins-and-fftshift/

[3]:https://www.mathworks.com/matlabcentral/answers/288818-what-s-the-purpose-of-doing-fftshift-twice

[4]:https://www.cnblogs.com/limanjihe/p/10014142.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM