信号処理論入門 第6章 §6.3 ★ バタフライとIFFTの流用
DFT を定義通り計算すると、各 k について N 回の積和を N 個の k に対して行うのでO(N2) の演算量になる。FFTは、回転因子 WN の対称性・周期性を使ってこれを O(NlogN) に落とすアルゴリズムである(N が2の冪のとき最も簡明)。
基本アイデアは分割統治である。長さ N の DFT を、偶数番目の標本と奇数番目の標本から成る長さ N/2 の DFT 二つに分け(時間間引き)、それらを回転因子で結合する。
X[k]=偶成分の N/2-DFTE[k]+WNk奇成分の N/2-DFTO[k],X[k+N/2]=E[k]−WNkO[k].
この一組の加減算をバタフライ演算と呼ぶ。同じ分割を再帰的に log2N 段くり返すと全体で O(NlogN) になる。たとえば N=1024 なら N2≈106 に対しNlog2N≈104 で、約100倍速い。
時間間引きでは、入力を偶奇に振り分けることを繰り返す都合上、入力(または出力)の並びがビットリバース順(添字の2進表現を逆順にした並び)になる。実装ではこの並べ替えを最初か最後に一度行う。
FFT の重要な応用が高速畳み込みである。長い畳み込み y=x∗h を直接計算するとO(N2) だが、畳み込み定理より Y[k]=X[k]H[k] だから、「FFT →周波数領域で要素ごとの積→逆FFT」とすれば O(NlogN) で済む。ただし DFT は巡回畳み込みを計算するので、線形畳み込みを得るにはx,h を十分に零詰めして周期化の巻き込みを防ぐ必要がある(§5.3参照)。
要点
順 FFT だけで逆 FFT を済ませる
逆 DFT は x[n]=N1∑kX[k]e+j2πkn/N で、符号が + である点だけが順 DFT
X[k]=∑nx[n]e−j2πkn/N と違う。そこで両辺の複素共役をとると
x[n]=N1k∑X[k]e−j2πkn/N=N1DFT{X[k]}⟹x[n]=N1DFT{X[k]}.
すなわち「入力を共役 → 順 FFT → 出力を共役 → N で割る」だけで逆 FFT が得られる(逆変換ルーチンが無くても順 FFT を流用できる)。これが Alice の流用手法の原理である。(別法:実部・虚部を入れ替える ℜ↔ℑ でも同じことができる。)
AI(Claude)が書いた教材を、木下が勉強しながら公開しています。式と数値は検算していますが、誤りが残っているかもしれません。誤りのご指摘・削除のご依頼をいただければ直します。 連絡先:support@tecktom.com