FFT(高速フーリエ変換)入門|基礎理論からPython実装まで
シリーズ この記事は「信号処理まとめ」の一部です。 シリーズ目次を見る
(2026年5月時点)FFT(Fast Fourier Transform)は DFT(離散フーリエ変換)をより少ない計算で求めるアルゴリズム総称のイメージで捉えると混乱が減ります。定義・計算量のざっくり比較、窓関数の理由、NumPy でのスペクトル表示までに絞って整理します。
フーリエ変換とは?
フーリエ変換は、時間領域の信号を周波数領域に変換する数学的手法です。「この信号にはどの周波数成分がどれだけ含まれているか」を分析できます。音声の周波数分析、画像圧縮(JPEG)、通信の変調方式など、幅広い分野で使われています。
時間領域と周波数領域
時間領域では信号を「時間に対する振幅の変化」として表現します。周波数領域では「各周波数成分の振幅と位相」として表現します。フーリエ変換はこの2つの表現を相互に変換する橋渡しの役割を果たします。
DFT(離散フーリエ変換)とは?
連続信号をコンピュータで処理するには、サンプリング(離散化)が必要です。離散化された信号に対するフーリエ変換がDFTです。
# DFTの定義式
X[k] = Σ(n=0 to N-1) x[n] * e^(-j*2π*k*n/N)
# N: サンプル数
# x[n]: 入力信号(時間領域)
# X[k]: 出力(周波数領域)
# 計算量: O(N²) ← Nが大きいと非実用的 FFT(高速フーリエ変換)とは?
代表的なアルゴリズム(例: Cooley–Tukey)は、入力長の条件付きで DFT と同じ値をより少ない複素乗算回数で求めます。厳密な演算回数や定数係数は実装依存ですが、粗い桁の目安として O(N²) と O(N log N) を比べる発想がよく使われます。
- DFT(ナイーブな三重ループなど) N が大きいと重いことが多い
- FFT(分割統治など) 長さが 2 の冪など条件を満たす典型実装では N log N オーダの話になりやすい
窓関数の役割とは?
実際のFFTでは、有限長の信号を切り出して処理するため、信号の端で不連続が生じます。この不連続が「スペクトル漏れ」を引き起こし、本来存在しない周波数成分が現れてしまいます。窓関数は信号の両端を滑らかに減衰させてこの問題を軽減します。
- 矩形窓(デフォルト):窓処理なし。周波数分解能は高いがスペクトル漏れが大きい
- ハミング窓:スペクトル漏れを抑えつつ周波数分解能を維持。汎用的
- ハニング窓:ハミング窓に類似。オーバーラップ処理との相性が良い
- ブラックマン窓:サイドロープ減衰が大きい。ダイナミックレンジが広い信号に適する
Python で FFT を実装する方法は?
import numpy as np
import matplotlib.pyplot as plt
# パラメータ
fs = 1000 # サンプリング周波数 [Hz]
N = 1024 # サンプル数
t = np.arange(N) / fs # 時間軸
# テスト信号: 50Hz + 120Hz + ノイズ
sig = np.sin(2*np.pi*50*t) + 0.5*np.sin(2*np.pi*120*t) + 0.2*np.random.randn(N)
# 窓関数の適用
window = np.hamming(N)
sig_windowed = sig * window
# FFTの実行
X = np.fft.rfft(sig_windowed)
freqs = np.fft.rfftfreq(N, 1/fs)
magnitude = 2.0/N * np.abs(X)
# スペクトル描画
plt.plot(freqs, magnitude)
plt.xlabel("Frequency [Hz]")
plt.ylabel("Amplitude")
plt.title("FFT Spectrum")
plt.grid(True)
plt.show() 実信号を切り取ると必ずウィンドウが付く前提で、係数だけでなく fs・N・窓関数が物理量にどう載るかを一度確認すると再現ズレが減ります。 参考:NumPy fft リファレンス
FFT を使うときの注意点は?
- サンプリング定理:扱いたい上限周波数に対して、サンプルレートが十分高いこと(ナイキスト上限を頭に置く)
- 周波数分解能:ざっくり Δf ≈ fs / N。ゼロ詰めはビンの見え方や補間には効いても、標本点数が増えて本質的な分解能が上がる話とは別
- オーバーラップ:STFT のように時間窓を滑らせるとき、50%前後のオーバーラップを試す構成がよく出る(用途と窓により調整)
まとめ:DFT と FFT の使い分けは?
- DFT は離散標本に対する周波数表現への線形変換。FFT は同じ結果をより速く求める 経路/実装側の名前 と捉えるとすっきりする
- 有限長ウィンドウはスペクトル漏れとトレードオフになり、窓選びが実務ポイント
- NumPy 系の fft / rfft は係数まで出せば速い。振幅・電力への換算と単位合わせはアプリ側のルールとして押さえる