1. はじめに
A/D変換器(ADC)でサンプリングした信号を周波数解析する際、**FFT(高速フーリエ変換)**がよく利用されます。
しかし、FFTの結果が正確に出るかどうかは、サンプリング周波数と入力信号の関係に大きく依存します。
本記事では、入力サイン波を例にして「コヒーレントサンプリング条件」と「FFT解析におけるリーケージ防止」について解説します。
2. 入力サイン波とコヒーレントサンプリング
2.1 サンプリングの基本
まず、連続時間のサイン波は次の式で表されます:
y(t) = A * sin(2π f_in t)
これをサンプリング周期 Ts (=1/Fs) ごとに離散化すると:
y[n] = A * sin(2π f_in n / Fs)
となり、離散時間信号として扱えます。
2.2 コヒーレントサンプリング条件
FFTでは、データ数(N_RECORD)分の信号を区切って解析します。
このとき、信号の周期が整数回だけ含まれていないとリーケージが発生し、周波数スペクトルににじみが生じます。
この条件を防ぐために、以下の関係式を満たす必要があります:
F_in / Fs = N_CYCLE / N_RECORD
- F_in : 入力信号周波数
- Fs : サンプリング周波数
- N_CYCLE : データレコードに含まれる信号周期の数
- N_RECORD : サンプル数(FFTのデータ長)
2.3 実例
例えば、次のパラメータを設定した場合:
- Fs = 48000 Hz
- N_RECORD = 4096
- N_CYCLE = 341
入力周波数は:
F_in = (N_CYCLE / N_RECORD) * Fs
= (341 / 4096) * 48000
≈ 4000.195 Hz
となります。
これにより、4096サンプルの中にちょうど341周期が収まるため、FFTでリーケージのない綺麗なスペクトルが得られます。
3. FFT解析とリーケージ
FFT解析では、信号を区切って扱うため、波形が「途中で切られる」場合には周波数成分が広がってしまいます。
これを**リーケージ(Leakage)**と呼びます。
リーケージが発生すると:
- スペクトルのピークがぼやける
- SN比の評価が不正確になる
- ΔΣ ADCなどの性能評価に誤差が生じる
といった問題が起きます。
コヒーレントサンプリング条件を満たせば、このリーケージを完全に防げます。
4. FFTシミュレーション(Python例)
以下のコードは、コヒーレントサンプリング条件を満たすサイン波をFFTで解析する例です。
import numpy as np
import matplotlib.pyplot as plt
# ==== Parameters ====
Fs = 48000
N_RECORD = 4096
N_CYCLE = 341
F_in = (N_CYCLE / N_RECORD) * Fs
n = np.arange(N_RECORD)
# ==== Input signal ====
x = np.sin(2 * np.pi * F_in * n / Fs)
# ==== FFT ====
X = np.fft.fft(x * np.hanning(N_RECORD)) # 窓関数を適用
freq = np.fft.fftfreq(N_RECORD, 1/Fs)
# ==== Plot ====
plt.figure(figsize=(8,5))
plt.plot(freq[:N_RECORD//2], 20*np.log10(np.abs(X[:N_RECORD//2]) + 1e-12))
plt.axvline(F_in, color='r', linestyle="--", label="Input Frequency")
plt.title("FFT Spectrum with Coherent Sampling")
plt.xlabel("Frequency [Hz]")
plt.ylabel("Magnitude [dB]")
plt.grid(True)
plt.legend()
plt.show()
print(f"Coherent Sampling Frequency: F_in = {F_in:.6f} Hz")
5. まとめ
- FFT解析では、入力信号がデータ長内に整数周期含まれることが重要
- 条件式 F_in / Fs = N_CYCLE / N_RECORD を満たすことで、リーケージのない結果が得られる
- 実際のADCシミュレーションや測定では、コヒーレントサンプリングを設計段階で考慮する必要がある