このブログでは、時間周波数解析として
STFTと
ウェーブレット変換で、
定Q変換をやりました。
今回はメルスペクトログラムをやってみます。
メルスペクトログラムは、周波数が人間の知覚に近いメル尺度(低周波数の音を良く知覚する)に変換されたSTFTのことです。
以前と同様に、音源はESC-50というデータセットからお借りしました。 データセットのリポジトリはこちら➡
https://github.com/karolpiczak/ESC-50 siren(サイレン)のタグがついたファイルを借りました➡
1-76831-A-42.wav
音響信号処理によく使われるライブラリであるlibrosaを用います。 このライブラリはpipでインストールできます。時間軸の生成には
librosa.time_to_framesを用い、周波数軸の生成には
librosa.mel_frequenciesを用います。
コードは次の通りです。
import matplotlib.pyplot as plt
import numpy as np
import librosa
if __name__ == "__main__":
wave, fs = wav_read(path_to_wavfile)
n_mels = 128
fmax = 8000
mel = librosa.feature.melspectrogram(y=wave, sr=fs, n_mels=n_mels, fmax=fmax)
mel_dB = librosa.power_to_db(mel, ref=np.max) #dBに変換
frq = librosa.mel_frequencies(n_mels=n_mels, fmax=fmax) #周波数軸
t = librosa.frames_to_time(np.arange(mel_dB.shape[1]), sr=fs) # 時間軸
plt.pcolormesh(t, frq, mel_dB, cmap = 'jet')
plt.show()
plt.close()
結果は以下のグラフです。
正しくメルスペクトログラムによる時間周波数解析ができていそうです。
コメント