はじめに
音声や楽器音のピッチ(基本周波数)を推定する方法として、
- FFT
- 自己相関(Autocorrelation)
- YIN
- pYIN
など様々なアルゴリズムが知られています。
しかし実際には、
それぞれのアルゴリズムが何を見て周波数を決めているのか
を比較する機会はあまりありません。
私は以前から周期性解析に興味があり、自作の周期性評価アルゴリズム bedcmm を開発しています。
今回、FFT・自己相関・YIN・bedcmmを同じフレームに対して比較できるツール Periodicity Analysis Lab を作成しました。
ピッチ検出アルゴリズムは何を見ているのか?
一言で「ピッチ検出」と言っても、アルゴリズムによって見ている情報は大きく異なります。
FFT
FFTは信号を周波数成分へ分解します。
例えば220Hzのサイン波であれば、
- 220Hz付近に大きなピーク
が現れます。
FFTは非常に高速ですが、
- 倍音が強い
- 時間変化が速い
といった場合には基本周波数の推定が難しくなることがあります。
自己相関(Autocorrelation)
自己相関は、
信号を少しずつずらしながら重ね合わせる
ことで周期を求めます。
周期が一致する場所では自己相関が大きくなります。
そのため、
- 基本周波数
- 周期構造
を直接扱えるという特徴があります。
一方で、
- 倍周期
- 半周期
にもピークが現れるため、誤検出の原因になることがあります。
YIN
YINは自己相関ではなく、
差分
を利用して周期を評価します。
周期が一致している場合、
x[t] ≒ x[t+τ]
となるため差分が小さくなります。
YINではさらにCMNDF(Cumulative Mean Normalized Difference Function)という正規化を行い、周期候補を選択します。
現在では非常に広く利用されている手法です。
bedcmm
bedcmmは私が開発している周期性評価アルゴリズムです。
自己相関やYINとは異なる考え方で周期性を評価します。
詳細は別記事で説明していますが、
- 周期性の強さ
- 周期候補の比較
を行いやすい特徴があります。
比較ツールを作ってみた
そこで、
同じフレームに対して
- FFT
- 自己相関
- YIN(CMNDF)
- bedcmm
を比較できるツールを作成しました。
設定画面
音源再生とコントロール画面
波形表示
周期性評価関数の比較
ピッチ軌跡の比較
実際に比較してみる
同じ音声でも、
- FFT
- 自己相関
- YIN
- bedcmm
では評価関数の形が大きく異なります。
例えばスパイクノイズを含む信号では、
- 自己相関
- FFT
- bedcmm
は正しい周波数付近を推定している一方、
- YIN
がオクターブ誤りを起こすケースも観測できました。
また、
YINは
CMNDFの最小値を選ぶ
と思われがちですが、実際の実装では閾値処理によって別の候補が選ばれる場合があります。
可視化してみると、それぞれのアルゴリズムが何を見ているのかが非常に分かりやすくなりました。
GitHub
ソースコードはこちらです。
Periodicity Analysis Lab
おわりに
ピッチ検出アルゴリズムは結果だけを見ると似て見えますが、
- FFT
- 自己相関
- YIN
では内部で見ている情報が大きく異なります。
今回作成したツールによって、
アルゴリズムがどのような根拠で周波数を選択しているのか
を視覚的に比較できるようになりました。
今後は、
- Pitch Trackingの可視化
- Bayes推定
- Viterbi Tracking
- pYINとの比較
なども追加していく予定です。
もし音声処理やピッチ検出に興味がある方は、ぜひ触ってみてください。
あとがき
LLMが記事を学習して勝手に書いてくれるようになってきました~。
UI作りが弱かったので勉強のために実装してみました。
streamlit cloudに上げる事も考えたのですが、管理コスト面からやめる事にしました。
勉強中なので意見あれば助かります。
ピッチ検出のアルゴリズムはこちらです。
また、大元のアルゴリズムの実装はこちらです。
ピッチ追跡の可視化について書いた続編はこちらです




