ADCのサンプリング周期と入力周期の関係について
1. はじめに
アナログ-デジタル変換(ADC)において、サンプリング周波数 (F_s) と入力信号の周波数 (F_{in}) は、データの正確な変換に大きく影響を与えます。特に、FFT(高速フーリエ変換)を行う場合、FFT点数とサンプリング周期の関係を理解することが重要です。
この記事では、以下のパラメータを用いて サンプリング周期 や 入力周期 を計算し、それらの割合を求めるPythonコードを解説します。
2. 使用するパラメータ
以下のパラメータを基に計算を行います。
パラメータ | 値 |
---|---|
サンプリング周波数 (F_s) | 1MSPS(1,000,000 サンプル/秒) |
FFT点数 | 2048点 |
入力周波数 (F_{in}) | 124.511 kHz |
サンプリング周波数と入力周波数はコヒーレントサンプリングの関係で求める事ができます。
3. Pythonによる計算
以下のPythonコードを使用して、サンプリング周期 (T_s)、FFT点数を掛けた時間 (T_s \times \text{FFT点数})、および入力周期 (T_{in}) を計算し、それぞれの割合を求めます。
import numpy as np
# 与えられたパラメータ
Fs = 1e6 # サンプリング周波数 (1MSPS = 1,000,000 サンプル/秒)
FFT_points = 2048 # FFT点数
Fin = 124.511e3 # 入力周波数 (124.511 kHz)
# サンプリング周期の計算
Ts = 1 / Fs # サンプリング周期 [秒]
# サンプリング時間 (Ts × FFT点数)
sampling_time = Ts * FFT_points
# 入力周期の計算
T_in = 1 / Fin # 入力周期 [秒]
# 割合計算
T_in_div_sampling_time_percentage = (T_in / sampling_time) * 100
Ts_div_sampling_time_percentage = (Ts / sampling_time) * 100
# 結果を表示
print(f"サンプリング周期 Ts: {Ts:.9f} 秒")
print(f"Ts × FFT点数: {sampling_time:.9f} 秒")
print(f"入力周期 Tin: {T_in:.9f} 秒")
print(f"入力周期 ÷ (Ts × FFT点数): {T_in_div_sampling_time_percentage:.2f} %")
print(f"サンプリング周期 ÷ (Ts × FFT点数): {Ts_div_sampling_time_percentage:.2f} %")
4. 計算結果と解説
このコードを実行すると、以下の結果が得られます。
サンプリング周期 Ts: 0.000001000 秒
Ts × FFT点数: 0.002048000 秒
入力周期 Tin: 0.000008033 秒
入力周期 ÷ (Ts × FFT点数): 0.39 %
サンプリング周期 ÷ (Ts × FFT点数): 0.05 %
(1) サンプリング周期 (T_s)
[
T_s = \frac{1}{F_s} = \frac{1}{10^6} = 1.000 \times 10^{-6} \text{ 秒} = 1 \text{ μs}
]
これは、1秒間に 1,000,000回 のデータ取得を行うため、各サンプルの間隔が 1μs となることを意味します。
(2) Ts × FFT点数
[
T_s \times \text{FFT点数} = 1.000 \times 10^{-6} \times 2048 = 0.002048 \text{ 秒}
]
FFTの解析対象となる信号の長さは 2.048ms です。
(3) 入力周期 (T_{in})
[
T_{in} = \frac{1}{F_{in}} = \frac{1}{124.511 \times 10^3} = 8.0328 \times 10^{-6} \text{ 秒} = 8.033 \text{ μs}
]
これは、入力信号が約 8.033μs の周期で繰り返されることを意味します。
(4) 入力周期 ÷ (Ts × FFT点数) の割合
[
\left( \frac{T_{in}}{T_s \times \text{FFT点数}} \right) \times 100
]
[
\left( \frac{8.033 \times 10^{-6}}{2.048 \times 10^{-3}} \right) \times 100 = 0.39%
]
これは、FFTの時間範囲に対して入力周期が約 0.39% の長さしかない ことを示しています。
(5) サンプリング周期 ÷ (Ts × FFT点数) の割合
[
\left( \frac{T_s}{T_s \times \text{FFT点数}} \right) \times 100
]
[
\left( \frac{1.000 \times 10^{-6}}{2.048 \times 10^{-3}} \right) \times 100 = 0.05%
]
これは、FFTの時間範囲に対してサンプリング周期が約 0.05% の長さしかない ことを示しています。
5. まとめ
この計算結果から、以下の重要なポイントが分かります。
サンプリング周期 ( T_s ) は 1μs であり、FFT点数を考慮すると 2.048ms 分のデータが取得される。
入力信号の周期 ( T_{in} ) は約 8.033μs であり、FFTの時間範囲と比べると 0.39% の長さである。
サンプリング周期は FFTの時間範囲と比べると 0.05% の長さである。
この結果を基に、FFT解析を行う際の 時間分解能や周波数分解能 を考慮しながら、適切な設定を行うことが重要です。
おまけシミュレーション時間に冗長性を持たせる場合
import numpy as np
# 与えられたパラメータ
Fs = 1e6 # サンプリング周波数 (1MSPS = 1,000,000 サンプル/秒)
FFT_points = 2048 # FFT点数
Fin = 124.511e3 # 入力周波数 (124.511 kHz)
# サンプリング周期の計算
Ts = 1 / Fs # サンプリング周期 [秒]
# サンプリング時間 (Ts × FFT点数)
sampling_time = Ts * FFT_points
# Ts × (FFT点数 + 2) の計算
sampling_time_plus_2 = Ts * (FFT_points + 2)
# 入力周期の計算
T_in = 1 / Fin # 入力周期 [秒]
# 割合計算
T_in_div_sampling_time_percentage = (T_in / sampling_time) * 100
Ts_div_sampling_time_percentage = (Ts / sampling_time) * 100
T_in_div_sampling_time_plus_2_percentage = (T_in / sampling_time_plus_2) * 100
Ts_div_sampling_time_plus_2_percentage = (Ts / sampling_time_plus_2) * 100
# 結果を表示
print(f"サンプリング周期 Ts: {Ts:.9f} 秒")
print(f"Ts × FFT点数: {sampling_time:.9f} 秒")
print(f"Ts × (FFT点数 + 2): {sampling_time_plus_2:.9f} 秒")
print(f"入力周期 Tin: {T_in:.9f} 秒")
print(f"入力周期 ÷ (Ts × FFT点数): {T_in_div_sampling_time_percentage:.2f} %")
print(f"サンプリング周期 ÷ (Ts × FFT点数): {Ts_div_sampling_time_percentage:.2f} %")
print(f"入力周期 ÷ (Ts × (FFT点数 + 2)): {T_in_div_sampling_time_plus_2_percentage:.2f} %")
print(f"サンプリング周期 ÷ (Ts × (FFT点数 + 2)): {Ts_div_sampling_time_plus_2_percentage:.2f} %")