Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Подавление акустического эха с помощью FPGA
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
bsp
Рассматривается система, в которой есть полностью четырехпроводный речевой тракт с выходом во внешний мир через цифру. Частота следования отсчетов 8 КГц, 16 разрядов. Есть необходимость кроме использования телефонной трубки обеспечить громкоговорящую связь для одного такого канала. Из свободных ресурсов - половина LE в Циклон 3 ( EP3C5 ) и почти все умножители ( 20 - 21 ) и ОЗУ ( блоков 40 ). Посмотрел применяемые алгоритмы в системах на DSP, похоже, самый популярный - компенсация по методу наименьших квадратов. Опыта в цифровой обработке сигнала у меня мало, прикинул, вроде могу втиснуть что-то такое, но никакой уверенности в том, что ресурсов хватит и что работать будет как надо, нет. Как последний вариант, можно сделать систему с переключением, но этого очень не хочется. Просьба помочь советом, где посмотреть самые "модные" алгоритмы с прицелом на FPGA и насколько это вообще реализуемо при таких ресурсах.
SM
Если задача для Вас новая - прицепите DSP и отладьте алгоритм в нем. А потом сами легко оцените, уберется он внутрь, или нет. В AEC очень много подводных камней, которые отловить на моделе крайне сложно, а реализация в FPGA очень негибкая с точки зрения отладки алгоритма. Что касается собственно алгоритма - да, разумеется, это адаптивные фильтры, и часто обычный LMS (NLMS), который несмотря на свою простоту обладает и довольно серьезными недостатками, как то медленная сходимость и разваливаемость при попытках повышения скорости. Я бы посоветовал обратить внимание еще и на Fast RLS реализации, как то например адаптивные фильтры на структурах Лягерра, они (у меня) показали значительно лучшие результаты на подавлении акустического эха.

ЗЫ. Касаемо ресурсов - должно хватить с запасом.
bsp
Спасибо SM, про достаточность ресурсов приятно слышать. Что касается DSP, то с ними на уровне программ я вообще не работал, надо нагружать человека, и так занятого выше головы. Посмотрел Матлаб, им хоть как-то пользовался. Но там другая проблема - в реальном времени не выйдет поэксперементировать. Придется прямо на FPGA разбираться, благо железо готовое есть. В связи с этим очень хотелось-бы посмотреть примеры реализации похожих систем на FPGA. Если есть ссылки или сами тексты, очень буду признателен за помощь! Мне в основном попадаются примеры на "C", а это не то, что привычный Verilog, да и рассчитано на DSP.
SM
Цитата(bsp @ Aug 3 2009, 11:03) *
Мне в основном попадаются примеры на "C", а это не то, что привычный Verilog, да и рассчитано на DSP.


Я тоже не видел описаний для ПЛИС, да и не слышал, чтобы кто-то использовал ПЛИС для этой цели в принципе (разве что ASIC-остроители в прототипах, но те ничего никому за так не дадут). ПЛИС для речевого сигнала - это как из С-300 по воробью. Если с ДСП нет желания связываться - тогда предлагаю два других варината:

1) Матлаб, и несколько разных моделей тракта ЦАП -> усилитель -> динамик -> корпус_устройства+помещение+окр.среда+шум+сигнал -> микрофон -> усилитель -> АЦП, и гонять на нескольких вариантах моделей помещения с разными шумами и полезным сигналом. Снять параметры модели "корпус_устройства+помещение+окр.среда" можно тем же матлабом и звуковой картой, выдав ограниченный по спектру псевдослучайный сигнал на динамик, который в корпусе, и приняв сигнал с микрофона, после чего в матлаб.

2) Временно запаять ПЛИС пожирнее, вогнать туда софт-процессор достаточной мощности, и отладить на нем алгоритм в виде программы, после чего реализовать железно. Алгоритм такой сложности, написанный на С, переделывается в описание устройства, его исполняющего, на раз одной левой.
bsp
Вот еще вопрос. Есть плата с микросхемой Cirrus Logic CS6422, представляет из себя адаптивный компенсатор акустического и сетевого эха, четырехпроводная, внутри цифровая, на входах выходах АЦП ЦАП. В нее заложена возможность при перехода в полудуплексный режим, если компенсация не справляется. Означает-ли это, что гарантированной устойчивости компенсации во всех ситуациях нельзя добиться, или есть примеры, говорящие об обратном? Лирическое отступление - свалилась другая срочная работа совершенно отличающегося характера, теперь месяц или два эхоподавлением придется заниматься в фоновом режиме ( хотя эту работу тоже никто не отменял, и тянуть с ней сильно нельзя ). А изучить в области цифровой обработки сигналов похоже, придется много. Может кто посоветует хорошую литературу для изучения. С основами был знаком когда-то, но многое уже забыл.
SM
Цитата(bsp @ Aug 5 2009, 12:05) *
Означает-ли это, что гарантированной устойчивости компенсации во всех ситуациях нельзя добиться, или есть примеры, говорящие об обратном?

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

