pythonで時間周波数解析~メルスペクトログラム~

このブログでは、時間周波数解析として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を用います。 コードは次の通りです。
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()
結果は以下のグラフです。 正しくメルスペクトログラムによる時間周波数解析ができていそうです。

コメント

タイトルとURLをコピーしました