SSブログ

アルゴリズムの振り分け [任意点数のFFT]

これまでで一通りやりたいと思っていたFFT(Fast Fourier Transform)のアルゴリズムのいくつかの整理ができた。それぞれをどのように使い分けるかを考える。

アルゴリズムの振り分け

あと、Raderのアルゴリズム(英語のWikipediaの解説があるけどわかりにくい。こっちの方がまだしもわかったような気になれる)というNが素数の場合に対応する方法があって、こっちはやはり畳み込みを使うけどN-1のFFTに変換されるというものでChirp zよりも効率がいい。ただしNが素数の場合だけにしか使えないのと、Chirp zよりも複雑で難しい(誤り訂正や暗号とよく似た数論の話が出てくる)。ということでRaderのアルゴリズムはとりあえずおいておく。

これで3+1通りのアルゴリズムが手に入った。まとめると
  1. Kooley-TukeyのFFT(N=2n
  2. Chirp z変換(Nは任意)
  3. 混合基数(Nは素数以外)
  4. 定義式のままのDFT(Nは任意)
である。Chirp z変換は最終的に2の基数の3つのFFTに帰着させるので、Chirp z変換と2の基数のFFTができればとりあえずはすべてのNに対応できる。

Nが小さいとこういう高速化の効果は少ないし、今回の場合Fourier変換を何度も繰り返すわけではないので、小さなNに関しては定義式のままのDFTでやっても差は出ない。

これらをどう使い分けるかは悩ましいけど、例えばこう考えよう。図-3にフローチャートを示す。
0907fig3.png
フローチャートなんて書いたの何年ぶりだろう、ちょっとへんなところもあるけど。そういえば去年も書いたか。 ようするにまず2のベキかどうかを調べる。この場合一番速く計算できる。そうではない場合には素数かどうかを判定する。NN0(実行効率を測定した上で決定する定数)より小さい場合には定義通りに計算する。混合基数の場合にも素因数ごとに、N0より小さければ定義式のままで、大きければChirp zを使って展開する。

これでは例えば2n×3のときには2のベキのアルゴリズムは使われないことになる。でもめんどうだからいいよ、これで。

N0Nが素数の場合に定義通りに計算するのとChirp zを使うのとどちらが速くなるかで決めればいい。定義通りではかけ算回数はN2になって、Chirp zではおおまかには
0907eq44.png
ぐらい(これ、ほんとかな。桁ぐらいは合ってるだろ)なので、Nが100よりちょっと大きいあたりで逆転する。実際には足し算回数も効くしデータの並び方にもよるので、N0は実際に実行させてみて実験的に決めよう。
nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

献立09/15献立09/17 ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。