離散時間フーリエ変換
🔥 Vibe プロンプト
「オーディオセンサーが8kHzで1000Hz、2000Hz、3000Hzの信号をサンプリング。FFTを使用して周波数を特定。」
FFTの仕組み
**高速フーリエ変換(FFT)**は、時間領域信号を周波数成分に変換します。分割統治アプローチが鍵です:
Nサンプル(2のべき乗):
1. 偶数インデックスと奇数インデックスに分割
2. 各半分でFFTを再帰的に計算
3. 「バタフライ」演算で結合
計算量: O(N²)(ナイーブ)→ O(N log N)(FFT)
N=8000の場合:
ナイーブDFT: 6400万演算
FFT: ~10万演算
高速化: ~615倍!
実装
import numpy as np
fs = 8000
duration = 1.0
t = np.arange(0, duration, 1/fs)
# 複合信号: 1000Hz + 2000Hz + 3000Hz
freqs = [1000, 2000, 3000]
amplitudes = [1.0, 0.5, 0.3]
signal = sum(a * np.sin(2 * np.pi * f * t) for a, f in zip(amplitudes, freqs))
# ノイズ追加
noise = np.random.normal(0, 0.1, len(signal))
signal_noisy = signal + noise
# FFT計算
fft = np.fft.fft(signal_noisy)
freq = np.fft.fftfreq(len(signal_noisy), 1/fs)
magnitude = np.abs(fft) / len(signal_noisy)
# ピーク検出(正の周波数のみ)
half = len(signal_noisy) // 2
print(f"サンプル数: {len(signal_noisy)}")
print(f"分解能: {fs/len(signal_noisy):.2f} Hz/bin")
print(f"\n検出された周波数:")
for i in range(half):
if magnitude[i] > 0.15:
print(f" {freq[i]:.0f} Hz (強度: {magnitude[i]:.4f})")
応用
| 分野 | 用途 | |------|------| | 🎵 音楽 | スペクトル分析、ピッチ検出 | | 🗣️ 音声 | フォルマント分析、声認識 | | 📷 画像 | JPEG圧縮(DCT) | | 📡 レーダー | ドップラーシフト検出 | | 🫀 医療 | ECG/EEG周波数分析 | | 🔧 振動 | 機械故障診断 |
まとめ
| 項目 | 詳細 | |------|------| | FFT | O(N log N)のDFT計算アルゴリズム | | 分解能 | fs/N Hz/bin — 長いサンプル=高分解能 | | ナイキスト限界 | 最大検出周波数 = fs/2 | | 窓関数 | ハニング/ハミング窓でスペクトル漏洩を低減 |
重要なポイント
- コアコンセプトをしっかり理解する
- ハンズオンコード例で実践する
- 実世界の問題に応用する
- 演習で知識を強化する
さらに学ぶ
- 公式ドキュメント
- GitHubのオープンソースプロジェクト
- コミュニティフォーラムとディスカッション
- 関連コースとチュートリアル