バックナンバーはこちら。
https://www.simulationroom999.com/blog/stock-predict-matlabpython-backnumber/
はじめに
前回は、離散フーリエ変換、逆離散フーリエ変換のバリエーションについて説明。
1/Nに伴う数式対称性によるバリエーションがある点に注意が必要。
そして今回からが本命のFFT、IFFTへ。
登場人物
博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
FFT、IFFTのバリエーション

まず最初に言っておくと、FFT、IFFTのバリエーションは
離散フーリエ変換(DFT)、逆離散フーリエ変換(IDFT)と同一だ。
よってバリエーションの話は終了。

まさかの一言で終了?!

ん?
ってことはDFTとFFTは同一のもの?
あれ?そうだっけ?

FFT、IFFTはDFT、IDFTを
とあるアルゴリズムを元に高速化したものだ。
よって、ベースとなる数式は同一なんだよね。

なるほど。
数式は同一なんだけど、演算方法が違うってだけなのか。

まぁその演算方法の都合、入力する時間領域の「サンプリングデータは2のべき乗」じゃないと使えないんだけどね。

そういえばそういう話は良く聞くなぁ?
なんで2のべき乗じゃないとダメなんだ?

バタフライ演算ってのをやってるから。

そのバタフライ演算ってのは・・・?
回転因子

バタフライ演算の前に回転因子について説明しよう。

回転因子?

オイラーの公式を覚えてる?

たしかこんなのだったよね?
\(e^{i\theta}=cos(\theta)+i sin(\theta)\)

そうそう。
そして、離散フーリエ変換、逆離散フーリエ変換で使用される指数関数はこんな感じだ。
\(\displaystyle e^{-i\frac{2\pi tx}{N}}\)
\(\displaystyle e^{i\frac{2\pi tx}{N}}\)

ポイント\(2\pi\)が入っている点で、
ここだけに着目すると、cos、sinの三角関数は必ず1周以上する。

うん。
単位がラジアンで考えると\(2\pi[rad]\)は\(360^{\circ}\)だもんね。

そして、サンプリング数、周波数数を決定する\(N\)で割ってる。

ということは、1周がN分割されてる????

この性質を利用したものが回転因子だ。
表現方法は以下になる。
\(W_N^n=\displaystyle e^{-i\frac{2\pi n}{N}}\)

イメージし易いよう\(N=8\)の場合の複素平面上の配置も出しておこう。


おー!
そうか、三角関数で表現し直せるから、こういう位置関係になるのか!

これはオイラーの公式様様って感じだね。

この回転因子のイメージがあるとこの先の説明が分かりやすくなると思うよ。
まとめ

まとめだよ。
- FFT、IFFTの数式上のバリエーションはDFT、IDFTと一緒。
- 元にしている数式自体は同一。
- FFT、IFFTはバタフライ変換による高速化を行ってる点で異なるのみ。
- バタフライ変換を理解するためには回転因子のイメージが重要。
- オイラーの公式のおかげで複素指数関数と三角関数が紐づく。
バックナンバーはこちら。
コメント