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

●EXCELでフーリエ変換は出来ない!?

 まずはこのマンガを読んでみてください。

 ひとまず「
フーリエ変換」を理解したとします。それでは実際にパソコンで計算してみよう・・・あれっ?積分のプログラムってどう書くんだっけ?・・・いわゆる「アナログ版フーリエ変換」ではここで思考停止してしまいます。

 そこで考えられたのが
DFT(Discrete Fourier Transform)です。このExcelをダウンロードして開いてみましょう。最初のREADMEシート(図4‐01)にEXCELファイルの簡単な説明があります。

  図4-01 最初のシートREADME

●DFTならEXCELで計算できる!

 このEXCELでは「8点DFT」を行います。READMEの図にあるように、8点の入力 x[n] に 8×8の「
回転因子行列」を乗算すると8点の出力 X[k] が得られます。

 回転因子行列はこのような複素ベクトルからなります。8ステップで単位円を一周、8点DFTならこの8種類のみになります。

 回転因子はmatTwiddleシートで生成します。図4‐02のように、IMEXP関数の引数に複素数の実数部、虚数部を入れ、ROW、COLUMNに応じて角度を変えることにより図4‐01のような行列を生成します。

  図4-02 回転因子行列を計算するmatTwiddleシート

●回転因子行列を実数部、虚数部に分ける

 matTwiddleシートで生成する値は
複素数ですが(*1)、見やすく・計算しやすくするために実数部と虚数部を分離します。

 図4‐03(a)のようにmatRealシートにその実数部、同図(b)のようにmatImagシートにその虚数部を置きます。

(*1)IMEXP関数の出力は複素数だが「文字列」なので桁数を調整することができない。IMREAL/IMAGINARY関数で分離して数値化する。
(a)

(b)
  図4-03 matRealシートに実数部、matImagシートに虚数部

●実数部と虚数部を別々に行列乗算

 calcDFTシートでは
DFTを計算します。入力はx[0]〜x[7]の8点の実数、出力はX[0]〜X[7]の8点の複素数になります。

 行列乗算は図4‐04のようになり、実数部に8回、虚数部にも8回の乗算が必要になります。出力は複素数なので、1点計算するのに16回の乗算、8点計算するのに
128回の乗算を行います。

  図4-04 各セルをクリックして演算を見てみる

●DFTの点数が多いと大変なことに…

 N点DFTでは(N^2)*2回の乗算が必要になります。DFTの点数は一般的に1024以上になることが多く、表4‐01に示すように多量の乗算が必要になり、演算に時間がかかるようになります。
DFTの点数 乗算の数
8 128
16 512
64 8,192
256 131,072
1024 2,097,152
4096 33,554,432
  表4‐01 乗算は加算よりも時間がかかるのでその数に注意

●次のページでFFTを説明します!

 そこで考えられたのがFFTです(図4‐05、READMEシートの下の方)。このようなバタフライ演算により乗算数が劇的に減少し(*2)、フーリエ変換ががより現実的になります。

(*2)なぜこのようなフローになるのかはこのサイト参照(スマホアプリで説明)。

 それではcalcFFTシートを見てみましょう。

  図4-05 8点の場合、3つのステージでFFT完成

次のページへ

目次へ戻る