pythonで時間周波数解析~定Q変換~

以前、時間周波数解析をSTFTウェーブレット変換でやりました。 今回は定Q変換(CQT: Constant-Q transform)をやってみます。 定Q変換の特徴として、低周波数で良い分解能を示します。 音色変換等の深層学習の前処理に使われることもあるみたいです。

以前と同様に、音源はESC-50というデータセットからお借りしました。 データセットのリポジトリはこちら➡https://github.com/karolpiczak/ESC-50 siren(サイレン)のタグがついたファイルを借りました➡1-76831-A-42.wav

librosa.cqtを用いた定Q変換

音響信号処理によく使われるライブラリであるlibrosaを用います。 このライブラリはpipでインストールできます。

import matplotlib.pyplot as plt
import numpy as np
import librosa
if __name__ == "__main__":
    bins = 84
    hop_length = 512
    fmin = 32.7
    cqt = librosa.cqt(wave,sr=fs, hop_length=hop_length, fmin=fmin, n_bins=bins)
    D = librosa.amplitude_to_db(cqt, ref=np.max) #定Q変換
    frq = librosa.cqt_frequencies(n_bins=bins,fmin=fmin) #周波数軸
    t = librosa.frames_to_time(np.arange(D.shape[1] + 1), sr=fs, hop_length=hop_length) #時間軸
    plt.pcolormesh(t, frq, 10 * np.log(np.abs(cqt)), cmap='jet')
    plt.colorbar()
    plt.show()
    plt.close()

結果は以下のグラフです。低周波数で良い分解能ですね。

比較のためにSTFT、ウェーブレット変換の結果をプロットしてみます。

確かに定Q変換の結果がきれいな気もします。

コメント

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