このブログでは、時間周波数解析としてSTFTとウェーブレット変換、定Q変換をやりました。
今回はメルスペクトログラムをやってみます。
メルスペクトログラムは、周波数が人間の知覚に近いメル尺度(低周波数の音を良く知覚する)に変換されたSTFTのことです。
以前と同様に、音源はESC-50というデータセットからお借りしました。 データセットのリポジトリはこちら➡https://github.com/karolpiczak/ESC-50 siren(サイレン)のタグがついたファイルを借りました➡1-76831-A-42.wav
librosa.feature.melspectrogramを用いたメルスペクトログラム
音響信号処理によく使われるライブラリであるlibrosaを用います。 このライブラリはpipでインストールできます。時間軸の生成にはlibrosa.time_to_framesを用い、周波数軸の生成にはlibrosa.mel_frequenciesを用います。
コードは次の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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() |
結果は以下のグラフです。
正しくメルスペクトログラムによる時間周波数解析ができていそうです。
コメント