» www.Giftbox.Az - Bir birindən gözəl hədiyyə satışı
ウィキペディアランダム
毎日カテゴリ
共有: WhatsappFacebookTwitterVK

高速フーリエ変換

高速フーリエ変換(こうそくフーリエへんかん、: fast Fourier transform, FFT)は、離散フーリエ変換: discrete Fourier transform, DFT)を計算機上で高速に計算するアルゴリズムである。高速フーリエ変換の逆変換を逆高速フーリエ変換(: inverse fast Fourier transform, IFFT)と呼ぶ。

概要

複素関数 f(x) の離散フーリエ変換である複素関数 F(t) は以下で定義される。

 

このとき、{x = 0, 1, 2, ..., N − 1} を標本点と言う。

これを直接計算したときの時間計算量は、ランダウの記号を用いて表現すると O(N2) である。

高速フーリエ変換は、この結果を、次数Nが2の累乗のときに O(N log N) の計算量で得るアルゴリズムである。より一般的には、次数が N = ∏ ni と素因数分解できるとき、O(Nni) の計算量となる。次数が 2 の累乗のときが最も高速に計算でき、アルゴリズムも単純になるので、0 詰めで次数を調整することもある。

高速フーリエ変換を使って、畳み込み積分などの計算を高速に求めることができる。これも計算量を O(N2) から O(N log N) まで落とせる。

現在は、初期の手法[1] をより高速化したアルゴリズムが使用されている。

逆変換

逆変換は正変換と同じと考えて良いが、指数の符号が逆であり、係数 1/N が掛かる。

高速フーリエ変換のプログラム中、どの符号が逆転するかを一々分岐させると、分岐の判定に時間がかかり、パフォーマンスが落ちる。一方、正変換のプログラムと、逆変換のプログラムを両方用意しておくことも考えられるが、共通部分が多いため、無駄が多くなる。このため、複素共役を使った次のような方法が考えられる。

離散フーリエ変換

 

で定義したとき、逆変換は

 

となる。

このため、F(t) の離散フーリエ逆変換を求めるには、

(1) 複素共役を取り、F(t) を求める、
(2) F(t) の正変換の離散フーリエ変換を高速フーリエ変換で行う、
(3) その結果の複素共役を取り、N で割る

とすれば良く、正変換の高速フーリエ変換のプログラムがあれば、逆変換は容易に作ることができる。

アルゴリズム

クーリー–テューキー型FFTアルゴリズム

クーリー–テューキー型アルゴリズムは、代表的な高速フーリエ変換 (FFT) アルゴリズムである。

分割統治法を使ったアルゴリズムで、N = N1 N2 のサイズの変換を、より小さいサイズである N1, N2 のサイズの変換に分割していくことで高速化を図っている。

最もよく知られたクーリー–テューキー型アルゴリズムは、ステップごとに変換のサイズをサイズ N/2 の2つの変換に分割するので、2 の累乗次数に限定される。しかし、一般的には次数は 2 の累乗にはならないので、素因数が偶数と奇数とで別々のアルゴリズムに分岐する。

伝統的なFFTの処理実装の多くは、再帰的な処理を、系統だった再帰をしないアルゴリズムにより実現している。

クーリー–テューキー型アルゴリズムは変換をより小さい変換に分解していくので、後述のような他の離散フーリエ係数のアルゴリズムと任意に組み合わせることができる。とりわけ、N ≤ 8 あたりまで分解すると、固定次数の高速なアルゴリズムに切り替えることが多い。

原理の簡単な説明

 
データ数12の離散フーリエ変換の模式図。時計を模した図形は1の12乗根の一つを表している。時計の針の向きと色は1の12乗根の偏角を表す。この図で表される行列をデータ列にかけることで離散フーリエ変換が得られる。上図で表されるような列の並べ替えを行うことで、元の行列のパターンはデータ数6の離散フーリエ変換のパターンに分解できる。この繰り返しにより最終的にはデータ数3のフーリエ変換に帰着される。
 
データ数100の離散フーリエ変換の模式図。色は1の100乗根の偏角を表す。バタフライ演算により元の行列のパターンは最終的にデータ数5の離散フーリエ変換のパターンに分解される。
 
