前回,2のべき乗の長さの時系列を,高速に離散フーリエ変換 (FFT)できるアルゴリズムのRスクリプトを作りました (高速じゃないけど).
chaos-kiyono.hatenablog.com
このFFTアルゴリズムは,Cooley-Tukey型と呼ばれるそうです (知らんけど).今回はこのアルゴリズムについて少し解説します.
要は周波数について奇数番と偶数番に分けるだけ
以下では,長さが2のべき乗の時系列を離散フーリエ変換することを考えます.時系列解析の本では,データの番号を
から
で考えることが多いですが,Rでは,配列の番号が1からはじまるので,データの番号は
から
にしました.他の教科書とかインターネットの解説と番号がずれているので注意してください.
このとき,離散フーリエ変換 は,
です.は,
から
までです.サンプリング間隔が1のときは周波数は,
です.
Cooley-Tukey型FFTって,要は,について,奇数番と偶数番を分けるだけです.
N=4の例
簡単な例として,でやってみます (速くないけど).
が偶数で,
のとき (
の肩の数値に注目),
と変形できます.この変形の注目点は
- 最初は
で4項の和だった部分が,変形すると
になり,半分の2項の和になった.
の部分の
が半分の
になった (周波数が半分になった).
の部分の
が半分の
になった.
ということです.
また,が奇数で,
のとき,
と変形できます (最後の式は結果を知っているので無理矢理書きました).やはり,で4項の和だった部分を,変形して
にできました.
一般にどんな関係式が成り立つか考えてみてください.
Rスクリプトとの対応
前回,RでCooley-Tukey型FFTのスクリプトを書いてみました.
chaos-kiyono.hatenablog.com
このスクリプトの中の
# 要素の半分をまとめて指定:1, 2, 3, ..., N/2 ii <- 1:(N/2) # バタフライ演算の右上がり線 (/)に対応する計算 x1 <- x[ii]+x[ii+N/2] # 足すだけ # バタフライ演算の右下がり線 (\)に対応する計算 x2 <- (x[ii]-x[ii+N/2])*W[ii] # 引いて回転因子をかける
の部分が,
と,
の計算です.
次回予告:バタフライダイアグラムの読み方
FFTのポイントはこれだけですが,次回,バタフライ演算の図の読み方と,ビット反転について説明します.
未来から帰ってきました.つづきの記事は,これです.
chaos-kiyono.hatenablog.com