クロック周波数設計とFFT

# **ADCのサンプリング周期と入力周期の関係について**

## **1. はじめに**
アナログ-デジタル変換（ADC）において、サンプリング周波数 \(F_s\) と入力信号の周波数 \(F_{in}\) は、データの正確な変換に大きく影響を与えます。特に、FFT（高速フーリエ変換）を行う場合、FFT点数とサンプリング周期の関係を理解することが重要です。

この記事では、以下のパラメータを用いて **サンプリング周期** や **入力周期** を計算し、それらの割合を求めるPythonコードを解説します。


---

## **2. 使用するパラメータ**
以下のパラメータを基に計算を行います。

| **パラメータ** | **値** |
|--------------|--------|
| **サンプリング周波数** \(F_s\) | 1MSPS（1,000,000 サンプル/秒） |
| **FFT点数** | 2048点 |
| **入力周波数** \(F_{in}\) | 124.511 kHz |

サンプリング周波数と入力周波数はコヒーレントサンプリングの関係で求める事ができます。

https://www.analog.com/jp/resources/interactive-design-tools/coherent-sampling-calculator.html


---

## **3. Pythonによる計算**
以下のPythonコードを使用して、サンプリング周期 \(T_s\)、FFT点数を掛けた時間 \(T_s \times \text{FFT点数}\)、および入力周期 \(T_{in}\) を計算し、それぞれの割合を求めます。

```python
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} %")
```