0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FFTとAD変換におけるコヒーレントサンプリングの重要性

Posted at

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シミュレーションや測定では、コヒーレントサンプリングを設計段階で考慮する必要がある

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?