庫利－圖基快速傅立葉變換演算法是最常見的快速傅裡葉變換演算法。這一方法以分治法為策略遞迴地將長度為 N N1N2 的 DFT 分解為長度分別為 N1 和 N2 的兩個較短序列的 DFT，以及與旋轉因子的複數乘法。這種方法以及 FFT 的基本思路在 1965 年詹姆斯庫利和約翰圖基合作發表《An algorithm for the machine calculation of complex Fourier series》之後開始為人所知。但後來發現，實際上這兩位作者只是重新發明瞭高斯在 1805 年就已經提出的演算法（此演算法在歷史上數次以各種形式被再次提出）。 庫利－圖基演算法最有名的應用，是將序列長為 N 的 DFT 分割為兩個長為 N2 的子序列的 DFT，因此這一應用只適用於序列長度為 2 的冪的 DFT 計算，即基 2FFT。實際上，如同高斯和庫利與圖基都指出的那樣，庫利－圖基演算法也可以用於序列長度 N 為任意因數分解形式的 DFT，即混合基 FFT，而且還可以應用於其他諸如分裂基 FFT 等變種。儘管庫利－圖基演算法的基本思路是採用遞迴的方法進行計算，大多數傳統的演算法實現都將顯示的遞迴演算法改寫為非遞迴的形式。另外，因為庫利－圖基演算法是將 DFT 分解為較小長度的多個 DFT，因此它可以同任一種其他的 DFT 演算法聯合使用。 複雜度 離散傅立葉變換的複雜度為 mathcal On2（可參考大 O 符號） 快速傅立葉變換的複雜度為 mathcal ONlog N，分析可見下方架構圖部分，級數為 log N 而每一級的複雜度為 N，故複雜度為 mathcal ONlog N 蝶形結 在 FFT 演演算法中，使用到的蝶形結可以分為 CooleyTukey 和 GentlemanSande 兩種，而他們進行的運算互為對方的逆運算，同時對應了 DFT 和 IDFT 當中會使用到的運算單元。 在 CooleyTukey 蝶形結當中，上下兩列的輸出分別為： acb acb 而在 GentlemanSande 蝶形結當中，上下兩列的輸出分別為： ab abc1 可以注意到在進行完一次 CooleyTukey 蝶形結和 GentlemanSande 蝶形結的運算之後，原先輸入的 a b 會變成 2a 2b，而這項常數倍的差異可以在所有的蝶形結運算結束後再處理，不需要直接改變這兩項蝶形結運算單元的常數。 以下是這兩種蝶形運算應用在快速傅立葉轉換中性質的比較。 CooleyTukey 蝶形運算 組成：一個加法器、一個減法器、和一個乘法器。 輸入順序：以位元反轉順序 bitreversed order 輸入資料。 輸出順序：產生以正常順序 normal order 輸出的結果，對應到分時快速傅立葉轉換 DecimationinTime FFT。 使用時機：由於輸入非按照正常順序，輸入端資料流控制較 DIFFFT 更為複雜。 GentlemanSande 蝶形運算 組成：一個加法器、一個減法器、和一個乘法器。 輸入順序：以正常順序 normal order 輸入資料。 輸出順序：產生以位元反轉順序 bitreversed order 輸出的結果，對應到分頻快速傅立葉轉換 DecimationinFrequency FFT。 使用時機：由於輸入會按照正常順序，輸入端資料流控制較 DITFFT 更為簡單。 而 Utsav Banerjee 等人在 2019 年發表的〈An EnergyEfficient Configurable Lattice Cryptography Processor for the QuantumSecure Internet of Things〉提出了一個整合式蝶形運算單元的架構，同時包含了 CooleyTukey 蝶形結和 GentlemanSande 蝶形結的運算，以滿足在硬體實作上同時兼顧兩者的需求。 整合式蝶形運算 組成：兩個加法器、兩個減法器、一個乘法器、和四個資料多工器 MUX。 原理：藉由資料多工器 MUX 使得每次只有其中一個加法器和一個減法器的輸出會被使用，以此呈現原先 CooleyTukey 蝶形結和 GentlemanSande 蝶形結中的運算，在 CooleyTukey 蝶形結中會跳過前半部分的加法器和減法器，使得乘法器放置在有效的加法器和減法器之前，而 GentlemanSande 蝶形結則正好相反，跳過後半部分的加法器和減法器，使得乘法器放置在有效的加法器和減法器之後。而至於是要呈現哪一個運算單元的特性就可以根據當下輸入輸出等情況做選擇，藉此彌補硬體實作上和軟體設計相比缺乏彈性的問題，同時避免硬體資源的浪費。 優點： 節省資源：透過整合 CooleyTukey 和 GentlemanSande 的蝶形結構，減少硬體面積。 提升效能：避免處理位元反轉 bit reversal 等複雜操作，提升運算效率。 高度彈性：支援兩種變換型別以適用於多種不同應用情境。 缺點： 由於蝶形運算單元的組成變得複雜而使得其電路面積 area 和延遲 latency 增加，但文章中指出由於關鍵路徑不在該蝶形運算單元之內，因此並不會影響系統的整體表現，此外其造成的額外面積負擔在系統中也是微乎其微的。 時域 頻域抽取法 在 FFT 演演算法中，針對輸入做不同方式的分組會造成輸出順序上的不同。如果我們使用時域抽取（Decimationintime），那麼輸入的順序將會是位元反轉排列（bitreversed order），輸出將會依序排列。但若我們採取的是頻域抽取（Decimationinfrequency），那麼輸出與輸出順序的情況將會完全相反，變為依序排列的輸入與位元反轉排列的輸出。 時域抽取法 我們可以將 DFT 公式中的專案在時域上重新分組，這樣就叫做時域抽取（Decimationintime），在這裡 ej 2 pi frac nkN 將會被代換為旋轉因子（twiddle factor）W_Nnk。 X k sum_n0N1 x n ej 2 pi frac nkNqquad k01ldotsN1 sum_n even x n W_Nnk sum_n odd x n W_Nnk sum_r0N21 x 2r W_N2rk sum_r0N21 x 2r1 W_N2r1 k sum_r0N21 x 2r W_N2rk W_Nk sum_r0N21 x 2r1 W_N2rk sum_r0N21 x 2r W_N2rk W_Nk sum_r0N21 x 2r1 W_N2rk G kW_Nk H k 在這邊我們要注意的是，我們所替換的 G k 與 H k 具有週期性： begin cases G k frac N2G kH kfrac N2H kend cases 還注意到係數具有對稱性： W_NkN2W_Nk 上述的推導可以劃成下面的圖： FileDIT N8JPG 劃紅框處所示的 frac N2 點 DFT 架構如下圖所示： FileDIT N4JPG 劃紅框處所示的 frac N4 點 DFT 架構如下圖所示： FileDIT N2JPG 下圖是一個 8 點 DIT FFT 的完整架構圖。 FileDIT N8 ALLJPG 頻域抽取法 我們可以將 DFT 公式中的專案在頻域上重新分組，這樣就叫做頻域抽取（Decimationinfrequency）。 首先先觀察在頻域上偶數項的部分： X 2r sum_n0N1 x n W_Nn 2r r01cdots frac N21 sum_n0frac N21 x n W_N2nr sum_nfrac N2N1 x n W_N2nr sum_n0frac N21 x n W_N2nr sum_n0frac N21 x nfrac N2 W_N2r nfrac N2 color Gray because W_N2r nfrac N2W_N2rn W_NrNW_N2rn sum_n0frac N21 x n W_N2rn sum_n0frac N21 x nfrac N2 W_N2rn sum_n0frac N21 x nx nfrac N2 W_frac N2rn sum_n0frac N21 g n W_frac N2rn 再觀察在頻域上奇數項的部分： X 2r1 sum_n0N1 x n W_Nn 2r1 r01cdots frac N21 sum_n0frac N21 x n W_Nn 2r1 sum_nfrac N2N1 x n W_Nn 2r1 sum_n0frac N21 x n W_Nn 2r1 sum_n0frac N21 x nfrac N2 W_N2r1nfrac N2 color Gray because W_N2r1nfrac N2W_N2r1 n W_N2r1frac N2W_N2r1 n sum_n0frac N21 x n W_N2r1 n sum_n0frac N21 x nfrac N2 W_N2r1 n sum_n0frac N21 x nx nfrac N2 W_Nn 2r1 sum_n0frac N21 x nx nfrac N2 W_Nn W_frac N2nr sum_n0frac N21h n W_Nn W_frac N2rn 上述的推導可以畫成下面的圖： FileDIF N8JPG 更進一步的拆解 frac N2point DFT 的架構 FileDIF N4JPG 下圖為 8 點 FFT 下 frac N4point DFT 的架構 FileDIF N2JPG 總結上述架構，完整的 8 點 DIF FFT 架構圖為 FileDIF N8 ALLJPG 單一基底 利用庫利－圖基演演算法進行離散傅立葉拆解時，能夠依需求而以 2 4 8 等 2 的冪次方為單位進行拆解，不同的拆解方法會產生不同層數快速傅裡葉變換的架構，基底越大則層數越少，複數乘法器也越少，但是每級的蝴蝶形架構則會越複雜，因此常見的架構為 2 基底、4 基底與 8 基底這三種設計。 2 基底 2 基底 快速傅立葉演演算法（Radix2 FFT）是最廣為人知的一種庫利－圖基快速傅立葉演演算法分支。此方法不斷地將 N 點的 FFT 拆解成兩個 N2 點的 FFT，利用旋轉因子 WnkWfrac N2 的對稱性藉此來降低 DFT 的計算複雜度，達到加速的功效。 而其實前述有關時域抽取或是頻域抽取的方法介紹，即為 2 基底的快速傅立葉轉換法。以下展示其他種 2 基底快速傅立葉演演算法的連線方法，此種不規則的連線方法可以讓輸出與輸入都為循序排列，但是連線的複雜度卻大大的增加。 4 基底 4 基底快速傅立葉變換演演算法則是承接 2 基底的概念，在此裡用時域抽取的技巧，將原本的 DFT 公式拆解為四個一組的形式： X k sum_n0N1 x n ej 2 pi frac nkNqquad k01ldotsN1 sum_n0frac N41 x 4n0 W_N4n0 k sum_n0frac N41 x 4n1 W_N4n1 k sum_n0frac N41 x 4n2 W_N4n2 k sum_n0frac N41 x 4n3 W_N4n3 k W_N0 sum_n0frac N41 x 4n0 W_frac N4nk W_N1k sum_n0frac N41 x 4n1 W_frac N4nk W_N2k sum_n0frac N41 x 4n2 W_frac N4nk W_N3k sum_n0frac N41 x 4n3 W_frac N4nk W_N0 F_0 k W_Nk F_1 k W_N2k F_2 k W_N3k F_3 k 在這裡再利用 Wnkfrac N4 Wnkfrac 3N4 j Wnk 的特性來進行與 2 基數 FFT 類似的化減方法，以降低演演算法複雜度。 8 基底 在庫利－圖基演算法裡，使用的基底（radix）越大，複數的乘法與記憶體的存取就越少，所帶來的好處不言而喻。但是隨之而來的就是實數的乘法與實數的加法也會增加，尤其計算單元的設計也就越複雜，對於可應用 FFT 之點數限制也就越嚴格。在表中我們可以看到在不同基底下所需的計算成本。 使用 4096 點 FFT 在不同基底下的計算量 動作 2 基底 4 基底 8 基底 複數乘法 22528 15360 10752 實數乘法 0 0 8192 複數加法 49152 49152 49152 實數加法 0 0 8192 記憶體存取 49152 24576 16384 在 DFT 的公式中，我們重新定義 xx 0x 1x N1 T XX 0X 1X N1 T，則 DFT 可重寫為 XFNx。FN 是一個 NN 的 DFT 矩陣，其元素定義為 FN ijWNij ij 0N1，當 N8 時，我們可以得到以下的 F8 矩陣並且進一步將其拆解。 在拆解成三個矩陣相乘之後，我們可以將複數運算的數量從 56 個降至 24 個複數的加法。底下是 8 基底的 SFG。要注意的是所有的輸出與輸入都是複數的形式，而輸出與輸入的排序也並非規律排列，此種排列方式是為了要達到接線的最佳化。 混合基底 28 基底 在 28 基底的演演算法中，我們可以看到我們對於偶數項的輸出會使用 2 基底的分解法，對於奇數項的輸出採用 8 基底的分解法。這個做法充分利用了 2 基底與 4 基底擁有最少乘法數與加法數的特性。當使用了 2 基底的分解法後，偶數項的輸出如下所示。 C_2ksum_n0frac N21 x_2nx_frac N2n W2nk 奇數項的輸出則交由 8 基底分解來處理，如下四式所述。 C_8k1sum_n0frac N81begin Bmatrixx_nx_nfrac N2 j x_nfrac N4x_nfrac 3N4 Wfrac N8x_nfrac N8x_nfrac 5N8 j x_nfrac 3N8x_nfrac 7N8 end Bmatrix W8nk Wn C_8k5sum_n0frac N81begin Bmatrixx_nx_nfrac N2 j x_nfrac N4x_nfrac 3N4 Wfrac N8x_nfrac N8x_nfrac 5N8 j x_nfrac 3N8x_nfrac 7N8 end Bmatrix W8nk W5n C_8k3sum_n0frac N81begin Bmatrixx_nx_nfrac N2 j x_nfrac N4x_nfrac 3N4 Wfrac 3N8x_nfrac N8x_nfrac 5N8 j x_nfrac 3N8x_nfrac 7N8 end Bmatrix W8nk W3n C_8k7sum_n0frac N81begin Bmatrixx_nx_nfrac N2 j x_nfrac N4x_nfrac 3N4 Wfrac 3N8x_nfrac N8x_nfrac 5N8 j x_nfrac 3N8x_nfrac 7N8 end Bmatrix W8nk W7n 以上式子就是 28 基底的 FFT 快速演演算法。在架構圖上可化為 L 型的蝴蝶運算架構，如下圖所示。 而下圖表示的是一個 64 點的 FFT 使用 28 基底的架構圖。雖然 28 基底的演演算法縮減了 Wfrac N8Wfrac 3N8 的乘法量，但是這種演演算法最大的缺點是跟其他固定基底或是混合基底比較起來，他的架構較為不規則。所以在硬體上比 4 基底或是 2 基底更難實現。 248 基底 為了改進 Radix 28 在架構上的不規則性，我們在這裡做了一些修改，如下圖 4。此修改可讓架構更加規則，且所使用的加法器與乘法器數量更加減少，如下表所示。 8n 點 FFT 在不同演演算法下所需複數乘法量 N8n 2 基底 4 基底 24 混合基底 248 基底 8 2 2 0 64 98 76 72 48 512 1538 1082 824 4096 18434 13996 12774 10168 在這裡我們最小的運算單元稱為 PE（Process Element）PE 內部包含了 28 基底、24 基底、2 基底的運算，簡化過的訊號處理流程與蝴蝶型架構圖可見下圖 22 基底 基底的選擇越大會造成蝴蝶形架構更加複雜，控制電路也會複雜化。因此 Shousheng He 和 Mats Torkelson 在 1996 提出了一個 22 基底的 FFT 演演算法，利用旋轉因子的特性：W_frac N4 j。而j 的乘法基本上只需要將被乘數的實部虛部對調，然後將虛部加上負號即可，這樣的負數乘法被定義為 簡單乘法 ，因此可以用很簡單的硬體架構來實現。利用上面的特性，22 基底 FFT 能用串接的方式將旋轉因子以 4 為單位對 DFT 公式進行拆解，將蝴蝶形架構層數降到 log4N，大幅減少複數乘法器的用量，而同時卻維持了 2 基底蝴蝶形架構的簡單性，在效能上獲得改進。22 基底 DIF FFT 演演算法的拆解方法如下列公式所述： N 點 DFT 公式： X ksum_n0N1 x n Wnk_N 0leqq k N 利用線性對映將 n 與 k 對映到三個維度上面 begin cases n frac N2 n_1 frac N4 n_2 n_3 _N k k_1 2k_2 4k_3_N end cases 然後套用 Common Factor Algorithm（CFA） X k_1 2k_2 4k_3sum_n_30frac N41 sum_n_201 sum_n_101 x frac N2 n_1 frac N4 n_2 n_3 Wfrac N2 n_1 frac N4 n_2 n_3k_1 2k_2 4k_3_N sum_n_30frac N41 sum_n_201 begin Bmatrix Bk_1_frac N2 Wfrac N4 n_2 n_3 k_1_Nend Bmatrix Wfrac N4 n_2 n_32k_2 4k_3_N 而蝴蝶型架構會變成以下形式 Bk_1_frac N2 x frac N4 n_2 n_3 1k_1 x frac N4 n_2n_3 frac N2 利用旋轉因子 W_frac N4 j 的特性，可以觀察出 Wfrac N4 n_2 n_3k_1 2k_2 4k_3_N WN n_2 n_3_N Wfrac N4 n_2 k_12k_2_N Wn_3 k_1 2k_2_N W4n_3 k_3_N jn_2 k_12k_2 Wn_3 k_1 2k_2_N W4n_3 k_3_N 再將此公式帶入原式中可以得到 X k_1 2k_2 4k_3sum_n_30frac N41 H k_1k_2n_3 Wn_3 k_1 2k_2_N W4n_3 k_3_N H k_1k_2n_3 begin matrix underbrace begin matrix BF2 I overbrace x n_31k_1n_3frac N2 end matrix begin matrix jk_12k_2 end matrix begin matrix BF2 I overbrace x n_3frac N41k_1n_3frac 3N4 end matrix BF2 II end matrix 如上述公式所示，原本的 DFT 公式會被拆解成多個 H k_1k_2n_3，而 H k_1k_2n_3 又可分為 BF2I 與 BF2II 兩個階層，分別會對應到之後所介紹的兩種硬體架構。 一個 16 點的 DFT 公式經過一次上面所述之拆解之後可得下面的 FFT 架構 可以看出上圖的架構保留了 2 基底的簡單架構，然而複數乘法卻降到每兩級才出現一次，也就是 log_4 N 次。而 BF2I 以及 BF2II 所對應的硬體架構下圖： 其中 BF2II 硬體單元中左下角的交叉電路就是用來處理 j 的乘法。 一個 256 點的 FFT 架構可以由下面的硬體來實現： 其中圖下方的為一 7 位元寬的計數器，而此架構的控制電路相當單純，只要將計數器的各個位元分別接上 BF2I 與 BF2II 單元即可。 下表將 2 基底、4 基底與 22 基底演演算法做一比較，可以發現 22 基底演演算法所需要的乘法氣數量為 2 基底的一半，加法棄用量是 4 基底的一半，並維持一樣的記憶體用量和控制電路的簡單性。 乘法器與加法器數量比較 乘法數 加法數 記憶體大小 控制電路 R2SDF 2 log4N1 4log4N N1 簡單 R4SDF log4N 1 8log4N N1 中等 R22SDF log4N 1 4log4N N1 簡單 23 基底 如上所述，22 演演算法是將旋轉因子 Wfrac N4 j 視為一個簡單乘法，進而由公式以及硬體上的化簡獲得硬體需求上的改進。而藉由相同的概念，Shousheng He 和 Mats Torkelson 進一步將旋轉因子 Wfrac N8 frac sqrt 221j 的乘法化簡成一個簡單乘法，而化簡的方法將會在下面講解。 frac sqrt 22 乘法化簡 在 2 基數 FFT 演演算法中的基本概念是利用旋轉因子 WnkWfrac N2 的對稱性，4 基數演演算法則是利用 Wnkfrac N4 Wnkfrac 3N4 j Wnk 的特性。但是我們會發現在這些旋轉因子的對稱特性中 Wfrac N8Wfrac 5N8frac sqrt 221jWfrac 3N8Wfrac 7N8frac sqrt 221j 並沒有被利用到。主要是因為 frac sqrt 221j 的乘法運算會讓整個 FFT 變得複雜，但是如果藉由近似的方法，我們便可以將此一運算化簡為 12 個加法。 frac sqrt 22070710678212324262829 我們可以從上式注意到，frac sqrt 22 可以被近似為五個加法的結果，所以 frac sqrt 221j 就可以被簡化為只有六個加法，再算入實部與虛部的計算，總共只需 12 個加法器就可以運用到此一簡化特性。 經由與 22 基底類似的推導，並用串接的方式將旋轉因子以 8 為單位對 DFT 公式進行拆解，23 基底 FFT 演演算法進一步將複數乘法器的用量縮減到 log8N，並同時維持硬體架構的簡單性。 推導的方法與 22 基底相當類似。藉由這樣的方法，23 基底能將乘法器的用量縮減到 2 基底的 13，並同時維持一樣的記憶體用量以及控制電路的簡單性。 一般性分解 除了常在應用中見到與 2 相關基底的拆解法，對於更加一般性的 NN_1N_2 點離散傅立葉變換問題， 我們也有辦法在理論上進行拆解，將問題化為數個 N_1 與 N_2 點離散傅立葉變換問題，並可對計算量進行估計。 而特別的是，透過互質在數論上的特性，對於 N_1 與 N_2 互質的情況，可以進一步節省一些運算， 在下面會特別分開討論。 N_1N_2 非互質 為了避免之後的符號混淆，我們先將 N_1N_2 置換為 P_1P_2，也就是說接著要將 NP_1P_2 點離散傅立葉變換， 想辦法拆解為數個 P_1 與 P_2 點離散傅立葉變換問題。 接著定義要拆分的問題，要拆分的問題為 N 點離散傅立葉變換，將 f n 轉換至 F m： F msum_n0N1 eifrac 2piN mn f n qquad mn 01ldotsN1 直觀地說，這個 N 點離散傅立葉變換，將由 n 作為引數的函式 f n，轉換成由 m 作為引數的函式 F m， 並且 mn 都有 N 個可能的數值。 待定義好要拆分的問題，便可以開始討論如何進行拆分，基本概念是將有 N 個可能的數值的 mn， 分別化為個使用兩個引數進行描述的函式 mm_1m_2nn_1n_2，並藉此將原問題化為二維度離散傅立葉變換， 便可使用數個較小的離散傅立葉變換問題描述整個過程。 而一種很直覺的轉換方式，便是透過將 mn 分別除以 P_2P_1， 以商數與餘數來做為引數描述 mn 的值： n n_1 P_1 n_2 qquad m m_1 m_2 P_2 n_1m_1 01ldotsP_21 qquad n_2m_2 01ldotsP_11 其中 n_1 作為將 n 除以 P_1 的商數，與作為 m 除以 P_2 的餘數的 m_1 相同， 具有 P_2 個可能數值，同理 n_2 與 m_2 有 P_1 個可能數值。 將上述的引數代換及 NP_1P_2 帶入原式，可以得到： F m_1 m_2 P_2sum_n_10P_21sum_n_20P_11 eifrac 2piP_1P_2m_1 m_2 P_2n_1 P_1 n_2 f n_1 P_1 n_2 將右式的指數部分乘開並分項化簡可以得到： F m_1 m_2 P_2sum_n_10P_21sum_n_20P_11 f n_1 P_1 n_2 eifrac 2piP_2 m_1 n_1 eifrac 2piP_1 m_2 n_2 eifrac 2piP_1P_2 m_1 n_2 ei 2pi m_2 n_1 最後透過 ei 2pi 1 與 P_1P_2 N，可以得到： F m_1 m_2 P_2sum_n_20P_11 sum_n_10P_21 f n_1 P_1 n_2 eifrac 2piP_2 m_1 n_1 eifrac 2piN m_1 n_2 eifrac 2piP_1 m_2 n_2 觀察上式，並加上括號輔助釐清運算順序我們可以得到： F m_1 m_2 P_2sum_n_20P_11 leftleft sum_n_10P_21 f n_1 P_1 n_2 eifrac 2piP_2 m_1 n_1 right eifrac 2piN m_1 n_2 right eifrac 2piP_1 m_2 n_2 最內層的運算可以視為將雙引數函式 f n_1n_2 中的一個引數 n_1，透過離散傅立葉變換取代為由 m_1 描述， 得到一個新函式 G_1 m_1n_2這步因為對每個不同 n_2，都需要做一次將 n_1 取代為 m_1 的轉換， 共需要 P_1 個 P_2 點離散傅立葉變換： F m_1 m_2 P_2sum_n_20P_11 leftG_1 m_1n_2 eifrac 2piN m_1 n_2 right eifrac 2piP_1 m_2 n_2 下一層的運算則可視為單純的乘法，將 G_1 m_1n_2 與 eifrac 2piN m_1 n_2 相乘，得到 G_2 m_1n_2 這步需要的計算量視 frac m_1 n_2N 的特殊性而會有變化： F m_1 m_2 P_2sum_n_20P_11 G_2 m_1n_2 eifrac 2piP_1 m_2 n_2 最後的運算可以視為將函式 G_2 m_1n_2 中 n_2，透過離散傅立葉變換取代為由 m_2 描述， 得到一個新函式 G_3 m_1m_2這步因為對每個不同 m_1，都需要做一次將 n_2 取代為 m_2 的轉換， 共需要 P_2 個 P_1 點離散傅立葉變換： F m m_1 m_2 P_2G_3 m_1m_2 就成功僅使用 P_1 與 P_2 點離散傅立葉變換，描述了原先的 N 點離散傅立葉變換。 而在這樣的分解下，我們使用了 P_1 個 P_2 點離散傅立葉變換與 P_2 個 P_1 點離散傅立葉變換與一些額外的乘法， 並且這些額外使用的複數乘法 G_1 m_1n_2times eifrac 2piN m_1 n_2， 在電腦的運算架構中，如果 frac m_1 n_2N 是 frac 14 的倍數則不需要使用乘法， 如果 frac m_1 n_2N 是 frac 18frac 112 的倍數則僅需兩個實數乘法， 其他則需三個實數乘法，所以總運算量可以如下方式表示： P_2B_1 P_1B_2 3D_3 2D_2 其中 B_1 是 P_1 傅立葉所需乘法數， B_2 是 P_2 傅立葉所需乘法數， D_3 是需三個實數乘法 m_1 n_2 組合個數， D_2 是需兩個實數乘法 m_1 n_2 組合個數。 而常見以 2 為基底的分解則是為了使離散傅立葉變換所需乘法數為零，這樣就僅需考慮上面提到的額外乘法，可以提高效率也有較簡單的結構。 N_1N_2 互質 在 N_1N_2 互質的情況下，仍是採取和上面相近的思路來將問題進行拆分，首先，為了避免之後的符號混淆，我們同樣將 N_1N_2 置換為 P_1P_2。 接著同樣定義要拆分的問題： F msum_n0N1 eifrac 2piN mn f n qquad mn 01ldotsN1 接著就是和上面的演算法有最大差異的部分，在將 mn 化為個使用兩個引數進行描述的函式 mm_1m_2nn_1n_2 時， 最直覺的作法便是使用商數和餘數，但在 P_1P_2 互質的情況下，可以有一些其他更具技巧性的選擇。 當 P_1P_2 互質，對所有 n 01ldotsN1 我們可以找到唯一且不重複的一組 n_1n_2 使得： n n_1P_1 n_2P_2_N n_1P_1 n_2P_2 c_1N qquad 0 leq n_1 P_2 qquad 0 leq n_2 P_1 其中 a_N a mod N，代表取餘數的意思，c_1 是一個整數。 例如假設 N15 P_13 P_25，則 n 1 對應到的 n_1n_2 就是 22， 有 2 times 3 2 times 5 mod 15 16 mod 15 1。 並且對所有 n_1n_2 的組合 有 P_1 times P_2 N 組，都對應到一個特定不重複的 n。 同理我們可以把 m 01ldotsN1 表示為 m_1m_2 的雙引數函式： m m_1P_1 m_2P_2_N m_1P_1 m_2P_2 c_2N qquad 0 leq m_1 P_2 qquad 0 leq m_2 P_1 將上述的引數代換及 NP_1P_2 帶入原式，可以得到： F m_1P_1 m_2 P_2_Nsum_n_10P_21sum_n_20P_11 eifrac 2piNm_1P_1 m_2 P_2 c_2Nn_1 P_1 n_2P_2 c_1N f n_1 P_1 n_2P_2_N 接著透過一次的展開化簡及應用 ei 2pi 1 可得： begin align F m_1P_1 m_2 P_2_N sum_n_10P_21sum_n_20P_11 eifrac 2piNm_1P_1 m_2 P_2n_1 P_1 n_2P_2 ei 2pi c_2 n_1 P_1 n_2P_2 c_1N ei 2pi c_1 m_1 P_1 m_2P_2 c_2N ei 2pi c_1 c_2N f n_1 P_1 n_2P_2_N sum_n_10P_21sum_n_20P_11 eifrac 2piNm_1P_1 m_2 P_2n_1 P_1 n_2P_2 f n_1 P_1 n_2P_2_N end align 再將 NP_1P_2 帶入並再透過一次的展開化簡及應用 ei 2pi 1 可得： begin align F m_1P_1 m_2 P_2_N sum_n_10P_21sum_n_20P_11 f n_1 P_1 n_2P_2_N eifrac 2piP_2 m_1P_1 n_1 eifrac 2piP_1 m_2P_2 n_2 ei 2pi m_1 n_2 ei 2pi m_2 n_1 sum_n_10P_21sum_n_20P_11 f n_1 P_1 n_2P_2_N eifrac 2piP_2 m_1P_1 n_1 eifrac 2piP_1 m_2P_2 n_2 end align 觀察上式，並加上括號輔助釐清運算順序我們可以得到： F m_1P_1 m_2 P_2_Nsum_n_20P_11 leftsum_n_10P_21 f n_1 P_1 n_2P_2_N eifrac 2piP_2 m_1P_1 n_1 right eifrac 2piP_1 m_2P_2 n_2 內層的運算可以視為將雙引數函式 f n_1 P_1 n_2P_2_N 中的一個引數 n_1， 透過離散傅立葉變換取代為由一個與 m_1 有關的變數 m_3 m_1P_1_P_2 描述， 得到一個新函式 G_1 m_3n_2這步因為對每個不同 n_2，都需要做一次將 n_1 取代為 m_3 的轉換， 共需要 P_1 個 P_2 點離散傅立葉變換： F m_1P_1 m_2 P_2_Nsum_n_20P_11 G_1 m_3n_2 eifrac 2piP_1 m_2P_2 n_2 外層的運算可以視為將函式 G_1 m_3n_2 中的引數 n_2， 透過離散傅立葉變換取代為由一個與 m_2 有關的變數 m_4 m_2P_2_P_1 描述， 得到一個新函式 G_2 m_3m_4這步因為對每個不同 m_3，都需要做一次將 n_2 取代為 m_4 的轉換， 共需要 P_2 個 P_1 點離散傅立葉變換： F m F m_1P_1 m_2 P_2_N G_2 m_3m_4 G_2 m_1P_1_P_2m_2P_2_P_1 最後透過 F 與 G_2 在不同 m_1m_2 時的點點數值對應關係， 就成功僅使用 P_1 與 P_2 點離散傅立葉變換，描述了原先的 N 點離散傅立葉變換。 而這個方法透過聰明的選取表達 mn 的方式，使得拆解的過程中完全不需要多餘的乘法運算， 總運算量可以簡單表示為： P_2B_1 P_1B_2 3D_3 2D_2 其中 B_1 是 P_1 傅立葉所需乘法數， B_2 是 P_2 傅立葉所需乘法數。 雖然這個方法可以較上面的方法節省運算量， 但這個方法也牽涉較為複雜的 mn 與 m_1m_2n_1n_2 轉換，較為不直覺且不易理解， 也會遇到許多需要取餘數的運算，可能會需要較大的空間建表進行查表法。 最後關於實際上要如何求得 n 與 n_1n_2 的轉換關係， 可以先透過輾轉相除法取得一對特定的 n_11n_21 使得： n_11 P_1 n_21 P_2_N 1 然後我們可以知道對於任意整數 0 leq k N 有： kn_11 P_1 kn_21 P_2_N k kn_11 P_1 c_1N kn_21 P_2 c_2N_N kn_11 c_1P_2 P_1 kn_21c_2P_1 P_2_N 然後就可以得到： n_1k kn_11_P_2 qquad n_2k kn_21_P_1 滿足： n_1k P_1 n_2k P_2_N k qquad 0 leq n_1k P_2 qquad 0 leq n_2k P_1 參考資料 Widhe T J Melander et al 1997 Design of efficient radix8 butterfly PEs for VLSI Circuits and Systems 1997 ISCAS 97 Proceedings of 1997 IEEE International Symposium on Lihong J G Yonghong et al 1998 A new VLSIoriented FFT algorithm and implementation ASIC Conference 1998 Proceedings Eleventh Annual IEEE International Duhamel P and H Hollmann 1984 Splitradix FFT algorithm Electronics Letters 20 1 1416 Vetterli M and P Duhamel 1989 Splitradix algorithms for lengthpm DFTs Acoustics Speech and Signal Processing IEEE Transactions on 37 1 5764 Richards M A 1988 On hardware implementation of the splitradix FFT Acoustics Speech and Signal Processing IEEE Transactions on 36 10 15751581 Shousheng H and M Torkelson 1996 A new approach to pipeline FFT processor Parallel Processing Symposium 1996 Proceedings of IPPS 96 The 10th International Shousheng H and M Torkelson 1998 Designing pipeline FFT processor for OFDM de modulation Signals Systems and Electronics 1998 ISSSE 98 1998 URSI International Symposium on Category 快速傅立葉轉換演演算法