第三節 - DFT 的加速運算(FFT)

講解完 DFT 的常見性質之後,這節要來介紹它的快速演算法,後面那三個小節的應用基本上都是因為有了這些快速演算法才能凸顯出它們的意義。FFT 的全名為 fast Fourier transform,它其實只是一個統稱,這世界上有太多太多能加速 DFT 的演算法 [3] 了,只要是企圖達成這個目標的方法都可以算是一種 FFT。

一般來說最知名的 FFT 是 Cooley 和 Tukey 在 1965 年所提出的以「因數分解」為核心思想的方法,[4] 有簡單俐落的推導和時間複雜度分析 (可以先弄懂這一節最後的範例之後再來看這篇),而 [5] 則是當年發表的 paper,只是大部分剛入門 FFT 的初心者一開始會學習的僅是該算法的其中一種特例

# Radix-2 Decimation in Time

下圖是展示如何用分治法的策略去拿「計算 4 點 DFT」的這個小模組來計算 8 點 DFT 的架構圖。

MATLAB 遞迴版本程式碼如下:

function Xdft = fftrecur(x)
    N = length(x); % N should be a power of 2
    if N == 1
        Xdft = x;
    else
        m = N/2;
        XE = fftrecur(x(1:2:N));
        XO = fftrecur(x(2:2:N));
        W = exp(-2*pi*sqrt(-1)/N).^(0:m-1).';
        temp = W.*XO;
        Xdft = [ XE+temp ; XE-temp ];
    end
end

# General Version (DIT + DIF)

Last updated