реклама на сайте
подробности

 
 
> декодер ADPCM (АДИКМ) на AVR, теория
Alt.F4
сообщение Sep 30 2010, 12:28
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Есть у Atmel аппнот: "AVR336: ADPCM Decoder" (там и исходники на Си есть, но я хочу сам код написать на Ассемблере), но т.к. с английским дружу только со словарем, то понять как декодировать АДИКМ из этого апнота, для меня нереально.
Искал в интернете, но ничего конкретного по этому вопросу не нашел...
Смысл я понял такой, в EEPROM (МК или внешнюю) грузим кодированный в АДИКМ звук (можно в Sound Forge). Затем декодируем и с помощью ШИМ выводим аналог. Я вот только понять не могу, как ШИМ потом с помощью фильтра сделать "звуком". Ведь у ШИМ амплитуда одинакова, у "звука" разная, а ФНЧ обрезает только частоту...
И еще интересует весь процесс декодирования, от загрузки байта из EEPROM, до вывода на ШИМ.
Может, угостите хорошей ссылкой по этому вопросу, или книгу умную порекомендуете rolleyes.gif .
Спасибо.

Сообщение отредактировал Alt.F4 - Sep 30 2010, 12:30
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 15)
Mike18
сообщение Sep 30 2010, 12:54
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 23-12-06
Из: Старых Васюков
Пользователь №: 23 821



Цитата(Alt.F4 @ Sep 30 2010, 16:28) *
Есть у Atmel аппнот: "AVR336: ADPCM Decoder"
...
Может, угостите хорошей ссылкой по этому вопросу, или книгу умную порекомендуете rolleyes.gif .

Там же в аппноте ссылаются на "AVR335:". В нём и подробности, только без ADPCM-a. В том числе и переводённый вариант легко найти. Поиском - "цифровое устройство записи речи". smile.gif

Сообщение отредактировал Mike18 - Sep 30 2010, 13:04


--------------------
Время - материя тонкая и неточная...
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Sep 30 2010, 13:06
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 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МГц. smile.gif

Существуют специальные нелинейные ЦАП для звука, которые при 8 битах обеспечивают 14 бит качество. Они применяются в GSM.
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Sep 30 2010, 13:07
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Mike18, читал я AVR335 на русском. Там ответов на мои вопросы нет. Все очень поверхностно.
SasaVitebsk, спасибо, про ШИМ понятно почти все =). Почему разрядность при 8бит = 256?
Осталось узнать, как декодировать программно.

Сообщение отредактировал Alt.F4 - Sep 30 2010, 13:15
Go to the top of the page
 
+Quote Post
Mike18
сообщение Sep 30 2010, 13:24
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 23-12-06
Из: Старых Васюков
Пользователь №: 23 821



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


--------------------
Время - материя тонкая и неточная...
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Sep 30 2010, 13:38
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Цитата
Там после фильтра ещё усилитель нужно и динамик. И питание. И тогда будет звук.
Тут еще программно декодировать надо! smile.gif
Цитата
Это не разрядность = 256, а 8бит = разрядность. А 256, это два в восьмой, разрядности то есть, степени.
А ё, меня чего-то клемануло.

Вопрос программного декодирования не решен.
Go to the top of the page
 
+Quote Post
Mike18
сообщение Sep 30 2010, 13:53
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 23-12-06
Из: Старых Васюков
Пользователь №: 23 821



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

Может, Вам эта статья поможет?


--------------------
Время - материя тонкая и неточная...
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Sep 30 2010, 14:01
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Mike18, эту статью тоже читал. Про реализацию декодирования ничего конкретного не написано.
Допустим есть у нас байт закодированного АДИКМ, что с ним делать?
Спасибо.
з.ы. Си не знаю, пишу на Асме

Сообщение отредактировал Alt.F4 - Sep 30 2010, 14:36
Go to the top of the page
 
+Quote Post
Mike18
сообщение Sep 30 2010, 15:39
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 23-12-06
Из: Старых Васюков
Пользователь №: 23 821



Цитата(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

Сообщение отредактировал Mike18 - Sep 30 2010, 15:43


--------------------
Время - материя тонкая и неточная...
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Sep 30 2010, 15:47
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Мне б на русском...
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Oct 1 2010, 08:21
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Почему все исходники на Си? Ни одного не нашел на Ассемблере, чтобы хотя бы по коду понять принцип работы...
Go to the top of the page
 
+Quote Post
Mike18
сообщение Oct 4 2010, 17:12
Сообщение #12


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 23-12-06
Из: Старых Васюков
Пользователь №: 23 821



Цитата(Alt.F4 @ Sep 30 2010, 19:47) *
Мне б на русском...

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

Если не усугубит, то и не поможет. smile.gif


--------------------
Время - материя тонкая и неточная...
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Oct 24 2010, 20:42
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
zombi
сообщение Oct 26 2010, 14:28
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



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

Да. Проверять обязательно!
На выходе 16 бит.
Go to the top of the page
 
+Quote Post
Alt.F4
сообщение Oct 26 2010, 14:50
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 468
Регистрация: 28-03-10
Из: Беларусь
Пользователь №: 56 256



Цитата
На выходе 16 бит.
А 8бит никак? rolleyes.gif
Go to the top of the page
 
+Quote Post
Maik-vs
сообщение Oct 29 2010, 14:01
Сообщение #16


Местный
***

Группа: Участник
Сообщений: 246
Регистрация: 4-12-06
Пользователь №: 23 101



Цитата(Alt.F4 @ Sep 30 2010, 19:47) *
Мне б на русском...

Английский учить всё равно придётся. Даже в ассемблере add, call и push - вполне себе переводимые английские слова. Поэтому берём Гугловый переводчик и переводим, наводим мышь на фразу - видим исходный текст.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 19:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01516 секунд с 7
ELECTRONIX ©2004-2016