4-01 DFTとFFT〜乗算の数を比較してみよう(続き)

●最後のシートでに8点FFTを計算する

 
FFT(高速フーリエ変換、Fast Fourier Transform)では乗算の数を大幅に減らすことができます。

 calcFFTシートではまず入力 x[n] を図4‐08のように n = 0, 4, 2, 6, 1, 5, 3, 7 と並び替えます(元々はこの図のA列の並び)。

  図4-08 入力データの並びに注意

●並び替えには規則性がある

 この並び替えは「
ビット逆順ソート」と呼ばれ、表4‐02のような規則で x[n] を並び替えます(*1)。

(*1)もし x[n] がRAMに格納されている場合はアドレスビットの上〜下位を逆にして読み出せばよい。
元の順序 2進数にする ビット逆順 FFTでの順序
0 000 000 0
1 001 100 4
2 010 010 2
3 011 110 6
4 100 001 1
5 101 101 5
6 110 011 3
7 111 111 7
  表4-02 この規則でx[n]を並び替え

●FFT演算シートの各列の説明

 calcFFTシートの下の方に「フロー」と「各列」の対応図があります(図4‐09)。

 例えばtw1は「
ステージ1」の回転因子で4つとも右向き、すなわち複素数では"1+j 0"になり(これ参照)、図4‐08のtw1列もそのようになっています(real=1, imag=0)。

 mo1はx[n]に回転因子を掛けた結果になりますが、4つの回転因子は"1+j 0"すなわち"1"です。図4‐08のmo1列を見ると、x[n]がそのまま転写されています。

 mo1の値を足したり引いたりしたものがst1、これがステージ1の結果になります。図4‐08のst1列にそれらの値があります。

  図4-09 フローと各列の対応図

●ステージ2の結果は複素数になる

 tw2は「
ステージ2」の回転因子です。図4‐09では右向きと下向きがあり、図4‐10のtw2列(real/imag)では"1+j 0", "0-j 1"となっています(これ参照)。

 ステージ2の入力はst1、それにtw2をかけたものがmo2になります。回転因子が虚数部を含むことにより、mo2列は(real/imag)に分かれ、図4‐10のようになります(各セルをクリックすると計算式が見れる)。

 フローに沿って演算を進めるとステージ2の結果は図4‐10のst2列(real/imag)のようになります。

  図4-10 ステージ1の結果は実数、ステージ2の結果は複素数

●ステージ3の結果が8点FFTの結果になる

 tw3は「ステージ3」の回転因子です。図4‐09を見ると右向き、下向きに加え、斜め右下向き、左下向きがあります。図4‐11のtw3列(real/imag)には"0.707-j 0.707", "-0.707-j 0.707"が見られます(これ参照)。

 ステージ3の入力はst2、それにtw3をかけたものがmo3になります。入力、回転因子ともに虚数部を含むことから、mo3列(real/imag)の計算はやや複雑になります(各セルをクリックすると計算式が見れる)。

 フローに沿って演算を進めるとステージ3の結果は図4‐11のst3列(real/imag)のようになります。

  図4-11 calcFFTの右端に8点FFTの結果

●FFTとDFTは結局同じことなので・・・

 ひるがえってDFTの結果(図4‐12)を見ると、FFTの結果(図4‐11)と
一致していることが分かります(演算時の切り捨ての関係で小数点以下の値は微妙に違う)。

  図4-12 前のシート(calcDFT)を見る

●各セルをクリックして乗算(*)を数えてみる

 それでは乗算数を数えてみましょう。mo2列(real/imag)で計4回、mo3列(real/imag)で計12回、合計
16回の乗算が行われています(図4‐13、各セルをクリックすると計算式が見れる)。

 DFTが128回だったことを鑑みると大幅に減っていることが分かります。

  図4-13 赤枠のセルで乗算が行われている


●点数が多いと N -> log2(N) の違いが効いてくる

 このフローを見てわかるようにFFTの場合、複素乗算数は (N/2)*log2(N) になります。DFTはN*N なので、Nの数が増えるにつれてその差は著しく広がります(*1)。

(*1)N=4096の場合 -> log2(4096)=12 なので300倍以上速くなる可能性がある。


 FFTは点数が2の累乗という制限がありますが、高速化効果がこのように強大です。現状ではDFTは限定的に使われ、ほとんどのケースでFFTが使われます。

最初のページへ

目次へ戻る