Note

このページは Jupyter Notebook から生成されました。 ノートブックをダウンロード (.ipynb)

Hilbert-Huang Transform (HHT) 解析チュートリアル

Open In Colab

このチュートリアルでは gwexpyTimeSeries.hht() を用いた 推奨ワークフロー を紹介します。 HHT は非線形・非定常な信号に強く、STFT やウェーブレットでは捉えにくい瞬時周波数の変化を可視化できます。

HHT は次の2ステップで構成されます:

  1. Empirical Mode Decomposition (EMD/EEMD): 信号を IMF と残差に分解

  2. Hilbert Spectral Analysis: 各 IMF の瞬時振幅・瞬時周波数を算出

注意: 本チュートリアルには PyEMD (EMD-signal) が必要です。

pip install EMD-signal
[1]:
import matplotlib.pyplot as plt
import numpy as np

from gwexpy.timeseries import TimeSeries

# Check PyEMD availability
try:
    import PyEMD

    print(f"{PyEMD.__name__} is installed and ready.")
except ImportError:
    raise ImportError(
        "This tutorial requires 'PyEMD' (EMD-signal). Please run: pip install EMD-signal"
    )

PyEMD is installed and ready.

1. シミュレーションデータの作成

以下の非定常信号を合成します:

  • 低周波サイン (5 Hz)

  • チャープ (80 → 120 Hz)

  • 線形トレンド

[2]:
# time / durationAxis (1seconds 、1000Sample)
t = np.linspace(0, 1, 1000)
dt = t[1] - t[0]

# Signal minutes
s1 = 0.5 * np.sin(2 * np.pi * 5 * t) #
s2 = 1.0 * np.sin(2 * np.pi * 80 * t * (1 + 0.5 * t)) # (80Hz -> 120Hz)
trend = 2.0 * t #

# TimeSeries Create
data = TimeSeries(s1 + s2 + trend, dt=dt, unit="V", name="Simulation Data")

# Plot
plot = data.plot(title="Original Simulation Signal")
plot.show()

../../../../_images/web_ja_user_guide_tutorials_advanced_hht_3_0.png

2. 推奨ワークフロー: TimeSeries.hht()

TimeSeries.hht() は EMD/EEMD とヒルベルト解析を一括で実行します。 ここでは次を指定します:

  • emd_kwargs: EEMD 設定(チュートリアルでは試行回数を少なめに設定)

  • hilbert_kwargs: パディングと平滑化で IF を安定化

Tip: EEMD は確率的なので、再現性のため random_state を指定します。

[3]:
emd_kwargs = {
    "eemd_trials": 20,
    "random_state": 42,
    "sift_max_iter": 200,
    "stopping_criterion": 0.2,
}
hilbert_kwargs = {
    "pad": 100,
    "if_smooth": 11,
}

result = data.hht(
    emd_method="eemd",
    emd_kwargs=emd_kwargs,
    hilbert_kwargs=hilbert_kwargs,
    output="dict",
)

imfs = result["imfs"]
plot = imfs.plot(figsize=(10, 10), sharex=True, title="IMFs (EEMD)")
plot.show()

plt.figure(figsize=(10, 4))
for key in list(imfs.keys())[:3]:
    if_ts = result["if"][key]
    plt.plot(if_ts.times.value, if_ts.value, label=key)

plt.xlabel("Time [s]")
plt.ylabel("Instantaneous Frequency [Hz]")
plt.title("Instantaneous Frequency (First 3 IMFs)")
plt.legend()
plt.show()

../../../../_images/web_ja_user_guide_tutorials_advanced_hht_5_0.png
../../../../_images/web_ja_user_guide_tutorials_advanced_hht_5_1.png

解釈(IMFs と IF)

第1 IMF が高周波チャープを主に表し、瞬時周波数が時間とともに増加します。

3. ヒルベルトスペクトル (HHTSpectrogram)

output='spectrogram' を指定すると時間-周波数マップを得られます。HHTSpectrogram.plot() は既定で対数スケールです。

[4]:
spec = data.hht(
    output="spectrogram",
    emd_method="eemd",
    emd_kwargs=emd_kwargs,
    hilbert_kwargs=hilbert_kwargs,
    fmin=0,
    fmax=200,
    n_bins=120,
    weight="ia2",
)

plot = spec.plot(figsize=(10, 5))
plot.show()

../../../../_images/web_ja_user_guide_tutorials_advanced_hht_8_0.png

4. 低レベルAPIについて(任意)

詳細制御が必要な場合は以下を直接使用できます:

  • emd()(分解)

  • hilbert_analysis()(IA/IF)

  • instantaneous_frequency() / envelope()(個別 IMF)

通常の解析では hht() が推奨です。

ヒント

  • 端点効果が出やすいので hilbert_kwargs={'pad': N} を検討し、端は無視してください。

  • より滑らかな IMF が必要なら eemd_trials を増やします(計算時間増)。

  • 再現性重視なら emd_method='emd' を使います。

まとめ

TimeSeries.hht() を使うと IMF の診断とヒルベルトスペクトルの両方を簡潔に取得できます。