コラム13 FFTを理解する


●複素行列の因数分解を繰り返して高速化するFFT

 スマホアプリの「DFTのイメージ」におけるDFTは点数(N)が10でしたが、Nの値は百以上になるのが一般的です。
 DFTにおける複素乗算の回数は
N^2 になります。よってNが増えるにつれて演算量が膨大になり、演算に時間がかかったり、ハードが大きくなったりします。それを解決するために提案されたアルゴリズムがFFT(Fast Fourier Transform、高速フーリエ変換)です。


■点数が2の累乗なら劇的に乗算を減らせるFFT

 DFTの複素乗算回数がN^2であるのに対し、FFTのそれは
(N/2) log2(N)になります。前出マンガの例では8^2 = 64回だったものが(8/2) log2(8) = 12回に低減されました(図1‐75)。
 FFTの点数が256、512、1024・・・と増えていくとDFTとの差はさらに顕著になります(表1-1)。このようなFFTの発明により、波形のスペクトルが短時間で算出できるようになりました。


● AB+AC = A(B+C) がFFTの基本

 DFTの行列には「
周期性」と「対称性」が強く存在します。それらを利用して複素行列を上手に「因数分解」するのがFFTの本質です。その手順はスマホアプリ「FFT−高速化のメカニズム」をじっくりご覧になれば分かると思います。


●本稿で扱うFFTは「時間間引き」の手法

 なおFFTには主に2種類の手法があります。本稿で説明したものはx[n]のnを偶数と奇数に分けたりしているため「
時間間引き」の手法といいます。それに対しX[k]のkを偶数・奇数に分けていく手法を「周波数間引き」といいます。(*)

(*)周波数間引きのFFTを説明する秀逸なJavaアプレット(井澤裕司氏のサイト)。
http://www7b.biglobe.ne.jp/~yizawa/InfSys1/basic/chap7/index.htm



●FFTはデータの入れ方に工夫が必要になる
 ただ図1-75を見ると、入力データx[n]はn=0から順に並んでいるわけではなく、上からx[0], x[4], x[2], x[6], x[1], x[5], x[3], x[7]となっています。実はこの並び方には、表1-2のような「
ビットの並びが逆」という規則性があります。

 表1-2 FFTはこの順序で入力データx[n]を読み出してバタフライ演算する
元の順序 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


●データの入れ替えは意外と単純

 「時間間引き」の手法のFFTでは、同表のような入力x[n]の並び替え(
ビット逆順ソート)を行い、その後にバタフライ演算を実行します。また「周波数間引き」の手法のFFTでは、バタフライ演算の後、出力X[k]をビット逆順ソートするのが一般的です。


●ビット逆順ソートで多少時間がかかるがFFTの方が断然速い

 表1-1に示すように、Nが大きくなるにつれて演算量が大幅に低減されます。FFTには前処理として「ビット逆順ソート」が必要になりますが、それにかかる時間は微々たるものです。したがって昨今はほとんどの場合でFFTを適用します。


目次へ戻る