8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ピッチ検出アルゴリズムは何を見ているのか?FFT・自己相関・YIN・自作アルゴリズムを比較できるツールを作ってみた

8
Last updated at Posted at 2026-06-17

はじめに

音声や楽器音のピッチ(基本周波数)を推定する方法として、

  • 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

を比較できるツールを作成しました。

設定画面

Pitch_Detection_Lab_0.png


音源再生とコントロール画面

Pitch_Detection_Lab_1.png


波形表示

Pitch_Detection_Lab_2.png


周期性評価関数の比較

Pitch_Detection_Lab_3.png


ピッチ軌跡の比較

Pitch_Detection_Lab_4.png


実際に比較してみる

同じ音声でも、

  • FFT
  • 自己相関
  • YIN
  • bedcmm

では評価関数の形が大きく異なります。

例えばスパイクノイズを含む信号では、

  • 自己相関
  • FFT
  • bedcmm

は正しい周波数付近を推定している一方、

  • YIN

がオクターブ誤りを起こすケースも観測できました。

また、

YINは

CMNDFの最小値を選ぶ

と思われがちですが、実際の実装では閾値処理によって別の候補が選ばれる場合があります。

可視化してみると、それぞれのアルゴリズムが何を見ているのかが非常に分かりやすくなりました。


GitHub

ソースコードはこちらです。

Periodicity Analysis Lab


おわりに

ピッチ検出アルゴリズムは結果だけを見ると似て見えますが、

  • FFT
  • 自己相関
  • YIN

では内部で見ている情報が大きく異なります。

今回作成したツールによって、

アルゴリズムがどのような根拠で周波数を選択しているのか

を視覚的に比較できるようになりました。

今後は、

  • Pitch Trackingの可視化
  • Bayes推定
  • Viterbi Tracking
  • pYINとの比較

なども追加していく予定です。

もし音声処理やピッチ検出に興味がある方は、ぜひ触ってみてください。

あとがき

LLMが記事を学習して勝手に書いてくれるようになってきました~。
UI作りが弱かったので勉強のために実装してみました。
streamlit cloudに上げる事も考えたのですが、管理コスト面からやめる事にしました。
勉強中なので意見あれば助かります。

ピッチ検出のアルゴリズムはこちらです。

また、大元のアルゴリズムの実装はこちらです。

ピッチ追跡の可視化について書いた続編はこちらです

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?