|
декодер ADPCM (АДИКМ) на AVR, теория |
|
|
|
Sep 30 2010, 12:28
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Есть у Atmel аппнот: " AVR336: ADPCM Decoder" (там и исходники на Си есть, но я хочу сам код написать на Ассемблере), но т.к. с английским дружу только со словарем, то понять как декодировать АДИКМ из этого апнота, для меня нереально. Искал в интернете, но ничего конкретного по этому вопросу не нашел... Смысл я понял такой, в EEPROM (МК или внешнюю) грузим кодированный в АДИКМ звук (можно в Sound Forge). Затем декодируем и с помощью ШИМ выводим аналог. Я вот только понять не могу, как ШИМ потом с помощью фильтра сделать "звуком". Ведь у ШИМ амплитуда одинакова, у "звука" разная, а ФНЧ обрезает только частоту... И еще интересует весь процесс декодирования, от загрузки байта из EEPROM, до вывода на ШИМ. Может, угостите хорошей ссылкой по этому вопросу, или книгу умную порекомендуете  . Спасибо.
Сообщение отредактировал Alt.F4 - Sep 30 2010, 12:30
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 15)
|
Sep 30 2010, 12:54
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 23-12-06
Из: Старых Васюков
Пользователь №: 23 821

|
Цитата(Alt.F4 @ Sep 30 2010, 16:28)  Есть у Atmel аппнот: " AVR336: ADPCM Decoder" ... Может, угостите хорошей ссылкой по этому вопросу, или книгу умную порекомендуете  . Там же в аппноте ссылаются на "AVR335:". В нём и подробности, только без ADPCM-a. В том числе и переводённый вариант легко найти. Поиском - "цифровое устройство записи речи".
Сообщение отредактировал Mike18 - Sep 30 2010, 13:04
--------------------
Время - материя тонкая и неточная...
|
|
|
|
|
Sep 30 2010, 13:06
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Принцип ШИМ прост. Есть период ШИМ. Есть заполнение. Если на выход поставить интегрирующую цепочку (резистор послед, конденсатор на землю) то получим (по теории) интегральную площадь заполнения импульса (на то и интегратор). Иными словами, если заполнение ШИМом 30%, то мы получим напряжение составляющее 0.3 от максимума. Правда это в теории. На практике такое получится при правильном подборе элементов интегратора. ШИМом очень удобно пользоваться при выводе медленно изменяющегося аналогового сигнала либо сигнала, управляющего интегральной нагрузкой. Классический пример - управление двигателем постоянного тока. На практике подбор интегратора и фильтра, который хорошо бы резал несущую (Fpwm) и незначительно искажал бы огибающий сигнал - задача непростая. Она тем легче, чем выше соотношение частоты несущей к частоте выходной. И то там много разных сложностей. Тем не менее - если взять простой расчёт, то выглядит всё примерно так: Допустим мы хотим получить частоту 4кгц. При скважности (фактически разрядность нашего ЦАПа) 256 (8 бит). По теории у нас должно быть не менее 2-ух кратного превышения частоты. Таким образом частота ШИМ должна быть не менее 4*2*256 = 2МГц. Или наоборот 16МГц/256/2 = 31кГц. При ШИМ 9 бит - 15.5кГц. Считается что для качества уровня телефонии (3.4кГц) требуется 14 битный ЦАП с частотой квантования 8кГц. Легко подсчитать, что частота ШИМ при этом должна быть 8*(2**14) ~ 33МГц.  Существуют специальные нелинейные ЦАП для звука, которые при 8 битах обеспечивают 14 бит качество. Они применяются в GSM.
|
|
|
|
|
Sep 30 2010, 13:24
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 23-12-06
Из: Старых Васюков
Пользователь №: 23 821

|
Цитата(Alt.F4 @ Sep 30 2010, 17:07)  Читал я AVR335 на русском. Там ответов на мои вопросы нет. Все очень поверхностно. ... Почему разрядность при 8бит = 256? Там после фильтра ещё усилитель нужно и динамик. И питание. И тогда будет звук.  Это не разрядность = 256, а 8бит = разрядность. А 256, это два в восьмой, разрядности то есть, степени.
--------------------
Время - материя тонкая и неточная...
|
|
|
|
|
Sep 30 2010, 13:38
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
Цитата Там после фильтра ещё усилитель нужно и динамик. И питание. И тогда будет звук. Тут еще программно декодировать надо! Цитата Это не разрядность = 256, а 8бит = разрядность. А 256, это два в восьмой, разрядности то есть, степени. А ё, меня чего-то клемануло. Вопрос программного декодирования не решен.
|
|
|
|
|
Sep 30 2010, 13:53
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 23-12-06
Из: Старых Васюков
Пользователь №: 23 821

