今週の講義は金曜日のみです。演習はありません。本日のテーマは高速フーリエ変換です。 この言葉はいろいろなところで聞いたことがあるとおもいます。英語では Fast Fourie Transform、略称FFTとよび、先週学習した離散(逆)フーリエ変換のような 変換の定義ではなく、計算の高速化をはかるアルゴリズムのことです。
データ長がNの離散データの離散フーリエ変換は回転子
を要素にもつN次元の複素行列WとN次元のデータベクトルx の積
によって記述できることを示しました。その回転子行列が固有の性質 を持つことは、演習で確認したとおもいます。FFTはこの性質を巧みに 計算アルゴリズムに取り入れたものです。 前回の演習の時間(または復習)での最後の問題の計算は手を抜かずに 自身で計算しましたか。 FFTのアルゴリズムを理解するために、 まだ計算していない受講生は必ず確認してください。
このアルゴリズムの特徴を結論から説明していきましょう。 なぜそうなるかより、どうしているのかを追求します。 FFTの計算アルゴリズムはバタフライ演算と呼ばれる独特の 計算方式に帰着されます。 まずその計算の技法(教科書102ページ図 3.11)を確認します。
この計算では2つのデータの加算 (p[n] + p[m])と(複素)乗算および(複素)加算(p[n]- α p[m]) により変換しています。 N=2^M個のデータの離散フーリエ変換ではこの計算をM段、各段 においてN/2=2 M-1のバタフライ演算を行います。 このことはよく覚えておいてください。
以下ではほとんどの教科書がそうしているように、 データ長がN=23=8の場合について考えていきます。 教科書の102ページの図 3.11を見てください。この場合 M=3段のバタフライ演算を各段でN/2=22=4繰り返していることが ○印の個数で確認できるとおもいます。 それでは N=8の場合について回転子を複素空間上に図示しましょう。 回転子行列の構成は先週の演習問題の最後の解答と同じです。 ただし、議論の便宜上今回は要素番号をマイナス側にふっています。
バタフライ演算を実現するために、変換後の周波数ベクトルX の並び替えを行います。この並び替えはビットリバースを利用します。 要素番号をビット表示し、それを左右逆転させます。これにより 離散周波数ベクトルを
のように並び替えます。これは連立方程式を並び変えたことに相当しますので、 この順番で回転子の行列の列を並び替えます。 そうすると教科書99ページ(3.51)式に載っている行列と同じもの が導出できますので、各自確かめてみてください。
ここでは変数Xが横ベクトルですので列の交換をしてください。 教科書どおりにW8を並び替えてからそのエルミート行列 をとっても同じです。
教科書では 並び替えた行列のエルミート行列をW8'Hと表記しています。 さて、バタフライ演算はこの行列をブロックに分け演算を 細かくみていきますと、各段において先ほどのバタフライ演算 が実行されているのがわかります。
このように 離散フーリエ変換ではその係数が循環的であるために大幅に 計算を節約できることがわかります。これを最後にもうすこし 具体的にみてみましょう。 最初にFFTではM段で2/N=2M-1回の反復バタフライ演算を おこなっているわけですから、その演算回数は
本日学習したことについての補足します。
FFTのアルゴリズムを理解するためにプログラム (C, Java,C# etc) を自分で作成することを勧めます。エレガントなプログラム を借りてくればよいという考えももちろんありますが、 内容を理解するには、これが一番早道です。教科書どおりの 初等的なプログラムでよいので、是非自身で組んでみてください。 プログラム作成のポイントをまとめます。
ビットリバースによる要素並び替えプログラムを作成しておくと便利
CやC# でプログラムを組んだ場合、複素演算は組み込み関数として はありませんので、そのクラスライブラリを作成する必要があります。 がここでの複素演算は簡単ですので、実数部、虚数部に 最初から分けて演算したほうが得策です。
Cプログラムの作成例をここであげておきますので、できれば自分で プログラムを組んでから比べてみてください。プログラムは次回の 講義日に配布します。
今後の授業を理解するために、各自でプログラムを実行しながら 確かめてみてください。開発コードの使用法等については 次回の講義中に説明します。ところで 毎年計算ソフトの紹介をしているとダウンロードしたのに使えないという 問い合わせがあります。 授業で紹介するフリーソフトはいずれもLinuxの世界では ボランテイアにより提供されているものです。したがって 使用環境が異なると、使えないこともよくあります。 情報工学の関連分野の技術者、研究者をめざす学生諸君は ソースコードを取り寄せて自分でコンパイルするぐらい の気概をもってほしいと考えています。どうしてもだめなら どんどんこちらに質問してください。