Alt.F4 0 30 сентября, 2010 Опубликовано 30 сентября, 2010 (изменено) · Жалоба Есть у Atmel аппнот: "AVR336: ADPCM Decoder" (там и исходники на Си есть, но я хочу сам код написать на Ассемблере), но т.к. с английским дружу только со словарем, то понять как декодировать АДИКМ из этого апнота, для меня нереально. Искал в интернете, но ничего конкретного по этому вопросу не нашел... Смысл я понял такой, в EEPROM (МК или внешнюю) грузим кодированный в АДИКМ звук (можно в Sound Forge). Затем декодируем и с помощью ШИМ выводим аналог. Я вот только понять не могу, как ШИМ потом с помощью фильтра сделать "звуком". Ведь у ШИМ амплитуда одинакова, у "звука" разная, а ФНЧ обрезает только частоту... И еще интересует весь процесс декодирования, от загрузки байта из EEPROM, до вывода на ШИМ. Может, угостите хорошей ссылкой по этому вопросу, или книгу умную порекомендуете :rolleyes: . Спасибо. Изменено 30 сентября, 2010 пользователем Alt.F4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mike18 0 30 сентября, 2010 Опубликовано 30 сентября, 2010 (изменено) · Жалоба Есть у Atmel аппнот: "AVR336: ADPCM Decoder" ... Может, угостите хорошей ссылкой по этому вопросу, или книгу умную порекомендуете :rolleyes: . Там же в аппноте ссылаются на "AVR335:". В нём и подробности, только без ADPCM-a. В том числе и переводённый вариант легко найти. Поиском - "цифровое устройство записи речи". :) Изменено 30 сентября, 2010 пользователем Mike18 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 30 сентября, 2010 Опубликовано 30 сентября, 2010 · Жалоба Принцип ШИМ прост. Есть период ШИМ. Есть заполнение. Если на выход поставить интегрирующую цепочку (резистор послед, конденсатор на землю) то получим (по теории) интегральную площадь заполнения импульса (на то и интегратор). Иными словами, если заполнение ШИМом 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alt.F4 0 30 сентября, 2010 Опубликовано 30 сентября, 2010 (изменено) · Жалоба Mike18, читал я AVR335 на русском. Там ответов на мои вопросы нет. Все очень поверхностно. SasaVitebsk, спасибо, про ШИМ понятно почти все =). Почему разрядность при 8бит = 256? Осталось узнать, как декодировать программно. Изменено 30 сентября, 2010 пользователем Alt.F4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mike18 0 30 сентября, 2010 Опубликовано 30 сентября, 2010 · Жалоба Читал я AVR335 на русском. Там ответов на мои вопросы нет. Все очень поверхностно. ... Почему разрядность при 8бит = 256? Там после фильтра ещё усилитель нужно и динамик. И питание. И тогда будет звук. :) Это не разрядность = 256, а 8бит = разрядность. А 256, это два в восьмой, разрядности то есть, степени. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alt.F4 0 30 сентября, 2010 Опубликовано 30 сентября, 2010 · Жалоба Там после фильтра ещё усилитель нужно и динамик. И питание. И тогда будет звук.Тут еще программно декодировать надо! :) Это не разрядность = 256, а 8бит = разрядность. А 256, это два в восьмой, разрядности то есть, степени.А ё, меня чего-то клемануло. Вопрос программного декодирования не решен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mike18 0 30 сентября, 2010 Опубликовано 30 сентября, 2010 · Жалоба ... Вопрос программного декодирования не решен. Думаю, что решён и давно. :rolleyes: Может, Вам эта статья поможет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alt.F4 0 30 сентября, 2010 Опубликовано 30 сентября, 2010 (изменено) · Жалоба Mike18, эту статью тоже читал. Про реализацию декодирования ничего конкретного не написано. Допустим есть у нас байт закодированного АДИКМ, что с ним делать? Спасибо. з.ы. Си не знаю, пишу на Асме Изменено 30 сентября, 2010 пользователем Alt.F4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mike18 0 30 сентября, 2010 Опубликовано 30 сентября, 2010 (изменено) · Жалоба 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: Изменено 30 сентября, 2010 пользователем Mike18 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alt.F4 0 30 сентября, 2010 Опубликовано 30 сентября, 2010 · Жалоба Мне б на русском... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alt.F4 0 1 октября, 2010 Опубликовано 1 октября, 2010 · Жалоба Почему все исходники на Си? Ни одного не нашел на Ассемблере, чтобы хотя бы по коду понять принцип работы... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mike18 0 4 октября, 2010 Опубликовано 4 октября, 2010 · Жалоба Мне б на русском... Вот здесь было немножко. По-русски. Искать "Рекомендация ITU G. ..." и "А.Н. Дегтеренко. Кодирование речевых сигналов на...". Если не усугубит, то и не поможет. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alt.F4 0 24 октября, 2010 Опубликовано 24 октября, 2010 (изменено) · Жалоба 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 битный ИКМ? Изменено 24 октября, 2010 пользователем Alt.F4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zombi 0 26 октября, 2010 Опубликовано 26 октября, 2010 · Жалоба zombi описал алгоритм декодирования АДИКМ, но у меня по такой схеме на выходе постоянно 0x8000. Может кто-нибудь перепроверит данный алгоритм, т.к. пытаясь понять Си исходники декодеров в апннотах MicroChip мне показалось, что в конце необходимо проверять чтобы D был не более 32768 и не менее -32768, а index был в пределах 0-88, т.е. схема в цитате описана не до конца? Спасибо. p.s. на выходе 8 битный ИКМ? Да. Проверять обязательно! На выходе 16 бит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alt.F4 0 26 октября, 2010 Опубликовано 26 октября, 2010 · Жалоба На выходе 16 бит.А 8бит никак? :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться