Mengukur waktu tunda sinyal audio

9

Sebelum ada yang meneriaki saya, saya sepenuhnya menyadari bahwa pertanyaan ini telah ditanyakan berkali-kali. Saya yakinkan Anda bahwa saya sudah membaca seluruh pertanyaan dan jawaban yang ada tetapi saya masih bingung tentang bagian dari masalah.

Saya memiliki sumber suara yang memutar musik (A) di lingkungan tertutup. Saya memiliki mikrofon yang saya gunakan untuk merekam A. Saya memiliki dua file wav yang memiliki karakteristik dan panjang yang sama (jumlah sampel).

Tujuan saya adalah menghitung waktu yang dibutuhkan untuk mencapai mikrofon.

Saya mencoba melakukan perhitungan menggunakan korelasi silang (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))

Saya secara konsisten mendapatkan nilai dalam kisaran 300.000 cm. Jarak antara speaker dan mik adalah sekitar 2 kaki.

Ini semua baru bagi saya, jadi saya yakin saya kehilangan sesuatu yang jelas.

Terima kasih sebelumnya.

CaymanEss
sumber
3
Apakah Anda yakin tidak boleh menggunakan numpy.correlatebukan numpy.convolve? Untuk memperkirakan keterlambatan, Anda ingin mengkorelasikan sinyal Anda secara silang, bukan membelitnya. Anda mungkin berakhir dengan penundaan yang jauh lebih besar dengan berbelit-belit.
Peter K.
PeterK mungkin benar. Perhatikan bahwa Anda dapat mengimplementasikan korelasi melalui konvolusi dengan membalikkan waktu dan mengkonjugasikan salah satu input terlebih dahulu. Ini memungkinkan Anda untuk menggunakan algoritma konvolusi cepat (seperti overlap-save) untuk korelasi.
Jason R

Jawaban:

8

Apakah Anda yakin tidak boleh menggunakan numpy.correlatebukan numpy.convolve? Untuk memperkirakan keterlambatan, Anda ingin mengkorelasikan sinyal Anda secara silang, bukan membelitnya. Anda mungkin berakhir dengan penundaan yang jauh lebih besar dengan berbelit-belit.

Mencoba sesuatu yang sederhana:

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])
Peter K.
sumber
3
Ini adalah persis apa yang saya cari. Contoh lain saya telah melihat konvolusi digunakan dan tidak terpikir oleh saya bahwa korelasi langsung akan menjadi pilihan yang tepat. Terima kasih.
CaymanEss