WHA (Wavelet Hierarchical Audio, Вейвлет-иерархическое Аудио) -- это высокопроизводительный перцептивный аудиокодек, основанный на вейвлет-пакетном разложении сигнала.
- Алгоритмическая задержка: ~22-44 мс на блок
- Скорость кодирования превышает MP3 LIB3LAME в ~5.3 раза, AAC-LC в ~5.3 раз, Opus в ~4 раза
- Скорость декодирования сравнима с MP3 на 128 кбит/с, сравнима с Opus на <128 кбит/с
- Прозрачное качество достигается на битрейтах 160 - 192 кбит/с для большинства треков по PEAQ.
- Полупрозрачное/почтипрозрачное качество достигается на битрейтах 96-128 кбит/с
- Слушабельное/нормальное качество достигается на 64 кбит/с
- Перекрытие между блоками: ~4.56-9.12%
- Поддержка: 44.1 кГц и 22.05 кГц
- Плавное затухание частот выше 16 кГц с сохранением формы спектра на низких битрейтах, вместо стандартного lowpass
- Стерео, моно
- Работает в режиме ABR
- Сравним с Vorbis по gstPEAQ и ViSQOL на 128 кбит/с
- Превышает Vorbis по gstPEAQ и ViSQOL на <128 кбит/с
В аудиокодеке используется вейвлет-пакетное разложение (WPT), вместо модифицированного косинусного преобразования (MDCT).
Также вместо фильтр-банки используется лифтинг схема с длиной предсказания и обновления 16 и 6 точки соответственно, что позволяет достичь быстрого разложения сигнала на субполосы с достаточно хорошими частотными характеристиками.
После упорядочивания по Грэй-коду (Gray-code), происходит кодирование совместного стерео (Joint Stereo), где для каждой пары субполос из разных каналов выбирается LR/MS/IS.
В качестве психоакустики была использована система приоритетно-перцептивного взвешивания энергии субполосы, что позволяет достаточно точно и быстро распределять биты.
Шаг квантования на субполосу определяется из количества выданных ей битов, что позволяет почти всегда упаковывать блок в выданный бит-бюджет.
На уже квантованные значения применяется декорреляционная и энтропийная системы.
В качестве энтропийного кодировщика используются райс-коды (Rice code) с адаптивным k на субполосу.
Система бит-резервуара между блоками устроена по принципу "выигрыш с предыдущего переместить на нынешний" с ограничителем в не более 20% от заданного бит-бюджета.
Активно используется адаптивная система Intensity Stereo на битрейтах 64-192 кбит/с
Активно используется система WSC (Wavelet Subband Completion) для всех битрейтов для заполнения пропущенных полос.
В качестве пост-обработки используется дизеринг на битрейты <=192 кбит/с и гармоническое шумоподавление на битрейты <=96 кбит/с через FFT.
Благодаря неидеальной частотной локализации фильтров и перекрытию субполос, что в АЧХ вейвлета направлены с ВЧ->НЧ/СЧ, высокочастотная энергия частично распределяется в соседние низшие диапазоны.
Это позволяет сохранять форму спектра и временную структуру сигнала в высокочастотной области, обеспечивая более плавное затухание высоких частот вместо жёсткого обрезания (brick-wall), характерного для традиционных кодеков, даже при частичном подавлении или низком битрейте.
Диапазон сохранения энергии ВЧ (вплоть до 22.05 кГц):
- на 192 кбит/с: 25% - 97%
- на 160 кбит/с: 23% - 94%
- на 128 кбит/с: 20% - 80%
Кодек оптимизирован на сохранение:
- спектральной огибающей сигнала
- транзиентной структуры
- высокочастотной текстуры без резких cutoff-артефактов
- быстрое сжатие с хорошим качеством
Благодаря вейвлет-пакетному разложению (WPT), транзиенты локализируются естественным образом внутри временно-частотных субполос, без необходимости отдельных детекций.
Артефакты пост-эха и пре-эха не были зафиксированы на тестовых сигналах с резкими атаками (включая стерео хлопки).
Для декодирования текущего блока требуется только небольшая часть данных предыдущего блока (~4.56-9.12%), используемая для коррекции граничных эффектов при восстановлении сигнала.
Основная часть блока декодируется независимо, что позволяет выполнять потоковое воспроизведение с низкой алгоритмической задержкой (~44 мс) и минимальным буфером (не более одного блока).
Имеется состояние для предсказания шага квантования, но оно опционально и его можно выключить.
Потеря отдельных блоков локализуется в пределах текущего фрейма и не приводит к распространению ошибки на последующие блоки, если знать при передаче когда стоит разорвать состояние в шагах квантования.
Кодек поддерживает работу с произвольным целевым битрейтом, задаваемым при инициализации, начиная от 48 кбит/с.
Поддерживаемые частоты дискретизации: 44.1 кГц, 22.05 кГц
При снижении битрейта качество деградирует постепенно без резких пороговых артефактов.
Основной характер искажений:
- ослабление высокочастотной энергии
- упрощение шумовой составляющей
- сохранение временной структуры сигнала
- сохранение транзиентной структуры сигнала
- возможное искажение чистых синусоидальных сигналов
При экстремально низких битрейтах (ниже 128 кбит/с) могут наблюдаться:
- упрощение шумовой текстуры
- частичная потеря высокочастотной детализации
- смазывание инструментов
Кодек плохо справляется с битрейтами ниже 128 кбит/с для стерео аудио файла, а также наблюдается снижение эффективности при работе с частотой дискретизации равной 48 кГц.
Благодаря неглубокому вейвлет-пакетному разложению (WPT) асимптотика алгоритма в пределах O(N).
Сложность кодирования и декодирования линейно зависит от количество сэмплов в сигнале, без итеративных этапов оптимизации.
Результаты MOS тестирования проводились используя наушники DT770-Pro 32 Ohm и плеер FiiO JM21 на тихой и средней громкостях.
Участвовало 5 человек возрастом от 16 до 17 лет, в числе которых были 2 музыканта.
Была использована 5 балльная шкала MOS: Результаты тестирований:
- 192 кбит/с: 4.6 (1 человек) и 5 (4 человека).
- 160 кбит/с: 4.6 (2 человека) и 5 (3 человека).
- 128 кбит/с: 4.3 (1 человек) и 4.6 (4 человека).
- 96 кбит/с: 4 (2 человека) и 4.3 (3 человека).
- 64 кбит/с: 3.5 (2 человека) и 4.2 (3 человека).
Примечание: результаты представляют собой неформальную MOS-оценку и не соответствуют стандартизированному тестированию.
В файлах есть скрипт setup.sh -- он отвечает за компилирование кодека, его бинарника кодирования (code) и его бинарника декодирования (decode). И
нтерфейсы функций следующие:
- ./code "example.wav" [bitrate] (на выходе файл формата .wha)
- ./decode "example.wha" "output.wav"