高速フーリエ変換(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個の複素数が作られるので、単純に考えると波形を記述するパラメータの情報量が増えてしまったようですが、変換後の値は完全に独立ではなく対称性があるので、結局パラメータの数は同じということになります。


