Измерение временной задержки аудио сигналов


9

Прежде чем кто-то кричит на меня, я полностью осознаю, что этот вопрос задавался много раз. Уверяю вас, что я прочитал существующие вопросы и ответы, но я все еще запутался в части проблемы.

У меня есть источник звука, который играет музыку (A) в закрытом помещении. У меня есть микрофон, который я использую для записи A. У меня осталось два файла wav, которые имеют одинаковые характеристики и длину (количество образцов).

Моя цель - подсчитать, сколько времени понадобилось А, чтобы добраться до микрофона.

Я пытаюсь выполнить расчет с использованием взаимной корреляции (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 скорее всего правильно. Обратите внимание, что вы можете реализовать корреляцию с помощью свертки, обращая время и сначала соединяя один из входов. Это может позволить вам использовать быстрые алгоритмы свертки (например, сохранение-перекрытие) для корреляции.
Джейсон Р

Ответы:


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.