2010年9月14日火曜日

信号処理の勉強

SciPyも無事導入出来たということで、信号処理を勉強し始めた。
ということで調べたことをメモ。

・自己相関関数
時間領域において波形の周期性を調べる際に用いられる数学的手続き。
その波形自信の畳み込み積分を計算することによって求められる。
音声のピッチ検出などに応用されている。

・相互相関関数
2つの波形の類似性を調べるための数学的手続き。
自己相関関数と同様ピッチ検出などに応用されている。
2つの波形の畳み込み積分を計算することによって求められる。

どちらもピッチ検出に用いられているけれど、相互相関を使った方が自己相関を使うよりも計算負荷が低くいのでより良いとのこと。

毎度お馴染みPythonだったら、2つともnumpy.correlate()で計算可能。

ただし、自己相関関数を求める場合は下記のようにmodeに"same"を指定する必要あり。


>>> correlate(signal,signal,"same")


ただ使うだけじゃ面白くないので相互相関関数を自分で実装してみた。
CCFは(Cross Correlation Function:相互相関関数)の略。

def CCF(array1,array2):

if len(array1) < len(array2):
array1,array2 = array2,array1

ccf = []

for i in range(len(array1) - len(array2)):
temp = 0
for j in range(len(array2)):
temp += array2[j] * array1[j - i]
ccf.append(temp / len(array2))

return ccf


この関数を用いて10Hzの正弦波(サンプリング周波数1000Hz)と、その正弦波の先頭から1周期分の波形の相互相関を求めてみる。



青が元の正弦波、赤が正弦波の先頭1周期、緑がそれら二つの波形の相互相関。

相互相関の値が0,100,200…と100の倍数で最大値をとっている。

これはつまり、この正弦波が100ms(10Hz)の周期の波形であること示している。
…ということでキチンと計算できているようだ。

0 件のコメント:

コメントを投稿