https://github.com/agushaos/wha
Репозиторий проекта WHA
https://github.com/agushaos/wha
audio audiocodec dsp wavelet
Last synced: 9 days ago
JSON representation
Репозиторий проекта WHA
- Host: GitHub
- URL: https://github.com/agushaos/wha
- Owner: AgushaOS
- License: mpl-2.0
- Created: 2026-05-21T13:44:05.000Z (about 1 month ago)
- Default Branch: main
- Last Pushed: 2026-06-17T20:00:09.000Z (9 days ago)
- Last Synced: 2026-06-17T22:00:12.010Z (9 days ago)
- Topics: audio, audiocodec, dsp, wavelet
- Language: C
- Homepage:
- Size: 249 KB
- Stars: 1
- Watchers: 0
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
Awesome Lists containing this project
README
# Wavelet Hierarchical Audio
WHA (Wavelet Hierarchical Audio, Вейвлет-иерархическое Аудио) -- это низколатентный высокопроизводительный кадровый аудиокодек, основанный на вейвлет-пакетном разложении сигнала.
## Характеристики кодека
- Алгоритмическая задержка: ~22 мс на блок
- Скорость кодирования превышает MP3 LIB3LAME в ~5.3 раза, AAC-LC в ~5.3 раз, Opus в ~4 раза
- Скорость декодирования сравнима с MP3
- Прозрачное качество достигается на битрейтах 160 - 192 кбит/с для большинства треков
- Перекрытие между блоками: ~4.56%
- Поддержка: 44.1 кГц, 88.2 кГц
- Плавное затухание частот выше 16 кГц с сохранением формы спектра
- Стерео, моно
- Работает в режиме CVBR
## Описание алгоритма
В аудиокодеке используется вейвлет-пакетное разложение (WPT), вместо модифицированного косинусного преобразования (MDCT).
Также вместо фильтр-банки используется лифтинг схема с длиной предсказания и обновления 6 и 4 точки соответственно, что позволяет достичь быстрого разложения сигнала на субполосы.
После упорядочивания по Грэй-коду (Gray-code) и степенного сжатия (power-law), происходит кодирование совместного стерео (Joint Stereo), где для каждой пары субполос из разных каналов выбирается LR/MS/IS.
В качестве психоакустики была использована система приоритетно-перцептивного взвешивания энергии субполосы, что позволяет достаточно точно и быстро распределять биты.
Шаг квантования на субполосу определяется из количества выданных ей битов, что позволяет почти всегда упаковывать блок в выданный бит-бюджет.
На уже квантованные значения применяется декорреляционная и энтропийная системы. Для первых 2-х субполос подбираются наилучшие фиксированными LPC предикторы, для оставшихся они по умолчанию берутся равные 0.
В качестве энтропийного кодировщика используются райс-коды (Rice code) с адаптивным k на субполосу.
Система бит-резервуара между блоками устроена по принципу "выигрыш с предыдущего переместить на нынешний" с ограничителем в не более 20% от заданного бит-бюджета.
В качестве пост-обработки используется TPDF дизеринг для субполос, имеющих бит на сэмпл меньшее либо равное 3.
## Сохранение ВЧ (частот > 16 кГц)
Благодаря неидеальной частотной локализации фильтров и перекрытию субполос, что в АЧХ вейвлета направлены с ВЧ->НЧ/СЧ, высокочастотная энергия частично распределяется в соседние низшие диапазоны.
Это позволяет сохранять форму спектра и временную структуру сигнала в высокочастотной области, обеспечивая более плавное затухание высоких частот вместо жёсткого обрезания (brick-wall), характерного для традиционных кодеков, даже при частичном подавлении или низком битрейте.
Диапазон сохранения энергии ВЧ:
- на 192 кбит/с: 25% - 97%
- на 160 кбит/с: 23% - 74%
- на 128 кбит/с: 20% - 60%
## Перцептивная модель
Кодек оптимизирован на сохранение:
- спектральной огибающей сигнала
- транзиентной структуры
- высокочастотной текстуры без резких cutoff-артефактов
- быстрое сжатие с хорошим качеством
## Обработка транзиентов и артефакты пост/пре эха
Благодаря вейвлет-пакетному разложению (WPT), транзиенты локализируются естественным образом внутри временно-частотных субполос, без необходимости отдельных детекций.
Артефакты пост-эха и пре-эха не были зафиксированы на тестовых сигналах с резкими атаками (включая хлопки).
## Межблочная устойчивость
Для декодирования текущего блока требуется только небольшая часть данных предыдущего блока (~4.56%), используемая для коррекции граничных эффектов при восстановлении сигнала.
Основная часть блока декодируется независимо, что позволяет выполнять потоковое воспроизведение с низкой алгоритмической задержкой (~22 мс) и минимальным буфером (не более одного блока).
Такая схема обеспечивает локальную межблочную связность без полной зависимости от предыдущих блоков, что ограничивает распространение ошибок и сохраняет стабильность декодирования при частичной потере данных.
## Устойчивость к потере данных
Потеря отдельных блоков локализуется в пределах текущего фрейма и не приводит к распространению ошибки на последующие блоки.
## Масштабируемость
Кодек поддерживает работу с произвольным целевым битрейтом, задаваемым при инициализации, начиная от 48 кбит/с.
Поддерживаемые частоты дискретизации: 44.1 кГц и 88.2 кГц.
## Поведение при снижении битрейта
При снижении битрейта качество деградирует постепенно без резких пороговых артефактов.
Основной характер искажений:
- ослабление высокочастотной энергии
- упрощение шумовой составляющей
- сохранение временной структуры сигнала
- сохранение транзиентной структуры сигнала
- возможное искажение чистых синусоидальных сигналов
## Известные артефакты
При экстремально низких битрейтах (ниже 128 кбит/с) могут наблюдаться:
- упрощение шумовой текстуры
- частичная потеря высокочастотной детализации
- смазывание инструментов
## Ограничения
Кодек плохо справляется с битрейтами ниже 128 кбит/с для стерео аудио файла, а также наблюдается снижение эффективности при работе с частотой дискретизации равной 48 кГц.
## Асимптотика алгоритма
Благодаря неглубокому вейвлет-пакетному разложению (WPT) асимптотика алгоритма в пределах O(N).
Сложность кодирования и декодирования линейно зависит от количество сэмплов в сигнале, без итеративных этапов оптимизации.
# Результаты ABX тестирований
Результаты ABX тестирования проводились используя наушники DT770-Pro 32 Ohm и плеер FiiO JM21 на тихой и средней громкостях.
Участвовало 5 человек возрастом от 16 до 17 лет, в числе которых были 2 музыканта.
Была использована 5 балльная шкала:
- 1 -- ужасный результат
- 2 -- плохой результат
- 3 -- терпимый результат
- 4 -- нормальный результат
- 4+ -- хороший результат
- 5- -- почти прозрачный результат
- 5 -- прозрачный результат
Результаты тестирований:
- 192 кбит/с: 5- (1 человек) и 5 (4 человека). Прозрачно для большинства треков (5) и почти-прозрачно для крайних случаев (5-)
- 160 кбит/с: 5- (2 человека) и 5 (3 человека). Прозрачно для большинства треков (5) и почти-прозрачно для крайних случаев и сложной стерео сцены (5-)
- 128 кбит/с: 4+ (3 человека) и 5- (2 человека). Хорошее (4+) или почти прозрачное (5-) качество для большинства треков
Примечание: результаты представляют собой неформальную ABX-оценку и не соответствуют стандартизированному тестированию ITU-R BS.1116.
# Как запускать кодек
В файлах есть скрипт setup.sh -- он отвечает за компилирование кодека, его бинарника кодирования (code) и его бинарника декодирования (decode). И
нтерфейсы функций следующие:
- ./code "example.wav" [bitrate] (на выходе файл фПормата .wha)
- ./decode "example.wha" "output.wav"