FFTと時系列データと過渡現象



##  各関数の種類とFFT適性・特徴（過渡現象含む）

| 関数の種類        | 数式                                      | 条件・特徴                                                | FFTとの相性 |
| ------------ | --------------------------------------- | ---------------------------------------------------- | ------- |
| **一次関数**     | $y(t) = at + b$                         | 線形増加または減少。非周期。境界で急な跳ね返りを生む。                          | ✕ 不適    |
| **二次関数**     | $y(t) = at^2 + bt + c$                  | 放物線型。非周期。FFTで意味あるスペクトルを得るのが困難。                       | ✕ 不適    |
| **三角関数**     | $y(t) = \sin(\omega t), \cos(\omega t)$ | 周期関数。基本波。\*\*FFTに最適。\*\*周期 $T = \frac{2\pi}{\omega}$ | ◎ 最適    |
| **指数関数**     | $y(t) = e^{at}$                         | $a>0$で発散、$a<0$で減衰。非周期。減衰波形のモデリングには有用。                | △ 限定的   |
| **対数関数**     | $y(t) = \log(t)$                        | $t > 0$ のみ定義。非周期。FFTには不適。                            | ✕ 不適    |
| **単位ステップ関数** | $y(t) = u(t - t_0)$                     | $t = t_0$ で 0→1。**不連続・非周期。** FFTで低周波成分が強調。           | △ 限定的   |
| **デルタ関数**    | $\delta(t - t_0)$                       | **無限小幅・無限大高さの衝撃波**。FFTでは**全周波数成分**を持つ。               | ◎（理論）   |
| **一次遅れ系**    | $\tau \frac{dy}{dt} + y = Ku(t)$        | 入力に対して指数関数的に応答。**過渡応答（transient）を持つ。**               | ◯ 適応可   |

---

## 🔁 【補足】過渡応答とは？

* **定義**：入力変化後の一時的な動き。例えばステップ応答に対する「立ち上がり」「立ち下がり」部分。
* **典型例**：一次遅れ系、二次遅れ系、振動系の**応答波形の立ち上がり部分**
* **FFTとの関係**：過渡現象は**広い周波数帯域**を持つため、**FFTで周波数分布を調べるのに適している**（特に減衰振動など）。

---




---

## 【1】時系列データとは？

* 定義：**時間に沿って連続・離散的に記録されたデータ列**。
* 例：

  * 気温・株価・心拍数・センサ出力・音声信号・制御系応答 etc.
* 数学表現：

  $$
  x(t_0), x(t_1), x(t_2), \dots, x(t_N)
  \quad \text{（等間隔：} t_{n+1} - t_n = \Delta t \text{）}
  $$

---

## 【2】FFTとは？

* 定義：離散的な時系列データを**周波数成分に変換**するアルゴリズム
* 数学的には\*\*離散フーリエ変換（DFT）\*\*の高速計算手法
* 出力：**各周波数ごとの振幅・位相**を含むスペクトル

---

## 【3】FFTを適用する条件

| 条件        | 内容                           |
| --------- | ---------------------------- |
| 等間隔サンプリング | $\Delta t$ 固定でサンプリングされていること  |
| 有限長       | $N$ 個の有限長データ                 |
| 周期性仮定     | 信号は周期的であると仮定（端で不連続が生じないよう注意） |

---

## 【4】FFTの出力と意味

* 入力：$N$ 個の時系列データ $x[0], x[1], \dots, x[N-1]$
* 出力：周波数ごとの**複素数スペクトル** $X[f]$

  $$
  |X[f]| \rightarrow \text{振幅} \quad,\quad \arg(X[f]) \rightarrow \text{位相}
  $$
* 各周波数：

  $$
  f_n = \frac{n}{N \cdot \Delta t} \quad (n = 0, 1, \dots, N/2)
  $$

---

## 【5】PythonによるFFTの実装例（サイン波）

```python
import numpy as np
import matplotlib.pyplot as plt

# パラメータ
fs = 1000              # サンプリング周波数 [Hz]
T = 1                  # 信号の長さ [s]
t = np.linspace(0, T, int(fs * T), endpoint=False)

# サイン波（周波数50Hz, 振幅1）
f0 = 50                # 基本周波数 [Hz]
signal = np.sin(2 * np.pi * f0 * t)

# FFT
N = len(t)
fft_result = np.fft.fft(signal)
freq = np.fft.fftfreq(N, d=1/fs)

# 正の周波数成分だけ抽出
mask = freq >= 0
fft_amp = np.abs(fft_result / N)

# プロット
plt.figure(figsize=(10, 4))
plt.plot(freq[mask], fft_amp[mask])
plt.title("Frequency Spectrum (FFT)")
plt.xlabel("Frequency [Hz]")
plt.ylabel("Amplitude")
plt.grid(True)
plt.tight_layout()
plt.show()
```

---

