Оценка временной задержки между двумя аудиосигналами - PullRequest
13 голосов
/ 11 февраля 2011

У меня есть две аудиозаписи одного и того же сигнала на 2 разных микрофонах (например, в формате WAV), но один из них записывается с задержкой, например, несколько секунд.

Легко идентифицировать такую ​​задержку визуально, просматривая эти сигналы в каком-либо средстве просмотра формы сигнала, то есть просто обнаруживая первый видимый пик в каждом сигнале и гарантируя, что они имеют одинаковую форму:

http://www.greycat.ru/temp/time-delay-peaks.png

Но как мне сделать это программно - узнать, что это за задержка (t)? Два оцифрованных сигнала немного отличаются (потому что микрофоны разные, были в разных положениях, из-за настроек АЦП и т. Д.).

Я немного покопался и обнаружил, что эту проблему обычно называют «оценкой задержки по времени» и к ней есть множество подходов - например, один из них .

Но есть ли простые и готовые решения, такие как утилита командной строки, библиотека или простой алгоритм?

Заключение : я не нашел простой реализации и сам выполнил простую утилиту командной строки - доступно по адресу https://bitbucket.org/GreyCat/calc-sound-delay (GPLv3-лицензировано). Он реализует очень простой алгоритм поиска максимума, описанный в Wikipedia .

Ответы [ 2 ]

14 голосов
/ 11 февраля 2011

Техника, которую вы ищете, называется кросс-корреляция . Это очень простой, хотя и довольно сложный метод, который можно использовать для решения различных задач, включая измерение разницы во времени (также известной как задержка ) между двумя одинаковыми сигналами (сигналы не обязательно должны быть идентичными).

Если у вас есть разумное представление о вашем значении лага (или, по крайней мере, о диапазоне ожидаемых значений лага), то вы можете значительно сократить общий объем вычислений. То же самое, если вы можете наложить определенный предел на то, сколько точности вам нужно.

1 голос
/ 11 февраля 2011

Очень простая задача - просто проверить, превышают ли пики какой-либо порог, время между высоким пиком в линии A и верхним пиком в линии B, вероятно, является вашей задержкой. Просто попробуйте немного поработать с пороговыми значениями, и если графики обычно такие же четкие, как и картинка, которую вы разместили, у вас все будет хорошо.

...