FFTのバタフライ演算

離散フーリエ係数は、1の原始 N 乗根の1つ WN = e−2πi/N を使うと、次のように表せる。

 

例えば、N = 4 のとき、  とすれば、離散フーリエ係数は行列を用いて表現すると(W = W4 と略記)

 

となる。入力列 xk を添字の偶奇で分けて、以下のように変形する。

 

( )

すると、サイズ 2 のFFTの演算結果を用いて表現でき、サイズの分割ができる。

 

また、この分割手順を図にすると蝶のような図になることから、バタフライ演算とも呼ばれる。

バタフライ演算は、計算機上では(ビット反転)で実現される。DSPの中には、このバタフライ演算のプログラムを容易にするため、ビット反転アドレッシングを備えているものがある。

原理の説明

N = PQ とする。N 次離散フーリエ変換を、以下のようにP 次離散フーリエ変換とQ 次離散フーリエ変換に分解する。

N 次離散フーリエ変換:

 

を、n = 0, 1, ..., N − 1 について計算することを考える。n, k を次のように書き換える。ただし 0 ≤ nN − 1 また 0 ≤ kN − 1 である。

 

すると

 

ここで、

 

と置くと、

 

となる。即ち、F(n) = F(sQ + r) の計算は、次の2ステップになる。

ステップ1
p = 0, 1, ..., P − 1r = 0, 1, ..., Q − 1 について
 
を計算する。これは、Q次の離散フーリエ変換
 
の実行と、回転因子 exp(−2πipr/PQ) の掛け算を、全ての p, r の組(PQ = N 通り)に対して行うことと見ることができる。
ステップ2
s = 0, 1, ..., P − 1r = 0, 1, ..., Q − 1 について
 
を計算する。ここで、右辺は r を固定すれば、P 次の離散フーリエ変換である。

ステップ1、2は、N = PQ 次の離散フーリエ変換を、Q 次の離散フーリエ変換と回転因子の掛け算の実行により、Q 組 (r = 0, 1, ..., Q − 1) の P 次離散フーリエ変換に分解したと見ることができる。

N = Qk (P = Qk − 1) の場合には、上を繰り返せば、Q 次の離散フーリエ変換と回転因子の掛け算を繰り返すことだけで次数を下げることができ、最終的に1次離散フーリエ変換(何もしないことと同じ)にまで下げると、F(t)を求めることができる。特に、Q2または4の場合は、Q次の離散フーリエ変換は非常に簡単な計算になる。

  • Q = 2 の場合は、exp(−2πirq/Q)1−1 なので、Q 次の離散フーリエ変換は符号の逆転と足し算だけで計算できる。
  • Q = 4 の場合は、exp(−2πirq/Q)1, −1, i, i のいずれかなので、Q 次の離散フーリエ変換の計算は、符号の逆転、実部虚部の交換と足し算だけで計算できる。

このため、2の累乗あるいは4の累乗次の離散フーリエ変換は簡単に計算できる。実務的に用いられるのは、Q = 2Q = 4 の場合のみである。なお、Q = 2Q = 4 の場合のこの部分のQ次の離散フーリエ変換のことを、バタフライ演算と言う。

