Adaptive Differential Pulse Code Modulation (ADPCM) является техникой сжатия цифровых сигналов, которая используется обычно для кодирования речи в телекоммуникациях. ADPCM это кодек звука, который также может использоваться и для других сигналов, не обязательно речи, как например музыка или звуковые эффекты. ADPCM проще, чем продвинутые техники сжатия звука с низким битрейтом, и не требует сложных вычислений, так что кодирование и декодирование может быть выполнено за относительно малое время. Здесь переведен перевод даташита AVR336: ADPCM Decoder on tinyAVR and megaAVR devices [1]. Показано следующее:
• Программа AVR может декодировать сигнал формата ADPCM в реальном времени. • Поддерживается декодирование звука с битрейтами 16, 24, 32 и 40 кбит/сек. • Во встроенную память программ ATmega128 помещается больше 1 минуты звучания (с битрейтом 16 кбит/сек). • Декодированный сигнал воспроизводится с помощью ШИМ, организованного на таймере/счетчике в режиме PWM.
Из Википедии: "G.726 кодек является стандартом ITU-T адаптивной импульсно-кодовой модуляции — ADPCM и описывает передачу голоса полосой в 16, 24, 32, и 40 килобит/сек. Он замещает собой другие стандарты — G.721, который описывает ADPCM передачу голоса полосой в 32 килобит/сек, и G.723, который описывает ADPCM передачу в 24 и 40 килобит/сек. Четыре полосы кодека G.726 соотносят обычно с размерами выборок(отсчетов) в битах, это 2-х, 3-х, 4-х, и 5-ти битовый соответственно.
Наиболее часто используемый среди них 32 килобит/сек, который равен ровно половине полосы стандартного кодека G.711. В первую очередь используется на международных линиях связи в телефонных сетях. Он также является стандартным кодеком, используемым в беспроводных телефонах системы DECT, а также используется в некоторых камерах фирмы Canon и IP-камерах фирмы Panasonic, Beward и D-link."
ADPCM обычно используется кодирование сигнала с параметрами 8 кГц, 8 бит, у которого соответствующая скорость потока бит составляет 64 кбит/сек. При кодировании с самым высоким уровнем сжатия, когда используется только 2 бита для кодирования сигнала ADPCM, скорость потока бит снижается до 16 кбит/сек, то есть до 25% от оригинала. При использовании 4-битного кодирования поток данных составляет 32 кбит/сек, т. е. 50% от оригинала, и качество сигнала остается приемлемым для большинства приложений.
Наиболее тесно связаны с ADPCM такие виды модуляции, как PCM и DPCM.
PCM. Расшифовывается как Pulse Code Modulation, по-русски импульсно-кодовая модуляция (ИКМ). Это наиболее простой способ кодирования звука. При этом нет никаких математических преобразований - отсчеты с выхода АЦП просто сохраняются в виде массива данных.
DPCM. Расшифровывается как Differential PCM, т. е. дифференциальная PCM, или по-русски ДИКМ. Кодирует сигнал в виде разности между текущим и предыдущим значением. Для звуковых данных такой тип модуляции уменьшает требуемое количество бит на отсчёт примерно на 25%. Из-за своей невысокой эффективности DPCM применяется редко.
На рисунке наглядно показано, чем отличаются друг от друга PCM, DPCM и ADPCM. Синяя кривая представляет исходный сигнал, красные вертикальные линии - цифровые данные модуляции, красные точки - попытка апроксимации исходного сигнала с помощью данного вида модуляции. Очевидно, что точнее всего работает PCM, однако для её передачи требуется больше всего данных. DPCM хорошо подходит для медленно меняющихся сигналов, но быстрые сигналы восстанавливает плохо. ADPCM "адаптирует" свои данные под исходный сигнал, пытаясь предсказывать его поведение.
Этот апноут фокусируется на декодировании сигнала ADPCM. Он задействует встроенный в микроконтроллер таймер/счетчик для создания выходного сигнала ШИМ (Pulse-Width Modulated, PWM, широтно-импульсная модуляция), который затем поступает на простой внешний фильтр низкой частоты (ФНЧ). ФНЧ состоит из нескольких внешних компонентов, и он переводит цифровой сигнал в аналоговую форму, которая подходит (после усиления) для подачи на динамики (звуковые излучатели) или наушники.
Дополнительную информацию про цифро-аналоговое преобразование с помощью таймера-счетчика см. в апноуте AVR335: Digital Sound Recorder with AVR® and DataFlash® [2].
Рис. 1. Декодирование ADPCM с помощью микроконтроллера AVR.
[1. Немного теории: как это работает]
Принцип ADPCM основан на предсказании текущего сигнала на основании предыдущих значений, и на передачи только различия между реальной и предсказанной величиной. При прямом кодировании Pulse-Code Modulation (PCM) передавалось бы реальное или фактическое значение сигнала. В ADPCM разница между предсказанным значением сигнала и действительным уровнем сигнала обычно получается довольно малой, следовательно её можно закодировать меньшим значением бит, чем соответствующим значением модуляции PCM.
При кодировании ADPCM в зависимости от требуемого качества и степени сжатия разностный сигнал оцифровывается по 4, 8, 16 или 32 уровням (соответственно на кодирование одной выборки приходится 2, 3, 4 или 5 бит вместо 8 бит при PCM). Блок-схема кодера ADPCM показана на рис. 1-1. Дополнительную информацию по кодированию ADPCM см. по ссылке [3].
Рис. 1-1. Блоковая диаграмма кодировщика ADPCM.
Схема декодера показана на рис. 1-2: берется значение выборки (оцифрованное изменение сигнала), выполняется выполняется инверсное квантование, и результат вычитается из предсказанного сигнала, после чего получается декодированный сигнал. Декодер описан подробно далее, заголовки ссылаются на рис. 1-2. Полные формулы см. в разделе "Приложение B: формулы".
Рис. 1-2. Блоковая диаграмма декодера ADPCM.
Примечание: имена блоков на диаграмме и в разделах статьи оставлены как в оригинале, непереведенными - чтобы было проще ориентироваться в терминах и тексте стандарта [3].
1.1. Inverse Adaptive Quantizer
В этом блоке вычисляется линейная квантованная разность dq(k) из логарифмического квантованного дифференциального сигнала dq ln(k) и фактора адаптации y(k). Логарифмический квантованный дифференциальный сигнал dq ln(k) получается из статической просматриваемой таблицы, в которой индексом используется кодовое слово ADPCM I(k). Линейный доменный разностный сигнал вычисляется возведением 2 в степень dq ln(k) + y(k).
1.2. Quantizer Scale Factor Adaptation
Здесь вычисляется фактор масштабирования y(k), используемый для inverse adaptive quantizer. Фактор масштабирования y(k) состоит из двух факторов; быстрый разблокированный (fast unlocked) фактор масштабирования yu(k) и медленный блокированный (slow locked) yl(k). Два фактора масштабирования нужны для обработки разных типов сигналов; быстрый фактор масштабирования позволяет адаптироваться к сигналам с большими изменениями (например речь), в то время как медленный фактор масштабирования нужен, когда сигнал меняется медленно (например, тональные сигналы). Фактор масштабирования является линейной комбинацией из этих двух факторов. Степень влияния определяется параметром скорости al, описанный в следующей секции.
1.3. Adaptation Speed Control
Скорость адаптации управляется параметром al. Он приближается к единице для сигналов речи и к нулю для сигналов данных звукового диапазона. Чтобы получить al, вычисляются две средние амплитуды (долго- и краткосрочные) кодового слова ADPCM I(k). Разница между ними показывает, как изменяется средняя амплитуда I(k). Если разность мала, то амплитуда I(k) постоянна; если разность большая, то амплитуда I(k) меняется, как это показывает параметр управления скоростью ap. Параметр учитывает также специальные случаи, когда детектированы переходы, или когда сигнал в состоянии ожидания. И наконец, ограниченный параметр управления скоростью al получается из ap (в диапазоне от 0 до 2) путем ограничения его величины от 0 до 1. Это выполняется асимметрично для задержки перехода от быстрого в медленный режим адаптации.
1.4. Tone and Transition Detector
Детектирования тона и изменений добавлены для улучшения ответа кодека, когда обрабатывается не речь, а сигналы данных.
Если сигнал использует только узкий частотный диапазон (например, тональные сигналы), квантизатор устанавливается в медленный режим адаптации.
Если были детектированы переходы, квантизатор переводится в быстрый режим адаптации (tr = 1), и коэффициенты адаптивного предсказателя устанавливаются в 0.
1.5. Adaptive Predictor
se(k) = sep + sez
Адаптивный предсказатель вычисляет оценку сигнала se(k) от квантованного разностного сигнала dq(k). Он использует две адаптивные структуры; структура второго порядка моделирует полюса (sep), и структура шестого порядка моделирует нули (sez). Коэффициенты в обоих структурах обновляются с упрощенным градиентным алгоритмом. Чтобы гарантировать устойчивость коэффициентов структура моделирования полюсов должна быть ограничена. Формулы для обновления коэффициентов в структуре моделирования нулей незначительно отличаются для разных битрейтов (5 бит отличается от 2, 3 или 4 бита).
Если был детектирован переход, то все коэффициенты предсказателя в обоих структурах устанавливаются в 0 (см. предыдущий блок).
1.6. Reconstructed Signal Calculator
sr(k) = se(k) + dq(k)
Реконструированный (восстановленный) сигнал sr(k) вычисляется просто добавлением оцененного сигнала se(k) к разностному сигналу dq(k).
[2. Реализация]
Декодер реализован с использованием компилятора C компании IAR Systems, причем некоторые секции написаны на ассемблере. Главная структура декодера проста (см. рис. 2-1); программа ожидает, пока пользователь не нажмет кнопку, и затем начнет декодировать предварительно закодированные выборки, которые записаны в память FLASH. Сначала программа вызывает функцию get_code(), которая читает данные из FLASH и распаковывает оттуда кодовое слово ADPCM (один байт содержит несколько кодовых слов).
Рис. 2-1. Алгоритм основной программы.
Далее вызывается функция decode(), как это показано на рис. 2-2. Функция вычисляет оценку сигнала (см. предсказатель predictor()), фактор масштабирования квантователя y, и разностный сигнал dq. Детектируются возможные переходы сигналов, и обновляются параметры размера шага фактора масштабирования, а также коэффициенты адаптивного предсказателя. И наконец, декодер детектирует возможные тональные сигналы и обновляет параметры управления скоростью адаптации.
Рис. 2-2. Алгоритм функции декодера.
Восстановленный сигнал sr выводится с помощью простого цифро-аналогового преобразователя, построенного на таймере/счетчике 1 в режиме PWM (ШИМ), при этом сигнал выводится на ножку 5 порта B (PB5), и далее поступает на внешний ФНЧ.
2.1.1. Совместимость со стандартом ITU-T G.726
Программное обеспечение довольно близко следует ранее сделанному описанию, однако были сделаны некоторые изменения для повышения эффективности вычислений. Стандарт ADPCM ITUT G.726 [3] определяет некоторые вычисления, вовлекаемые при восстановлении сигнала sr(k), как вычисления с применением арифметики плавающей точки. В этой реализации такие вычисления опущены, и вместо них применена арифметика с фиксированной точкой. Это было сделано, чтобы сократить количество затрачиваемых тактовых циклов ядра. Использование арифметики с фиксированной точкой вместо плавающей точки немного ухудшает качество восстановленного сигнала.
Два блока выброшены совсем, под именами преобразования μ-law and A-law, вместе с синхронной подстройкой кодирования. Преобразования μ-law и A-law используются для того, чтобы уменьшить количество бит на выборку. Поскольку вывод напрямую передается в цифро-аналоговый преобразователь, здесь не нужны преобразования μ-law/A-law.
В этой реализации также выброшена синхронная подстройка кодирования, определенная в стандарте G.726. Назначение синхронной подстройки кодирования в том, чтобы предотвратить искажения в синхронном тандеме кодирований (например ADPCM-PCM-ADPCM), что не требуется в этом приложении.
Чтобы достичь максимального качества кодирования, процессы кодирования и декодирования должны использовать один и тот же алгоритм, т. е. кодирование также должно производиться в арифметике с фиксированной точкой.
2.2. Аппаратура
Для запуска программы используется процессор ATmega128. Чтобы достичь наилучшего качества, очень рекомендуется использовать активный ФНЧ между выходом PWM (ШИМ) и динамиком/наушниками/усилителем, чтобы отфильтровать базовую частоту PWM. Вывод PWM и советуемая схема фильтра описана в апноуте AVR335 [2]. Схема простого активного фильтра второго порядка, реализованного на низковольтном операционном усилителе показана разделе "Приложение C".
Рекомендуется использовать плату разработчика STK500 с модулем расширения STK501. Когда декодируются сигналы с частотой выборок 8 кГц, AVR должен работать на частоте 16 МГц, так что требуется применение внешнего кварцевого или керамического резонатора.
[3. Пример реализации]
В этой секции даны пошаговые инструкции - как декодировать сжатый звук ADPCM на микроконтроллере ATmega128 и плате разработчика STK500/501. Для декодирования сигнала ADPCM с частотой выборок 8 кГц нужна тактовая частота ядра AVR 16 МГц.
3.1. Быстрый старт
Для использования декодера ADPCM выполните следующее:
• Скачайте пример кода с сайта Atmel, либо см. ссылку [4]. Распакуйте архив в произвольную папку на диске. • Выберите один из файлов из приложенных закодированных выборок звука (см. файлы в папке Samples), и сделайте его копию в папку с модулями исходного кода (папка Decoder). Переименуйте скопированный файл в data.c. • Запустите IAR Embedded Workbench, откройте файл рабочего пространства Decoder\AVR336.eww, и сконфигурируйте рабочее пространство; отредактируйте параметры BITS и INPUTSIZE в файле adpcm.h, чтобы они соответствовали выбранному файлу оцифрованного звука (data.c), и пересоберите проект. • Загрузите скомпилированную и слинкованную программу в память целевого микроконтроллера AVR. • Соберите схему ФНЧ, подключите его к выходу PWM (PB5 на Atmega128), и подключите к выходу ФНЧ усилитель и динамик.
Теперь сигнал из файла data.c готов к декодированию и воспроизведению.
3.2. Файлы звука ADPCM
Вместе с этим апноутом приложены некоторые закодированные звуковые файлы (в папке Samples). Можно скопировать любой из этих файлов в директорию проекта, и переименовать его в data.c. Альтернативно используйте стороннее программное обеспечение для создания новых звуковых файлов в формате ADPCM. Если используются свои данные ADPCM, то имейте в виду, что двоичные данные звука должны быть преобразованы в текстовый модуль исходного кода с соответствующим массивом, как это сделано в приложенных файлах примеров каталога Samples. См. раздел "Приложение E", где показано как кодировать файлы ADPCM.
3.3. Компилирование и линковка
Чтобы скомпилировать и слинковать исходный код в IAR Embedded Workbench, выполните следующие шаги:
• Откройте рабочее пространство (workspace) AVR336.eww. • В свойствах проекта установить выходной формат UBROF-8 (Project -> Options -> XLINK -> Output -> UBROF-8). По умолчанию IAR Embedded Workbench 3.10 генерирует UBROF 9, но AVR Studio 4.10 в настоящий момент поддерживает UBROF 8 и предыдущие. Это поведение может быть изменено в новых релизах. • В окне проекта сделайте двойной клик на файле adpcm.h, чтобы открыть его в текстовом редакторе кода IAR. Обновите установки ADPCM в этом файле, чтобы они соответствовали формату выбранного файла звука ADPCM. INPUTSIZE задает длину звуковой записи, и BITS определяет количество бит, используемые для кодирования. • В окне проекта сделайте правый клик на файле data.c, и в контекстном меню выберите Compile. Это гарантирует, что линкер не будет использовать ранее скомпилированную версию старого звукового файла (т. е. файл data.c скомпилируется заново. Того же самого эффекта можно добиться, если сначала сделать очистку проекта Clean, а потом скомпилировать проект Project -> Make). • Выполните компиляцию и линковку проекта (Project -> Make).
3.4. Настройка аппаратуры
Подключите плату STK501 к плате STK500, и установите верхний модуль процессора с микроконтроллером AVR ATmega128. Подключите кнопки к порту D с помощью гибкого кабеля (соедините кабелем коннекторы SWITCHES и PORTD). Сконфигурируйте целевой AVR для работы на нужной частоте (по умолчанию используется внешний кварцевый резонатор на 16 МГц). Подключите AVR и/или STK500 к PC с помощью прямого соединения кабелем, либо через программатор/отладчик.
3.5. Настройка сессии отладки firmware
Запустите AVR Studio, и откройте файл adpcm.dbg из выходной директории IAR (Debug/Exe или Release/Exe). Сконфигурируйте AVR Studio для выбора Вашей платформы отладки (какой используется аппаратный отладчик; обычно это JTAGICE mkII) и используемого AVR. Теперь программа готова к запуску в отладчике.
3.6. Схема ФНЧ
Применение выходного фильтра необязательно, однако это значительно улучшает качество звука. Одна из возможных схем фильтра описана в апноуте AVR335 [2]. Если используется схема из AVR335, то имейте в виду, что нужно взять оттуда только выходную часть (часть схемы, которая относится к микрофону, не нужна). Или Вы можете использовать упрощенную схему, показанную в разделе Приложение C.
[4. Портирование кода на различные модели микроконтроллеров]
Приведенный пример программы может быть довольно просто портирован на другие устройства AVR. Все что нужно поменять - ссылки на упакованные в память данные звука, и выходной вывод для PWM. Например, чтобы использовать декодер на ATmega32 (макетная плата AVR-USB-MEGA16), замените все __hugeflash на __flash в файле main.c, adpcm.c и data.c. Для выхода PWM в случае использования OC1A порт PB5 для ATmega32 поменяется на PD5. Кроме того, должна быть также соответственно изменена функция initialize_pwm() в файле adpcm.c.
Рекомендуется использовать AVR со встроенным аппаратным перемножителем [5].
Для хранения воспроизводимого звука требуется некоторое количество FLASH-памяти программ. Это количество зависит от частоты дискретизации звука (sample rate), скорости потока бит (ADPCM bit rate) и конечно, от длительности звучания записи. Таблица ниже показывает требования к объему памяти для одной секунды звука и при различных битрейтах (столбец Бит на выборку) и частот дискретизации (столбцы Sample rate, Гц).
Таблица 5-1. Сколько займет памяти 1 секунда звуковых данных.
Бит на выборку
Частота дискретизации (Гц)
4000
6000
8000
2
1 кбайт
1.5 кбайта
2 кбайта
3
1.5 кбайта
2.25 кбайта
3 кбайта
4
2 кбайта
3 кбайта
4 кбайта
Например, 10-секундный звук, закодированные с битрейтом 4 бита и частотой дискретизации 8 кГц потребует 320 килобит памяти, что равно 40 килобайтам. Это означает, что декодер ADPCM на ATmega128, который сам займет порядка 3 кбайт, сможет воспроизвести (128-3) килобайт / (32/8) = больше чем 31 секунд на ADPCM, закодированным 8 кГц, 4-бит.
5.1. Количество циклов, затрачиваемых на вычисления
Таблица ниже показывает количество требуемых циклов на обработку одной выборки звука. Битрейт слабо влияет на требования к количеству циклов (поэтому в таблице показано среднее значение для версии с битрейтом 4 бита). Чтобы найти требуемую тактовую частоту AVR, умножьте общее количество тактовых циклов на частоту дискретизации (sample rate).
Таблица 5-2. Затраты тактовых циклов - среднее и для самого худшего случая.
Функция
Среднее количество циклов на выборку
Самое худшее количество циклов на выборку
get_code()
130
140
decode()
1600
1860
T/C3 ISR
60
70
Другой код
140
150
Общая длина цикла декодера
1930
2220
Например, цифровой звук записан с частотой дискретизации 7812 Гц, и среднее общее требуемое количество циклов 1930. AVR должен работать на частоте 1930 x 7812 Гц = 15 МГц, и чтобы был запас, округлим эту частоту сверху до 16 МГц. Требования к количеству циклов для самого худшего случая не превысят 16 МГц, и нужен буфер небольшого размера, чтобы исключить слышимые искажения для тех случаев, когда вычислений слишком много. Длина буфера может быть подстроена (с помощью правки исходного кода). Чем больше буфер, тем меньше риск его опустошения, но это конечно повышает требования к наличию необходимой памяти (задействуется 2 байта на 1 элемент).
5.2. Память
Требования к памяти показаны в таблице ниже. Исходный код включает в себя все варианты битрейтов кодирования (от 2 до 5 бит на выборку), однако обычно в приложении требуется только один вариант. Удаление поддержки ненужных битрейтов уменьшит требования к памяти программ декодера ADPCM.
Таблица 5-3. Требования декодера к объему памяти (без учета звуковых данных).
Этот раздел содержит таблицы, которые нужны для декодирования 4-битного битрейта ADPCM. Соответствующие значения для других битрейтов (2, 3 и 5) можно найти напрямую в исходном коде (adpcm.c). В исходном коде некоторые табличные значения представлены в виде десятичных чисел с фиксированной точкой. Количество бит, которыми кодируется дробная десятичная часть, показана нотацией Qn. Например, нотация Q4 числа 4.75 будет записана как 0000 0000 0100.1100.
Таблица 6-1. Значения функции W() и F() для 4-битного кодирования.
|I(k)|
W|I(k)| (нотация Q4)
F|I(k)| (нотация Q9)
0
-0.75
0
1
1.13
0
2
2.56
0
3
4.00
1
4
7.00
1
5
12.38
1
6
22.19
3
7
70.13
7
Таблица 6-2. Инверсное квантование для 4-битного кодирования.
В этом приложении приведены математические формулы, используемые для декодирования сигнала ADPCM. Заголовки для разделов формул ссылаются на имена блоков алгоритма рис. 1-2 (так что для ясности они остались непереведенными).
7.1. Inverse Adaptive Quantizer
Чтобы выполнить преобразование из логарифмического домена в линейный, используется следующая формула:
7.2. Quantizer Scale Factor Adaptation
Блокированный (locked) и разблокированный факторы масштабирования комбинируются формулой
y(k) = al(k)yu(k-1) + (1-al(k))yl(k-1)
где
0 ≤ al(k) ≤ 1
Разблокированный (быстрый) фактор масштабирования yu(k) (таблицы в разделе Приложение A для определений значений функции W при различных битрейтах):
Диапазон изменения yu(k) ограничен рамками от 1.06 до 10.00.
7.3. Adaptation Speed Control
Скорость адаптации управляется параметром al. Как уже упоминалось, он достигает 1 для речи и 0 для тональных звуков. Параметр вычисляется путем ограничения параметра управления скоростью ap(k) значению меньше или равно 1:
Неограниченный параметр управления скоростью ap(k) определен так:
Следующие переменные (краткосрочные и длинные усреднения F|I(k)|) нужны для вычисления ap:
dms(k) = (1-2-5)dms(k-1) + 2-5F|I(k)|
dml(k) = (1-2-7)dml(k-1) + 2-7F|I(k)|
Значения для F|I(k)| выбираются из статической таблицы (см. раздел Приложение A).
Фильтр, показанный на рисунке ниже, является фильтром второго порядка низкой частоты, с характеристикой Баттерворта и топологией Саллена-Ки. Частота среза составляет 3000 Гц. Базовая частота PWM 31.25 кГц будет ослаблена таким фильтром на 40 dB. Фильтр реализован на низковольтном операционном усилителе TS921 с однополярным питанием, который может работать в диапазоне питающих напряжений от 2.7V до 12V.
Рис. 8-1. Схема фильтра.
Усиление и напряжение питание может быть понадобиться подобрать из-за величины сопротивления нагрузки RL. Для этой конфигурации было выбрано напряжение питания +5V.
Таблица 8-1. Значения номиналов деталей схемы ФНЧ.
RefDes
Номинал
Описание
R1
1.69 кОм
Резистор в составе фильтра Баттерворта
R2
3.4 кОм
Резистор в составе фильтра Баттерворта
C1
0.022 мкФ
Конденсатор в составе фильтра Баттерворта
C2
0.022 мкФ
Конденсатор в составе фильтра Баттерворта
C3
1 мкФ
Конденсатор в составе фильтра Баттерворта
IC1
TS921
Операционный усилитель
RL
≥ 32 ома (1)
Миниатюрный динамик, наушники или другие звуковые излучатели
Примечание 1: допустимое сопротивление нагрузки зависит от микросхемы операционного усилителя IC1. См. даташит производителя микросхемы.
В этой секции перечислены файлы [4], которые поставляются с этим апноутом.
9.1. Декодер
Как уже упоминалось, файл data.c содержит запись закодированного звука. Чтобы экспериментировать с разными звуками, удалите файл data.c, сделайте копию одного из файлов папки Samples в каталог проекта, переименуйте его в data.c, и поменяйте параметры BITS и INPUTSIZE в файле adpcm.h, чтобы они соответствовали этой записи звука. Затем выполните очистку, компиляцию и линковку программы. Файлы декодера будут находиться в папке Source\Decoder.
Таблица 9-1. Файлы декодера.
Имя файла
Описание
adpcm.c
Алгоритмы ADPCM
adpcm.h
Файл заголовка для модуля adpcm.c
AVR336.eww
Файл рабочего пространства IAR
data.c
Закодированные звуковые данные ADPCM (см. заголовок для получения информации)
Decoder.ewp
Файл проекта IAR
main.c
Основная программа
update_yl.asm
Подпрограмма на ассемблере для обновления фактора масштабирования
9.2. Кодер
Файлы кодировщика ADPCM находятся в папке Source\Tools.
Таблица 9-2. Файлы кодера.
Имя файла
Описание
decode.c
Модуль исходного кода для декодера
decode.exe
Скомпилированный декодер
encode.c
Модуль исходного кода для кодера
encode.exe
Скомпилированный кодер
g7*.*
Исходный код поддержки для кодера и декодера
c-izer.cpp
Исходный код для преобразования текстового файла в код на языке C
c-izer.exe
Скомпилированный код преобразователя текстового файла в код на языке C
Некоторые части программы основаны на коде, предоставленном в общее пользование компанией Sun Microsystem®, Inc. [7] (см. также ссылку [4], где можно найти код библиотек для обработки звука CCITT G.711, G.721, G.723).
9.3. Данные записанного звука
Оцифрованные и закодированные звуки находятся в папке Source\Samples.
Для получения упакованных файлов звука, который будет обрабатывать описанный в этом апноуте декодер, нужен кодер ADPCM. Декодер будет декодировать данные, которые были упакованы с любым совместимым со стандартом кодировщиком ADPCM, но для достижения самого высокого качества звука рекомендуется использовать собственный, нестандартный кодер для генерации звуковых файлов в формате ADPCM. Причина в том, что декодер не точно следует спецификации стандарта ITU-T (см. раздел "Совместимость со стандартом ITU-T G.726"). Принцип работы кодера кратко рассмотрен в разделе "Немного теории: как это работает".
10.1. Использование кодера
Вместе с этим апноутом поставляется готовый скомпилированный кодировщик, который может быть запущен на компьютере PC с операционной системой Windows®. Кодер запускается из командой строки со следующими параметрами:
encode [-2|3|4|5] [-a|u|l] –i infile -o|c outfile
-2 генерировать данные G.726 16kbps (2-bit)
-3 генерировать данные G.726 24kbps (3-bit)
-4 генерировать данные G.726 32kbps (4-bit) [поведение по умолчанию]
-5 генерировать данные G.726 40kbps (5-bit)
-a обрабатывать входные данные как 8-bit A-law
-u обрабатывать входные данные как 8-bit μ-law
-l обрабатывать входные данные как линейные выборки 16-bit PCM [поведение по умолчанию]
-i Input filename (входной двоичный файл)
-o Output filename (выходной двоичный файл)
-c Output filename (текстовый файл, который можно вставить в тело массива на языке C)
Например, следующая командная строка инструктирует кодировщик использовать 32 kbps ADPCM для кодирования файла 16-битного линейного PCM "sound1.bin" в текстовый файл "encoded1.txt":
encode –4 –l -i sound1.bin –c encoded1.txt
Выходной файл будет содержать листинг HEX-значений примерно в таком виде (этот вывод показан только для примера, Ваш файл звука может содержать другие данные):
Затем из текстового файла должен быть сформирован файл на языке C с расширением *.c, чтобы его можно было использовать в составе проекта декодера ADPCM. Ниже показано оформление такого массива данных. Жирным шрифтом показаны строки, которые надо добавить (hex-данные приведены только для примера):
Обратите внимание, что кодер командной строки генерирует выходные файлы с HEX-данными, причем последний символ запятая. Убедитесь, что в C-файле вы эту запятую удалили, потому что массив не должен заканчиваться на запятую.
Сохраните файл под именем data.c и сделайте его копию в каталоге исходного кода проекта декодера ADPCM. И наконец подсчитайте количество элементов в массиве, и используйте это число для конфигурирования параметра INPUTSIZE в файле adpcm.h (см. секцию "Пример реализации"). Каждая полная строка массива содержит 8 элементов, так что для расчета длины массива надо узнать количество строк. Чтобы быстро подсчитать общее количество строк в массиве, используйте редактор простого текста, который нумерует строки при редактировании. Переместитесь в редакторе от первой строки до последней, узнайте их номера, и по ним определите количество строк.
Также вместе с апноутом поставляется маленькое приложение C-IZER. Оно выполняет все необходимые вышеописанные операции для создания стандартного файла на языке C из текстового файла, который генерится кодировщиком ENCODE. Приложение также возвращает значение для параметра INPUTSIZE.
10.2. Использование WAV-файлов.
WAV [6] является звуковым форматом, разработанным компанией Microsoft®, и этот формат широко используется в Microsoft Windows®. Доступны различные инструменты для преобразования форматов, чтобы другие системы могли проигрывать WAV-файлы. Кодировщик из этого апноута можно использовать для конвертации WAV-файлов в записи ADPCM, которые может воспроизвести декодер на целевом AVR.
Чтобы WAV-файлы могли быть обработаны кодировщиком ADPCM, файлы должны быть сохранены в формате 16 бит PCM моно. Установки по умолчанию декодера относятся к частоте дискретизации (sampling frequency) 7.8 кГц.
WAV-файлы включают в себя заголовок, который кодировщик ADPCM не отличает от данных звука. Это значит, что выходной файл может начаться с некоторого количества байт, которые на самом деле относятся к закодированному заголовку, поскольку он был обработан как звук. Поэтому перед обработкой кодировщиком нужно просто удалить из входного WAV-файла двоичные данные заголовка (программой наподобие WinHex).
10.3. Перекомпиляция утилиты кодировщика Encoder
Для того, чтобы кодировщик можно было использовать на других платформах, кроме Windows® PC, его нужно перекомпилировать для той операционной системы, где его предполагается использовать. Вместе с этим апноутом также поставляются и исходные коды кодировщика.