TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

CQTでスペクトログラムを描く その6(基本周波数解析)

スペクトログラム解析VST3プラグインに基本周波数解析を実装した。

基本周波数解析

ボーカル音程モニターと同じアルゴリズムで基本周波数解析を行う。

時間分解能のずれ

スペクトログラムはF#1まで4分音の周波数分解能に対応しているため、サンプリング周波数44.1kHzで、FFTSIZEが32768となり時間分解能が低い。

ピッチ解析は、FFTSIZEが4096でも十分に解析できるため、時間分解能がずれることで、表示がずれることになる。

FFTSIZEをスペクトログラムに合わせることもできるが、時間分解能が低すぎるので、スペクトログラムの時間分解能を上げることを検討する。

バンク分割

低域の周波数分解能確保するために時間分解能が犠牲になっているので、低域は周波数分解能を落として時間分解能を上げることにする。
高域は、窓長が短いため、時間分解能を上げても周波数分解能はそのままにできる。

低域と高域でバンクを分けて処理を行い、結果を対数周波数軸で結合する。

時間分解能は同じにできるので、CQTの高速化アルゴリズムで、FFTの計算は共通化でき、スペクトルカーネルの疎行列のみ別々に作成する。

また、低域は、周波数分解能を半分にするため、ビンの間隔が2倍になる。
後続処理で透過的に扱えるようにするため、ビンの間隔は同じにしたい。
そのため、低域は、本来のCQTの半分の間隔でスペクトルカーネルを作成する。
理論上は正しくないが、表示上の補間の意味合いである。

解析音高範囲

低域をバンク分割したことで、最低音を下げることができるため、最低音をC1にした(以前はF#1)。

ピッチ解析のFFTSIZE

ピッチ解析のFFTSIZEもCQTに合わせて、FFT計算を共通化した。

これにより、FFTの計算を一部省略できて、時間のずれをなくすことができる。

ただし、修正後のスペクトログラムのFFTSIZEは16384で、時間分解能は371 msである。
体感上、若干遅く感じる。

ボーカル単音を解析した結果


楽曲からボーカル抽出したトラックを解析した結果

Demucs-Guiで、ミックスされた楽曲からボーカルトラックを抽出して解析した。


ピッチ解析のオン/オフ

クイックコントロールからピッチ解析のオン/オフを設定できるようにした。


まとめ

スペクトログラム解析VST3プラグインに基本周波数解析を実装した。
また、スペクトログラムの時間分解能を上げるため低域と高域でバンクを分けてCQTを計算するようにした。

次は、マウスカーソル位置のハイライトを実装したい。