Вимірювання затримки звукових сигналів у часі


9

Перш ніж хтось кричить на мене, я цілком усвідомлюю, що це питання задавали не раз. Я запевняю вас, що я прочитав існуючі питання та відповіді, але все ще плутаю частину проблеми.

У мене є джерело звуку, яке відтворює музику (A) у закритому середовищі. У мене є мікрофон, який я використовую для запису А. Мені залишаються два файли 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 см. Відстань між динаміком та мікрофоном приблизно 2 фути.

Це все для мене досить нове, так що я впевнений, що я пропускаю щось очевидне.

Заздалегідь спасибі.


3
Ви впевнені, що numpy.correlateзамість цього не слід користуватися numpy.convolve? Для оцінки затримки потрібно перехресно співвіднести свої сигнали, а не перекручувати їх. Ви, можливо, закінчите набагато більшу затримку, зробивши згортання.
Пітер К.

PeterK, ймовірно, правильно. Зауважте, що ви можете реалізувати кореляцію за допомогою згортки, спочатку обертаючи час та кон'югуючи один із входів. Це дозволяє дозволити використовувати алгоритми швидкої згортки (наприклад, перекриття-збереження) для кореляції.
Джейсон 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.