tecktom.com

高速 Fourier 変換(FFT)

2026年10月15日3分で読めますAI生成教科書『基礎理論』第6章 窓関数と高速 Fourier 変換(FFT)

AI 生成・木下が未勉強

信号処理論入門 第6章 §6.3 ★ バタフライとIFFTの流用

DFT を定義通り計算すると、各 kk について NN 回の積和を NN 個の kk に対して行うのでO(N2)O(N^2) の演算量になる。FFTは、回転因子 WNW_N の対称性・周期性を使ってこれを O(Nlog⁡N)O(N\log N) に落とすアルゴリズムである(NN が2の冪のとき最も簡明)。

基本アイデアは分割統治である。長さ NN の DFT を、偶数番目の標本と奇数番目の標本から成る長さ N/2N/2 の DFT 二つに分け(時間間引き)、それらを回転因子で結合する。

X[k]=E[k]⏟偶成分の N/2-DFT+WNkO[k]⏟奇成分の N/2-DFT,X[k+N/2]=E[k]−WNkO[k].X[k]=\underbrace{E[k]}_{\text{偶成分の }N/2\text{-DFT}}+W_N^{k}\underbrace{O[k]}_{\text{奇成分の }N/2\text{-DFT}},\quad X[k+N/2]=E[k]-W_N^{k}O[k].

この一組の加減算をバタフライ演算と呼ぶ。同じ分割を再帰的に log⁡2N\log_2 N 段くり返すと全体で O(Nlog⁡N)O(N\log N) になる。たとえば N=1024N=1024 なら N2≈106N^2\approx10^6 に対しNlog⁡2N≈104N\log_2 N\approx10^4 で、約100倍速い。

時間間引きでは、入力を偶奇に振り分けることを繰り返す都合上、入力(または出力)の並びがビットリバース順(添字の2進表現を逆順にした並び)になる。実装ではこの並べ替えを最初か最後に一度行う。

FFT の重要な応用が高速畳み込みである。長い畳み込み y=x∗hy=x* h を直接計算するとO(N2)O(N^2) だが、畳み込み定理より Y[k]=X[k]H[k]Y[k]=X[k]H[k] だから、「FFT →周波数領域で要素ごとの積→逆FFT」とすれば O(Nlog⁡N)O(N\log N) で済む。ただし DFT は巡回畳み込みを計算するので、線形畳み込みを得るにはx,hx,h を十分に零詰めして周期化の巻き込みを防ぐ必要がある(§5.3参照)。

要点

順 FFT だけで逆 FFT を済ませる
逆 DFT は x[n]=1N∑kX[k] e+j2πkn/Nx[n]=\dfrac1N\sum_k X[k]\,\mathrm{e}^{+\mathrm{j}2\pi kn/N} で、符号が ++ である点だけが順 DFT X[k]=∑nx[n] e−j2πkn/NX[k]=\sum_n x[n]\,\mathrm{e}^{-\mathrm{j}2\pi kn/N} と違う。そこで両辺の複素共役をとると

x[n]‾=1N∑kX[k]‾ e−j2πkn/N=1N DFT{X[k]‾}⟹x[n]=1N DFT{X[k]‾}‾.\overline{x[n]}=\frac1N\sum_k \overline{X[k]}\,\mathrm{e}^{-\mathrm{j}2\pi kn/N} =\frac1N\,\mathrm{DFT}\bigl\{\overline{X[k]}\bigr\} \quad\Longrightarrow\quad x[n]=\frac1N\,\overline{\mathrm{DFT}\bigl\{\overline{X[k]}\bigr\}}.

すなわち「入力を共役 →\to 順 FFT →\to 出力を共役 →\to NN で割る」だけで逆 FFT が得られる(逆変換ルーチンが無くても順 FFT を流用できる)。これが Alice の流用手法の原理である。(別法:実部・虚部を入れ替える ℜ↔ℑ\Re\leftrightarrow\Im でも同じことができる。)

木下の勉強ステータス

木下はまだこの記事を勉強していません。

AI(Claude)が書いた教材を、木下が勉強しながら公開しています。式と数値は検算していますが、誤りが残っているかもしれません。誤りのご指摘・削除のご依頼をいただければ直します。 連絡先:support@tecktom.com

← AI生成教科書『基礎理論』の記事一覧へ