Подавление эха в сервере Asterisk


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


Как работает подавление эха?


Почти все (если вообще не все) алгоритмы подавления сигнала эха работают на основе генерирования множественных копий фиксированных отрезков передаваемого сигнала в линию связи, каждый из которых задерживается не некоторый небольшой, но увеличивающийся, промежуток времени. Все это работает, как эквивалент сдвигового регистра, где каждый из задержанных отрезков сигнала сравнивается с принимаемым, на каждом уникальном "отрезке сигнала". Число копий задержанных отрезков сигналов определяет время задержки сигнала эха, который можно подавить. Эти копии подгоняются по уровню (т.к. сигнал эха приходит ослабленным) и взаимодействуют по определенному алгоритму с принимаемым сигналом. Используемый алгоритм обеспечивает то, что при этом взаимодействии, в результате удаляется только эхо и ничего более. Методы, используемые в определении наличия сигнала эха в каждом отрезке принимаемого сигнала - это то, что отличает работу одного алгоритма от другого.


Не верьте своим ушам...

Эхоподавитель должен "самообучаться", рассчитывая приблизительную задержку появления (и уровень) эха, при появлении принимаемого сигнала. Время обучения (адаптации) зависит от используемого алгоритма и числа "отрезков сигналов" (tap). Для оптимального времени адаптации, число используемых "отрезков сигналов" должно быть как можно меньше, но при этом обеспечивая нормальное подавление сигнала эха. В типичных случаях, к которым мы привыкли, задержка сигнала должна быть относительно небольшой. Не полагайтесь на то, что вы слышите! Эхо, которое Вы слышите, имеет некоторую дополнительную задержку, связанную с прохождением сигнала между эхоподавителем и Вашим телефоном. Вас же должна интересовать реальная задержка сигнала - это задержка сигнала, который поступает из нашего эхоподавителя, через интерфейсную карту, в телефонную сеть до источника появления отраженного сигнала (смотри: причины возникновения эха), и обратно к нашему эхоподавителю. Эта задержка относительно небольшая, приблизительно около 20-30 ms. Упрощая, Вам нужно знать "длину линии" (tail circuit) (дистанция между Вашим эхоподпвителем и источником отраженного сигнала), для линии связи примерно в 2500 миль сигнал эха появляется с задержкой примерно в 30ms (хотя, интерфейсная карта и ее драйвера скорее всего вносят дополнительные задержки при прохождении сигнала в обоих направлениях, так что это значение может быть несколько большим).

Каждый "отрезок сигнала" (tap) представляет собой 1 отрезок оцифрованного звука, итак, при частоте дискретизации равной 8 kHz (для работы с которой и приспособлены все компенсаторы эха сервера Asterisk), каждый отрезок сигнала имеет длительность в 0.125ms. По умолчанию, в сервере Asterisk используется буфер из 128 отрезков сигнала (tap), что позволяет подавить эхо сигнал с задержкой до 16ms, и обычно подходит для большинства случаев.

Однако стоит отметить, что Вы можете получить большую производительность и адаптацию эхоподавителя при использовании меньшего числа буфера из "отрезков сигналов" (taps), т.к. в этом случае меньше время его самообучения. И наоборот, если у Вас появляются проблемы с подавлением эха при телефонных вызовах на дальние расстояния, то возможно Вам надо увеличить число отрезков сигнала в буфере до 256.

Обратите внимание, что сервер Asterisk позволяет установить размер буфера для сигналов только в значения: 32, 64, 128 или 256 (потому, что в используемом алгоритме предполагается, что это значение - кратно степени числа 2). Попытка использовать другое число для отрезков сигналов приведет к тому, что сервер Asterisk установит это значение в 128 без всяких уведомлений.

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

Также (и это очевидно!) Ваш эхокомпенсатор должен работать с правильным плечом установленного соединения! Эхокомпенсаторы сервера Asterisk могут успешно подавлять эхо поступающие из публичной телефонной сети через интерфейсную карту digium, перед тем как передать сигнал на обработку самому серверу. Они не подавляют эхо для сигналов, передаваемых через VoIP каналы (с которыми нужно работать по-другому, по причине изложенной выше).


