MATLAB中fft函數的正確使用方法


  問題來源:在閱讀萊昂斯的《數字信號處理》第三章離散傅里葉變換時,試圖驗證實數偶對稱信號的傅里葉變換實部為偶對稱的且虛部為零。驗證失敗。驗證信號為矩形信號,結果顯示虛部是不為零且最大幅值等於信號幅值。

  錯誤原因:MATLAB中的fft函數默認其 N 點輸入信號的時間序號為從 0 到 N-1 ,默認其輸出信號的頻率序號為從 0 到 N-1 。而當試圖輸入一個時間序號為從 -N/2 到 N/2-1 ( N 為偶數時)或從 -(N-1)/2 到 (N-1)/2 ( N 為奇數)的信號時,輸出將會產生相移,看到的頻譜的實部、虛部和相位都不是原始信號的 fft 的結果。只有頻譜的幅值等於原始信號的 fft 的結果。

  解決方法:在進行 fft 之前須使用 ifftshift 函數對原始信號進行移位,整個正確的 fft 過程為 fft(ifftshift(signal)) 。然而這樣計算得到的 fft 也需要在頻域使用 fftshift 進行移位才能顯示頻率序號為從 -N/2 到 N/2-1 ( N 為偶數時)或從 -(N-1)/2 到 (N-1)/2 ( N 為奇數)的頻譜,即 fftshift(fft(ifftshift(signal))) 。在對頻率序號為從 -(N+1)/2 到 (N+1)/2 的信號進行 ifft 的時候也會有類似的問題,解決方式為 fftshift(ifft(ifftshift(spectrum))) 。

  注意:當 N 為奇數,若要使用 ifftshift 構造偶對稱信號,須按照時間序號為從 -N/2 到 N/2-1 構造。即構造 [ 1 2 3 4 5 4 3 2 ] 經過ifftshift之后變為 [ 5 4 3 2 1 2 3 4 ] ,原信號中位於 0 時間序號的“5”依然在 0 時間序號的位置。

 

參考資料

1. FFT of a real symmtric vector is not real and symmetric

  http://stackoverflow.com/questions/25042379/fft-of-a-real-symmetric-vector-is-not-real-and-symmetric#

2. Correct use of fftshift and ifftshift at input to fft and ifft 

  http://www.mathworks.com/matlabcentral/newsreader/view_thread/285244


免責聲明!

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



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