Цитата(bsp @ Aug 5 2009, 12:05) *
А изучить в области цифровой обработки сигналов похоже, придется много. Может кто посоветует хорошую литературу для изучения. С основами был знаком когда-то, но многое уже забыл.

Ну тут вопрос - с какого уровня. Вспомнить основы - "библию" - например Оппенгейма с Шафером или Рабинера с Голдом. Конкретно по теме - Адаптивная обработка сигналов, Б. Уидроу, С.Стирнз. Еще я бы сам посоветовал обратить внимание на публикации Ali H.Sayed и Ricardo Merched на тему адаптивной фильтрации, про быстрые RLS-ы.
Ковылин_Константин
Да, результаты Fast RLS реализации, особенно на структурах Лягерра впечатляют (на графиках из статей Ali H.Sayed и Ricardo Merched).

Одно но - при беглом взгляде на алгоритм, для реализации RLS нужно использовать деление, что для FPGA неудобно.

2SM: Вы использовали деление в своих алгоритмах fast RLS?

2bsp: http://www.rowetel.com/ucasterisk/oslec.html - собираюс реализовать эот алгоритм в FPGA тк без делений, но он не очень подходит для подавления при громкой связи ( этот алгоритм скорее рассчитан на остаточное эхо ).
zltigo
Цитата(Ковылин_Константин @ Aug 12 2009, 09:29) *
нужно использовать деление, что для FPGA неудобно.

Какие проблемы? Наличие большого количества аппаратных умножителей в FPGA обыденное дело по нынешним временам.
SM
Цитата(Ковылин_Константин @ Aug 12 2009, 10:29) *
2SM: Вы использовали деление в своих алгоритмах fast RLS?

Разумеется использовал. Более того, деление нужно и в классическом NLMS. А в чем, собственно, проблема? Делитель в FPGA занимает примерно столько же, сколько и умножитель. Однако я это все в ФПГА не раскладывал, я на DSP все делал.
DmitryR
Цитата(SM @ Aug 12 2009, 11:39) *
Делитель в FPGA занимает примерно столько же, сколько и умножитель.

Это ошибка. Например, умножитель 36*36 занимает просто 4 аппаратных умножителя 18*18 и чуть-чуть логики, при этом имеет высокую скорость (сотни мегагерц) _И_ низкую латентность (единицы тактов). А делитель 36/36 занимает 17 таких умножителей плюс около тысячи лутов, при этом имеет ИЛИ большую латентность (30 тактов), ИЛИ низкую частоту (30 МГц). По информации Xilinx Coregen.
SM
Цитата(DmitryR @ Aug 12 2009, 13:00) *
Это ошибка.

Никакой ошибки нет. Так как речи об использовании аппаратного умножителя в моем посте не шло. Я подразумевал построение полностью комбинаторной схемы на LUT-ах.
Ковылин_Константин
Цитата(SM @ Aug 12 2009, 14:39) *
Разумеется использовал. Более того, деление нужно и в классическом NLMS...


Это одно место с делением на усреднённую мощность в NLMS красиво обходится : Поправка коэффициентов в фильтре всё-равно с эмпирическим коэффициентом, и значение усреднённой мощности для нормализации поправок (N-нормализация) берётся с точностью до одного бита (те коэффициент от этого скачет от 1 до 2х). Далее деление заменяется на сдвиг и всё )
SM
Цитата(Ковылин_Константин @ Aug 12 2009, 13:38) *
Это одно место с делением на усреднённую мощность в NLMS красиво обходится

Оно обходится и по-другому. Т.е. его обходить вообще не надо. Мощность считаем на первом такте обсчета самого фильтра, вычитая из аккумулятора мощности квадрат самой старой выборки и прибавляя квадрат новой. Далее параллельно с вычислением самого фильтра спокойно делим последовательным делителем хоть до какой точности, так как длина фильтра не маленькая. Последовательный делитель это вообще пренебрежимые копейки площади.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.