メールマガジン・新着情報一覧
- TOP
- メールマガジン・新着情報一覧
- A-0043. 高速フーリエ変換(FFT)の原理 — TT
2014.12.10
A-0043. 高速フーリエ変換(FFT)の原理 — TT
◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇ 高速フーリエ変換(FFT)の原理 発行:エスオーエル株式会社 https://www.sol-j.co.jp/ 連載「X線CTで高精度寸法測定!?」 2014年12月10日号 VOL.043 平素は格別のお引き立てを賜り、厚く御礼申し上げます。 X線CTスキャンによる精密測定やアプリケーション開発情報などをテーマに、 無料にてメールマガジンを配信いたしております。 ◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇◆◇ 最近、息子がよく「テューター、テューター」と言います。 どうやら「機関車トーマス」のことのようです。 トーマスの仲間の「パーシー」や「トビー」はちゃんと言えるのに、 肝心の「トーマス」はまだ発音できないようです。 さて、測定機の重要な基礎の一つにフーリエ変換があることは、 何度もお伝えしてきました。 X線CTにしても、干渉計のフリンジスキャンにしても、 フーリエ変換なしでは、原理に立ち返って開発や提案をすることができません。 装置設置場所の振動などの外乱を調査するにも、 測定で得られた生データから必要な情報を取り出すフィルタリングを実行するにしても フーリエ変換が必須です。 フーリエ変換を実際にコンピュータに計算させるには、 DFT(離散フーリエ変換)を実行することになります。 DFTは、W = exp(-2πi/N) と書いておくと、 F(k) = Σ^{N-1}_{j=0} f(j) W^(kj) を計算せよということになります。 この計算をそのまま実行すると、 j=0~N まで f(j) と W^(kj) を N回掛け算することになります。 N回掛け算することで、ようやくフーリエ変換後の1点が決まります。 k=0~N まで全ての F(k) を求めるには、N×N 回の掛け算が必要です。 足し算の回数も数えておくと、N(N-1) 回あります。 では、高速フーリエ変換(FFT)と呼ばれる方法で、 どれだけ計算量が減るかを見るとともに、 FFTの基本原理をご紹介致します。 まず、F(k) について、和を偶数番目と奇数番目の項に分けます。 F(k) = Σ^{N/2-1}_{j=0} f(2j) W^(2jk) + Σ^{N/2-1}_{j=0} f(2j+1) W^((2j+1)k) = Σ^{N/2-1}_{j=0} f(2j) exp(-2πikj/(N/2)) + Σ^{N/2-1}_{j=0} f(2j+1) exp(-2πik/N) exp(-2πikj/(N/2)) ここで、 F[e](k) = Σ^{N/2-1}_{j=0} f(2j) exp(-2πikj/(N/2)) , F[o](k) = Σ^{N/2-1}_{j=0} f(2j+1) exp(-2πikj/(N/2)) , W[N] = exp(-2πi/N) と書くことにすると、 F(k) = F[e](k) + W[N]^k F[o](k) と分割できることが分かります。この分割をさらに続けます。 F[e](k) と F[o](k) を同様に分割することで、 F(k) = F[ee](k) + W[N/2]^k F[eo](k) + W[N]^k ( F[oe](k) + W[N/2]^k F[oo](k) ) とすることができます。中身を書いておくと、 F[ee](k) = Σ^{N/4-1}_{j=0} f(4j) exp(-2πikj/(N/4)) , F[eo](k) = Σ^{N/4-1}_{j=0} f(4j+2) exp(-2πikj/(N/4)) , F[oe](k) = Σ^{N/4-1}_{j=0} f(4j+1) exp(-2πikj/(N/4)) , F[oo](k) = Σ^{N/4-1}_{j=0} f(4j+3) exp(-2πikj/(N/4)) , W[N/2] = exp(-2πi/(N/2)) です。この調子で続けていくと、Σ^{0}_{j=0} にたどり着きます。 そうすると、f(jの式) に j=0 を代入して、 さらに exp(0) の部分は 1 になりますので、単純な式になります。 例えば、N=2 のときは、 F(k) = f(0) + W[2]^k f(1) N= 2^2 = 4 のときは、 F(k) = f(0) + W[4]^k f(2) + W[2]^k f(1) + W[2]^k W[4]^k f(3) N= 2^3 = 8 のときは、 F(k) = f(0) + W[8]^k f(4) + W[4]^k f(2) + W[4]^k W[8]^k f(6) + W[2]^k f(1) + W[2]^k W[8]^k f(5) + W[2]^k W[4]^k f(3) + W[2]^k W[4]^k W[8]^k f(7) と書けます。 一般に、N = 2^m と書くと、F(k) は m回(つまり、log_2 N 回)分割できます。 そして、1回の分割で W[]^k という因子が全体の半分に掛かりますので、 m回分割後には、1つの項当たりに m/2 回の掛け算が実行されてる換算になります。 その項が N個できますので、掛け算の回数は、N×m/2 , つまり、(N/2) log_2 N となります。 ちなみに足し算は、1つの k につき、分割した回数(m = log_2 N 回)必要なので、 k=0~N の全てで、N×log_2 N 回の足し算ということになります。 計算量が分かったところで、どれ位早くなるのかを比較します。 N×N 回のオーダーと N×log_2 N 回のオーダーは、どの位違うのでしょうか。 N=1024×1024 の計算をさせたとします。 その場合、 N×N = 1024^4 = 2^40 = 1099511627776 , N×log_2 N = 1024^2 × 20 = 20971520 を比較し、52428.8 倍の違いがあることが分かります。 もし、FFTを使うと1秒で完了する計算だったとすると、 FFTなしでは、14時間半も待たされることになります。 FFTの基本原理は、上に述べた通りですが、 実用的なアルゴリズムの実装には、もうひと手間必要です。 機会があれば、バタフライ演算やビット逆転についてご紹介したいと思います。 また、FFTの分割を最後まで実行せずに、N=4 までで止めておいて、 sin や cos の値が 0, ±1 となる性質を利用して、 掛け算をさらに省略する方法などもあり、FFTの奥は深いです。 -- 高野智暢 ☆TomoScope専門サイトはこちら☆