はじめに
この実験では、Python の Matplotlib ライブラリを使って、加性ノイズ付きのサイン信号を生成し、可視化する方法を学びます。具体的には、高速フーリエ変換 (FFT) を使って、信号のさまざまなスペクトル表現を作成します。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み完了するまで数秒待つ必要があります。Jupyter Notebook の制限により、操作の検証は自動化できません。
学習中に問題がある場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
必要なライブラリをインポートする
まず、必要なライブラリをインポートする必要があります。私たちは NumPy と Matplotlib を使用します。
import matplotlib.pyplot as plt
import numpy as np
変数を設定する
次に、信号用の変数を設定します。サンプリング間隔を 0.01 に設定し、これによりサンプリング周波数は 100Hz になります。0 秒から 10 秒までの時間配列を 0.01 秒刻みで作成します。また、NumPy のrandn関数を使ってノイズを生成し、指数減衰関数と畳み込んでノイジーな信号を作成します。
np.random.seed(0)
dt = 0.01 ## サンプリング間隔
Fs = 1 / dt ## サンプリング周波数
t = np.arange(0, 10, dt)
## ノイズを生成する:
nse = np.random.randn(len(t))
r = np.exp(-t / 0.05)
cnse = np.convolve(nse, r) * dt
cnse = cnse[:len(t)]
s = 0.1 * np.sin(4 * np.pi * t) + cnse ## 信号
グラフを作成する
ここでは、さまざまなスペクトル表現のグラフを作成します。Matplotlib のsubplots関数を使って、3x2 のグリッドのグラフを作成します。最初のグラフには時間信号をプロットし、残りのグラフにはさまざまなスペクトルタイプをプロットします。
fig, axs = plt.subplots(nrows=3, ncols=2, figsize=(7, 7))
## 時間信号をプロットする:
axs[0, 0].set_title("Signal")
axs[0, 0].plot(t, s, color='C0')
axs[0, 0].set_xlabel("Time")
axs[0, 0].set_ylabel("Amplitude")
## さまざまなスペクトルタイプをプロットする:
axs[1, 0].set_title("Magnitude Spectrum")
axs[1, 0].magnitude_spectrum(s, Fs=Fs, color='C1')
axs[1, 1].set_title("Log. Magnitude Spectrum")
axs[1, 1].magnitude_spectrum(s, Fs=Fs, scale='dB', color='C1')
axs[2, 0].set_title("Phase Spectrum ")
axs[2, 0].phase_spectrum(s, Fs=Fs, color='C2')
axs[2, 1].set_title("Angle Spectrum")
axs[2, 1].angle_spectrum(s, Fs=Fs, color='C2')
axs[0, 1].remove() ## 空の ax を表示しない
fig.tight_layout()
plt.show()
グラフの解釈
最初のグラフは、時間領域における信号を示していることがわかります。2 番目のグラフは、信号の大きさのスペクトルを示しており、信号内のさまざまな周波数成分の強さを示しています。3 番目のグラフは、対数大きさスペクトルを示しており、非常に大きな値と非常に小さな値がある場合に、スペクトル全体を視覚化するのに役立ちます。4 番目のグラフは、位相スペクトルを示しており、信号内の各周波数成分の位相シフトを示しています。最後に、5 番目のグラフは、角度スペクトルを示しており、位相スペクトルと似ていますが、度数ではなくラジアンを使用しています。
まとめ
この実験では、Python の Matplotlib ライブラリを使って、加算ノイズ付きのサイン信号を生成し、信号のさまざまなスペクトル表現を作成しました。さまざまなスペクトルタイプをどのように解釈するか、また信号の分析にどのように役立つかを学びました。