YINアルゴリズム

YINアルゴリズムは、単音のオーディオデータから基本周波数の序列を計算するアルゴリズムです。2002年に発表されたアルゴリズムで、現在すっかりピッチ検出の定番アルゴリズムです。これに基づいた改良版もどんどん発表されてます。ちなみにYINというのは英語のイニシャルとかではなく、陰陽の「陰」のことだそうです。

YIN以前の基本周波数検出は、主に自己相関関数を計算して行われます。自己相関関数とは、あるシグナルを時間シフトさせて元シグナルとの相関を計算して、シグナルの繰り返しパターンを調べる関数です。

Eq1

シグナルが周期的であるならば、このシグナルを一周期分シフトすれば元シグナルと整合するので、自己相関関数のピークとして現れます。つまり自己相関関数のピークを探し出せばシグナルの周期、そして周波数がわかる、というわけです。

しかしこの方法だけでは正解率はイマイチで、なぜかというと自己相関関数のピークはF0の周期以外のところにもたくさんあるからです。たとえばシグナル周期の倍数にあたるところでは、周期のピークより高い値が出ている可能性も充分あります。

それにシグナル強度の変化が激しければ、計算結果も不安定になります。そこもエラーの大きな原因です。

YINアルゴリズムも上述の自己相関関数から始まりますが、さらに工夫を加えることによって正確性を上げていきます。論文ではStep 1からStep 6までに分けて説明されてます。Step1が自己相関関数なので、Step2から見ていきます。

Step 2–整合性の計算に別の関数を使います。

Eq2

この関数は上述の自己相関関数を使ってこのように表すことができます。

Eq3

もともと自己相関関数のピークを探す問題を、この関数ではボトム(論文ではdipと呼んでる)を探す問題になりました。値が低いほど整合性が高いということですね。

一見自己相関関数と実質変わらないように見えますが、第二項も変数によって変わるので、ボトムの位置は必ずしも自己相関関数のピーク位置と一致しません。

これだけでぐっと正解率が上がるそうです。主な原因は第一項の定数のおかげでシグナル強度の変化の影響を受けにくくなったため、だそうです。

Step 3–Cumulative mean(累加平均?)でStep 2の関数を正規化する。

Eq4

これによってもともとγ=0あたりにあったボトムを自然な形で無視できることになり、周期の倍数以外のボトムも邪魔してこなくなる、らしい。

Step 4–それでも周期の倍数のところで邪魔されるので、関数の最低値を求める代わりに閾値を設定して、閾値を下回るボトムのなかで周期(γ)が一番小さいものを選びます。

Step 5–Parabolic interpolation、つまり内挿を行います。ちょっと正確になりますが、そんなに大事な処理でもなさそうです。

Step6–ここまで全ての時間(フレーム)でF0の予測値が計算されました。最後にすべてのフレームにおいて、そのフレームを中心に一定範囲内のフレームを調べて、関数値が一番低かったフレームのF0で元フレームのF0を置き換えてしまいます。スムージングみたいなことをしてますね。これを違う時間範囲で二回行えば、もうちょっとだけ正解率が上がります。

これでおわり。

見ての通り、YINアルゴリズムはフーリエ変換は使っていませんがやはり計算量は膨大で、とてもリアルタイム処理には向いていません。しかし音声分析や、口ずさみで音楽を検索する機能などの音楽情報処理分野ではとても強力なツールとなっています。

ちなみに普通のチューナーなどは、単純に一定時間内の波形のピークを数えて楽器のピッチを割り出しているそうです。まあメーカーごとにさらなるノウハウがありそうですが。

『YINアルゴリズム』へのコメント

  1. 名前:moutend 投稿日:2015/06/25(木) 19:05:30 ID:70345643a 返信

    音声処理を勉強中の学生です。
    理解力はしゅをみんさんの足元にも及びませんが…。
    日本語でYINアルゴリズムを説明している記事は少ないので参考になります。

    • 名前:しゃをみん 投稿日:2015/06/26(金) 18:42:54 ID:072683f12 返信

      役に立ててくれてありがとうございます。
      僕も何かを勉強するときは日本語が読みたくてよく探し回ってます。
      音声や音楽情報処理とか書いてくれる人がもっといればな~と思っちゃいますね。