Popeye, поймите простую вещь, даже если вы сместите спектр, даже если вы сделаете режекторные фильтры это не решит проблемы в вашем случае. Я объясню почему, это просто.
Все эти способы хорошо работают на столе и в аналоговых системах наземной локальной связи, т.е. там где нет значимых задержек между динамиками и сигналами из микрофонов.
В случае цифровой системы все будет иначе, так как любой цифровой канал передачи данных вносит значимую задержку, измеряемую в миллисекундах, а то и в десятках миллисекунд. Это так, потому что используется пакеты данных и их буферирование на приемной стороне. Буфер - это линия задержки. Без буфера звук будет порванным и прерывистым, с буфером - чуть задержанным, но чистым. Естественно, все выбирают второе.
Из-за всего этого будет образовываться сложный многочастотный гул, который режекторым фильтром не вырезать. И двумя, и даже тремя, так как форма циркулирующего сигнала в системе не несколько синусоид, а целый их "букет". Смещение спектра тоже не приведет ни к чему, кроме воющих и шипящих концовок враз, а может даже и к самовозбуждению. Скажете букву "а", спектр будет смещаться, звук будет циркулировать в системе до тех пор, пока не затухнет или пока не выйдет за пределы рабочих частот. А если динамик/микрофон вносят большие интер-модуляционные искажения, то генератор визга гарантирован.
Все эти способы попросту не будут работать из-за задержки цифрового канала связи, которая образуется из-за буфера, в котором собираются вместе принятые пакеты данных.
Один из немногих способов, которые действительно работают, это локальное подавление эха, как например сделано в телефонных трубках. Под этим подразумевается, что микрофон как бы перестает слышать, то, что говорит динамик рядом с ним, а слышит только все остальное. Достигается просто - из сигнала микрофона в определенной пропорции вычитается сигнал, который подается в динамик. Получается
подавление локального эха.
Теперь идем дальше. В случае переговорного устройства это сложнее, так как перед ним открытое пространство. Это значит, что теперь микрофон и динамик не связаны фиксированным значением проникновения звука, как это было в трубке. Это значение теперь попросту неизвестно. Оно меняется от размера помещения, от материалов помещения, от положения устройства в помещении и т.д. Может быть еще и от фазы Луны. И теперь не получиться так просто вычесть сигнал динамика из сигнала микрофона.
Но благодаря некоторым математическим трюкам, это все же становится возможно! Математически строится такой фильтр
h, который полностью имитирует звуковые свойства помещения, в котором находится устройство. После того как фильтр построен, через него пропускается точно такой же сигнал
Y, как и тот, который идет в динамик. На выходе фильтра получается сигнал предсказанного эхо
h(Y). На выходе микрофона
d имеем сигнал реального эхо + полезный сигнал, например от говорящего человека. А дальше простая операция:
e = d - h(Y)
В результате получаем сигнал
е, который в идеале представляет собой только сигнал говорящего человека, а сигнал паразитной обратной связи (эхо) взаимоуничтожается с помощью сигнала предсказанного эхо
h(Y). Попросту говоря
эхо + антиэхо = 0. Математическая аннигиляция, если хотите.
Трюк состоит в самонастройке фильтра
h так, чтобы он повторял свойства комнаты, в которой работает устройство. Для этого просто численно минимизируется функция
е, рассмотренная выше, путем подбора коэффициентов фильтра
h. Постановка такой оптимизационной задачи математически выглядит так:
e(h) -› 0
Для ее решения используется алгоритм
NLMS, который представляет собой ничто иное, как связку фильтра с конечным откликом (FIR) с банальным численным методом оптимизации под названием "Градиентный спуск".
Подробнее об
NLMS http://en.wikipedia.org/wiki/Least_mean_squares_filter
В заключение скажу, что поначалу этот метод кажется сложным и непонятным. Но это происходит
не от того, что он действительно сложный, а потому что он неочевидный. Сознание человека этот метод
не воспринимает. Но это не значит что он не реализуем - заняло всего лишь 2 кБ кода в ATmega16.
P.S. Интересный факт, а ведь еще так много неочевидных и еще не открытых решений насущных задач. А люди просто любят смотреть "в лоб". И только благодаря математике становится возможным комбинировать маленькие "очевидные" кусочки в более изощренные, формально верные, но увы недоступные осязательному сознанию решения.