はじめに
この実験では、Matplotlib を使って周波数スペクトル図を作成する方法を学びます。周波数スペクトル図は、信号の周波数スペクトルが時間とともに変化する様子を視覚的に表したものです。周波数スペクトル図は、音声認識、音楽分析、オーディオ信号処理など、信号の時間経過に伴う周波数成分を分析する際に一般的に使用されます。Python と Matplotlib を使って信号の周波数スペクトル図を作成します。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。
学習中に問題に遭遇した場合は、Labby にお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。
ライブラリのインポート
必要なライブラリをインポートして始めましょう:NumPy と Matplotlib。
import matplotlib.pyplot as plt
import numpy as np
信号の生成
次に、描画する信号を生成します。この例では、異なる周波数の 2 つの正弦波と、いくらかのランダムノイズの和で構成される信号を作成します。
## Fixing random state for reproducibility
np.random.seed(19680801)
dt = 0.0005
t = np.arange(0.0, 20.0, dt)
s1 = np.sin(2 * np.pi * 100 * t)
s2 = 2 * np.sin(2 * np.pi * 400 * t)
## create a transient "chirp"
s2[t <= 10] = s2[12 <= t] = 0
## add some noise into the mix
nse = 0.01 * np.random.random(size=len(t))
x = s1 + s2 + nse ## the signal
スペクトログラムの生成
次に、信号のスペクトログラムを生成します。Matplotlib のAxesクラスのspecgramメソッドを使ってスペクトログラムを生成します。このメソッドは 4 つのオブジェクトを返します:Pxx、freqs、bins、およびim。Pxxは周期グラム、freqsは周波数ベクトル、binsは時間ビンの中心、imはプロット内のデータを表すAxesImageインスタンスです。
NFFT = 1024 ## the length of the windowing segments
Fs = int(1.0 / dt) ## the sampling frequency
fig, (ax1, ax2) = plt.subplots(nrows=2)
ax1.plot(t, x)
Pxx, freqs, bins, im = ax2.specgram(x, NFFT=NFFT, Fs=Fs, noverlap=900)
プロットのカスタマイズ
タイトル、軸のラベル、カラーマップを追加することで、プロットをカスタマイズできます。
fig, (ax1, ax2) = plt.subplots(nrows=2)
ax1.set_title('Time Domain Signal')
ax1.set_xlabel('Time (s)')
ax1.set_ylabel('Amplitude')
ax1.plot(t, x)
ax2.set_title('Spectrogram')
ax2.set_xlabel('Time (s)')
ax2.set_ylabel('Frequency (Hz)')
im = ax2.specgram(x, NFFT=NFFT, Fs=Fs, noverlap=900, cmap='viridis')
fig.colorbar(im[3], ax=ax2)
プロットの表示
最後に、プロットを表示します。
plt.show()
まとめ
この実験では、Matplotlib を使ってスペクトログラムを作成する方法を学びました。信号を生成し、Matplotlib のAxesクラスのspecgramメソッドを使ってスペクトログラムを生成しました。また、タイトル、軸のラベル、カラーマップを追加することでプロットをカスタマイズしました。スペクトログラムは、信号の周波数成分を時間とともに分析するのに役立ち、音声認識、音楽分析、オーディオ信号処理で一般的に使用されます。