FFTを数式で書いてみた
FFTについてgoogle先生にお聞きしてみると,実装できるところまで解説したらおしまい,という形をとってるものが多い気がします。 実際,実装できればいいというのはそのとおりだと思いますが,やはりアルゴリズムの理解という意味では自分で手を動かして計算してみるのが一番ではないかと思います。
というわけでFFTに対する理解を深めるために,式を立ててみました。 自分へのメモがてらまとめておきます。
ちなみにデータ数が2の累乗数のときに限定して話を進めます。
なお,自分で考えて導出した式なので間違ってる可能性も大いにあります。
※2019/5/9 : 順変換の式のの範囲が一部間違ってたので修正しました。 ※2019/5/10 : 分割した式のの添字が一部間違ってたので修正しました。
FFTとは
FFTとは Fast Fourier Transform 略で,離散フーリエ変換を計算機上で高速に計算するアルゴリズムです。離散フーリエ変換の計算量はですが,FFTの計算量はデータ数が2の累乗数のときに限りです。
離散フーリエ変換(Descrete Fourier Transform)
離散フーリエ変換(以下,DFT)はフーリエ変換を離散化したもので,周波数解析などでよく使われます。順変換は,虚数単位,データ数,ネイピア数,円周率を用いて
と定義され,逆変換は
と定義されます。
この式を変形していくと,データ数のDFTはデータ数のDFT2に分割できます。この分割作業を再帰的に繰り返していくことで計算量をにまで落とすことができるのです。
Cooley-Tukey型アルゴリズム
今回は,いくつかあるらしいFFTのアルゴリズムのうち,Cooley-Tukey型と言われるアルゴリズムに従って式を変形していきます。
まず,計算を簡単化するためにデータ数は自然数を用いてとかけるとします。 それと,DFTの式を
と書き換えます。 このとき,としました。
順変換
まず,順変換について考えます。 順変換の式を変形すると
と書くことができます。 この式はの範囲をとすると
という2つの式であらわすことができます。 ここで,は指数関数の性質を考えると
という性質を持ちます。 これを考えると,上の2つの式はそれぞれ
として書くことができます。 この式を見てみると,データ数のDFTが2つあらわれていることがわかります。
では,2つのDFTを
として,これら2つを分割することを考えてみます。 最初に分割したときと同様の手順を取ることで分割してみると,
となります。 ここで,は,です。
このような手順を繰り返していくと,最終的にデータ数のDFTの順変換は1以上以下の整数を用いて,
と置くとがであり,かつとしたときは
と書くことができます。
これで順変換の式を求めることができました。
逆変換
次に,逆変換について考えます。 逆変換の式中にあるをと置き換えてみると
と書き直すことができます。 そしてはと同様に
という性質を持ちます。 つまり,順変換のときとまったく同じように式変形することができます。 順変換と同脳の変形を行うと逆変換は
と置くとがであり,かつとしたとき
となります。
総括
まとめです。
DFT前の関数を,DFT後の関数をとしたとき,データ数のDFTの順変換はとして
と書くことができ,であるようなを用いてはの範囲で
と書くことができます。
同様にDFTの逆変換は
と書くことができ,は
と書くことができます。
DFTの順変換,逆変換の式中で用いたは1か0をとるものとします。
上の式の,を見てみると,それぞれビットの順序を入れ返す作業が行われてることがわかります。 よくFFTの解説で見るビットの順序を入れ替える操作はこの式と対応づいているわけです。
実際に実装する場合,0からまでを計算することになります。 これは回の計算なのでのオーダーです。 さらに各はのオーダーで計算できるので最終的に,計算量がになります。
ちなみに,多倍長演算にもFFTと同じ考え方が使われているらしいので,多倍長演算用のアルゴリズムなんかも調べてみたいです。