Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: декодер ADPCM (АДИКМ) на AVR
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Alt.F4
Есть у Atmel аппнот: "AVR336: ADPCM Decoder" (там и исходники на Си есть, но я хочу сам код написать на Ассемблере), но т.к. с английским дружу только со словарем, то понять как декодировать АДИКМ из этого апнота, для меня нереально.
Искал в интернете, но ничего конкретного по этому вопросу не нашел...
Смысл я понял такой, в EEPROM (МК или внешнюю) грузим кодированный в АДИКМ звук (можно в Sound Forge). Затем декодируем и с помощью ШИМ выводим аналог. Я вот только понять не могу, как ШИМ потом с помощью фильтра сделать "звуком". Ведь у ШИМ амплитуда одинакова, у "звука" разная, а ФНЧ обрезает только частоту...
И еще интересует весь процесс декодирования, от загрузки байта из EEPROM, до вывода на ШИМ.
Может, угостите хорошей ссылкой по этому вопросу, или книгу умную порекомендуете rolleyes.gif .
Спасибо.
Mike18
Цитата(Alt.F4 @ Sep 30 2010, 16:28) *
Есть у Atmel аппнот: "AVR336: ADPCM Decoder"
...
Может, угостите хорошей ссылкой по этому вопросу, или книгу умную порекомендуете rolleyes.gif .

Там же в аппноте ссылаются на "AVR335:". В нём и подробности, только без ADPCM-a. В том числе и переводённый вариант легко найти. Поиском - "цифровое устройство записи речи". smile.gif
SasaVitebsk
Принцип ШИМ прост. Есть период ШИМ. Есть заполнение. Если на выход поставить интегрирующую цепочку (резистор послед, конденсатор на землю) то получим (по теории) интегральную площадь заполнения импульса (на то и интегратор). Иными словами, если заполнение ШИМом 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МГц. smile.gif

Существуют специальные нелинейные ЦАП для звука, которые при 8 битах обеспечивают 14 бит качество. Они применяются в GSM.
Alt.F4
Mike18, читал я AVR335 на русском. Там ответов на мои вопросы нет. Все очень поверхностно.
SasaVitebsk, спасибо, про ШИМ понятно почти все =). Почему разрядность при 8бит = 256?
Осталось узнать, как декодировать программно.
Mike18
Цитата(Alt.F4 @ Sep 30 2010, 17:07) *
Читал я AVR335 на русском. Там ответов на мои вопросы нет. Все очень поверхностно.
...
Почему разрядность при 8бит = 256?
Там после фильтра ещё усилитель нужно и динамик. И питание. И тогда будет звук. smile.gif
Это не разрядность = 256, а 8бит = разрядность. А 256, это два в восьмой, разрядности то есть, степени.
Alt.F4
Цитата
Там после фильтра ещё усилитель нужно и динамик. И питание. И тогда будет звук.
Тут еще программно декодировать надо! smile.gif
Цитата
Это не разрядность = 256, а 8бит = разрядность. А 256, это два в восьмой, разрядности то есть, степени.
А ё, меня чего-то клемануло.

Вопрос программного декодирования не решен.
Mike18
Цитата(Alt.F4 @ Sep 30 2010, 17:38) *
...
Вопрос программного декодирования не решен.
Думаю, что решён и давно. rolleyes.gif

Может, Вам эта статья поможет?
Alt.F4
Mike18, эту статью тоже читал. Про реализацию декодирования ничего конкретного не написано.
Допустим есть у нас байт закодированного АДИКМ, что с ним делать?
Спасибо.
з.ы. Си не знаю, пишу на Асме
Mike18
Цитата(Alt.F4 @ Sep 30 2010, 18:01) *
Mike18, эту статью тоже читал. Про реализацию декодирования ничего конкретного не написано.
Допустим есть у нас байт закодированного АДИКМ, что с ним делать?
Спасибо.

Применительно к упомянутому в этой статье микрочиповскому AN643, делать так, как пошагово расписано в "TABLE2" этого AN. rolleyes.gif

Цитата
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, писать, наверно, можно и на Асме, но читать примеры, скорее всего придётся именно на Си. laughing.gif
Alt.F4
Мне б на русском...
Alt.F4
Почему все исходники на Си? Ни одного не нашел на Ассемблере, чтобы хотя бы по коду понять принцип работы...
Mike18
Цитата(Alt.F4 @ Sep 30 2010, 19:47) *
Мне б на русском...

Вот здесь было немножко. По-русски.
Искать "Рекомендация ITU G. ..." и "А.Н. Дегтеренко. Кодирование речевых сигналов на...".

Если не усугубит, то и не поможет. smile.gif
Alt.F4
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 битный ИКМ?
zombi
Цитата(Alt.F4 @ Oct 24 2010, 23:42) *
zombi описал алгоритм декодирования АДИКМ, но у меня по такой схеме на выходе постоянно 0x8000.
Может кто-нибудь перепроверит данный алгоритм, т.к. пытаясь понять Си исходники декодеров в апннотах MicroChip мне показалось, что в конце необходимо проверять чтобы D был не более 32768 и не менее -32768, а index был в пределах 0-88, т.е. схема в цитате описана не до конца?
Спасибо.
p.s. на выходе 8 битный ИКМ?

Да. Проверять обязательно!
На выходе 16 бит.
Alt.F4
Цитата
На выходе 16 бит.
А 8бит никак? rolleyes.gif
Maik-vs
Цитата(Alt.F4 @ Sep 30 2010, 19:47) *
Мне б на русском...

Английский учить всё равно придётся. Даже в ассемблере add, call и push - вполне себе переводимые английские слова. Поэтому берём Гугловый переводчик и переводим, наводим мышь на фразу - видим исходный текст.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.