オーディオ信号の時間遅延の測定


9

誰かが私に怒鳴る前に、私はこの質問が何度も尋ねられたことを完全に理解します。既存の質問と回答をすべて読んだことは間違いありませんが、問題の一部についてはまだ混乱しています。

閉鎖的な環境で音楽を再生する音源(A)があります。Aの録音に使用しているマイクがあります。同じ特性と長さ(サンプル数)を共有する2つのwavファイルが残ります。

私の目標は、Aがマイクに到達するのにかかった時間を計算することです。

相互相関(numpy)を使用して計算を実行しようとしています:

# Delay estimation
corr = numpy.convolve(original_audio, recorded_audio, 'full')
delay = int(len(corr)/2) - numpy.argmax(corr)
distance = delay / sample_rate * 343 # sample_rate == 22050, m/s = speed of sound
print("Distance full: %.2f cm" % (distance * 100))

300,000 cmの範囲の値を一貫して取得します。スピーカーとマイクの間の距離は約2フィートです。

これはすべて私にとってはまったく新しいことなので、明らかな何かが欠けていると確信しています。

前もって感謝します。


3
numpy.correlate代わりに使用してはいけませんnumpy.convolveか?遅延を推定するには、信号を畳み込むのではなく、相互相関させる必要があります。たたみ込みにより、はるかに大きな遅延が生じる可能性があります。
ピーターK

PeterKはおそらく正しいです。最初に入力の1つを時間反転および共役させることにより、畳み込みを介して相関を実装できることに注意してください。これにより、相関に高速のたたみ込みアルゴリズム(overlap-saveなど)を使用できます。
Jason R

回答:


8

numpy.correlate代わりに使用してはいけませんnumpy.convolveか?遅延を推定するには、信号を畳み込むのではなく、相互相関させる必要があります。たたみ込みにより、はるかに大きな遅延が生じる可能性があります。

簡単なことを試す:

x = [1, 0, 0, 0, 0 ];
y = [0, 0, 0, 0, 1 ];
conv = numpy.convolve(x,y); 
conv
array([0, 0, 0, 0, 1, 0, 0, 0, 0])
corr = numpy.correlate(x,y,"full");
corr
array([1, 0, 0, 0, 0, 0, 0, 0, 0])

3
これはまさに私が探していたものです。私が見た別の例は畳み込みを使用しており、直接相関が正しい選択であるとは思いもしませんでした。ありがとうございました。
CaymanEss 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.