HOWTO · MATLAB

MATLAB 快速傅立葉逆變換

使用 MATLAB 的 ifft(),可將傅立葉域資料重建為訊號。

本頁內容

使用 MATLAB 的 ifft() 函式,可將傅立葉域資料轉換回時域或空間域訊號。結果取決於頻譜值、轉換維度,以及指定的轉換長度。若要重建產生該頻譜的訊號,請保留振幅與相位,並在呼叫 ifft() 前還原任何頻譜位移。

MATLAB 快速傅立葉逆變換

ifft() 使用快速演算法計算離散傅立葉逆變換。它接受向量、矩陣和多維陣列。根據預設,向量會產生長度相同的向量。對於陣列,函式會轉換選定的維度,並保留其他維度。

了解 ifft 語法與預設值

常見形式包括 ifft(X)、ifft(X,n)、ifft(X,n,dim) 和 ifft(X,n,dim,'symmetric')。第一種形式使用預設的轉換長度和維度。對矩陣而言,由於預設維度是第一個非單一維度,MATLAB 會轉換每一欄;對列向量則沿著該列轉換。對 N 維陣列,函式會使用大小不是 1 的第一個維度。

選用的對稱旗標會告知 MATLAB 將輸入視為共軛對稱;在此假設適用時,結果可以是實數。這個旗標不會讓任意頻譜資料自動變成對稱。若頻譜可能不對稱,或需要保留複數輸出,請使用預設行為。

選擇轉換維度與長度

dim 引數用來選擇要轉換的維度。對矩陣而言,dim 為 1 時會轉換各欄,為 2 時則會轉換各列。當每一列或每一欄存放一個獨立訊號時,這項設定很有用。選擇維度前,請先確認陣列形狀,尤其要留意大小為 1 的維度。

n 引數設定所選維度上的轉換長度。長度較小時,該維度上的輸入會被截短;長度較大時,轉換前會在輸入頻譜末端補零。回傳陣列在轉換維度上的長度會是 n;由於頻譜的頻率 bin 排列方式與逆變換正規化都取決於指定長度,輸出值也可能改變。因此,單獨使用 ifft(X,n) 並不能保證取得同一週期訊號更密集的取樣點。若要透過對頻譜補零來插值週期訊號,必須依正確順序將新增的零 bin 放在正頻率與負頻率分量之間,並考量維持原始振幅所需的正規化。補零不會在輸入值之間插入零,也不保證運算更快。

使用 ifft 重建訊號

往返轉換能說明 fft() 和 ifft() 之間的關係。這個與 Octave 相容的範例使用和 MATLAB 相同的基本語法。請執行此範例:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

x = [1 6 2];
X = fft(x);
xRecovered = ifft(X);
disp(xRecovered)
withinTolerance = all(abs(xRecovered - x) < 1e-12);
   1   6   2

範例會顯示重建值 1 6 2,並以容許誤差為基準,將結果與原始訊號進行比較。逆變換結果應與輸入相符,但會有浮點捨入誤差,因此請使用容許誤差比較,而不要要求完全相等。使用實數資料計算時,也可能出現極小的殘餘虛部。

使用 ifftshift 處理位移後的頻譜

fftshift() 會重新排列頻譜值,讓零頻率分量位於中央。若直接對重新排列後的陣列使用 ifft(),重建訊號的順序通常會不正確。請先用 ifftshift() 還原排列,再使用 ifft()。fftshift() 和 ifftshift() 是一對反向操作;對奇數長度的維度而言,兩者的位移方式不能互換。

例如,使用 X = fft(x),再用 centeredX = fftshift(X) 將頻譜置中顯示。若要從 centeredX 重建訊號,請計算 xRecovered = ifft(ifftshift(centeredX))。若重建時需要保留原始訊號,請保留完整的複數頻譜。捨棄相位或變更頻譜值都會改變結果。

驗證輸出並避免常見錯誤

不同的轉換長度會改變輸出大小,通常也會改變輸出值。例如,ifft(fft([1 6 2]),4) 會要求輸出四個取樣點,而不是原本的三個。新增的點來自逆變換前對頻譜補零;這並不是單純複製原始取樣值,再於末尾加上一個零。同樣地,逆變換前截短頻譜會造成資料遺失。

若重建結果不如預期,請確認頻譜來自你想要還原的訊號、振幅與相位都仍保留、ifftshift() 已還原先前由 fftshift() 所做的位移,並確認轉換長度與維度符合資料排列方式。請依訊號尺度選擇適當的容許誤差來比較數值。更多語法與細節請參閱 MATLAB ifft 函式參考資料。