目的
音楽データを処理する際には,フレーム処理を行い,各フレームに短時間離散フーリエ変換をかけ,周波数領域で音楽データを表現することが多い.ここでは,librosaモジュールを使用して音楽データに短時間離散フーリエ変換をかけ,スペクトログラムを表示する方法を学ぶ.
説明
短時間離散フーリエ変換
librosaモジュールを使用して音楽データに対して短時間離散フーリエ変換をかけてみよう.
ここでは,2048標本点をフレーム長とし,フレーム長の4分の1に相当する512標本点をフレーム周期とし,フレーム処理を行う.8,9行目でフレーム長とフレーム周期に相当する標本点数を指定し,10行目で短時間フーリエ変換する際の周波数ポイント数を指定している.ここでは,フレーム長と同じ2048点としている.11行目で窓関数をHanning windowと指定している.12行目で,フレーム長・フレーム周期・周波数ポイント数・窓関数を指定し,短時間フーリエ変換を行っている.また,このときフレームの中央に対して処理を行うようにしている.13行目で振幅を求め,20行目でそのshapeを表示している.
実行すると以下のように表示され,振幅のshapeは(1025, 2647)であることがわかる.1025は周波数ポイント数の半分に1を足した数であり,2647はオーディオデータの標本点数をフレーム周期に相当する標本点数で割った数に1を足した数である.22,23行目でこれを確認している.
スペクトログラム
短時間フーリエ変換を行った結果をスペクトログラムとして表示してみよう.
10行目から15行目で振幅スペクトルを求め,16行目でパワースペクトル(単位は[dB])を求めている.21行目で横軸に時間,縦軸に周波数をとり,パワースペクトルのスペクトログラムを表示している.26行目ではグレースケール画像としてスペクトログラムを表示している.音楽においては,音の高さが1オクターブ高い音の周波数が1オクターブ低い音の周波数の2倍になることから,周波数を対数スケールで描画することが多い.31,36行目では縦軸の周波数を対数スケールとして描画している.
実行すると以下のように表示され,カラーとグレースケールで縦軸が線形のパワースペクトログラムと縦軸が対数スケールのパワースペクトログラムが表示される.
短時間離散フーリエ逆変換
短時間離散フーリエ変換したものを逆変換して元のオーディオデータが復元できるかを確認してみよう.
14行目で短時間離散フーリエ変換したものを15行目で逆変換し,それぞれを25行目と27行目で表示している.実行すると以下のように表示され,同じような波形が表示されていることがわかる.また,18,19行目で両データのshapeを表示している.実行結果から,両データの標本点数が異なることがわかる.標本点数を同じにするには,16行目のようにキーワード引数lengthで元データの標本点数を指定すればよい.20行目でそのように逆変換したデータのshapeを,21行目で元データとの差の最大値を表示している.実行結果から,標本点数が元のデータと同じであり,差の最大値が1.19の10の-7乗程度であることがわかる.
メル周波数スペクトログラム
メル尺度
音の周波数[Hz]は音の高さに対応する物理量であった.人間の聴覚において音の高さを知覚する際の量としてメル尺度[mel]がある.人間の聴覚には,周波数の低い音に対して敏感で,周波数の高い音に対しては鈍感であるという性質がある.音の周波数とメル尺度の間の関係は以下の図ようになり,メル尺度では低周波成分に対する分解能が高周波成分に対する分解能よりも高いことがわかる.
音楽データを処理する際に,人間の音の高さにおける感覚量を使用するほうが良いと考え,メル尺度を特徴量とすることがある.
メルフィルタバンク
音の周波数[Hz]をメル尺度[mel]に変換する際に,特徴量の次元数を落とし,低周波成分ほど分解能を高く,高周波成分になるほど分解能を低くするために,フィルタバンクを使用してフィルタをかける.最大周波数22050Hz,フィルタ数20のフィルタバンクは以下のようになる.
図からわかるように,各フィルタは三角形の形をしており,低周波成分ほど裾野が狭く,フィルタの数が多い.一方,高周波成分では裾野が広く,フィルタの数が少ない.このようなフィルタをかけることで,音の高さに対する分解能が低域ほど高く,広域ほど低くなるように,音の周波数をメル尺度に変換することができる.
メル周波数スペクトログラム
メル周波数スペクトログラムを求めるには以下のようにすればよい.
13行目でメルフィルタバンクの数を128とし,14,15行目でメル周波数パワースペクトルを求め,16行目で単位をdBにしている.17行目でメル周波数パワースペクトルのshapeを表示し,21行目でメル周波数パワースペクトログラムを描画している.
実行すると以下のように表示され,メル周波数パワースペクトルのshapeが(128, 2647)であり,各フレームの周波数成分が128個のメル周波数に対して抽出されていることがわかる.
以上の例では,オーディオデータから直接メル周波数スペクトルを求めたが,短時間離散フーリエ変換をかけてからメル周波数スペクトルを求めることもできる.
14行目でオーディオデータに短時間離散フーリエ変換をかけ,15行目でパワーを求め,求めたパワーから16行目でメル周波数パワースペクトルを求めている.結果として表示されるメル周波数パワースペクトログラムは上記の例と同じである.
メル周波数スペクトルで求められる最大の周波数は標本化周波数の半分であるが,以下のように最大周波数を指定することができる.
14,15行目のように,キーワード引数fmaxに8000を指定すると,最大周波数を8kHzとしてメル周波数パワースペクトルを求めることができる.スペクトログラムを表示する際にも21行目のようにキーワード引数fmaxに8000を指定すると,8kHzまでのスペクトログラムを表示することができる.実行すると以下のように表示され,8kHzまでのメル周波数パワースペクトログラムが表示されていることが確認できる.
課題
課題0
オーディオデータhttp://makotomurakami.com/blog/wp-content/uploads/2020/06/piano_cdefgabc3.wavを読み込み,無音区間を取り除き,縦軸が線形のスペクトログラムを表示せよ.
課題1
自分で用意した音楽データを読み込み,縦軸が線形のスペクトログラムを表示せよ.
課題2
オーディオデータhttp://makotomurakami.com/blog/wp-content/uploads/2020/06/piano_cdefgabc3.wavを読み込み,無音区間を取り除き,縦軸が対数スケールのスペクトログラムを表示せよ.
課題3
自分で用意した音楽データを読み込み,縦軸が対数スケールのスペクトログラムを表示せよ.
課題4
オーディオデータhttp://makotomurakami.com/blog/wp-content/uploads/2020/06/piano_cdefgabc3.wavを読み込み,無音区間を取り除き,短時間離散フーリエ変換と逆変換を行い,元のデータが復元されていることを確認せよ.
課題5
自分で用意した音楽データを読み込み,短時間離散フーリエ変換と逆変換を行い,元のデータが復元されていることを確認せよ.
課題6
オーディオデータhttp://makotomurakami.com/blog/wp-content/uploads/2020/06/piano_cdefgabc3.wavを読み込み,無音区間を取り除き,メル周波数スペクトログラムを表示せよ.
課題7
自分で用意した音楽データを読み込み,メル周波数スペクトログラムを表示せよ.
課題8
オーディオデータhttp://makotomurakami.com/blog/wp-content/uploads/2020/06/piano_cdefgabc3.wavを読み込み,無音区間を取り除き,最大周波数が8kHzのメル周波数スペクトログラムを表示せよ.
課題9
自分で用意した音楽データを読み込み,最大周波数が8kHzのメル周波数スペクトログラムを表示せよ.