また、Q = 2Q = 4の場合において、計算を終了するまでに何回の「掛け算」が必要かを考える。符号の逆転、実部虚部の交換は「掛け算」として数えなければ、回転因子の掛け算のみが「掛け算」である。N = Qkの次数を1落とすためにN回の「掛け算」が必要であり、次数をkから0に落とすにはそれをk回繰り返す必要があるため、「掛け算」の数は Nk = N logQ N となる。高速フーリエ変換の計算において時間がかかるのは「掛け算」の部分であるため、これが「高速フーリエ変換では計算速度は O(N' log N) になる」ことの根拠になっている。

ビットの反転

上記の説明で、  の場合、N = Qk 個のデータ から、N = Qk 個の計算結果

 

を計算する場合に、メモリの節約のため、0 ≤ qQ − 10 ≤ rQ − 1 を利用し、計算結果   を元データ  のあった場所に格納することが多い。これが次の次数 Qk − 1 でも繰り返されるため、 とすると、次の次数の計算結果  のあった場所に格納される。繰り返せば、 とすると、計算結果  のあった場所に格納される。

一方、

 

を、r を固定し s を変数とした Qk − 1 次離散フーリエ変換と見なして、 とすると、

 

となる。繰り替えせば、

 

となるが、左辺について

 

より sk = 0, また右辺について

 

より pk = 0。このため、

 

これは   のあった場所に格納されている。

このように、求める解    のあった場所に格納されていることを、ビット反転と言う。これは、Q 進法で表示した場合、  となるのに対し、 は逆から読んだ となるためである。

プログラムの例

以下は、高速フーリエ変換のプログラムを Q = 4 の場合にMicrosoft Visual Basicの文法を用いて書いた例である。

Const pi As Double = 3.14159265358979 '円周率 Dim Ndeg As Long '4^deg Dim Pdeg As Long '4^(deg-i) Dim CR() As Double '入力実数部 Dim CI() As Double '入力虚数部 Dim FR() As Double '出力実数部 Dim FI() As Double '出力虚数部 deg=5 '任意に設定。5ならN=4^5=1024で計算 Ndeg=4^deg ReDim CR(Ndeg - 1) As Double '入力実数部 ReDim CI(Ndeg - 1) As Double '入力虚数部 ReDim FR(Ndeg - 1) As Double '出力実数部 ReDim FI(Ndeg - 1) As Double '出力虚数部 'ここで、変換される関数の実部をCR(0)からCR(Ndeg-1)に、虚部をCI(0)からCI(Ndeg-1)に入力しておくこと 'フーリエ変換 For i = 1 To deg  Pdeg = 4 ^ (deg - i)  For j0 = 0 To 4 ^ (i - 1) - 1  For j1 = 0 To Pdeg - 1  j = j1 + j0 * Pdeg * 4  'バタフライ演算(Q=4)  w1 = CR(j) + CR(j + Pdeg) + CR(j + 2 * Pdeg) + CR(j + 3 * Pdeg)  w2 = CI(j) + CI(j + Pdeg) + CI(j + 2 * Pdeg) + CI(j + 3 * Pdeg)  w3 = CR(j) + CI(j + Pdeg) - CR(j + 2 * Pdeg) - CI(j + 3 * Pdeg)  w4 = CI(j) - CR(j + Pdeg) - CI(j + 2 * Pdeg) + CR(j + 3 * Pdeg)  w5 = CR(j) - CR(j + Pdeg) + CR(j + 2 * Pdeg) - CR(j + 3 * Pdeg)  w6 = CI(j) - CI(j + Pdeg) + CI(j + 2 * Pdeg) - CI(j + 3 * Pdeg)  w7 = CR(j) - CI(j + Pdeg) - CR(j + 2 * Pdeg) + CI(j + 3 * Pdeg)  w8 = CI(j) + CR(j + Pdeg) - CI(j + 2 * Pdeg) - CR(j + 3 * Pdeg)  CR(j) = w1  CI(j) = w2  CR(j + Pdeg) = w3  CI(j + Pdeg) = w4  CR(j + 2 * Pdeg) = w5  CI(j + 2 * Pdeg) = w6  CR(j + 3 * Pdeg) = w7  CI(j + 3 * Pdeg) = w8  '回転因子  For k = 0 To 3  w1 = Cos(2 * pi * j * k / Pdeg / 4)  w2 = -Sin(2 * pi * j * k / Pdeg / 4)  w3 = CR(j + k * Pdeg) * w1 - CI(j + k * Pdeg) * w2  w4 = CR(j + k * Pdeg) * w2 + CI(j + k * Pdeg) * w1  CR(j + k * Pdeg) = w3  CI(j + k * Pdeg) = w4  Next k  Next j1  Next j0 Next i 'ビット反転 For i = 0 To Ndeg - 1  k = i  k1 = 0  For j = 1 To deg  k1 = k1 + (k - Int(k / 4) * 4) * 4 ^ (deg - j)  k = Int(k / 4)  Next j  FR(i) = CR(k1)  FI(i)=CI(k1) Next i 

この例では、最深部 (For kNext k の間の部分)の繰り返し回数が Ndeg log4 Ndeg となっている。

その他のアルゴリズム

  • (Prime Factor Algorithm)(英語版) (PFA)
  • (Bruun's FFT algorithm)(英語版)
  • レーダーのFFTアルゴリズム
  • (Bluestein's FFT algorithm)(英語版) (see "Chirp Z-transform") 任意長のデータ列に対する変換が高速に可能である。
  • (オドリツコ・ショーンハーゲ法)(英語版) - (アンドリュー・オドリツコ)(英語版)(アーノルド・ショーンハーゲ)(英語版)
  • FFTW
  • (Fast Walsh–Hadamard transform)(英語版)

実数および対称的な入力への最適化

多くの応用において、FFTに対する入力データは実数の列(実入力)であり、このとき変換された出力の列は次の対称性を満たす(    は複素共役):

 

そこで、多くの効率的なFFTアルゴリズム[2] は入力データが実数であることを前提に設計されている。

入力データが実数の場合の効率化の手段としては、次のようなものがある。

  • クーリー-テューキー型アルゴリズムなど典型的なアルゴリズムを利用して、時間とメモリーの両方のコストを低減する。
  • 入力データが偶数の長さのフーリエ係数はその半分の長さの複素フーリエ係数として表現できる(出力の実数/虚数成分は、それぞれ入力の偶関数/奇関数成分に対応する)ことを利用する。

かつては実数の入力データに対するフーリエ係数を求めるのには、実数計算だけで行える(離散ハートリー変換)(英語版) (discrete Hartley transform, DHT)を用いると効率的であろうと思われていた。しかしその後に、最適化された離散フーリエ変換 (discrete Fourier transform, DFT) アルゴリズムの方が、離散ハートリー変換アルゴリズムに比べて必要な演算回数が少ないということが判明した。また当初は、実数入力に対してブルーン (Bruun) FFT アルゴリズムは有利であると云われていたが、その後そうではないことが判った。

また、偶奇の対称性を持つ実入力の場合には、DFTはDCT(DST)(英語版)となるので、演算と記憶に関してほぼ2倍の効率化が得られる。よって、そのような場合にはDFTのアルゴリズムをそのまま適用するよりも、DCTやDSTを適用してフーリエ係数を求める方が効率的である。

応用

OFDM日本および欧州地上デジタルテレビジョン放送ADSL等に用いられる変調方式)の実装は、LSI化されたFFTおよびIFFT(逆変換)をそれぞれ復調器および変調器を用いて行われている。
核磁気共鳴 (NMR) スペクトルを得るために使用される。
受像素子を360度回転させながら連続撮影した映像をフーリエ変換する事により、回転面の透過画像を合成する。
周波数の分布を調べるために使用される。以前はハードウェアで信号を処理していたが、近年はCPUの性能が向上した為ソフトウェアで処理される。ノートパソコンUSBで接続して使用するもの[3] や、近年はデジタルオシロスコープにFFTの機能を内蔵している物もある。
FX型デジタル分光相関器等を使用して星間分子のスペクトルを解析する[4][5]

歴史

高速フーリエ変換といえば一般的には1965年、(ジェイムズ・クーリー)(英語版) (J. W. Cooley) とジョン・テューキー (J. W. Tukey) が発見した[1] とされている(クーリー–テューキー型FFTアルゴリズム)(英語版)を呼ぶ[6]。同時期に高橋秀俊がクーリーとテューキーとは全く独立にフーリエ変換を高速で行うためのアルゴリズムを考案していた[7]。しかし、1805年頃に既にガウスが同様のアルゴリズムを独自に発見していた[8](本ページの外部リンク先に同じ文章PDFへのリンクがある)。ガウスの論文以降、地球物理学や気候や潮位解析などの分野などで測定値に対する調和解析は行われていたので、計算上の工夫を必要とする応用分野で受け継がれていたようである(たとえば、Robart L. Nowack: "Development of the FFT and Applications in Geophysics", in Proceedings of the Cornelius Lanczos International Centenary Conference,SIAM, (ISBN 978-0898713398) (1994), pp.395--397、の中では Danielson and Lanczos(1942年)などの先行例をあげている。和書でも沼倉三郎:「測定値計算法」、森北出版、(1956年)には,一般の合成数Nに対してではないが人が計算を行う場合にある程度の大きさの合成数Nに対してどのように計算すればよいかについての説明をみることができる)。 以下の書籍にも、天体観測の軌道の補間のためにガウスが高速フーリエ変換を利用したことが書かれている。

  • Elena Prestini:"The Evolution of Applied Harmonic Analysis", Springer, (ISBN 978-0-8176-4125-2) (2004)のSec.3.10 'Gauss and the asteroids: history of the FFT'.

参考文献

[脚注の使い方]
  1. ^ a b J. W. Cooley and J. W. Tukey: Math. of Comput. 19 (1965) 297.
  2. ^ 例えば、H. V. Sorensen, D. L. Jones, M. T. Heideman, and C. S. Burrus, "Real-valued fast Fourier transform algorithms," IEEE Trans. Acoust. Speech Sig. Processing ASSP-35, 849–863 (1987).
  3. ^ FFT spectrum analyzer
  4. ^ 惑星大気の観測「SPART」
  5. ^ 空間FFT電波干渉計による電波天体の高速撮像
  6. ^ IEEE Archives: History of FFT with Cooley and Tukey.
  7. ^ 『東京大学大型計算機センターニュース』第2巻Supplement 2、1970年。 
  8. ^ Carl Friedrich Gauss, "Nachlass: Theoria interpolationis methodo nova tractata", Werke band 3, 265–327 (Konigliche Gesellschaft der Wissenschaften, Gottingen, 1866). See also M. T. Heideman, D. H. Johnson, and C. S. Burrus, "Gauss and the history of the fast Fourier transform", IEEE ASSP Magazine 1 (4), 14–21 (1984).

関連記事

学習用図書

今後記述を追加の予定

  • Henri J. Nussbaumer: "Fast Fourier Transform and Convolution Algorithms",2nd Ed.,Springer-Verlag, (ISBN 978-3-540-11825-1) (1982年).
  • E.Oran Brigham:「高速フーリエ変換」、科学技術出版社 (1985年).
  • Henri J. Nussbaumer:「高速フーリエ変換のアルゴリズム」、科学技術出版社、(ISBN 978-4876530069) (1989年).
  • William L. Briggs and Van Emden Henson: "The DFT: An Owners' Manual for the Discrete Fourier Transform", SIAM, (ISBN 978-0-898713-42-8) (1995年).
  • Gerlind Plonka, Daniel Potts, Gabriele Steidl and Manfred Tasche: "Numerical Fourier Analysis", Birkhaeuser, (ISBN 978-3030043056) (2019年2月).
  • 谷萩隆嗣:「高速アルゴリズムと並列信号処理」、コロナ社、(ISBN 4-339-01124-X)(2000年7月26日)。

外部リンク

  • fast Fourier transform (Mathematics) - ブリタニカ百科事典
  • 世界大百科事典 第2版『(高速フーリエ変換)』 - コトバンク
  • Michael T. Heideman, Don H. Johnson, and C. Sidney Burrus: "Gauss and the History of the Fast Fourier Transform", IEEE ASSP Magazine, Vol.1,pp.14-21(1984). (PDF File)
  • Alex H. Barnett, Jeremy F. Magland, Ludvig af Klinteberg:A parallel non-uniform fast Fourier transform library based on an "exponential of semicircle" kernel
  • 高橋大介:「高速フーリエ変換におけるキャッシュ最適化」、RISTニュース、No.57,pp.24-31 (2014).
  • 「2の累乗専用のFFTを用いて任意長FFTを実装:チャープZ変換」(Qiita記事,2018年11月13日)
  • WEB SITE "FFT REPORT"
  • 山本有作:「高速フーリエ変換とその並列化 (I)」(2003年6月6日)
ウィキペディア、ウィキ、本、library、論文、読んだ、ダウンロード、自由、無料ダウンロード、mp3、video、mp4、3gp、 jpg、jpeg、gif、png、画像、音楽、歌、映画、本、ゲーム、ゲーム。