Программный аудиокодек для STM8S Печать
Добавил(а) microsin   

В этой статье (перевод апноута [1]) описывается простое для реализации решение, помогающее реализовать вывод звука в таких встраиваемых устройствах как игрушки, стиральные машины, дверные звонки и т. п.

Аудиоданные обычно требуют для своего хранения некоторого объема памяти. Объем необходимой для этого памяти может быть уменьшен путем сжатия данных звука определенным образом. Обработка таких сжатых данных довольно ресурсоемкая задача, которая требует применения мощных микроконтроллеров, таких как DSP, или применения специализированных чипов. Обычно 8-битные микроконтроллеры не обладают ни достаточным объемом памяти, ни достаточной вычислительной мощностью.

Программное решение, предоставленное в этом описании, воссоздает звуковые сигналы из компрессированных аудиоданных. Используется простой аудиокодек, основанный на алгоритме адаптивной дифференциальной модуляции импульса (adaptive differential pulse coded modulation, ADPCM). Также используются преимущества усовершенствованного ядра STM8S с его 3-ступенчатым конвейером и пиковой производительностью 16 или 24 MIPS.

Цифровые выборки обычно преобразуются в аналоговый сигнал с помощью некоторого внешнего ЦАП (digital-to-analog converter, DAC). Существуют приложения, в которых нет приоритета для высококачественного вывода звука, чтобы нужно было применять внешний DAC, и более важно снизить общую стоимость решения с использованием 8-битных микроконтроллеров. Для снижения стоимости и предоставления звука хорошего качества идеальным решением будет генерация звука на ШИМ (pulse-width modulation, PWM).

Примечание: вместе с апноутом [1] предоставляется пример кода firmware [2], который можно легко портировать в конечное приложение.

[ADPCM]

Adaptive differential pulse coded modulation (ADPCM) это аудиокодек с фиксированной длиной кодового слова, который уменьшает избыточную информацию в звуковых сигналах. Формирование выходных выборок использует отслеживание взаимосвязи между соседними выборками звука, с кодированием разности между текущей выборкой и предсказанной. Поскольку похожесть соседних выборок обычно велика, этот метод сжатия довольно эффективен, и сохраняет хорошее качество звука. Кодек The ADPCM, основанный на кодировании сигналов в домене времени, гораздо менее сложен, чем кодеки, основанные на восприятии голоса (вокодеры), которые работают в домене частот. По этой причине кодек ADPCM это лучший выбор для вывода звука 8-битными микроконтроллерами.

Алгоритм ADPCM был разработан для кодирования речи. Он используется в телефонных системах наподобие ITU-T G.726 (охватывающих стандарты CCITT G.721 и G.723). G.726 и подобные телекоммуникационные кодеки предоставляют продвинутые функции, необходимые для успешной передачи и организации потока аудиоданных. Эти функции включают синхронную подстройку кодирования, детектирование тона для переноса данных сигналами модема, адаптивное управление скоростью, восстановление из ситуаций ошибок при передаче. Эти функции добавляют сложности в алгоритме, которые требуют либо мощностей процессора DSP, либо понижение частоты выборок при кодировании/декодировании. К счастью, эти функции не требуются в случае вывода микроконтроллером звуковых сигналов, и можно найти менее сложные альтернативы.

IMA ADPCM. Кодек Interactive multimedia association (IMA) ADPCM как раз является таким альтернативным решением. Оно широко используется различными компьютерными платформами, например в Microsoft® Sound Recorder или Apple® QuickTime®. Изначально этот кодек был предоставлен Intel/DVI® как открытый стандарт для использованием ассоциацией IMA. Эталонные алгоритмы и рекомендованные форматы изначально были разработаны группой digital audio technical working group (DATWG), и были улучшены группой digital audio focus group (DAFG) IMA. Эти группы больше неактивны.

Алгоритм IMA DATWG менее сложен в сравнении с алгоритмом G.726. Количество операций CPU для кодирования/декодирования уменьшено за счет использования фиксированного прогнозирования и замены справочными таблицами сложных математических операций с плавающей запятой. Реализация кодека ADPCM, представленная в этом апноуте, совместима с изначальным алгоритмом IMA, опубликованным ассоциацией IMA DATWG/DAFG "Recommended Practices for Enhancing Digital Audio Compatibility in Multimedia Systems" ревизии 3.00 (см. IMA_ADPCM.pdf в архиве [10]).

[Декомпрессия IMA ADPCM]

Алгоритм IMA ADPCM распаковывает выборки звука, которые сохранены как 4-битные значения со знаком в формате двоичного дополнения (signed two’s complement values). Результат - 16-битные декомпрессированные целочисленные выборки в формате чисел со знаком с двоичным дополнением.

