Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ADPCM кодек, проблема восстановления сигнала
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Fenolftalein
Доброго времени суток. Для передачи речи в цифровом виде использую кодек ADPCM, реализован на МК pic24fj64ga004. Исходник кодека можно посмотретьhttp://www.microchip.com/stellent/idcplg?I...ppnote=en011118. На выходе кодека 4-битные отсчеты, упаковываю их в один байт и отсылаю, на приемной стороне восстанавливаю, и отправляю на цап с соответствующими задержками. У восстановленного сигнала появляется постоянная составляющая, которая медленно растет, что приводит к переполнению (проверял синусоидой 20 - 4000 Гц). Проблема в цифровой области, поскольку при моделировании в происходит то же самое.
Кто-нибудь сталкивался с такой проблемой?

Еше вопрос, кодек работает с сигналом диапазона от -32765 до 32764, у МК АЦП 10-битный, нужно ли нормировать результат преобразования (умножение, смещение) для полного использования диапазона кодека и улучшения качества восстановленного сигнала?
fontp
Дык у них диапазон сигнала сугубо положительный в кодере и декодере

.....

/* Check for overflow of the new predicted sample */
if( predsample > 65535 )
predsample = 65535;
else if( predsample < 0 )
predsample = 0;

Учитывая что long в этом процессоре как сказано в коменте - 16-разрядный эти инструкции выглядят вообще очень странно (if( predsample > 65535 ) не выполняется вообще никогда для 16-разрядных чисел со знаком, а if( predsample < 0 ) - неверно),
Либо этот АDPCM не предназначен для кодирования сигнала со знаком, а только для положительных чисел (для изображений годится)
Либо программист не понимал вообще что он пишет, так тоже бывает)

Для нормального кодека с нормальным АЦП (с двоичным комплиментом) попробуйте что-нибудь типа
if( predsample > MAX_ADC )
predsample = MAX_ADC;
else if( predsample < -MAX_ADC )
predsample = -MAX_ADC;
и проверьте ещё, что адаптация сделана правильно (т.е. не зависит от знака сигнала)

В принципе,да, чтобы снизить шум квантования желательно разносить диапазон сигнала до максимального посредством умножения на постоянный множитель, в Вашем случае 64
Fenolftalein
Цитата(fontp @ May 17 2011, 14:02) *
Дык у них диапазон сигнала сугубо положительный в кодере и декодере


Вы имеете в виду какую-то другую реализацию этого кодека, в микрочиповской реализации (см ссылку выше), прототип кодера:

char ADPCMEncoder(long signed sample);

И в описании указано, что диапазон от 32767 до -32768.
Это же видно из кода
Код
if(predsample > 32767)
     predsample = 32767;
else if(predsample < -32768)
     predsample = -32768;


Мой диапазон 0-1024 (10-битный АЦП)
Откуда на выходе берется медленно растущая постоянная составлющая, при подаче синусоиды на вход?

Попробую пронормировать сигнал к диапазону 32767, -32768.
fontp
QUOTE (Fenolftalein @ May 18 2011, 06:24) *
Вы имеете в виду какую-то другую реализацию этого кодека, в микрочиповской реализации (см ссылку выше), прототип кодера:

char ADPCMEncoder(long signed sample);


я нашел реализацию по вашей ссылке в файле Projects\Microchip\Pic24Speech\adpcm.c
Извиняюсь, если там есть ещё и другие - AN я не смотрел
Вообще DPCM, пусть даже адаптивный, настолько простая вещь, что проще самому написать, чем разбираться в чужом неработающем.

QUOTE (Fenolftalein @ May 18 2011, 06:24) *
Откуда на выходе берется медленно растущая постоянная составлющая, при подаче синусоиды на вход?


Во-первых если постоянная составляющая - таки берется, то очевидно что процесс квантование-восстановление кривой,несимметричный, с систематической ошибкой. Часто, это даже не очень проявляется, поскольку DPCM обычно использует предсказание с утечкой, т.е. разность формируется не как S-P, а как S-alpha*P, alpha=чуть меньше 1, поэтому накопление ошибки ограничено (поскольку и интегратор в декодере тогда не идеальный, а взвешеный степенями alpha). Но в этом AN утечки нет, поэтому систематическая ошибка при квантовании-восстановлении разности, если она есть, будет накопляться в бесконечность, поскольку восстановленый сигнал есть просто сумма квантованых-восстановленых разностей без экспоненциального взвешивания. Если отвлечься от адаптации, декодер DPCM является линейной системой и в случае отсутствия утечки, он находится на границе устойчивости, поэтому любая систематическая ошибка пустит этот идеальный интегратор в разнос

QUOTE (Fenolftalein @ May 18 2011, 06:24) *
Это же видно из кода
CODE
if(predsample > 32767)
     predsample = 32767;
else if(predsample < -32768)
     predsample = -32768;


Даже здесь видна нессиметрия реализации (32767!=32768), хотя скорее всего основную нессиметрию в операцию квантования-восстановления вносят сдвиги вправо, >>, которые очевидно несимметричны к знаку величины разности, т.е. округление где оно есть должно везде проводиться без систематических ошибок. При использовании нелинейного квантователя сдвиги не используются, используется поиск по таблицам,но в любом случае нужно быть увереным, что шкалы квантования и восстановления абсолютно симметричны.
Fenolftalein
Прошу прощения, по невнимательности пытался использовать реализацию для 8-битных контроллеров на 16-битном. В кодеке для 16-битного контроллера дейтвительно диапазон 0-65535. Пронормировал сигнал АЦП, путем сдвига на 6 разрядов. Проблема с растущей постоянной составляющей исчезла. Возникли две другие.

1. Амплитуда восстановленного сигнала, при изменении частоты может упасть в 2 раза, но если сбросить контроллер на приемной стороне, то амплитуда восстанавливается.

2. В восстановленном сигнале биения, с периодом 50мс.
Fenolftalein
Пробовал нормировать входной сигнал в разных диапазонах, везде одна проблема, сигнал (синусоида), корректно восстанавливается в течении 0.2, 1.7 с, после чего амплитуда резко возрастает, и кодек ее "режет". Добавил "костыль", при превышении восстановленным сигналом заданного диапазона, устаналиваю начальные условия (предыдущий осчет и индекс шага квантования) в 0. Собираюсь проверить, как это отразиться на звуке. Не нравиться мне такое решение.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.