Настройка уровней сигналов


До того, как система подавления эха сможет нормально работать, Вы должны убедиться, что уровни принимаемого (да и передаваемого) сигнала более менее правильно настроены. Для того, чтобы узнать, как их настроить, посетите страницу: Настройка уровней сигналов для каналов Zap.


Терминология


  • Near-end signal - это принимаемый сигнал, с которым работает наш эхоподавитель. Отметьте, что, (несколько туманно) в контексте про установку сервера Asterisk, он обычно физически будет еще дальше, чем сигнал на дальней точке линии связи (far-end signal). Однако, в терминах, связанных с задержками сигналов, сигнал на ближней точке линии связи (near-end signal) (поступающий из публичной телефонной сети) "ближе", чем сигнал на удаленной точки линии связи (far-end signal) (поступающий через VoIP каналы).

  • Reference signal - сигнал, который мы передаем в публичную телефонную сеть (PSTN) - т.е. это сигнал, который приходит с удаленной точки линии связи (far-end).

  • Tail circuit (Длина линии связи) - потенциальная дистанция между эхокомпенсатором и источником любого эхосигнала.

  • Doubletalk - проблема, с которой сталкивается компенсатор эха, когда кто-то на ближней точке линии связи "near end" (удаленный абонент) говорит в то же самое время, что и абонент на дальней точке линии связи "far end" (Вы).


Подавление эха в сервере Asterisk


Драйвер zaptel содержит в себе пять реализаций различных эхоподавителей (семь в версии драйвера zaptel 1.2). Вы можете установить, какой из них Вам нужен в файле zconfig.h. К сожалению, в настоящее время почти нет описания о различиях между ними, и даже документации по их настройке. Хотелось бы побольше узнать разницу в работе этих алгоритмов эхоподавления от самих авторов, и если она появиться от них, то появиться и тут. Выбор надлежавшего механизма компенсации эха можно сделать только, если известен их алгоритм работы. Мы должны знать о каждом такие вещи, как производительность алгоритма, размер буфера, максимальную задержку эха, которую он в состоянии подавить, механизм адаптации и т.д. Если бы все это было известно, хотя бы для одного из предложенных алгоритмов, то можно было бы обратиться к дополнительной литературе за информацией, в каких условиях этот эхоподавитель будет идеально работать: или для подавления эха, появляющегося в результате использования громкой связи телефона, или для подавления эха, возникающего из-за несогласования сопротивления нагрузки и линии связи, или для других.

  • Asterisk mark echo canceller (mec)
  • Asterisk mark2 echo canceller (mec2)
  • Asterisk mark3 echo canceller (mec3)
  • Asterisk steve echo canceller (sec)
  • Asterisk steve2 echo canceller (sec2)
  • Asterisk kb1 echo canceller (kb1ec)
  • Asterisk mg2 echo canceller (mg2ec)

Алгоритм эхоподавления, используемый по умолчанию, для версий драйвера zaptel 1.2 (как минимум, до версии 1.2.5) - это kb1.
Ни один из этих алгоритмов не изменялся с версии драйвера zaptel 1.2.1(?) 2005-11-30.


Обнаружение Факс тона (Факсов)


Драйвер zaptel содержит в себе код, который определяет наличие тонального сигнала, генерируемого факсовыми аппаратами (чистый тон с частотой 2100Hz), и автоматически выключает систему подавления сигналов эха, если этот тональный сигнал обнаружен с любого из двух плеч соединения.

Эта функция может выключить подавление эха в любой момент времени в течении вызова (хотя она может быть отключена во время компиляции, установкой параметра NO_ECHOCAN_DISABLE).

Stephen R. Besch, November 2003
Дополнено — Richard van der Hoff, July 2005''

Ссылки по теме