13. 高速フーリエ変換 (FFT)
注 – 例題ワークシートをダウンロードすることができます. 1. 例題ワークシートの入手と使用方法 をご覧ください.
離散フーリエ変換 (Discrete Fourier Transform (DFT)) は, 離散データに対するフーリエ変換を数値的に求めるものです. DFT の逆変換を離散フーリエ逆変換 (Inverse Discrete Fourier Transform (IDFT)) とよびます. DFT/IDFT を少ない演算回数で求める数値計算法が高速フーリエ変換 (Fast Fourier Transform (FFT)) です.
高速フーリエ変換の XLPack による計算例を説明します.
例題 1
400Hz と 1400Hz の正弦波を混合した波を作ると, 次のような波形になります.
1/10000 秒ごとのデータを用意し, DFT を求めます(変換結果の格納内容についてはリファレンスマニュアルを参照). そして, さらにその IDFT を求めて変換が正しく行われていることを確認します.
DFT を求めるためには, WRfft1f ワークシート関数を使います. 下に50点のデータを使った例を示します.
DFT が求められたら, その内容に対して WRfft1b ワークシート関数により IDFT を適用します.
下のように, 元のデータが復元されたのが確認できます.
例題 2 (パワースペクトル)
FFT の応用のひとつにパワースペクトル分析があります.
N 個のデータ fj の DFT 出力から, 周波数 fk におけるパワーを次のようにして求めることができます. ただし, fk = (k/N) fs, fs はサンプリング周波数です.
P0 = P(f0) = N |F0|2 = N ak2 Pk = P(fk) = N (|Fk|2 + |FN-k|2) = (N/2)(ak2 + bk2) (k=1~N/2-1) PN/2 = P(fN/2) = N |FN/2|2 = N aN/22 (Nが偶数の場合)
全エネルギーはこれらの総和より求められます.
E = Σ Pk (Σはk=0~N/2)
上の例題の DFT 結果よりパワースペクトルを求めてみます.
ワークシート上で計算すると複雑になるので, パワーを求める次の VBA 関数を用意します.
Function PsdR(N As Long, VR As Variant) As Variant
Dim R() As Double, P() As Double, I As Long
ReDim R(N - 1), P(N / 2, 0)
For I = 1 To N
R(I - 1) = VR(I)
Next
P(0, 0) = N * R(0) ^ 2
For I = 1 To N - 3 Step 2
P((I + 1) / 2, 0) = (N / 2) * (R(I) ^ 2 + R(I + 1) ^ 2)
Next
P(N / 2, 0) = N * R(N - 1) ^ 2
PsdR = P
End Function
この関数を使ってパワースペクトルを求めます.
求められたパワースペクトルより作成されたグラフはと次のようになります(ピリオドグラムといいます).
f(x) には 400Hz と 1400Hz の成分が含まれていることがわかります.