がれすたさんのDIY日記

電子回路、Python、組み込みシステム開発、自作エフェクターを語るblog

Python:scipy.signal.spectrogramを使ってスペクトログラムを描画する



今回は信号の時系列変化を可視化できるスペクトログラムを描画してみたいと思う
使うメソッドはPython:scipy.signal.spectrogramである。

オプションパラメータがたくさんあるが

f,t,Sxx = signal.spectrogram(data, fs, nperseg=512)

のように書いてあげればいいnpersegは256でもいいかもしれない。

spectrogramの描画

今回は前回作成したSwept-sine信号のスペクトラムの描画をやってみたいと思う
信号の生成は前回の記事を参考にしてほしい
gsmcustomeffects.hatenablog.com

今回やることとしてはsignal.spectrogramメソッド呼ぶだけ

import matplotlib.pylab as plt
import numpy as np
import scipy.signal as signal

f1 = 10        # start frequency
f2 = 12000       # end frequency
fs = 96000      # sampling frequency
T = 10          # time duration of the sweep
fade = [48000, 480]   # samlpes to fade-in and fade-out the input signal


'''generation of the signal'''
L = T/np.log(f2/f1)                    # parametre of exp.swept-sine
t = np.arange(0,np.round(fs*T-1)/fs,1/fs)  # time axis
s = np.sin(2*np.pi*f1*L*np.exp(t/L))       # generated swept-sine signal

# fade-in the input signal
if fade[0]>0:
    s[0:fade[0]] = s[0:fade[0]] * ((-np.cos(np.arange(fade[0])/fade[0]*np.pi)+1) / 2)

# fade-out the input signal
if fade[1]>0:
    s[-fade[1]:] = s[-fade[1]:] *  ((np.cos(np.arange(fade[1])/fade[1]*np.pi)+1) / 2)
    
f,t,Sxx = signal.spectrogram(s, fs, nperseg=512)

plt.figure()
plt.pcolormesh(t,f,Sxx,cmap="GnBu")
plt.xlim([0,10])
plt.ylim([0,10000])
plt.xlabel("Time [sec]")
plt.ylabel("Freq [Hz]")
plt.colorbar()
plt.show()

matplotのcmapの設定で好みの色に設定できる


f:id:gsmcustomeffects:20190117192936p:plain
Swept-sine信号のスペクトログラム
f:id:gsmcustomeffects:20190117193200p:plain
色変更後[cmap="Spectral"]