Этот пример показывает, как реализовать декодер Vorbis, который является бесплатной, открытой альтернативой MP3 стандарту. Этот формат декодирования аудио поддерживает сегментацию закодированных данных в небольшие пакеты для сетевой передачи.
Формат кодирования Vorbis [1] представляет собой алгоритм сжатия звука с потерями с открытым исходным кодом, подобный MPEG-1 Audio Layer 3, более известному как MP3. Vorbis обладает многими из тех же функций, что и MP3, в то же время добавляя гибкость и функциональность. Спецификация Vorbis задает только формат битового потока и алгоритма декодирования. Это позволяет разработчикам улучшать алгоритм кодирования с течением времени и оставаться совместимым с существующими декодерами.
Кодирование начинается с разделения исходного сигнала на перекрываемые системы координат. Vorbis позволяет системы координат различной длины, так что он может эффективно обрабатывать стационарные и переходные сигналы. Каждая система координат умножается на окно и преобразуется с помощью модифицированного дискретного косинусоидного преобразования (mdct
). Системы координат затем разделяются на грубое приближение, называемую полом, и оставшуюся часть, называемую остатком.
Гибкость формата Ворбиса проиллюстрирована его использованием различных методов для представления и кодирования фрагментов сигнала пола и остатков. Алгоритм представляет режимы как механизм, чтобы задать эти различные методы и, таким образом, кодировать различные системы координат по-разному.
Ворбис использует кодирование Хаффмана, чтобы сжать данные, содержащиеся в фрагментах пола и остатков. Ворбис использует динамическую модель вероятностей, а не статическую модель MP3. В частности, Vorbis создает пользовательские кодовые книги для аудиосигналов, которые могут отличаться для 'floor' и 'restue' и от системы координат к системе координат.
После завершения кодирования Хаффмана данные системы координат упаковываются в логический пакет. В Vorbis серии таких пакетов всегда предшествует заголовок. Заголовок содержит всю информацию, необходимую для правильного декодирования. Эта информация включает полный набор кодовых книг, описание способов представления пола и остатка, а также режимы и отображения для многоканальной поддержки. Заголовок может также включать в себя общую информацию, такую как скорости передачи битов, частоты дискретизации, имена песен и исполнителей и т.д.
Vorbis предоставляет свой собственный формат, известный как 'Ogg', чтобы инкапсулировать логические пакеты в транспортные потоки. Формат Ogg предоставляет такие механизмы, как кадрирование, синхронизация, позиционирование и коррекция ошибок, которые необходимы для передачи данных по сетям.
Декодер Vorbis в этом примере реализует спецификации формата Vorbis I, который является подмножеством Vorbis. Модель примера декодирует любой необработанный двоичный OGG файл, содержащий моно или стерео аудиосигнал. Пример модели имеет возможность декодировать и воспроизводить большое разнообразие аудио файлов Vorbis в реальном времени.
Можно протестировать этот пример с любыми аудио файла Vorbis, или с включенными handel
файл. Чтобы загрузить файл в модель, замените имя файла в аннотированном коде на верхнем уровне модели на имя файла, который вы хотите протестировать. Когда этот шаг будет завершен, щелкните аннотированный код, чтобы загрузить новый аудио файла. Модель сконфигурирована, чтобы уведомить вас, если выход частота дискретизации была изменяем из-за изменения входных данных. В этом случае симуляция должна быть перезапущена с новой частотой дискретизации.
Для реализации декодера Vorbis в Simulink ® необходимо обратиться к пакетам данных переменного размера. Этот пример обращается к пакетам переменного размера путем захвата целой страницы битового потока Ogg с использованием шаблона синхронизации OggS. Для практических целей страница принята размером не более 5500 байт. После получения таблицы сегментации в начале страницы модель извлекает логические пакеты из оставшейся части страницы. Асинхронное управление последовательностью декодирования реализуют с помощью диаграммы Stateflow 'Decode All Pages of Data'.
Первоначально график пытается обнаружить шаблон синхронизации 'OggS', а затем следовать этапам декодирования, описанным выше. Декодирование страницы выполняется функцией Simulink 'decodePage', и затем модель немедленно возвращается к обнаружению следующей последовательности 'OggS'. Состояние 'ResetPageCounter' добавляется параллельно с алгоритмом Stateflow, описанным выше, чтобы поддерживать закольцовывание сжатого входного файла для неограниченного количества итераций.
Страницы данных содержат различные типы информации: заголовок, кодовые книги и данные аудиосигнала. Подсистемы 'Read Setup Info', 'Read the Header' и 'Decode Audio' внутри функции 'decodePage' Simulink отвечают за обработку каждого из этих различных видов информации.
Процесс декодирования реализован с использованием Блоков MATLAB function. Большинство стандартных программ битовой распаковки в примере реализованы с кодом MATLAB.
Рекомбинирование пола и остатка и последующий обратный MDCT (IMDCT) также реализованы с блоком MATLAB Function, который использует быстрый imdct
функция Audio Toolbox. Длины переменной системы координат учитываются с помощью системы координат максимальной длины фиксированного размера на входе и выходе блока Function и при помощи параметра window length в коде Function и блоке Selector сразу после блока Function.
IMDCT преобразует системы координат назад в временной интервал, готовый к умножению на окно синтеза и затем объединенный с операцией добавления перекрытия.
Блок выход на верхнем уровне модели подает выход блока декодирования на устройство воспроизведения аудио в вашей системе. Допустимый фрагмент декодированного сигнала вводится в блок Аудио устройства Средства записи.
[1] Полная спецификация стандартного https://xiph.org/vorbis/doc/Vorbis_I_spec.html декодера Vorbis