Cooley –Tukeyアルゴリズムは、JW CooleyとJohn Tukeyにちなんで名付けられた、最も一般的な高速フーリエ変換(FFT)アルゴリズムです。任意の合成サイズの離散フーリエ変換(DFT)を、 N 1 個のより小さなサイズN 2のDFTで再帰的に表現することで、高度に合成されたN(滑らかな数)の場合、計算時間をO( N log N )に短縮します。このアルゴリズムの重要性から、特定の変種や実装スタイルは、以下に示すように、それぞれ独自の名前で知られています。
基数2のDITは、まず偶数インデックスの入力 と奇数インデックスの入力のDFTを計算し、次にこれら2つの結果を組み合わせてシーケンス全体のDFTを生成します。この考え方は再帰的に実行することで、全体の実行時間をO( N log N )に短縮できます。この簡略化された形式では、Nは2のべき乗であると仮定しています。サンプルポイントの数Nは通常、アプリケーションによって自由に選択できるため(例えば、サンプルレートやウィンドウの変更、ゼロパディングなど)、これは多くの場合重要な制約ではありません。
X 0,..., N −1 ← ditfft2 ( x , N , s ): (x 0 , x s , x 2 s , ..., x ( N -1) s ) の DFT : N = 1 の場合、X 0 ← x 0自明なサイズ 1 DFT 基本ケース、それ以外の場合、X 0,..., N /2−1 ← ditfft2 ( x , N /2, 2 s ) (x 0 , x 2 s , x 4 s , ..., x ( N -2) s ) の DFT X N /2,..., N −1 ← ditfft2 ( x +s, N /2, 2 s ) k = 0 から (N/2)-1までの (x s , x s +2 s , x s +4 s , ..., x ( N -1) s ) の DFT は、2 つの半分の DFT を結合します: p ← X k q ← exp(−2π i / N k ) X k + N /2 X k ← p + q X k + N /2 ← p − q 終了 終了if
ここで、ditfft2( x , N ,1) は、基数 2 の DIT FFT によってX =DFT( x )をアウトオブプレースで計算します。ここで、 Nは 2 の整数乗であり、s =1 は入力x配列のストライドです。 x + s は、 x sで始まる配列を示します。
一般的な因数分解におけるCooley-Tukey FFTの基本ステップは、1次元DFTを2次元DFTのようなものとして再解釈することと見ることができます。長さN = N 1 N 2の1次元入力配列は、列優先順序で格納されたN 1 × N 2の2次元行列として再解釈されます。まず、N 2方向(非連続方向)に沿って小さな1次元DFTを実行し、次に位相係数(回転係数)を乗算し、最後にN 1方向に沿って1次元DFTを実行します。転置ステップは、ここに示すように途中で実行することも、最初または最後に実行することもできます。これは、小さな変換に対して再帰的に実行されます。
より一般的には、クーリー・テューキーアルゴリズムは、複合サイズN = N 1 N 2のDFTを再帰的に次のように再表現する:[ 10 ]
一般的なクーリー・テューキー分解は、添え字kとnをそれぞれとに書き換える。ここで添え字k aとn aは0からN a -1(aは1または2)までの範囲である。つまり、入力(n)と出力(k)をそれぞれ列優先と行優先のN 1 × N 2の2次元配列に再添え字付けする。これらの添え字付けの違いは、前述のように転置である。この再添え字付けをnkのDFT式に代入すると、交差項は消滅し(その指数は1)、残りの項は次のようになる 。
Cooley と Tukey [ 3 ]および Gauss (基数 3 と基数 6 の手順の例を示した)の両方によって示されているように、任意の基数r (および混合基数) を使用できます。 [ 2 ] Cooley と Tukey は当初、基数バタフライには O( r 2 ) の作業が必要であると想定し、基数rの複雑性をO( r 2 N / r log r N ) = O( N log 2 ( N ) r /log 2 r ) と計算しました。 rの値が2 から 12 までの整数の場合のr /log 2 rの値を計算すると、最適な基数は 3 ( eに最も近い整数で、 r /log 2 rを最小化する)であることがわかります。[ 3 ] [ 17 ] しかし、この分析は誤りであった。基数バタフライもDFTであり、FFTアルゴリズムを使用してO( r log r )の演算で実行できるため、基数rは実際には計算量O( r log( r ) N / r log r N )で打ち消され、最適なrはより複雑な考慮によって決定される。実際には、例えば現代のプロセッサの多数のプロセッサレジスタを効果的に活用するためには、かなり大きなr (32または64)が重要であり、[ 13 ]また、無制限の基数r = √ NでもO( N log N )の計算量を達成し、前述のように大きなNに対して理論的および実用的な利点がある。 [ 14 ] [ 15 ] [ 16 ]
最もよく知られている並べ替え手法では、インプレース radix-2 アルゴリズムで明示的なビット反転が使用されます。ビット 反転とは、インデックスnのデータが、数字b 4 b 3 b 2 b 1 b 0 (たとえば、N =32 入力の場合は 5 桁) で 2 進数で記述され、数字が反転されたb 0 b 1 b 2 b 3 b 4でインデックスに転送される置換です。上記に示したような、出力が入力にインプレースで上書きされる radix-2 DIT アルゴリズムの最終段階について考えます。と がサイズ 2 の DFT と組み合わされると、これら 2 つの値は出力によって上書きされます。ただし、2 つの出力値は、最上位ビットb 4 ( N =32 の場合)に対応する出力配列の前半と後半に入る必要があります。一方、2 つの入力 とは、最下位ビットb 0に対応する偶数要素と奇数要素にインターリーブされます。したがって、出力を正しい場所にするためには、b 0 をb 4の代わりに使用し、インデックスはb 0 b 4 b 3 b 2 b 1になります。次の再帰ステージでは、これらの最下位 4 ビットはb 1 b 4 b 3 b 2になります。基数 2 DIT アルゴリズムの再帰ステージをすべて含める場合、すべてのビットを逆にする必要があり、したがって、順序どおりの出力を得るためには、入力をビット反転で前処理 (または出力を後処理) する必要があります (サイズN /2 の各サブ変換が連続するデータに対して動作する場合、DIT入力はビット反転によって前処理されます)。同様に、すべての手順を逆の順序で実行すると、後処理 (または前処理) でビット反転を行う基数 2 DIF アルゴリズムが得られます。
アルゴリズムiterative-fftの入力: n 個の複素数値の配列a (n は 2 の累乗)。 出力: a の DFT である配列A。 ビット逆コピー(a, A) n ← a .length s = 1からlog( n )まで、m ← 2 s ω m ← exp(−2π i / m ) k = 0からn -1まで、mによって、 ω ← 1 j = 0からm / 2 – 1まで、t ← ω A [ k + j + m /2] u ← A [ k + j ] A [ k + j ] ← u + t A [ k + j + m /2] ← u – t ω ← ω ω mAを返す
ビット逆コピー手順は次のように実装できます。
アルゴリズムbit-reverse-copy( a , A )の入力: n 個の複素数値の配列a (n は 2 の累乗)。 出力:サイズnの配列A。n ← a .length 、k = 0からn – 1 までA [rev(k)] := a [k] を実行する
A typical strategy for in-place algorithms without auxiliary storage and without separate digit-reversal passes involves small matrix transpositions (which swap individual pairs of digits) at intermediate stages, which can be combined with the radix butterflies to reduce the number of passes over the data.[13][27][28][29][30]
References
^Gauss, Carl Friedrich (1866). "Theoria interpolationis methodo nova tractata" [Theory regarding a new method of interpolation]. Nachlass (Unpublished manuscript). Werke (in Latin and German). Vol. 3. Göttingen, Germany: Königlichen Gesellschaft der Wissenschaften zu Göttingen. pp. 265–303.
^James W. Cooley, Peter A. W. Lewis, and Peter W. Welch, "Historical notes on the fast Fourier transform," Proc. IEEE, vol. 55 (no. 10), p. 1675–1677 (1967).
^ Danielson, GC、C. Lanczos、「実用的なフーリエ解析の改良と液体からのX線散乱への応用」、 J. Franklin Inst. 233、365–380、435–452 (1942)。
^ a b c S. G. Johnson と M. Frigo、「FFT の実際の実装」、『高速フーリエ変換』(CS Burrus 編)、第 11 章、ライス大学、ヒューストン、テキサス州:Connexions、2008 年 9 月。
^ a b Gentleman WM、G. Sande、「高速フーリエ変換 - 楽しみと利益のために」、Proc. AFIPS 29、563–578 (1966)。
^ a b Bailey, David H.、「外部メモリまたは階層メモリにおけるFFT」、J. Supercomputing 4 (1), 23–35 (1990)
^ a b M. Frigo, CE Leiserson, H. Prokop, S. Ramachandran. キャッシュ忘却アルゴリズム. Proceedings of the 40th IEEE Symposium on Foundations of Computer Science (FOCS 99), p.285-297. 1999. IEEE の拡張概要、Citeseer に掲載。
^ Cooley, JW, P. Lewis, P. Welch, "高速フーリエ変換とその応用", IEEE Trans on Education 12 , 1, 28–34 (1969)
^ Rubio, M.; Gómez, P.; Drouiche, K. (2002). 「新しい超高速ビット反転アルゴリズム」. International Journal of Adaptive Control and Signal Processing . 16 (10): 703– 707. doi : 10.1002/acs.718 . S2CID 62201722 .
^ Temperton, C. (1991). 「自己ソート型インプレース高速フーリエ変換」. SIAM Journal on Scientific and Statistical Computing . 12 (4): 808– 823. doi : 10.1137/0912043 .
^ Qian, Z.; Lu, C.; An, M.; Tolimieri, R. (1994). 「最小作業スペースを備えた自己ソート型インプレースFFTアルゴリズム」. IEEE Transactions on Signal Processing . 52 (10): 2835– 2836. Bibcode : 1994ITSP...42.2835Q . doi : 10.1109/78.324749 .