Входная выборка (Sq) деквантуется с помощью обратного квантователя с адаптированным шагом (q), чтобы получить разность между предыдущим и следующим значением (Sd). Для снижения ошибок квантования к Sd добавляется половина размера шага. Полученная декомпрессированная линейная выборка это сумма Sd и предсказанной выборки (Sp). Поскольку Sp это простая функция удержания нулевого порядка, значение Sd просто добавляется к предыдущему выходному значению. Размер шага адаптируется в соответствии с Sq. Предварительные условия для декодера - очистка Sp и установка минимального шага квантования.

AN3143ADPCM decoder fig01

Рис. 1. Декодер ADPCM.

[Компрессия IMA ADPCM]

Алгоритм компрессии IMA ADPCM вычисляет разницу (d) между 16-битными линейными выборками со знаком (Sin) и предсказанной линейной выборкой (SL). Эта разница квантуется в 4-битное сжатое выходное значение (Sq) на шаге адаптивного квантования (q). Этот шаг такой же, как в декодере. На рис. 2 показан алгоритм кодера ADPCM. Это также показывает блоки построения декодера с функционалом, описанном в секции "Декомпрессия IMA ADPCM". Поскольку кодер содержит блоки, идентичные декодеру, и выдает идентичные результаты, то нет необходимости хранить информацию прогнозирования. Квантованная разность это единственная основная информация о кодированных выборках, которая должна быть сохранена или передана.

AN3143ADPCM encoder fig02

Рис. 2. Кодер ADPCM.

[Кодирование и сохранение аудиоданных]

Кодек IMA ADPCM довольно популярен на платформах PC, и существует широкий ассортимент программ с разными возможностями для обработки и кодирования звуковых данных. Существует проблема кодировки файлового хранилища битового потока ADPCM, потому что не не стандартизован в [3]. На 8-битных микроконтроллерах предпочтительнее использовать сырые данные без какого-либо форматирования, чтобы обеспечить самый простой способ манипуляции данными звукового файла.

На платформе Microsoft Windows® часто используется контейнер данных WAVEform (WAV) для хранения линейных данных PCM [4]. WAV также может использоваться для сохранения аудиоданных IMA ADPCM. Чтобы использовать WAV для хранения битового потока звука, в микроконтроллере должен быть реализован соответствующий парсер формата. Это необходимо для распаковки сырых данных, которые потом должны подвергнуться декомпрессии. Парсер WAV увеличивает сложность и размер приложения, и не дает для 8-битной системы значительных преимуществ.

К счастью, есть программное обеспечение, которое может сохранить сжатый аудиопоток напрямую в сырые данные, без добавления формата, и парсер тогда становится ненужным. Например, существует утилита командной строки Sound eXchange (SOX) [5] позволяет манипулировать аудиоданными, и она распространяется по свободной лицензии (GNU). SOX может следующее:

● Пересобрать входные аудиоданные на любую целевую частоту выборок (ресемплинг).
● Закодировать эти данные в формат IMA ADPCM.
● Сохранить выходной битовый поток как неформатированные сырые данные (без заголовка).

Ниже показан пример команды для выполнения следующих действий:

● Целевая частота выборок 15625 Гц.
● Уменьшение громкости на -12 dB.
● Компрессия данных кодеком IMA ADPCM.

sox inputfilename -r 15625 outputfilename.ima gain -12

На входе могут использоваться данные самых разных форматов, включая PCM WAV, MP3, MP4, OGG, FLAC, и многие другие. Подробности см. в документации SOX [5].

[Использование внутренней FLASH для аудиоданных]

Внутренняя память FLASH микроконтроллера STM8S может использоваться для хранения небольших дампов аудиоданных. При сжатии IMA ADPCM одна 16-битная выборка PCM займет половину байта. Требования к объему памяти можно вычислить по формуле:

Memory (байт) = samplerate × length ⁄ 2

Здесь samplerate это частота выборок в Гц или частота дискретизации (количество выборок в секунду), а length это длительность звука в секундах. Например, поток бит звука 5 секунд ADPCM с частотой дискретизации 8 кГц займет 20 килобайт памяти.

Аудиоданные могут быть сохранены во внутреннюю память с помощью программатора или загрузчика (технология "in-application programming", IAP). Дополнительную информацию см. в апноуте AN2659 "STM8S in-application programming (IAP) using a customized bootloader" [6] и в UM0560 "STM8L/S bootloader" [7].

Другой способ сохранить аудиоданные во внутреннюю память FLASH - прикрепить массивы аудиоданных к компилируемому коду. Чтобы включить сырые данные в проект, их двоичное представление нужно преобразовать в текст ASCII (заголовок или исходный код языка C). Продвинутый HEX-редактор может выполнить такое преобразование, чтобы полученный текстовый файл мог прочитать компилятор ANSI C. Например, есть простой в использовании редактор HxD hexa [8], который распространяется по свободной лицензии и не имеет ограничений для коммерческого использования.

Для обработки аудиоданных, которые надо включить в проект, загрузите двоичные данные в редактор и экспортируйте их как исходный код C.

AN3143Hexa editor export to C source code fig03

