快速傅立葉變換，是快速計算序列的離散傅立葉變換（DFT）或其逆變換的方法。傅立葉分析將訊號從原始域（通常是時間或空間）轉換到頻域的表示或者逆過來轉換。FFT 會透過把 DFT 矩陣分解為稀疏（大多為零）因子之積來快速計算此類變換。Charles Van Loan Computational Frameworks for the Fast Fourier Transform SIAM 1992 因此，它能夠將計算 DFT 的複雜度從只用 DFT 定義計算需要的 O n2，降低到 O n log n，其中 n 為資料大小。 快速傅立葉變換廣泛的應用於工程、科學和數學領域。這裡的基本思想在 1965 年才得到普及，但早在 1805 年就已推匯出來。 1994 年美國數學家吉爾伯特斯特朗把 FFT 描述為 我們一生中最重要的數值演算法，它還被 IEEE 科學與工程計算期刊列入 20 世紀十大演算法。 定義和速度 用 FFT 計算 DFT 會得到與直接用 DFT 定義計算相同的結果；最重要的區別是 FFT 更快。（由於捨入誤差的存在，許多 FFT 演算法還會比直接運用定義求值精確很多，後面會討論到這一點。） 令 x0 xN1 為複數。DFT 由下式定義 X_k sum_n0N1 x_n ei 2pi k frac nN qquad k 0dotsN1 直接按這個定義求值需要 O N2 次運算：Xk 共有 N 個輸出，每個輸出需要 N 項求和。直接使用 DFT 運算需使用 N 個複數乘法（4N 個實數乘法）與 N1 個複數加法（2N2 個實數加法），因此，計算使用 DFT 所有 N 點的值需要 N2 複數乘法與 N2N 個複數加法。FFT 則是能夠在 O Nlog N 次操作計算出相同結果的任何方法。更準確的說，所有已知的 FFT 演算法都需要 O Nlog N 次運算（技術上 O 只標記上界），雖然還沒有已知的證據證明更低的複雜度是不可能的。Johnson and Frigo 2007 要說明 FFT 節省時間的方式，就得考慮複數相乘和相加的次數。直接計算 DFT 的值涉及到 N2 次複數相乘和 N N1 次複數相加（可以透過削去瑣碎運算（如乘以 1）來節省 O N 次運算）。眾所周知的基 2 庫利 圖基演算法，N 為 2 的冪，可以只用 N2 log2 N 次複數乘法（再次忽略乘以 1 的簡化）和 Nlog2 N 次加法就可以得到相同結果。在實際中，現代計算機通常的實際效能通常不受算術運算的速度和對複雜主體的分析主導 Frigo Johnson 2005，但是從 O N2 到 O Nlog N 的總體改進仍然能夠體現出來。 一般的簡化理論 假設一個 MN 型矩陣 S 可分解成列向量以及行向量相乘： mathbf Sbegin bmatrix a_1 a_2 vdots a_mend bmatrixbegin bmatrix b_1 b_2 cdots b_nend bmatrix 若 begin bmatrix a_1 a_2 cdots a_mend bmatrixT 有 M_0 個相異的非平凡值（a_mnepm2ka_mnepm2ka_n where mne n） begin bmatrix b_1 b_2 cdots b_nend bmatrix 有 N_0 個相異的非平凡值 則 S 共需要 M_0N_0 個乘法。 begin bmatrix Z 1 Z 2 vdots Z N end bmatrix mathbf Sbegin bmatrix X 1 X 2 vdots X Nend bmatrixbegin bmatrix a_1 a_2 vdots a_mend bmatrixbegin bmatrix b_1 b_2 cdots b_nend bmatrixbegin bmatrix X 1 X 2 vdots X Nend bmatrix Step 1：Z_ab_1X 1b_2X 2cdotsb_nX N Step 2：Z 1a_1Z_aZ 2a_2Z_acdotsZ Na_mZ_a 簡化理論的變型： mathbf Sbegin bmatrix a_1 a_2 vdots a_mend bmatrixbegin bmatrix b_1 b_2 cdots b_nend bmatrixmathbf S_1 S_1 也是一個 MN 的矩陣。 若 S_1 有 P_1 個值不等於 0，則 mathbf S 的乘法量上限為 M_0N_0P_1。 快速傅立葉變換乘法量的計算 假設 N P_1 times P_2 times cdots times P_k ，其中 P_1P_2 cdots P_k 彼此互質 mathbf P_k 點 DFT 的乘法量為 mathbf B_k，則 mathbf N 點 DFT 的乘法量為： frac NP_1 B_1frac NP_2 B_2cdotscdotsfrac NP_k B_k 假設 mathbf NPc，P 是一個質數。 若 mathbf N_1Pa 點的 DFT 需要的乘法量為 mathbf B_1 且 n_1times n_2 當中（ n_101cdotsN_11 quad n_201 cdots N_21） 有 D_1 個值不為 frac N12 及 frac N8 的倍數， 有 D_2 個值為 frac N12 及 frac N8 的倍數，但不為 frac N4 的倍數， 則 N 點 DFT 的乘法量為： mathbf N_2B_1N_1B_23D_12D_2 庫利 圖基演算法 庫利 圖基演算法是最常見的 FFT 演算法。這一方法以分治法為策略遞迴地將長度為 NN_1 N_2 的離散傅立葉變換分解為長度為 N_1 的 N_2 個較短序列的離散傅立葉變換，以及與 Omicron N 個旋轉因子的複數乘法。 這種方法以及 FFT 的基本思路在 1965 年 J W Cooley 和 J W Tukey 合作發表 An algorithm for the machine calculation of complex Fourier series 之後開始為人所知。但後來發現，實際上這兩位作者只是重新發明了高斯在 1805 年就已經提出的演算法（此演算法在歷史上數次以各種形式被再次提出）。 庫利 圖基演算法最有名的應用，是將序列長為 N 的 DFT 分割為兩個長為 N2 的子序列的 DFT，因此這一應用只適用於序列長度為 2 的冪的 DFT 計算，即基 2FFT。實際上，如同高斯和 Cooley 與 Tukey 都指出的那樣，CooleyTukey 演算法也可以用於序列長度 N 為任意因數分解形式的 DFT，即混合基 FFT，而且還可以應用於其他諸如分裂基 FFT 等變種。儘管 CooleyTukey 演算法的基本思路是採用遞迴的方法進行計算，大多數傳統的演算法實現都將顯式的遞迴演算法改寫為非遞迴的形式。另外，因為 CooleyTukey 演算法是將 DFT 分解為較小長度的多個 DFT，因此它可以同任一種其他的 DFT 演算法聯合使用。 設計思想 下面，我們用 N 次單位根 W_N 來表示 ejfrac 2piN。 W_N 的性質： 週期性，W_N 具有周期 N，即 W_NkNW_Nk 對稱性：W_Nkfrac N2W_Nk。 若 m 是 N 的約數，W_NmknW_frac Nmkn 為了簡單起見，我們下面設待變換序列長度 n2r。根據上面單位根的對稱性，求級數 y_ksum_n0N1 W_Nkn x_n 時，可以將求和區間分為兩部分： begin matrix y_ksum_n2t W_Nkn x_n sum_n2t1 W_Nkn x_n sum_t W_frac N2kt x_2t W_Nksum_t W_frac N2kt x_2t1 F_evenk W_Nk F_oddkiinmathbb Zend matrix F_oddk 和 F_evenk 是兩個分別關於序列 leftx_nright_0N1 奇數號和偶數號序列 N2 點變換。由此式只需計算出 y_k 的前 N2 個點，對於後 N2 個點可以透過復指數函式的對稱性快速求解。即，注意 F_oddk 和 F_evenk 都是週期為 N2 的函式，由單位根的對稱性，有以下變換公式： y_kfrac N2 F_evenk W_Nk F_oddk y_k F_evenk W_Nk F_oddk。 這樣，一個 N 點變換就分解成了兩個 N2 點變換。照這樣可繼續分解下去。這就是庫利 圖基快速傅立葉變換演算法的基本原理。根據主定理不難分析出此時演算法的時間複雜度為 Omicron Nlog N 演算法實現 蝶形結網路和位反轉（Bit Reversal）： 首先將 n2N 個輸入點列按二進位制進行編號，然後對各個編號按位倒置並按此重新排序。例如，對於一個 8 點變換， 001 倒置以後變成 100 000 000 001 100 010 010 011 110 100 001 101 101 110 011 111 111 倒置後的編號為 04261537。 然後將這 n 個點列作為輸入傳送到蝶形結網路中，注意將因子 W_Nk 逐層加入到蝶形網路中。 演算法複雜度 由於按蝶形結網路計算 n 點變換要進行 log n 層計算，每層計算 n 個點的變換，故演算法的時間複雜度為 Omicron n log n。 其他演算法 在 CooleyTukey 演算法之外還有其他 DFT 的快速演演算法。對於長度 N N_1N_2 且 N_1 與 N_2 互質的序列，可以採用基於中國剩餘定理的互質因子演算法將 N 長序列的 DFT 分解為兩個子序列的 DFT。與 CooleyTukey 演算法不同的是，互質因子演算法不需要旋轉因子。 RaderBrenner 演算法是類似於 CooleyTukey 演算法，但是採用的旋轉因子都是純虛數，以增加加法運算和降低了數值穩定性為代價減少了乘法運算。這方法之後被 splitradix variant of CooleyTukey 所取代，與 RaderBrenner 演演算法相比，有一樣多的乘法量，卻有較少的加法量，且不犧牲數值的準確性。 Bruun 以及 QFT 演演算法是不斷的把 DFT 分成許多較小的 DFT 運算。（RaderBrenner 以及 QFT 演演算法是為了 2 的指數所設計的演演算法，但依然可以適用在可分解的整數上。Bruun 演演算法則可以運用在可被分成偶數個運算的數字）。尤其是 Bruun 演演算法，把 FFT 看成是 zN1，並把它分解成 zM1 與 z2MazM1 的形式。 另一個從多項式觀點的快速傅立葉變換法是 Winograd 演算法。此演演算法把 zN1 分解成 cyclotomic 多項式，而這些多項式的係數通常為 1，0，1。這樣只需要很少的乘法量（如果有需要的話），所以 winograd 是可以得到最少乘法量的快速傅立葉演演算法，對於較小的數字，可以找出有效率的算方式。更精確地說，winograd 演演算法讓 DFT 可以用 2k 點的 DFT 來簡化，但減少乘法量的同時，也增加了非常多的加法量。Winograd 也可以利用剩餘值定理來簡化 DFT。 Rader 演演算法提出了利用點數為 N（N 為質數）的 DFT 進行長度為 N1 的迴旋摺積來表示原本的 DFT，如此就可利用摺積用一對基本的 FFT 來計算 DFT。另一個 primesize 的 FFT 演演算法為 chirpZ 演演算法。此法也是將 DFT 用摺積來表示，此法與 Rader 演演算法相比，能運用在更一般的轉換上，其轉換的基礎為 Z 轉換（Rabiner et al 1969）。 實數或對稱資料專用的演演算法 在許多的運用當中，要進行 DFT 的資料是純實數，如此一來經過 DFT 的結果會滿足對稱性： mathbf X_Nkmathbf X_k 而有一些演演算法是專門為這種情形設計的（eg Sorensen 1987）。另一些則是利用舊有的演演算法（eg CooleyTukey），刪去一些不必要的演算步驟，如此省下了記憶體的使用，也省下了時間。另一方面，也可以把一個偶數長度且純實數的 DFT，用長度為原本一半的複數型態 DFT 來表示（實數項為原本純實數資料的偶數項，虛數項則為奇數項）。 在 Matlab 上用一次 N 點 FFT 計算兩個 N 點實數訊號 xy 的 FFT function XY Real2FFT xy Npoint FFT is used for 2 real signals both with length N N length x z xyi Z fft z X 05Zconj Z 1mod 011NN Y 05Zconj Z 1mod 011NNi end 一度人們認為，用離散哈特利轉換（Discrete Hartley Transform）來處理純實數的 DFT 會更有效率，但接著人們發現，對於同樣點數的純實數 DFT，經過設計的 FFT，可以比 DHT 省下更多的運算。Bruun 演演算法是第一個試著從減少實數輸入的 DFT 運算量的演演算法，但此法並沒有成為人們普遍使用的方法。 對於實數輸入，且輸入為偶對稱或奇對稱的情形，可以更進一步的省下時間以及記憶體，此時 DFT 可以用離散餘弦轉換或離散正弦轉換來代替（Discrete cosinesine transforms）。由於 DCTDST 也可以設計出 FFT 的演演算法，故在此種情形下，此方法取代了對 DFT 設計的 FFT 演演算法。 DFT 可以應用在頻譜分析以及做摺積的運算，而在此處，不同應用可以用不同的演演算法來取代，列表如下： 用來做頻譜分析的情況下，DFT 可用下列的演演算法代替： DCT DST DHT 正交基底的擴充套件（orthogonal basis expantion）包括正交多項式（orthogonal polynomials）以及 CDMA Walsh（Hadamard）轉換 Haar 轉換 小波（wavelet）轉換 時頻分佈（timefrequency distribution） 用來做摺積的情況下，DFT 可用下列的演演算法代替： DCT DST DHT 直接做摺積（direct computing） 分段式 DFT 摺積（sectioned DFT convolution） 威諾格拉德快速傅立葉變換演演算法 沃爾什（Walsh、Hadamard）轉換 數論轉換 單一路徑延遲迴授系統 單一路徑延遲迴授系統 英語：Singlepath delay feedback，縮寫為 SDF 是一種用於實現快速傅立葉轉換 Fast Fourier Transform 中運算的管線式架構 pipeline architecture。此架構的特點是資料從輸入一直到最終的輸出只會透過單一的路徑，並使用蝶形結 butterfly diagram 做為資料的運算單元。經過蝶形結後的輸出資料會先暫存在系統的移位暫存器 shift registers 或是隨機存取記憶體 RAM 當中，而由於只有單一路徑的關係，對於每一級的蝶形結架構我們只需要一個複數乘法器來進行和 FFT 當中的旋轉因子 twiddle factor 的乘積運算。 SDF 的優點在於其架構簡單並且利用硬體實現的成本較低，原因在於其單一路徑的設計，使得資料會依序進行處理並輸出，並不會在系統中加入多個複雜的運算單元以進行平行化的運算，事實上 SDF 的架構在管線式快速傅立葉轉換處理器 pipelined FFT processors 中具有最高的記憶體使用效率，而由於記憶體單元數量會隨快速傅立葉轉換的級數而指數增長，記憶體使用效率進而成為影響電路面積和功耗的主要因素之一。因此在實作大型快速傅立葉轉換處理器的情況下，SDF 架構一直是被優先考量採用的選擇。然而其缺點也同樣來自於單一路徑的設計，導致其吞吐量 throughput 和多路徑延遲交換線路系統 英語：Multiplepath delay commutator，縮寫為 MDC 相比較低。 接著我們將以 8 個點的基 2 單一路徑延遲迴授系統 8point R2SDF 為例進行其演演算法細節的介紹，並且展示在硬體實作中每一個 cycle 的運算和中間結果的儲存位置。 首先考慮系統輸入為 x0 x1 x7，並在前 8 個 cycle 依序輸入。 Cycle 03 x0x3 依序存入第一級 BF2 上方的暫存器中。 Cycle 4 x0 和 x4 輸入第一級 BF2 後輸出 x0 和 x4，x0 存入第二級 BF2 上方的暫存器中，x4 存入第一級 BF2 上方的暫存器中。 Cycle 5 x1 和 x5 輸入第一級 BF2 後輸出 x1 和 x5，x1 存入第二級 BF2 上方的暫存器中，x5 存入第一級 BF2 上方的暫存器中。 Cycle 6 x2 和 x6 輸入第一級 BF2 後輸出 x2 和 x6，x6 存入第一級 BF2 上方的暫存器中，x0 和 x2 輸入第二級 BF2 後輸出 x0 和 x2，x0 存入第三級 BF2 上方的暫存器中，x2 存入第二級 BF2 上方的暫存器中。 Cycle 7 x3 和 x7 輸入第一級 BF2 後輸出 x3 和 x7，x7 存入第一級 BF2 上方的暫存器中，x1 和 x3 輸入第二級 BF2 後輸出 x1 和 x3，x3 存入第二級 BF2 上方的暫存器中，x0 和 x1 輸入第三級 BF2 後輸出 x0 和 x1，x0 直接輸出，x1 存入第三級 BF2 上方的暫存器中。此為第一筆輸出，此後每一個 cycle 皆會輸出一筆資料。 Cycle 8 x4 乘上 W0 後存入第二級 BF2 上方的暫存器中，x2 乘上 W0 後存入第三級 BF2 上方的暫存器中，x1 直接輸出。 Cycle 9 x5 乘上 W1 後存入第二級 BF2 上方的暫存器中，x3 乘上 W2 後和 x2 輸入第三級 BF2 後輸出 x2 和 x3， x2 直接輸出，x3 存入第三級 BF2 上方的暫存器中。 Cycle 10 x6 乘上 W2 後和 x4 輸入第二級 BF2 後輸出 x4 和 x6，x6 存入第二級 BF2 上方的暫存器中，x4 存入第三級 BF2 上方的暫存器中，x3 直接輸出。 Cycle 11 x7 乘上 W3 後和 x5 輸入第二級 BF2 後輸出 x5 和 x7，x7 存入第二級 BF2 上方的暫存器中，x4 和 x5 輸入第三級 BF2 後輸出 x4 和 x5，x4 直接輸出，x5 存入第三級 BF2 上方的暫存器中。 Cycle 12 x6 乘上 W0 後存入第三級 BF2 上方的暫存器中，x5 直接輸出。 Cycle 13 x7 乘上 W2 後和 x6 輸入第三級 BF2 後輸出 x6 和 x7，x6 直接輸出，x7 存入第三級 BF2 上方的暫存器中。 Cycle 14 x7 直接輸出。此為最後一筆輸出。 此外，我們可以在蝶形結中的加法器和乘法器加上額外的暫存器 register 來降低系統的關鍵路徑 critical path，來避免某些時刻不同級之間的繁重運算必須擠在同一個 cycle 中運算完成，進而嚴重影響整體電路在 timing 上的表現。但如此的管線式設計 pipeline design 也會增加整體電路的延遲 latency 和暫存器使用量。 相似架構之硬體實作比較 Radix2 SDF 2 log4N1 個乘法器、4log4N 個加法器、記憶體大小為 N1。 Radix4 SDF log4N1 個乘法器、8log4N 個加法器、記憶體大小為 N1。 Radix22 SDF log4N1 個乘法器、4log4N 個加法器、記憶體大小為 N1。 Radix2 MDC 2 log4N1 個乘法器、4log4N 個加法器、記憶體大小為 15N2。 Radix4 MDC 3 log4N1 個乘法器、8log4N 個加法器、記憶體大小為 25N4。 Radix4 SDC log4N1 個乘法器、3log4N 個加法器、記憶體大小為 2N2。 複雜度以及運算量的極限 長久以來，人們對於求出快速傅立葉變換的複雜度下限以及需要多少的運算量感到很有興趣，而實際上也還有許多問題需要解決。即使是用較簡單的情形，即 2k 點的 DFT，也還沒能夠嚴謹的證明出 FFT 至少需要 Omega Nlog N（不比 Nlog N 小）的運算量，目前也沒有發現複雜度更低的演演算法。通常數學運算量的多寡會是運算效率好壞最主要的因素，但在現實中，有許多因素也會有很大的影響，如快取記憶體以及 CPU 均有很大的影響。 在 1978 年，Winograd 率先匯出一個較嚴謹的 FFT 所需乘法量的下限：Theta N。當 N2k 時，DFT 只需要 4N2log_22N2log_2 N4 次無理實數的乘法即可以計算出來。更詳盡，且也能趨近此下限的演演算法也一一被提出（Heideman Burrus 1986 Duhamel 1990）。很可惜的是，這些演演算法，都需要很大量的加法計算，目前的硬體無法克服這個問題。 對於所需加法量的數目，雖然我們可以在某些受限制的假設下，推得其下限，但目前並沒有一個精確的下限被推匯出來。1973 年，Morgenstern 在乘法常數趨近巨大的情形下（對大部分的 FFT 演演算法為真，但不是全部）推匯出加法量的下限：Omega left N log N right。Pan（1986）在假設 FFT 演演算法的不同步的情形有其極限下證明出加法量的下限 Omega NlogN，但一般來說，此假設相當的不明確。長度為 N2k 的情形下，在某些假設下，Papadimitriou（1979）提出使用 CooleyTukey 演演算法所需的複數加法量 Nlog_2 N 是最少的。到目前為止，在長度為 N2k 情況，還沒有任何 FFT 的演演算法可以讓複數的加法量比 Nlog_2 N 還少。 還有一個問題是如何把乘法量與加法量的總和最小化，有時候稱作 演算複雜度（在這裡考慮的是實際的運算量，而不是漸近複雜度）。同樣的，沒有一個嚴謹下限被證明出來。從 1968 年開始，N2k 點 DFT 而言，splitradix FFT 演演算法需要最少的運算量，在 N1 的情形下，其需要 4Nlog_2 N6N8 個乘法運算以及加法運算。最近有人匯出更低的運算量：frac 349 Nlog_2 N。（Johnson and Frigo 2007 Lundy and Van Buskirk 2007） 大多數嘗試要降低或者證明 FFT 複雜度下限的人都把焦點放在複數資料輸入的情況，因其為最簡單的情形。但是，複數資料輸入的 FFT 演演算法，與實數資料輸入的 FFT 演演算法，離散餘弦轉換（DCT），離散哈特列轉換（DHT），以及其他的演演算法，均有很大的關連性。故任何一個演演算法，在複雜度上有任何的改善的話，其他的演演算法複雜度也會馬上獲得改善（Duhamel Vetterli 1990）。 快速演演算法查表 當輸入訊號長度為 N 時 N 160 N 乘法數 加法數 N 乘法數 N 乘法數 N 乘法數 1 0 0 11 46 24 28 39 182 2 0 4 12 8 25 148 40 100 3 2 12 13 52 26 104 42 124 4 0 16 14 32 27 114 44 160 5 10 34 15 40 28 64 45 170 6 4 36 16 20 30 80 48 92 7 16 72 18 32 32 72 52 208 8 4 52 20 40 33 160 54 228 9 16 72 21 62 35 150 56 156 10 20 88 22 80 36 64 60 160 N 1000 N 乘法數 N 乘法數 N 乘法數 N 乘法數 63 256 96 280 192 752 360 1540 64 204 104 468 204 976 420 2080 66 284 108 456 216 1020 480 2360 70 300 112 396 224 1016 504 2300 72 164 120 380 240 940 512 3180 80 260 128 560 252 1024 560 3100 81 480 144 436 256 1308 672 3496 84 248 160 680 288 1160 720 3620 88 412 168 580 312 1324 784 4412 90 340 180 680 336 1412 840 4580 N 1000 N 乘法數 N 乘法數 N 乘法數 N 乘法數 1008 5356 1440 8680 2520 16540 4032 29488 1024 7436 1680 10420 2688 19108 4096 37516 1152 7088 2016 12728 2880 20060 4368 35828 1260 7640 2048 16836 3369 24200 4608 36812 1344 8252 2304 15868 3920 29900 5040 36860 參閱 離散傅立葉變換 並行快速傅立葉變換 快速數論變換 參考資料 延伸閱讀 D F Elliott K R Rao 1982 Fast transforms Algorithms analyses applications New York Academic Press Funda Ergün 1995 Proc 27th ACM Symposium on the Theory of Computing 407416 H Guo and C S Burrus 1996 Proc SPIE Intl Soc Opt Eng 2825 250259 H Guo G A Sitton C S Burrus 1994 Proc IEEE Conf Acoust Speech and Sig Processing ICASSP 3 445448 Steve Haynal and Heidi Haynal Generating and Searching Families of FFT Algorithms Journal on Satisfiability Boolean Modeling and Computation vol 7 pp 145187 2011 T Lundy and J Van Buskirk 2007 A new matrix approach to real FFTs and convolutions of length 2k Computing 80 1 2345 Kent Ray D and Read Charles 2002 Acoustic Analysis of Speech ISBN 9780769301129 Cites Strang G 1994MayJune Wavelets American Scientist 82 250255 V Pan 1986 Information Proc Lett 22 1114 Christos H Papadimitriou 1979 J ACM 26 95102 D Potts G Steidl and M Tasche 2001 Fast Fourier transforms for nonequispaced data A tutorial in JJ Benedetto and P Ferreira Eds Modern Sampling Theory Mathematics and Applications Birkhauser See also Category 數字訊號處理 Category 變換編碼 分類：數學術語 Category 傅立葉變換 Category 計算機科學中未解決的問題