Constant-Q変換と音高

目的

ここまでで,音楽データに短時間離散フーリエ変換をかけ,周波数領域で音楽データを表現する方法を学んだ.ここでは,Constant-Q変換を使用して音楽データを周波数領域で表現する方法を学ぶ.

説明

音名と周波数

ピアノの白鍵でドから始まりシで終わる「ド レ ミ ファ ソ ラ シ」をアルファベットで記述すると「C D E F G A B」となる.ピアノの黒鍵も加えると「C C# D D# E F F# G G# A A# B」となる.ピアノの中央のCを「C4」とし,1オクターブ下のCを「C3」,1オクターブ上のCを「C5」と記述する.例えばC4から1オクターブ上のC5までを「C4 C#4 D4 D#4 E4 F4 F#4 G4 G#4 A4 A#4 B4 C5」と書く.一般的な88鍵のピアノの最低音はA0であり,最高音はC8である.C0からB8までの音の周波数は以下のようになる.

A0からA8までを見ると,1オクターブ上の音の周波数は1オクターブ下の音の周波数の2倍になっていることがわかる.ピアノの調律を行う際には,A4が440Hzとなるようにすることが一般的である.ちなみに,時報の最初の短い3音はA4であり,最後の長い1音は1オクターブ上のA5である.

C0からC8までを見ると,やはり1オクターブ上の音の周波数は1オクターブ下の音の周波数の2倍になっていることがわかる.また,Cの音の周波数は2の累乗に近い値であることも確認できる.

Constant-Q変換

Constat-Q変換は離散フーリエ変換と同様に時間信号を周波数信号に変換する方法である.Constant-Q変換では,周波数フィルタバンクにおける各フィルタの中心周波数が$$f_k = f_0 \cdot 2^{\frac{k}{b}}$$となるようにする.ここで,\(f_0\)は最小周波数であり,\(b\)は1オクターブあたりの周波数フィルタの数である.\(b=12\)とすると,中心周波数\(f_k\)が音名に対応する周波数を表すこととなる,このことから,Constant-Q変換は音楽データの周波数解析によく使用される.

librosaモジュールを使用して,ピアノで「C3 D3 E3 F3 G3 A3 B3 C4」の8音を順に弾いたオーディオデータにConstant-Q変換をかけてみよう.

25行目でフレーム周期に相当する標本点数を,26行目で窓関数を,27行目で1オクターブあたりの周波数フィルタ数を,28行目で求めるオクターブ数を指定し,29行目で全体の周波数フィルタ数を求めている.30,31行目でC1の周波数を最小周波数として,指定した条件でConstant-Q変換を行い,32行目で振幅を求め,34行目で求めた振幅のshapeを表示している.

実行すると以下のように表示され,振幅のshapeが(84, 348)であることがわかる.84は指定した周波数フィルタの数であり,348はオーディオデータの標本点数をフレーム周期に相当する標本点数で割った数に1を足した数である.35,36行目でこれを確認している.

また,40行目でConstant-Q変換で得られたパワースペクトログラムを描画している.実行すると以下のように表示され,C3からC4までの8音に対応した周波数成分が強く現れていることが確認できる.

Constant-Q変換で得られた周波数成分の中心周波数は音名に対応する周波数であった.上の例ではスペクトログラムの縦軸を周波数としてプロットしたが,縦軸を音名としてプロットすることもできる.

36行目のように,キーワード引数y_axisに「cqt_note」を指定すると,スペクトログラムの縦軸を音名とすることができる.実行すると以下のように表示され,指定した最小周波数の音C1から7オクターブ分の音名が縦軸に表示されていることが確認できる.また,C3からC4までの8音の成分が強く現れていることが容易に確認できる.

ピッチの変更

librosaモジュールを使用すると音の高さ(ピッチ)を変更することができる.ピアノで「C3 D3 E3 F3 G3 A3 B3 C4」の8音を順に弾いたオーディオデータのピッチを変更し,Constant-Q変換によって得られたパワースペクトログラムを表示させてピッチが変更されたか確認してみよう.

1オクターブを12に分けた1つが半音であるが,24行目のように記述することで,ピッチを半音で4つ分高くすることができる.これを長三度(major third)高くすると言う.25行目のように記述することで,ピッチを半音で6つ分低くすることができる.これを三全音(tritone)低くすると言う.1オクターブを12に分けた1つが半音であるが,1オクターブを24に分けるには9行目のように記述すればよい.26行目では,1/4音で3つ分高くしているため3/4音だけピッチを高くしている.33行目から36行目で,元のオーディオデータとピッチを変更した3種類のオーディオデータにConstant-Q変換をかけ,振幅を求めている.41,46,51,56行目でそれらのパワースペクトログラムを表示している.実行すると以下のように表示され,変更したピッチに対応する音名の成分が強く現れていることが確認できる.