Рис. 3. Редактор Hexa экспортирует исходный код C.

Эта операция сгенерирует исходный файл C, где находится один массив:

unsigned char rawData[10340] = { ...

Декларация массива должна быть модифицирована директивами компилятора в массив констант, находящийся в памяти программ. Для компилятора COSMIC это делается так:

const @far unsigned char rawData[10340] = { ...

Для компилятора Raisonance используется следующая директива:

fcode unsigned char rawData[10340] = { ...

[Использование внешней памяти для аудиоданных]

Для сохранения аудиоданных можно использовать карту micro SD. Также можно использовать другую внешнюю память с интерфейсом, который поддерживает STM8S.

Если карта отформатирована в системе File Allocation Table (FAT), то firmware микроконтроллера также должно поддерживать FAT. К сожалению, реализация FAT на 8-битном микроконтроллере требует слишком много ресурсов, и объем памяти программы получается слишком большим для недорогих приложений на микроконтроллере. Кроме того, обычно файловая система на карте не нужна, потому что часто содержимое карты нужно изменить только один раз. Более удобный способ поместить аудиоданные на карту SD состоит в том, чтобы использовать специальное ПО, в котором встроенный драйвер реализует прямой доступ к карте, без поддержки файловой системы.

HEX-редактор с такой функцией прямого доступа может использоваться для модификации содержимого неформатированной карты SD. Один из таких проверенных редакторов это все тот же Hxd от Maël Hörz (см. [8]). В нем есть встроенная функция модификации содержимого диска напрямую.

Когда сжатые данные ADPCM записана на карту SD, крд firmware микроконтроллера сможет их прочитать сектор за сектором. У стандартной карты SD размер сектора фиксированный и составляет 512 байт.

[Обзор аппаратуры вывода звука STM8S]

У микроконтроллера STM8S есть 16-битный таймер с функцией ШИМ (PWM), при этом ШИМ может работать в режиме центрального выравнивания импульсов (center aligned mode). Для формирования аналогового звука понадобится только несколько внешних компонентов. Это может быть простой интегрирующий RC-фильтр низких частот, который уменьшит на выходе шум составляющих спектра основной частоты ШИМ (см. рис. 4).

AN3143single PWM output fig04

Рис. 4. Вывод звука на основе одного канала PWM.

Частота среза ФНЧ должна быть близка к половине частоты дискретизации (fsampling). В примере кода [2] использовалась частота PWM в 4 раза выше частоты дискретизации. Это необходимо для сохранения достаточного запаса по частоте, чтобы было проще вырезать высокочастотный шум. Чем выше подавление фильтром ненужных частот (чем круче спад характеристики ФНЧ), тем ниже шум на выходе и как следствие выше разрешающая способность цифро-аналогового преобразования с помощью ШИМ (PWM).

Достижимая разрешающая способность (N) сигнала PWM зависит от частоты PWM (fPWM) и тактовой частоты внутреннего системного генератора 16 МГц (high-speed internal oscillator, fHSI). Эта зависимость отражена в следующей формуле:

          fHSI
2N = ----------------
       4 x fsampling

По этой формуле, если у нас частота выборок 15625 Гц и системная тактовая частота 16 МГц, то можно достичь только 8-битной разрешающей способности. Таким образом, младший байт наших 16-битных выборок звука придется отбросить. Иногда это допустимо, но не всегда, потому что в динамиках высокого качества будет хорошо слышны шумы ошибок квантования.

Чтобы избежать такого снижения качества, используется второй канал для генерации сигнала от младшего байта выборки. Например, PWM1 генерирует сигнал старшего байта, PWM2 младшего байта выборки. Сигналы двух каналов PWM1 и PWM2 перемножаются с походящим весовым фактором 1/2N. Теоретически таким способом можно достичь 16-разрядной разрешающей способности. Этот принцип ЦАП на двух каналах PWM показан на рис. 5.

AN3143dual PWM output fig05

Рис. 5. Вывод звука на двух каналах PWM.

Самый простой ФНЧ - RC фильтр. Он присутствует на отладочной плате STM8/128-EVAL. Схему отладочной платы можно найти в руководстве UM0482 [9].

[Ссылки]

1. AN3143 Audio software codec for the STM8S site:st.com.
2. en.stsw-stm8045.zip site:st.com.
3. IMA Digital Audio Focus and Technical Working Group, Recommended Practices for Enhancing Digital Audio Compatibility in Multimedia Systems, revision 3.00, October 21, 1992.
4. Wave File Format - формат звукового файла WAV.
5. SoX Sound eXchange HomePage site:sox.sourceforge.net.
6. AN2659 STM8S in-application programming (IAP) using a customized bootloader site:st.com.
7. UM0560 STM8L/S bootloader site:st.com.
8. HxD fast free hex editor site:mh-nexus.de.
9. UM0482 STM8/128-EVAL evaluation board site:st.com.
10. 220916AN3143doc.zip - документация, утилиты HxD, SOX.