高速フーリエ変換

提供:ペチラボ書庫
ナビゲーションに移動 検索に移動

高速フーリエ変換は 離散フーリエ変換 を高速に計算するアルゴリズムである。 計算結果は 離散フーリエ変換 と同じになる。 だいたいFFTと呼ばれる。

Cooley-Tukeyのアルゴリズム

[math]\displaystyle{ N }[/math] が2の累乗の場合で考える。

DFTの定義を整理する

まず離散フーリエ変換の定義を思い出しておく。

[math]\displaystyle{ X[k] = \sum ^{N-1}_{n=0} x[n] e^{-i\frac{2\pi kn}{N}} }[/math]

[math]\displaystyle{ W_N = e^{-i\frac{2\pi}{N}} }[/math]

とすれば、

[math]\displaystyle{ X[k] = \sum ^{N-1}_{n=0} x[n] W_N^{kn} }[/math]


k の偶奇で分ける

[math]\displaystyle{ k }[/math] の偶奇で分けて [math]\displaystyle{ k = 2d + b ~(0 \le d \lt \frac{N}{2}, 0 \le b \lt 2) }[/math] とすると

[math]\displaystyle{ \begin{eqnarray} X[2d+b] &=& \sum ^{N-1}_{n=0} x[n] W_N^{(2d+b)n} \\ &=& \sum ^{N-1}_{n=0} x[n] W_N^{2dn}W_N^{bn} \\ &=& \sum ^{N-1}_{n=0} x[n] W_{N/2}^{dn}W_{N}^{bn} \end{eqnarray} }[/math]


nを半分ずつに分ける

こうすると、 [math]\displaystyle{ W_N }[/math] の累乗が[math]\displaystyle{ N }[/math]周期であるのに対し、 [math]\displaystyle{ W_{N/2} }[/math] の累乗は[math]\displaystyle{ \frac{N}{2} }[/math]周期である。

そこで [math]\displaystyle{ n }[/math] を半分ずつに分ける。

[math]\displaystyle{ \begin{eqnarray} X[2d+b] &=& \sum ^{N-1}_{n=0} x[n] W_{N/2}^{dn}W_{N}^{bn} \\ &=& \sum ^{N/2-1}_{n=0} x[n] W_{N/2}^{dn}W_{N}^{bn} + \sum ^{N-1}_{n=N/2} x[n] W_{N/2}^{dn}W_{N}^{bn} \\ &=& \sum ^{N/2-1}_{n=0} x[n] W_{N/2}^{dn}W_{N}^{bn} + \sum ^{N/2-1}_{n=0} x[n+N/2] W_{N/2}^{d(n+N/2)}W_{N}^{b(n+N/2)} \\ &=& \sum ^{N/2-1}_{n=0} x[n] W_{N/2}^{dn}W_{N}^{bn} + \sum ^{N/2-1}_{n=0} x[n+N/2] W_{N/2}^{dn}W_{N}^{b(n+N/2)} \\ &=& \sum ^{N/2-1}_{n=0} (x[n]W_N^{bn} + x[n+N/2]W_N^{b(n+N/2)}) W_{N/2}^{dn} \end{eqnarray} }[/math]

FFT

こうして、[math]\displaystyle{ X[k] }[/math]をもとの半分の長さのDFTで表すことができる。

同じことを繰り返して計算量を O(NlogN) に削減できる。