Алгоритм акустического эхоподавления в Matlab

Мы с коллегой разрабатываем модуль обработки звука и речи на цифровом сигнальном процессоре Analog Device. Из-за близости нашего единственного микрофона и динамика мы ощущали значительное эхо. Мы хотим реализовать алгоритм на основе NLMS, чтобы уменьшить это эхо.

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

Вот обзор моего наивного способа реализовать это в Matlab. Схема Simulink здесь

Ссылка на код Simulink (.slx)

Сейчас код не может скомпилироваться из-за "алгебраической ошибки цикла" в Simulink, но мне кажется, что проблема не в этом.

Любая помощь будет оценена по достоинству.


person Juan Morency    schedule 01.08.2015    source источник
comment
Вы читали статью документации об алгебраических циклах? de.mathworks.com/help/simulink/ug/алгебраические-циклы. html   -  person Daniel    schedule 01.08.2015
comment
Возможно, я совершенно неправильно понимаю вашу проблему, но что вы имеете в виду, говоря, что у вас нет доступа к неискаженному сигналу? Разве вы не можете просто выключить динамик и записать аудиосэмпл? Разве ваше эхо не буквально передается с микрофона через динамик с небольшой задержкой?   -  person Andras Deak    schedule 01.08.2015
comment
Можете выложить скриншот модели? Взгляните на изображение алгоритма на ti.com/lit/an/spra063/ spra063.pdf, который должен помочь смоделировать это.   -  person Navan    schedule 03.08.2015
comment
Даниэль, Да, я прочитал документацию и не могу найти, как устранить этот алгебраический цикл. Андрас Дик, это должен быть процесс в реальном времени. Поэтому микрофон и динамик всегда включены. @Navan, я разместил скриншот. по ссылке не видно?   -  person Juan Morency    schedule 05.08.2015


Ответы (1)


Модель у вас не совсем правильная. Для подавления акустического эха вы используете адаптивный фильтр для моделирования помещения. Вы определяете характеристики помещения с помощью адаптивного фильтра. Как только вы это сделаете, вы можете использовать свой адаптивный фильтр, чтобы определить часть сигнала на дальнем конце от громкоговорителя, которая возвращается в микрофон, и вычесть ее из сигнала микрофона, чтобы удалить эхо.

Для вашего адаптивного фильтра ваш вход должен быть сигналом с дальнего конца, который будет сигналом, поступающим на громкоговоритель в комнате. Желаемый сигнал — это сигнал, исходящий от микрофона в комнате. Сигнал микрофона содержит сигналы голосов человека в комнате, а также часть звука громкоговорителя, который является эхом.

Sound from far end          ----|In               | Out (You can ignore this)
                                | Adaptive Filter |
Sound from local microphone ----|Desired          | Error

В этой модели выходной сигнал ошибки адаптивного фильтра является желаемым свободным от эха сигналом. Это связано с тем, что ошибка вычисляется путем вычитания выходных данных адаптивного фильтра из желаемого, что в основном удаляет эхо.

Чтобы смоделировать эту систему в Simulink, вам нужен фильтр для представления комнаты. Для этого можно использовать обычный КИХ-фильтр. Вы должны иметь возможность получать импульсные отклики комнаты онлайн. Обычно это длинные (~1000) медленно затухающие импульсные характеристики. Ваш источник звука может представлять сигнал из громкоговорителя. Вы подаете тот же аудиосигнал в этот фильтр отклика комнаты, и вы получите желаемый сигнал. Подача обоих в адаптивный фильтр заставит адаптивный фильтр адаптироваться к фильтру отклика помещения.

person Navan    schedule 05.08.2015
comment
Большое спасибо Наван. Это, скорее всего, поможет мне разобраться в моей проблеме. - person Juan Morency; 06.08.2015
comment
Я понял, что ваша реализация не работает, поскольку алгоритм NLMS имеет тенденцию корректировать веса КИХ-фильтра, чтобы уменьшить сигнал ошибки. В вашем случае мы не хотим, чтобы сигнал ошибки уменьшался, поэтому мы получаем странный результат, когда фильтр пытается адаптироваться. Так как ошибка является выходом - желаемым, а вывод в нашем случае - прогнозируемым эхом, для того, чтобы это работало, не нужно ли нам вводить желаемое фактическое эхо? Но у меня нет доступа к такому сигналу. У вас есть другое решение? - person Juan Morency; 25.08.2015
comment
Поначалу кажется странным смотреть на эту модель, поскольку сигнал ошибки — это тот сигнал, который вам нужен. Предполагается, что в этой модели отсутствует корреляция между сигналом на дальнем конце и сигналом на ближнем конце. Несмотря на то, что адаптивный фильтр пытается свести к минимуму ошибку, он не может опуститься ниже удаления эха из-за предположения о корреляции. Какой странный результат? - person Navan; 25.08.2015