Перейти к содержанию
    

декодер ADPCM (АДИКМ) на AVR

Есть у Atmel аппнот: "AVR336: ADPCM Decoder" (там и исходники на Си есть, но я хочу сам код написать на Ассемблере), но т.к. с английским дружу только со словарем, то понять как декодировать АДИКМ из этого апнота, для меня нереально.

Искал в интернете, но ничего конкретного по этому вопросу не нашел...

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

И еще интересует весь процесс декодирования, от загрузки байта из EEPROM, до вывода на ШИМ.

Может, угостите хорошей ссылкой по этому вопросу, или книгу умную порекомендуете :rolleyes: .

Спасибо.

Изменено пользователем Alt.F4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть у Atmel аппнот: "AVR336: ADPCM Decoder"

...

Может, угостите хорошей ссылкой по этому вопросу, или книгу умную порекомендуете :rolleyes: .

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

Изменено пользователем Mike18

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Принцип ШИМ прост. Есть период ШИМ. Есть заполнение. Если на выход поставить интегрирующую цепочку (резистор послед, конденсатор на землю) то получим (по теории) интегральную площадь заполнения импульса (на то и интегратор). Иными словами, если заполнение ШИМом 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Mike18, читал я AVR335 на русском. Там ответов на мои вопросы нет. Все очень поверхностно.

SasaVitebsk, спасибо, про ШИМ понятно почти все =). Почему разрядность при 8бит = 256?

Осталось узнать, как декодировать программно.

Изменено пользователем Alt.F4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Читал я AVR335 на русском. Там ответов на мои вопросы нет. Все очень поверхностно.

...

Почему разрядность при 8бит = 256?

Там после фильтра ещё усилитель нужно и динамик. И питание. И тогда будет звук. :)

Это не разрядность = 256, а 8бит = разрядность. А 256, это два в восьмой, разрядности то есть, степени.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Там после фильтра ещё усилитель нужно и динамик. И питание. И тогда будет звук.
Тут еще программно декодировать надо! :)

Это не разрядность = 256, а 8бит = разрядность. А 256, это два в восьмой, разрядности то есть, степени.
А ё, меня чего-то клемануло.

 

Вопрос программного декодирования не решен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

Вопрос программного декодирования не решен.

Думаю, что решён и давно. :rolleyes:

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Mike18, эту статью тоже читал. Про реализацию декодирования ничего конкретного не написано.

Допустим есть у нас байт закодированного АДИКМ, что с ним делать?

Спасибо.

з.ы. Си не знаю, пишу на Асме

Изменено пользователем Alt.F4

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Mike18, эту статью тоже читал. Про реализацию декодирования ничего конкретного не написано.

Допустим есть у нас байт закодированного АДИКМ, что с ним делать?

Спасибо.

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

 

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:

Изменено пользователем Mike18

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему все исходники на Си? Ни одного не нашел на Ассемблере, чтобы хотя бы по коду понять принцип работы...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне б на русском...

Вот здесь было немножко. По-русски.

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

zombi описал алгоритм декодирования АДИКМ, но у меня по такой схеме на выходе постоянно 0x8000.

Может кто-нибудь перепроверит данный алгоритм, т.к. пытаясь понять Си исходники декодеров в апннотах MicroChip мне показалось, что в конце необходимо проверять чтобы D был не более 32768 и не менее -32768, а index был в пределах 0-88, т.е. схема в цитате описана не до конца?

Спасибо.

p.s. на выходе 8 битный ИКМ?

Да. Проверять обязательно!

На выходе 16 бит.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...