2010年9月15日水曜日

AMDF

AMDF(Average Magnitude Deference function)を用いたピッチ検出を試してみましたよ、というお話。

AMDFは自己相関、相互相関関数のようにピッチ検出に用いられるアルゴリズムのひとつ。

(※2010/10/12追記:OEDEC2007のプレゼン資料にAMDFの分かりやすい説明が載ってます)

ココとかココ(こちらはIEEEの認証が必要)を参考にAMDFをPythonで実装してみた。


def AMDF(array,frameLength):
amdf = []
length = len(array)
for i in range(frameLength):
temp = 0
for j in range(length):
temp += abs(array[j] - array[j - i])
amdf.append(temp / length)
return amdf



この関数が正しく動作するか確認するため、下のような波形を用意する。



周波数100Hzの方形波にノイズを加えたもの。


この波形にAMDFを適用して計算した結果がこちら。



0.01sに最小値のピークが出ている。
相互相関関数と違って、AMDFでは最小値となる点が周期性を表していることが分かる。

0 件のコメント:

コメントを投稿