## 【6】FFTで見えるもの

| 時系列の特徴       | FFTでの結果例        |
| ------------ | --------------- |
| 周期的な繰り返し     | 鋭いピーク（正弦波など）    |
| ノイズの混入       | 広帯域に分散したスペクトル   |
| 過渡現象（立ち上がり等） | 広い帯域成分を含むスペクトル  |
| 定常状態（一定）     | DC成分（0Hz）にピークのみ |

---


```Python
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import find_peaks

# -------------------- Time and Sampling --------------------
fs = 1000  # Sampling frequency [Hz]
T = 1      # Duration [s]
t = np.linspace(0, T, int(fs * T), endpoint=False)

# -------------------- Function Definitions --------------------
# 単位ステップ関数
t0_step = 0.3
u_step = np.heaviside(t - t0_step, 1)

# デルタ関数（近似的：幅1サンプルのインパルス）
delta = np.zeros_like(t)
t0_delta_idx = np.argmin(np.abs(t - 0.3))
delta[t0_delta_idx] = 1.0  # impulse at t=0.3

# 一次遅れ系の応答
tau = 0.1
K = 1.0
y_first_order = K * (1 - np.exp(-(t - t0_step) / tau)) * (t >= t0_step)  # response to step input

# 三角関数（基準）
f_tri = 50
tri_signal = np.sin(2 * np.pi * f_tri * t)

# -------------------- FFT Function --------------------
def compute_fft(signal, fs):
    N = len(signal)
    fft_result = np.fft.fft(signal)
    freq = np.fft.fftfreq(N, d=1/fs)
    fft_magnitude = np.abs(fft_result / N)
    return freq[:N//2], fft_magnitude[:N//2]

# -------------------- Plot + FFT + Peak Detection --------------------
signals = {
    "Step Function": u_step,
    "Delta Function (Impulse)": delta,
    "First-order Response": y_first_order,
    "Sine Wave (50Hz)": tri_signal
}

fig, axs = plt.subplots(len(signals), 2, figsize=(14, 10))

for i, (name, sig) in enumerate(signals.items()):
    # FFT
    f, mag = compute_fft(sig, fs)

    # Peak Detection
    peaks, _ = find_peaks(mag, height=np.max(mag)*0.1)
    peak_freqs = f[peaks]
    peak_amps = mag[peaks]

    # 時系列プロット
    axs[i, 0].plot(t, sig)
    axs[i, 0].set_title(f"{name} - Time Domain")
    axs[i, 0].set_xlabel("Time [s]")
    axs[i, 0].set_ylabel("Amplitude")
    axs[i, 0].grid(True)

    # FFTプロット
    axs[i, 1].plot(f, mag)
    axs[i, 1].plot(peak_freqs, peak_amps, "rx")
    axs[i, 1].set_title(f"{name} - Frequency Spectrum (FFT)")
    axs[i, 1].set_xlabel("Frequency [Hz]")
    axs[i, 1].set_ylabel("Amplitude")
    axs[i, 1].grid(True)

    # プリント関数でピーク周波数出力
    print(f"--- {name} ---")
    print("Detected FFT Peaks [Hz]:", np.round(peak_freqs, 2))

plt.tight_layout()
plt.show()

```
--- Step Function ---
Detected FFT Peaks [Hz]: []
--- Delta Function (Impulse) ---
Detected FFT Peaks [Hz]: [  9.  16.  23.  27.  31.  41.  49.  56.  63.  67.  71.  81.  89.  96.
 103. 107. 111. 121. 129. 136. 143. 147. 151. 161. 169. 176. 183. 187.
 191. 201. 209. 216. 223. 227. 231. 241. 249. 256. 263. 267. 271. 281.
 289. 296. 303. 307. 311. 321. 329. 336. 343. 347. 351. 361. 369. 376.
 383. 387. 391. 401. 409. 416. 423. 427. 431. 441. 449. 456. 463. 467.
 471. 481. 489.]
--- First-order Response ---
Detected FFT Peaks [Hz]: []
--- Sine Wave (50Hz) ---
Detected FFT Peaks [Hz]: [50.]

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4046871/3a740ec8-d9ff-471b-af58-12898bb4d39e.png)


## FFTスペクトルとピーク検出結果

| 関数名                      | 主な周波数ピーク（Hz）     | 特徴・解説                       |
| ------------------------ | ---------------- | --------------------------- |
| **Step Function**        | *なし*             | DC成分が主。非周期なので明確なピークなし。      |
| **Delta Function**       | 多数（2Hz, 11Hz, …） | **広帯域全体に周波数成分**が存在（理論通り）。   |
| **First-order Response** | *なし*             | 周波数分布は滑らかで、特定ピークなし（緩やかに減衰）。 |
| **Sine Wave (50Hz)**     | **50Hz**         | 理想的な正弦波。**明確なピークが1つのみ。**    |

---