MPMアルゴリズムのNSDFの求めかた
結論だけ知りたい人向け
NSDF の式
の について、前から求めると
後ろから求めると
となるので、好きな方でやってください。
はじめに
ピッチ検出アルゴリズムについて検索すると、まぁ大体このページ(音声の波形からピッチを検出するアルゴリズム - まめめも)に行き着くと思うのですが、 NSDF のインクリメンタルな求め方について特に説明もなく、クワイン用の well compressed なプログラムしか書いていないので、基の論文であるところの『A Smarter Way to Find Pitch』に書いてある式を変形しながら、本当にインクリメンタルに求まるのか検証していきます。
ここでは Normalized Square Difference Function の略として NSDF と言っていますが、 McLeod 氏の 2008 年の論文では specially-normalized autocorrelation function で略して SNAC と呼んでいますね。まぁいいや。
前から求めていく
まず、 NSDF は自己相関から得られる値で、最大値は 1 です。 のとき、元の信号と完全に一致するわけですから、 になるはずで、 だから になります。
次に のもともとの定義を見てみましょう。
話を簡単にするために としてみます。そしてシグマを展開すると次のようになります。
で、これを眺めて雑に一般化してしまえば
になるなぁというのがわかると思います。というわけで
が得られました。 NSDF の値自体は に求まった を突っ込むだけなので、特に言うことはないと思います。
後ろから求めていく
普通実装するにあたって、すでに信号は読み込まれているはずなので、逆から舐めていっても問題ないはずです。そこで先ほど展開した をもう一度眺めてみると
という感じなので、頭悪く と置いてしまえば
になります。というわけで
になります。
私は のループできれいに書ける逆順のほうが好きです。こちらからは以上です。