Фон
Я разрабатываю систему, которая будет иметь один маленький микрофон и динамики для использования в настройках типа телефона. Самый простой пример, который я могу привести, это разговор по Skype, где вы используете динамики своего компьютера и настольный микрофон.
Я беспокоюсь о том, что звук из динамиков будет поднят микрофоном и отправлен обратно оригинальному человеку. Раньше я слышал, что это случалось все время в первые дни разговоров VoIP, но вряд ли слышал это больше.
Я предполагаю, что группы придумали способы отменить эхо, но как они это делают?
подходы
Моей первой мыслью было просто вычесть сигнал, посылаемый на динамики из сигнала микрофона, за исключением того, что при этом методе вы должны быть обеспокоены задержкой. Я не уверен, как определить задержку без какой-либо предварительной калибровки, которой я хотел бы избежать. Существует также проблема того, насколько масштабировать сигнал, прежде чем вычесть его.
Затем я подумал о том, чтобы сделать какую-то корреляцию между сигналом динамика и микрофонным сигналом, чтобы определить вероятность того, что микрофонный сигнал будет эхом, а также определить реальную задержку. Этот метод мог нормально работать, когда я играл с некоторыми записанными сигналами, но казалось, что задержки в вычислении корреляции были бы весьма полезными в системе реального времени. Кроме того, регулируемая громкость на динамиках затруднила определение того, действительно ли что-то коррелировало или нет.
Моя следующая мысль, что в Интернете должен быть кто-то, кто делал это раньше с успехом, но не нашел хороших примеров. Поэтому я прихожу сюда, чтобы посмотреть, какие методы могут быть использованы для решения этого типа проблемы.
Ответы:
Ты прав. Существует много методов эхоподавления, но ни один из них не является тривиальным. Самый общий и популярный метод - эхоподавление через адаптивный фильтр. В одном предложении работа адаптивного фильтра заключается в изменении сигнала, который он воспроизводит, путем минимизации количества информации, поступающей с входа.
Адаптивные фильтры
Адаптивный (цифровой) фильтр - это фильтр, который изменяет свои коэффициенты и в конечном итоге сходится к некоторой оптимальной конфигурации. Механизм для этой адаптации работает, сравнивая выходные данные фильтра с некоторыми желаемыми выходными данными. Ниже приведена схема универсального адаптивного фильтра:
Как видно из диаграммы, сигнал фильтруется (свернут с) → ш п для получения выходного сигнала д [ п ] . Затем мы вычитаем д [ п ] от требуемого сигнала д [ п ] для получения ошибки сигнала е [ п ] . Обратите внимание, что → w n - это вектор коэффициентов, а не число (следовательно, мы не пишем w [ n ]Икс [ н ] вес⃗ N d^[ п ] d^[п ] d[ п ] е [ п ] вес⃗ N w [ n ] ). Поскольку он меняет каждую итерацию (каждую выборку), мы присваиваем текущую коллекцию этих коэффициентов . Как только e [ n ] получено, мы используем его для обновления → w n по выбранному алгоритму обновления (подробнее об этом позже). Если вход и выход удовлетворить линейную зависимость , которая не изменяется с течением времени , и данный алгоритм обновления хорошо разработанный, → ш п будет в конечном итоге сходятся к оптимального фильтра и д [ п ] будет внимательно следить за д [ п ] .N е [ п ] вес⃗ N вес⃗ N d^[ п ] d[ п ]
Эхоподавление
Проблема эхоподавления может быть представлена в терминах проблемы адаптивного фильтра, где мы пытаемся получить некоторый известный идеальный выходной сигнал с учетом входных данных путем нахождения оптимального фильтра, удовлетворяющего соотношению вход-выход. В частности, когда вы берете гарнитуру и говорите «привет», она принимается на другом конце сети, изменяется в зависимости от акустического отклика комнаты (если она воспроизводится громко) и возвращается в сеть для возврата. тебе как эхо. Однако, поскольку система знает, как звучало первоначальное «привет», и теперь она знает, как звучит реверберированный и отсроченный «привет», мы можем попытаться угадать, как реагирует эта комната, используя адаптивный фильтр. Тогда мы можем использовать эту оценку, свяжите все входящие сигналы с этим импульсным откликом (который даст нам оценку эхо-сигнала) и вычтите его из того, что входит в микрофон человека, которого вы вызвали. Диаграмма ниже показывает адаптивный эхоподавитель.
Реальные приложения и проблемы
Несколько вещей могут представлять трудности с этим методом эхоподавления. Прежде всего, как упоминалось ранее, не всегда верно, что другой человек молчит, пока он получает ваш «привет» сигнал. Можно показать (но это выходит за рамки этого ответа), что в некоторых случаях все еще может быть полезно оценить импульсную характеристику, в то время как на другом конце линии присутствует значительный объем входного сигнала, поскольку входной сигнал и эхо считается статистически независимым; следовательно, минимизация ошибки все еще будет допустимой процедурой. В общем, для обнаружения хороших временных интервалов для оценки эхо-сигналов необходима более сложная система.
С другой стороны, подумайте о том, что происходит, когда вы пытаетесь оценить эхо-сигнал, когда принятый сигнал приблизительно равен тишине (фактически, шуму). При отсутствии значимого входного сигнала адаптивный алгоритм будет расходиться и быстро начнет давать бессмысленные результаты, что в конечном итоге приведет к случайному эхо-паттерну. Это означает, что мы также должны учитывать обнаружение речи . Современные эхоподавители больше похожи на рисунок ниже, но описание выше - это суть.
Существует множество литературы по адаптивным фильтрам и эхоподавлению, а также некоторые библиотеки с открытым исходным кодом, к которым вы можете подключиться.
источник
Я бы начал с изменения алгоритма акустической дактилоскопии, такого как Shazam .
Ваши требования во многом схожи с требованиями Shazam (функции должны выдерживать алгоритм сжатия, разработанный для телефонии, они также проходят через некачественные микрофоны), поэтому вы, вероятно, можете использовать те же функции (локальные максимумы мощности во временном / частотном пространстве), хотя Вы можете увеличить разрешение по времени за счет разрешения по частоте.
Равномерное масштабирование почти наверняка не будет достаточно точным. Вам нужно будет сделать что-то вроде аппроксимации частотной характеристики с помощью КИХ-фильтра, а затем пропустить ваш (задержанный) микрофонный сигнал через инвертированный фильтр, прежде чем вычесть его из полученного сигнала.
источник