音名の推定

ある1つの楽器で1音ずつ演奏したオーディオデータに対してConstant-Q変換を行えば,比較的簡単な処理で音名を推定することができる.ピアノで「C3 D3 E3 F3 G3 A3 B3 C4」の8音を順に弾いたオーディオデータから音名を推定してみよう.

30,31行目でオーディオデータにConstant-Q変換をかけ,振幅を求めている.33行目で各フレームで振幅が最大となる音名に対応するインデックス番号を求めている.34行目でインデックス番号に対応した音名を表示するためのデータを,35行目でフレーム数に対応した時間を表示するためのデータを作成している.37,38行目で各フレームの時間と推定した音名を表示している.

実行すると以下のように表示され,約1秒間隔でC3からC4までの音名が正しく推定できていることが確認できる.

課題

以下のオーディオデータを使用して課題を行え.

  • ピアノで「C2 D2 E2 F2 G2 A2 B2 C3」の8音を順に弾いたオーディオデータ
    • http://makotomurakami.com/blog/wp-content/uploads/2020/06/piano_cdefgabc2.wav
  • ピアノで「C3 D3 E3 F3 G3 A3 B3 C4」の8音を順に弾いたオーディオデータ
    • http://makotomurakami.com/blog/wp-content/uploads/2020/06/piano_cdefgabc3.wav
  • ピアノで「C4 D4 E4 F4 G4 A4 B4 C5」の8音を順に弾いたオーディオデータ
    • http://makotomurakami.com/blog/wp-content/uploads/2020/06/piano_cdefgabc4.wav
  • ピアノで「C5 D5 E5 F5 G5 A5 B5 C6」の8音を順に弾いたオーディオデータ
    • http://makotomurakami.com/blog/wp-content/uploads/2020/06/piano_cdefgabc5.wav

課題0

ピアノで「C3 D3 E3 F3 G3 A3 B3 C4」の8音を順に弾いたオーディオデータを読み込み,無音区間を取り除き,Constant-Q変換によるパワースペクトログラムを表示せよ.

課題1

ピアノで「C2 D2 E2 F2 G2 A2 B2 C3」の8音を順に弾いたオーディオデータを読み込み,無音区間を取り除き,Constant-Q変換によるパワースペクトログラムを表示せよ.

課題2

ピアノで「C4 D4 E4 F4 G4 A4 B4 C5」の8音を順に弾いたオーディオデータを読み込み,無音区間を取り除き,Constant-Q変換によるパワースペクトログラムを表示せよ.

課題3

ピアノで「C5 D5 E5 F5 G5 A5 B5 C6」の8音を順に弾いたオーディオデータを読み込み,無音区間を取り除き,Constant-Q変換によるパワースペクトログラムを表示せよ.

課題4

ピアノで「C2 D2 E2 F2 G2 A2 B2 C3」の8音を順に弾いたオーディオデータを読み込み,無音区間を取り除き,フレーム処理を行い,各フレームの音名を推定せよ.

課題5

ピアノで「C4 D4 E4 F4 G4 A4 B4 C5」の8音を順に弾いたオーディオデータを読み込み,無音区間を取り除き,フレーム処理を行い,各フレームの音名を推定せよ.

課題6

ピアノで「C5 D5 E5 F5 G5 A5 B5 C6」の8音を順に弾いたオーディオデータを読み込み,無音区間を取り除き,フレーム処理を行い,各フレームの音名を推定せよ.

課題7

ピアノで「C2 D2 E2 F2 G2 A2 B2 C3」の8音を順に弾いたオーディオデータを読み込み,無音区間を取り除き,半音3つ分ピッチを高くし,フレーム処理を行い,各フレームの音名を推定せよ.

課題8

ピアノで「C4 D4 E4 F4 G4 A4 B4 C5」の8音を順に弾いたオーディオデータを読み込み,無音区間を取り除き,半音4つ分ピッチを低くし,フレーム処理を行い,各フレームの音名を推定せよ.

課題9

ピアノで「C5 D5 E5 F5 G5 A5 B5 C6」の8音を順に弾いたオーディオデータを読み込み,無音区間を取り除き,1/4音3つ分ピッチを低くし,フレーム処理を行い,各フレームの音名を推定せよ.