互質因子算法

来自testwiki
imported>Sw7772023年2月1日 (三) 13:16的版本
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转到导航 跳转到搜索

互質因子算法(Prime-factor FFT algorithm, PFA),又稱為Good-Thomas算法[1] [2],是一種快速傅立葉變換(FFT),把N = N1N2大小的離散傅立葉變換重新表示為N1 * N2大小的二維離散傅立葉變換,其中N1N2互質。變成N1N2大小的傅立葉變換後,可以繼續遞迴使用PFA,或用其他快速傅立葉變換算法來計算。

較流行的Cooley-Tukey算法經由mixed-radix一般化後,也是把N = N1N2大小的離散傅立葉變換分割為N1N2大小的轉換,但和互質因子算法 (PFA)作法並不相同,不應混淆。Cooley-Tukey算法N1N2不需互質,可以是任何整數。然而有個缺點是比PFA多出一些乘法,和單位根twiddle factors相乘。相對的,PFA的缺點則是N1N2互質 (例如N 是2次方就不適用),而且要藉由中國剩餘定理來進行較複雜的re-indexing。互質因子算法 (PFA)可以和mixed-radix Cooley-Tukey算法相結合,前者將N 分解為互質因數,後者則用在重複質因數上。

PFA也與nested Winograd FFT算法密切相關,後者使用更為精巧的二維摺積技巧分解成N1 * N2的轉換。因而一些較古老的論文把Winograd算法稱為PFA FFT。

儘管PFA和Cooley-Tukey算法並不相同,但有趣的是Cooley和Tukey在他們1965年發表的有名的論文中,沒有發覺到高斯和其他人更早的研究,只引用Good在1958年發表的PFA作為前人的FFT結果。剛開始的時候人們對這兩種作法是否不同有點困惑。

算法

離散傅立葉變換(DFT)的定義如下:

Xk=n=0N1xne2πiNnkk=0,,N1

PFA將輸入和輸出re-indexing,代入DFT公式後轉換成二維DFT。

Re-indexing

N = N1N2N1N2兩者互質,然後把輸入n 和輸出k 一一對應

n=n1N2+n2N1modN

N1N2 互質,故根據最大公因數表現定理,對每個n 都存在滿足上式的整數n1n2,且在同餘N 之下n1可以調整至0~N1 –1之間,n2可以調整至0~N2 –1之間。並根據同餘理論易知滿足上式且在以上範圍內的整數n1n2是唯一的。這稱為Ruritanian 映射 (或Good's 映射),

k=k1modN1
k=k2modN2

舉例來說:

如果N=15,N1=5,N2=3,n=0,1,2,...,12,13,14,對於任一 n 都可以對應到

n=n1N2+n2N1modN,n1=0,1,...,N11,n2=0,1,...,N21

0=0N2+0N1mod15

1=2N2+2N1mod15

2=4N2+1N1mod15

3=1N2+0N1mod15

4=3N2+2N1mod15

5=0N2+1N1mod15

6=2N2+0N1mod15

7=4N2+2N1mod15

8=1N2+1N1mod15

9=3N2+0N1mod15

10=0N2+2N1mod15

11=2N2+1N1mod15

12=4N2+0N1mod15

13=1N2+2N1mod15

14=3N2+1N1mod15

N1N2 互質,故根據中國剩餘定理,對於每組 ( k1 , k2 ) (其中k1在0~N1 – 1之間, k2在0~N2 – 1之間),都有存在且唯一的k 在0~N - 1之間且滿足上兩式。這稱為 CRT 映射。 CRT 映射的另一種表示法如下

k=k1N21N2+k2N11N1modN

其中N1-1表示N1N2之下的反元素N2-1反之。

( 也可以改成對輸入n CRT 映射以及對輸出kRuritanian 映射)

對於有效re-indexing (理想上是達到原地)的方法有許多研究[3],以減少耗費時間的運算。

DFT re-expression

表示方法一:

將以上的re-indexing代入DFT公式裡指數部分的nk 之中,

e2πiNnk=e2πiN(n1N2+n2N1)k=e2πiN1kn1e2πiN2kn2=e2πiN1k1n1e2πiN2k2n2

( 因為ei = 1,所以兩個指數的k 部份可以分別N1N2 )。剩下的部分變成

Xk1,k2=n1=0N11(n2=0N21xn1N2+n2N1e2πiN2n2k2)e2πiN1n1k1.

則內部和外部的總和分別轉換成大小為N2N1的DFT。

表示方法二:

如果令 k=k1N2+k2N1fork=0,1,...,N1,

n=((n1N2+n2N1))N()N相當於取 N的餘數,n1=0,,N11, n2=0,,N21

X[((k1N2+k2N1))N]=n=0N1x[((n1N2+n2N1))N]ej2πN2N1(k1N2+k2N1)(n1N2+n2N1)

=n=0N1x[((n1N2+n2N1))N]ej2πN2N1(k1n1N2N2+k2n2N1N1+k1n2N2N1+k2n1N1N2)

=n=0N1x[((n1N2+n2N1))N]ej2πN1(k1n1N2)ej2πN2(k2n2N1)

=n2=0N21{n1=0N11x[((n1N2+n2N1))N]ej2πN1(k1n1N2)}ej2πN2(k2n2N1).

對於每一個 n2 都要做一個 N1 點的 DFT,而因為 n2=0,,N21N2個,所以需要 N2N1DFT,

對於每一組((k1N2))N1都要做一個 N2 點的 DFT,而因為 N2為常數,k1=0,,N11N1 個,所以需要 N1N2DFT

因此如果要計算複雜度,可以乘法器的數量當作考量,

假設N1 點的 DFT 需要 M1個乘法器,

假設N2 點的 DFT 需要 M2個乘法器,

則總共需要 N2M1+N1M2個乘法器。

範例

N = 6為例,有兩種可能,N1 = 2, N2 = 3或N1 = 3, N2 = 2。

N1 = 2, N2 = 3
N1 = 3, N2 = 2

第一種情形所產生的流程圖如左圖所示。先做2次3點DFT後再做3次2點DFT。

第二種情形所產生的流程圖如右圖所示。先做3次2點DFT後再做2次3點DFT。

其中2點DFT的部份因構造單純,皆以交錯的蝴蝶圖來顯示。

可以看出即使在這個簡單的例子中,輸入和輸出的index也都經過有點複雜的重新排列。

與Cooley-Tukey算法的比較

如首段所述,Cooley-Tukey算法和互質因子算法 (PFA)曾被誤認為很類似。兩者皆有各自優點可適用於不同狀況,因此分辨它們的不同是很重要的。在1965年著名的論文中發表的Cooley-Tukey算法,是在DFT的定義

Xk=n=0N1xne2πiNnkk=0,,N1

中代入n = n1 + n2N1 , k = k1N2 + k2,則

e2πiNnk=e2πiN(n1+n2N1)(k1N2+k2)=e2πiN1n1k1e2πiNn1k2e2πiN2n2k2
Xk1N2+k2=n1=0N11(n2=0N21xn1+n2N1e2πiN2n2k2)e2πiNn1k2e2πiN1n1k1

比PFA多了一些要乘的因子e2πiNn1k2 (稱為twiddle factors ),但index較為簡單,且適用於任何N1N2。在J. Cooley稍後發表的關於FFT歷史探討的論文[4]中使用N = 24點FFT為例,顯示兩種作法在index結構上的不同。

相關條目

注釋

Template:Reflist

參考文獻

  1. Template:Citation

外部連結

Template:Authority control