高速フーリエ変換(FFT)

高速フーリエ変換は、得られる結果自体はこの離散フーリエ変換とまったく同じなのですが、計算アルゴリズムを工夫することで、掛け算の回数をN**2回より減らすものです。

Nが素数でなく複数の自然数(1を除く)の積で表わせるのであれば使える手法ですが、特にNが2のべき乗数(512や1024など)の場合が代表的です。

このアルゴリズムを一般的に記述するのは難しいので、ここではN=8の場合を例にとって示しましょう。

【手順1】
入力信号列である(f0、f1、f2、f3、f4、f5、f6、f7)を、次のように並べ替えます。

(f0、f4、f2、f6、f1、f5、f3、f7)

一般的にいうと、N=2**mの時、0、1、・・・、N-1という数をそれぞれNビットの2進数で表わし、そのN桁の並べ順を完全に逆にし、その結果できた値の順番で並べるということです。

ビット逆順並べ替えと呼ばれます。

今回の場合はm=3なので、逆順にする前は以下のパターンということになります。

(000、001、010、011、100、101、110、111)

これを逆順にすると、以下のようになります。

(000、100、010、110、001、101、011、111)

すなわち0、4、2、6、1、5、3、7ということです。

この数列を新たな順番として、fの値を並べ替えるわけです。

【手順2】
並べ替えた8つの数字に対し、左から順に2つずつを1組とします。

その各組に対して以下の演算を行います。

[a,b]→[a+b,a-b]

この結果、やはり2つ1組の数が発生します。

その2つ1組をそのまま左から順に並べます。

そうして得られた8つの数(8次元ベクトル)を便宜的に(g0、g1、g2、g3、g4、g5、g6、g7)と書きます。

その中味は以下の通りです。

(f0+f1、f0-f1、f2+f3、f2-f3、f4+f5、f4-f5、f6+f7、f6-f7)。

【手順3】
(g0、g1、g2、g3、g4、g5、g6、g7)に対し、今度は左から順に4つずつを1組とし、各組に対して以下の演算を行います。

[a,b,c,d]→[a+c,b-i*d,a-c,b+i*d]

そうして得られた4つ1組をそのまま左から順に並べます。

そうして得られた8つの数(8次元ベクトル)を便宜的に(h0、h1、h2、h3、h4、h5、h6、h7)と書きます。

その中味は以下の通りです。

(g0+g2,g1-i*g3,g0-g2,g1+i*g3,g4+g6,g5-i*g7,g4-g6,g5+i*g7)とりあえず手順3としてはこの通りなのですが、その意味を正確に把握するために、4つ1組に対する演算結果を以下のように考えるのがよいでしょう。

[a+p0*c,b+p1*d,a+p2*c,b+p3*d]ただしp0=1、p1=-i、p2=-1、p3=i

このp0、p1、p2、p3は、実は下記のように一般的に書くことができます。

pk=exp(-2kπi/4)ここでk=0、1、2、3

一般にexp(i *z)=cos(z)+ i *sin(z)なので、実際に上記のようなpの値が得られるのです。

【手順4】
(h0、h1、h2、h3、h4、h5、h6、h7)に対し、今度は左から順に8つずつを1組とし、各組に対して以下の演算を行います。

なお、データ数(N)を8としているので、「各組」とはいっても、この場合にできるのは1組だけです。

[a,b,c,d,e,f,g,h]

[a+ q0*e,b+q1*f,c+q2*g,d+q3*h,a+ q4*e,b+q5*f,c+q6*g,d+q7*h]
ただしqk=exp(-2kπi/8) ここでk=0、1、2、3、4、5、6、7。

そうして得られた8つ1組をそのまま左から順に並べます。

くどいようですが、N=8の時は1組だけです。

これがN=8の時の高速フーリエ変換のアルゴリズムです。

N=2**mの時、手順はm+1まで続くことになります。

なぜこれで離散フーリエ変換が実現できるかの説明は省略します。

重要なことは、これにより掛け算の回数を減らすことができる、という点です。

たとえば上記手順4の中では、掛け算が8回出てきます。

実は一般に、手順2から手順m+1のそれぞれに対して、掛け算はN回出てきます。

m=log2 N(2を底とするNの対数)なので、結局掛け算の総数は、N*log2 Nということになります。

一方、一般の離散フーリエ変換で必要とされる掛け算の総数はN**2ですから、ずっと小さな値となったことがわかります。

画像の離散フーリエ変換では、入力値は実数ですが、出力値は一般に複素数となります。

高速フーリエ変換でも同じです。

F0が直流成分量であり、以下、F1、...、F(N-1)となるに従って高周波の成分量を表わします。

変換によりN個の実数からN個の複素数が作られるので、単純に考えると波形を記述するパラメータの情報量が増えてしまったようですが、変換後の値は完全に独立ではなく対称性があるので、結局パラメータの数は同じということになります。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

« フーリエ変換と離散フーリエ変換 | ホーム | 2次元フーリエ変換とフーリエ逆変換 »

このページの先頭へ