|
Цитата(Alt.F4 @ Sep 30 2010, 17:38)  ... Вопрос программного декодирования не решен. Думаю, что решён и давно. Может, Вам эта статья поможет?
--------------------
Время - материя тонкая и неточная...
|
|
|
|
|
Sep 30 2010, 15:39
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 23-12-06
Из: Старых Васюков
Пользователь №: 23 821

|
Цитата(Alt.F4 @ Sep 30 2010, 18:01)  Mike18, эту статью тоже читал. Про реализацию декодирования ничего конкретного не написано. Допустим есть у нас байт закодированного АДИКМ, что с ним делать? Спасибо. Применительно к упомянутому в этой статье микрочиповскому AN643, делать так, как пошагово расписано в "TABLE2" этого AN. Цитата 1. ADPCMDecoder takes an 8-bit number containing the 4-bit ADPCM code (0-15) and returns a 16-bit signed number (speech sample, 32767 to -32768). 2. Restore the previous values of predicted sample (sp) and quantizer step size index. ... 10. Return the new sample (sr). Цитата з.ы. Си не знаю, пишу на Асме IMHO, писать, наверно, можно и на Асме, но читать примеры, скорее всего придётся именно на Си.
Сообщение отредактировал Mike18 - Sep 30 2010, 15:43
--------------------
Время - материя тонкая и неточная...
|
|
|
|
|
Oct 4 2010, 17:12
|
Местный
  
Группа: Участник
Сообщений: 206
Регистрация: 23-12-06
Из: Старых Васюков
Пользователь №: 23 821

|
Цитата(Alt.F4 @ Sep 30 2010, 19:47)  Мне б на русском... Вот здесь было немножко. По-русски. Искать "Рекомендация ITU G. ..." и "А.Н. Дегтеренко. Кодирование речевых сигналов на...". Если не усугубит, то и не поможет.
--------------------
Время - материя тонкая и неточная...
|
|
|
|
|
Oct 24 2010, 20:42
|
Профессионал
    
Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256

|
zombi описал алгоритм декодирования АДИКМ, но у меня по такой схеме на выходе постоянно 0x8000. Может кто-нибудь перепроверит данный алгоритм, т.к. пытаясь понять Си исходники декодеров в апннотах MicroChip мне показалось, что в конце необходимо проверять чтобы D был не более 32768 и не менее -32768, а index был в пределах 0-88, т.е. схема в цитате описана не до конца? Спасибо. Цитата Обьявляем констатнты: indextable : массив 16 чисел (-1,-1,-1,-1,2,4,6,8,-1,-1,-1,-1,2,4,6,8)
stepsizeTable: массив 89 чисел (7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552,1707, 1878, 2066, 2272, 2499, 2749, 3024, 3327, 3660, 4026, 4428, 4871, 5358, 5894, 6484, 7132, 7845, 8630, 9493, 10442, 11487, 12635, 13899, 15289, 16818, 18500, 20350, 22385, 24623, 27086, 29794, 32767)
Обьявляем переменные D : результат 16 бит Index : смещение в stepsizeTable A и S : переменные 16 бит
Инициализируем переменные: D=8000H Index=0
M1: C=входные 4 бита ADPCM S=stepsizeTable[Index] A=0
Если 2-й бит в C =1 то A=A+S Сдвигаем S на один бит вправо Если 1-й бит в C =1 то A=A+S Сдвигаем S на один бит вправо Если 0-й бит в C =1 то A=A+S Сдвигаем S на один бит вправо A=A+S
Если 3-й бит в С=1 то D=D-A иначе D=D+A Index=Index+Indextable[C]
Сохраняем D Идем на М1 p.s. на выходе 8 битный ИКМ?
Сообщение отредактировал Alt.F4 - Oct 24 2010, 22:05
|
|
|
|
|
Oct 29 2010, 14:01
|
Местный
  
Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101

|
Цитата(Alt.F4 @ Sep 30 2010, 19:47)  Мне б на русском... Английский учить всё равно придётся. Даже в ассемблере add, call и push - вполне себе переводимые английские слова. Поэтому берём Гугловый переводчик и переводим, наводим мышь на фразу - видим исходный текст.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|