Форматы сжатия звука: AIFF, FLAC и MP3

Почему FLAC после распаковки возвращает те же отсчёты, а MP3 — другие, и сколько места экономит каждый способ?

Опубликовано Дополнено 22 мин чтения

В треках:Программист, этап 4Звукорежиссёр, этап 5Диджей, этап 4Меломан, этап 4

Минута стереозаписи с параметрами компакт-диска занимает в WAV (WAVE file)WAV-файл (WAVE file) — Звуковой файл со структурой RIFF и типом формы WAVE. Чанк fmt описывает параметры звука, чанк data содержит отсчёты; обычно это несжатый PCM. около 10,6 млн байт. Во FLAC (Free Lossless Audio Codec)FLAC (Free Lossless Audio Codec) — Формат сжатия звука без потерь: блоки PCM кодируются предсказанием по предыдущим отсчётам и остатком в кодах Райса. Описан в RFC 9639. та же минута обычно занимает чуть больше половины этого объёма, а в MP3 (MPEG-1/2 Audio Layer III)MP3 (MPEG-1/2 Audio Layer III) — Формат сжатия звука с потерями: гибридный банк фильтров, психоакустическая модель, неравномерное квантование и коды Хаффмана в кадрах по 1152 отсчёта. с битрейтом (bit rate)битрейт (bit rate) — Число бит на секунду звучания. У несжатого PCM равен произведению частоты дискретизации, разрядности и числа каналов: для CD 1 411 200 бит/с. 128 кбит/с — 0,96 млн байт, в 11 раз меньше. За этими числами стоят два разных подхода. FLAC убирает предсказуемую часть данных и после распаковки возвращает те же числа. MP3 отбрасывает то, что по модели слуха не будет услышано, и возвращает другие числа, близкие на слух.

AIFF (Audio Interchange File Format)AIFF (Audio Interchange File Format) — Формат звукового файла Apple на основе контейнера IFF: чанки COMM с параметрами и SSND с отсчётами PCM, числа записаны старшим байтом вперёд. хранит те же отсчёты (sample)отсчёт (sample) — Значение сигнала в один момент дискретизации, одно число. В звукозаписи его также называют сэмплом. PCM (pulse-code modulation, PCM)импульсно-кодовая модуляция (pulse-code modulation, PCM) — Представление сигнала последовательностью квантованных отсчётов, взятых через равные промежутки времени. В WAV код формата 1 означает PCM с целыми отсчётами., что и WAV, без сжатия, поэтому с него удобно начать сравнение. После него разобраны FLAC и MP3, включая то, как MP3 опирается на психоакустику (psychoacoustics)психоакустика (psychoacoustics) — Раздел науки о связи физических свойств звука с тем, что слышит человек: громкостью, высотой, направлением и слышимостью одних звуков на фоне других.; AAC, Opus и ALAC сведены в итоговую таблицу.

Битрейт и два способа сжатия

Битрейтбитрейт (bit rate) — Число бит на секунду звучания. У несжатого PCM равен произведению частоты дискретизации, разрядности и числа каналов: для CD 1 411 200 бит/с. — число бит на секунду звучания. У несжатого PCMимпульсно-кодовая модуляция (pulse-code modulation, PCM) — Представление сигнала последовательностью квантованных отсчётов, взятых через равные промежутки времени. В WAV код формата 1 означает PCM с целыми отсчётами. он определяется параметрами записи:

R=fs⋅B⋅CR = f_s \cdot B \cdot C
RR
битрейт, бит/с;
fsf_s
частота дискретизации, кадров в секунду;
BB
разрядность, бит на отсчёт;
CC
число каналов.

Для компакт-диска R=44 100⋅16⋅2=1 411 200R = 44\,100 \cdot 16 \cdot 2 = 1\,411\,200 бит/с. Это 176 400 байт в секунду и 10 584 000 байт в минуту. В битрейтах кодеков (codec)кодек (codec) — Алгоритм или программа, которая кодирует сигнал в сжатый поток и декодирует его обратно. Формат файла при этом задаёт упаковку данных и метаданных. приставка «кило» означает 1000: 128 кбит/с — это 128 000 бит/с.

Уменьшить битрейт можно двумя способами. Сжатие без потерь (lossless compression)сжатие без потерь (lossless compression) — Уменьшение объёма данных, после которого распаковка возвращает в точности исходные отсчёты. Так работают FLAC и ALAC. находит в данных закономерности и записывает их короче; распаковка возвращает в точности исходные числа. Сжатие с потерями (lossy compression)сжатие с потерями (lossy compression) — Уменьшение объёма за счёт замены сигнала приближением: восстановленные отсчёты отличаются от исходных. Так работают MP3, AAC и Opus. заменяет сигнал приближением: восстановленные отсчёты отличаются от исходных, и разницу уже не вернуть (RFC 9639, разд. 3).

Программу, которая кодирует и декодирует сигнал, называют кодекомкодек (codec) — Алгоритм или программа, которая кодирует сигнал в сжатый поток и декодирует его обратно. Формат файла при этом задаёт упаковку данных и метаданных.. Формат файла задаёт, как закодированные данные упакованы вместе с параметрами и метаданными. WAV и AIFF — контейнеры: внутри обычно несжатый PCM, но код формата допускает и другие способы записи. FLAC и MP3 определяют и способ кодирования, и порядок данных в потоке.

AIFF: тот же PCM в порядке big-endian

AIFFAIFF (Audio Interchange File Format) — Формат звукового файла Apple на основе контейнера IFF: чанки COMM с параметрами и SSND с отсчётами PCM, числа записаны старшим байтом вперёд. описан Apple в 1988–1989 годах (Apple, AIFF 1.3). Он следует стандарту контейнеров EA IFF 85: как и в WAV, файл состоит из чанковчанк (chunk) — Блок файла RIFF: идентификатор из четырёх символов, 32-битный размер данных и сами данные. После данных нечётной длины стоит нулевой байт выравнивания, в размер он не входит. с четырёхсимвольным идентификатором, 32-битным размером и данными, а после данных нечётной длины стоит нулевой байт выравнивания. Главное отличие от WAV — порядок байтов. Многобайтовые числа в AIFF записаны старшим байтом вперёд (big-endian)порядок байтов big-endian (big-endian) — Запись многобайтового числа, при которой старший байт идёт первым. Число 44 100 = 0xAC44 в четырёх байтах хранится как 00 00 AC 44., как в процессорах Motorola 68000 тогдашних компьютеров Macintosh.

Внешний чанк FORM содержит тип AIFF и вложенные чанки. Обязателен COMM с параметрами звука; SSND с отсчётами нужен, если звук не пустой. Порядок чанков спецификация не задаёт, поэтому их читают так же, как в WAV: по идентификатору и размеру, пропуская незнакомые.

Таблица 1. Чанк COMM стереозаписи 16 бит, 44,1 кГц длительностью 2 с: 8 байт заголовка и 18 байт данных. Байты записаны старшим вперёд.
ПолеБайты в файлеЗначение
ckID43 4F 4D 4DCOMM
ckSize00 00 00 1218 байт данных
numChannels00 022 канала
numSampleFrames00 01 58 8888 200 кадров
sampleSize00 1016 бит
sampleRate40 0E AC 44 00 00 00 00 00 0044 100 Гц

Число кадров в AIFF записано явно, а в WAV его вычисляют из размера данных. Кадр здесь означает то же, что в WAV: по одному отсчёту каждого канала.

Частота хранится 80-битным числом с плавающей точкой (extended). Первые 2 байта — знак и 15-битный показатель ee со смещением 16 383, остальные 8 байт — 64-битная значащая часть MM с явным целым битом. Значение равно M⋅2e−16383−63M \cdot 2^{e-16383-63} (Wikipedia, Extended precision). В примере e=400E16=16 398e = \text{400E}_{16} = 16\,398 и M=44 100⋅248M = 44\,100 \cdot 2^{48}, поэтому значение 44 100⋅248⋅216398−16383−63=44 10044\,100 \cdot 2^{48} \cdot 2^{16398-16383-63} = 44\,100. В дампе после 40 0E видны байты AC 44: это число 44 100, которое в WAV записано как 44 AC.

Чанк SSND начинается двумя 32-битными полями offset и blockSize для выравнивания данных по блокам; обычно оба равны нулю. Затем подряд идут кадры. Отсчёты — целые в дополнительном коде (two’s complement)дополнительный код (two’s complement) — Представление знакового целого в N битах: при установленном старшем бите беззнаковое значение этих битов уменьшают на 2ᴺ. Диапазон — от −2ᴺ⁻¹ до 2ᴺ⁻¹−1; у нуля одна запись., старший байт первым: 16-битный отсчёт −2 записан как FF FE, а в WAV — как FE FF. 8-битные отсчёты в AIFF тоже со знаком, тогда как в WAV 8 бит хранятся без знака со смещением 128. Если разрядность (bit depth)разрядность (bit depth) — Число бит для представления одного квантованного отсчёта. B бит дают 2ᴮ кодов; при равномерном квантовании шаг зависит также от полного диапазона сигнала. не кратна 8, отсчёт выравнивают по старшим битам в целом числе байтов, а младшие биты заполняют нулями: 12-битный отсчёт занимает 2 байта.

AIFF-C: поле для способа сжатия

Расширение AIFF-C (1991) меняет тип внешнего чанка на AIFC, добавляет чанк версии FVER и два поля в COMM: четырёхсимвольный код сжатия compressionType и его название для людей (Apple, AIFF-C). Код NONE означает обычный PCM. Исходная спецификация перечисляла также сжатие MACE с отношением 3:1 и 6:1. Позже появились коды sowt (PCM с младшим байтом первым), fl32 и fl64 (числа с плавающей точкой), ulaw и alaw (Peter Kabal, AIFF / AIFF-C). Поэтому файл с расширением .aif не обязательно хранит несжатые отсчёты старшим байтом вперёд: способ записи проверяют по COMM.

FLAC: сжатие без потерь

FLACFLAC (Free Lossless Audio Codec) — Формат сжатия звука без потерь: блоки PCM кодируются предсказанием по предыдущим отсчётам и остатком в кодах Райса. Описан в RFC 9639. хранит PCM с 1–8 каналами, частотой до 1 048 575 Гц и разрядностью от 4 до 32 бит. С 2024 года формат описан стандартом IETF (RFC 9639). Сжатие работает, потому что соседние отсчёты звука сильно связаны: по нескольким прошлым значениям можно неплохо угадать следующее. FLAC использует только эту краткосрочную связь и смотрит назад не больше чем на 32 отсчёта, тогда как архиваторы общего назначения ищут повторы по словарю (RFC 9639, разд. 1).

Кодер выполняет четыре шага (разд. 4): делит запись на блоки, для стерео (stereo)стерео (stereo) — Аудиоформат с двумя каналами, обычно левым и правым. Кадр несжатых стереоданных содержит два отсчёта одного момента времени. выбирает преобразование каналов, подбирает для каждого канала предсказатель и записывает остаток кодом переменной длины. Декодер проходит те же шаги в обратном порядке. Все вычисления целочисленные, поэтому обратный путь точно восстанавливает отсчёты.

Предсказание и остаток

Линейное предсказание (linear prediction)линейное предсказание (linear prediction) — Оценка отсчёта взвешенной суммой нескольких предыдущих отсчётов. Во FLAC используются фиксированные предсказатели порядка 0–4 и предсказатели с записанными коэффициентами. оценивает отсчёт x[n]x[n] взвешенной суммой предыдущих отсчётов. Кодер записывает не сам отсчёт, а остаток (prediction residual)остаток предсказания (prediction residual) — Разность между отсчётом и его предсказанием. При удачном предсказании остаток близок к нулю и записывается меньшим числом бит, чем отсчёт.:

e[n]=x[n]−x^[n]e[n] = x[n] - \hat{x}[n]
x[n]x[n]
отсчёт с номером nn, целое;
x^[n]\hat{x}[n]
предсказание по предыдущим отсчётам, целое;
e[n]e[n]
остаток, целое.

Декодер вычисляет то же предсказание по уже восстановленным отсчётам и прибавляет остаток. Если предсказание удачное, остаток близок к нулю и записывается меньшим числом бит.

FLAC определяет пять фиксированных предсказателей порядка от 0 до 4 (таблица 2). Порядок pp — сколько предыдущих отсчётов использует предсказатель. Коэффициенты известны и кодеру, и декодеру, поэтому в файле записывают только порядок (RFC 9639, разд. 9.2.5).

Таблица 2. Фиксированные предсказатели FLAC (RFC 9639, табл. 20). Остаток порядка p равен p-й разности соседних отсчётов.
ПорядокПредсказание x̂[n]Что предполагается
00ничего: остаток равен отсчёту
1x[n−1]значение не меняется
22x[n−1] − x[n−2]значения лежат на прямой
33x[n−1] − 3x[n−2] + x[n−3]значения лежат на параболе
44x[n−1] − 6x[n−2] + 4x[n−3] − x[n−4]значения лежат на кубической кривой

Предсказатели связаны с разностями соседних значений. Порядок 2 предполагает, что вторая разность равна нулю, и продолжает прямую через два последних отсчёта; его остаток и есть вторая разность. Возьмём отсчёты 100, 130, 155, 175, 190, 200. Для n=2n = 2 предсказание x^[2]=2⋅130−100=160\hat{x}[2] = 2 \cdot 130 - 100 = 160, остаток 155−160=−5155 - 160 = -5. Дальше остаток тоже равен −5: значения лежат на параболе, у которой постоянна вторая разность. Порядок 3 здесь даёт нулевой остаток.

Первые pp отсчётов предсказать нечем: каждый подкадр, то есть один канал кадра, кодируется независимо от предыдущих. Эти отсчёты разогрева (warm-up samples) записывают как есть, полной разрядностью.

Кроме фиксированных, FLAC допускает предсказатель с произвольными целыми коэффициентами: до 32 коэффициентов, их разрядность и сдвиг вправо записаны в подкадре (разд. 9.2.6). Он точнее описывает сложный сигнал, но коэффициенты занимают место. В потоковом подмножестве для частот до 48 кГц порядок не больше 12 (разд. 7). Есть и два особых подкадра: постоянный, когда все отсчёты блока равны, как в цифровой тишине, и подкадр без сжатия (verbatim) для сигнала, который не удаётся предсказать (разд. 4.3).

Коды Райса

Остаток — в основном небольшие числа с редкими большими значениями. Для таких данных FLAC использует код Райса (Rice code)код Райса (Rice code) — Код переменной длины для неотрицательных целых: частное от деления на 2^k записывается унарно, остаток — k битами. Короток для чисел около нуля.: короткий код для чисел около нуля и всё более длинный для далёких от нуля (разд. 4.4).

Сначала знак убирают свёрткой (zigzag): 0, −1, 1, −2, 2 … переходят в 0, 1, 2, 3, 4 …

u={2e,e≥0,−2e−1,e<0u = \begin{cases} 2e, & e \geq 0, \\ -2e - 1, & e < 0 \end{cases}
uu
свёрнутый остаток, целое u≥0u \geq 0.

Затем uu делят на 2k2^k с остатком, где kk — параметр Райса. Частное записывают в унарном коде: столько нулей, сколько оно равно, и единица в конце. Остаток от деления записывают kk битами. Деление на степень двойки с остатком сводится к разбиению двоичной записи на старшие и младшие биты. Длина кода:

L=⌊u2k⌋+1+kL = \left\lfloor \frac{u}{2^k} \right\rfloor + 1 + k
LL
длина кода, бит;
kk
параметр Райса, целое от 0 до 14 при 4-битном поле.

Пример из RFC 9639, разд. 9.2.7.2: k=3k = 3, u=38=1001102u = 38 = 100110_2. Старшая часть 1002=4100_2 = 4 записывается как 00001, младшие три бита 110 — как есть. Получается код 00001110 длиной 8 бит. Остаток −5 из предыдущего примера даёт u=9u = 9; при k=2k = 2 частное 2 и остаток 1, код 001 01 — 5 бит вместо 16 у исходного отсчёта.

Выбор kk — компромисс. Малый kk удлиняет унарную часть у больших чисел, большой тратит лишние младшие биты на малые. Кодер выбирает kk с наименьшей суммой длин. Остаток подкадра можно разбить на 2m2^m частей со своим параметром в каждой. Параметр занимает 4 или 5 бит, а значение из одних единиц — escape-код: такая часть записана числами фиксированной длины без кода Райса (разд. 9.2.7).

Попробовать предсказание

Визуализация 1 ниже показывает, как порядок предсказания меняет остаток и размер подкадра. Тон 1 кГц при 44,1 кГц меняется плавно: на период (period)период (period) — Время одного полного повторения периодического колебания. Обозначается T, измеряется в секундах и связано с частотой как T = 1/f. приходится 44 отсчёта, и порядок 4 сокращает подкадр почти втрое. У тона 5 кГц на период меньше 9 отсчётов, соседние значения сильно различаются, и выигрыш меньше. Шум не предсказывается: с ростом порядка остаток только растёт, и кодер записал бы подкадр без сжатия.

Визуализация 1Предсказание FLAC: остаток и коды Райса
Отсчёты сигнала «Тон 1 кГц» и предсказание порядка 232 отсчётов от −7 653 до 8 000, номера n от 0 до 31. Первые 2 отсчёта — разогрев: хранятся как есть. Кольца — предсказание для n от 2 до 31.разогрев
Остаток e[n] = x[n] − x̂[n] при порядке 2Столбики от нуля для n от 2 до 31: остаток от −162 до 146. Шкала подобрана под размах остатка: от −200 до 200.
  • отсчёт
  • предсказание
  • остаток
  • разогрев: хранится как есть

Тон 1 кГц, порядок 2. Остаток от −162 до 146 при отсчётах до ±8 000. Лучший параметр Райса k = 7; подкадр — 324 бита, 62 % от записи без сжатия.

Заголовок подкадра и поля остатка
18 бит
Разогрев
2 × 16 = 32 бита
Остаток: 30 кодов, k = 7
274 бита
Итого
324 бита — 62 %
Без сжатия
8 + 32 × 16 = 520 бит
nx[n]x̂[n]e[n]uкод Райса
22 2492 272−234510101101
33 3163 362−469111011011
44 3164 383−67133010000101
55 2295 316−87173010101101

Ещё 26 остатков кодируются так же; u — остаток со свёрнутым знаком.

Параметры визуализации
Сигнал
Порядок предсказания

Параметры работают с включённым JavaScript. Рисунок показывает тон 1 кГц и порядок 2.

Рис. 1. 32 отсчёта 16 бит при 44,1 кГц, амплитуда 8 000; шум — псевдослучайные целые в тех же пределах. Фиксированный предсказатель FLAC и один параметр Райса на весь остаток; учтены заголовок подкадра и поля остатка, но не заголовок кадра. Звука нет.

Стерео: середина и разность

Левый и правый каналы музыки часто похожи. Для каждого блока FLAC может заменить пару каналов на середину и разность (mid-side stereo)мид-сайд (mid-side stereo) — Представление двух стереоканалов через их сумму и разность с выбранной нормировкой. Позволяет отдельно обрабатывать общую и разностную составляющие, а в кодеках — уменьшать избыточность похожих каналов.: M=(L+R)≫1M = (L + R) \gg 1, S=L−RS = L - R (разд. 4.2). Здесь ≫1\gg 1 — сдвиг вправо на один бит. Когда каналы похожи, разность мала и кодируется коротко. Возможны и смешанные варианты: левый канал и разность или разность и правый канал.

Сдвиг отбрасывает младший бит суммы, но потери нет: L+RL + R и L−RL - R всегда одной чётности, и отброшенный бит восстанавливается по чётности SS. Пусть L=1000L = 1000, R=997R = 997. Тогда S=3S = 3, M=1997≫1=998M = 1997 \gg 1 = 998. Декодер вычисляет 998⋅2=1996998 \cdot 2 = 1996; SS нечётно, поэтому прибавляет 1 и получает 1997. Затем L=(1997+3)≫1=1000L = (1997 + 3) \gg 1 = 1000, R=(1997−3)≫1=997R = (1997 - 3) \gg 1 = 997. Разности нужен один дополнительный бит: при 16-битных каналах SS лежит от −65 535 до 65 535.

Метаданные и кадры

Файл начинается с четырёх байтов fLaC. Затем идут блоки метаданных, каждый с 4-байтовым заголовком: признак последнего блока (1 бит), тип (7 бит) и длина (24 бита). Первым обязательно идёт STREAMINFO (таблица 3). Остальные блоки необязательны: PADDING оставляет место для правки тегов без перезаписи файла, SEEKTABLE хранит точки быстрого перехода, VORBIS_COMMENT — текстовые теги, PICTURE — обложку; есть также CUESHEET и APPLICATION (разд. 8). Числа во FLAC записаны старшим байтом вперёд; исключение — длины полей в тегах VORBIS_COMMENT (разд. 5).

Таблица 3. Поля блока STREAMINFO (RFC 9639, табл. 3), всего 34 байта. Размеры блоков — в отсчётах на канал.
ПолеБитСодержание
Наименьший размер блока16без учёта последнего блока
Наибольший размер блока16от 16 до 65 535
Наименьший размер кадра24байт; 0 — неизвестно
Наибольший размер кадра24байт; 0 — неизвестно
Частота дискретизации20Гц
Число каналов − 13от 1 до 8 каналов
Разрядность − 15от 4 до 32 бит
Число отсчётов на канал360 — неизвестно
MD5128контрольная сумма исходных отсчётов

MD5 считается по всем отсчётам, чередующимся по каналам, в знаковом виде младшим байтом вперёд (разд. 8.2). После декодирования сумму можно вычислить заново и проверить, что восстановлены те же числа, даже если поток не содержит ошибок формы.

Заголовок кадра начинается с 15-битного синхрокода 111111111111100 и бита стратегии блоков, поэтому первые 2 байта кадра — FF F8 при постоянном размере блока или FF F9 при переменном. Дальше записаны размер блока, частота, каналы и разрядность, в основном короткими табличными кодами, затем номер кадра и контрольная сумма CRC-8 заголовка. За заголовком идут подкадры: по одному на канал, отсчёты разных каналов не чередуются. Кадр завершают нулевые биты до границы байта и CRC-16 всего кадра (разд. 9). Синхрокод и параметры в каждом заголовке позволяют начать декодирование с середины потока.

Размер блока — от 16 до 65 535 отсчётов на канал; в потоковом подмножестве при частоте до 48 кГц — не больше 4608 (разд. 4.1, разд. 7). Слишком короткие блоки тратят место на заголовки, а в слишком длинных свойства сигнала меняются, и одному предсказателю труднее описать весь блок.

Сколько экономит FLAC

Степень сжатия без потерь зависит от записи. В сравнении Martijn van Beurden на 64 записях с параметрами компакт-диска FLAC 1.4.3 в среднем сократил файлы до 52–57 % от размера WAV в зависимости от настроек кодера; ALAC — до 53–55 % (Lossless audio codec comparison, revision 6, CDDA). Минута стереозаписи CD тогда занимает около 5,5–6 млн байт. Гарантии экономии нет: шум не предсказывается, его подкадры записываются без сжатия, и с заголовками файл получается чуть больше исходного PCM.

MP3: сжатие с потерями

MP3MP3 (MPEG-1/2 Audio Layer III) — Формат сжатия звука с потерями: гибридный банк фильтров, психоакустическая модель, неравномерное квантование и коды Хаффмана в кадрах по 1152 отсчёта. — разговорное название MPEG-1/2 Audio Layer III. Он стандартизирован в ISO/IEC 11172-3 в 1992 году, а MPEG-2 добавил частоты 16; 22,05 и 24 кГц (Brandenburg, разд. 2, 3.1). Стандарт задаёт формат потока и декодер, а способ кодирования оставляет разработчику. Поэтому кодеры при одном битрейте звучат по-разному, а декодеры, соответствующие стандарту, слышимо не различаются (Brandenburg, разд. 3.2, 5.3, 5.4).

Общий принцип перцептивного кодированияперцептивное кодирование (perceptual audio coding) — Сжатие звука с потерями, при котором модель слуха оценивает порог маскировки, а шум квантования стараются удержать ниже него. Применяется в MP3 и AAC. разобран в статье о психоакустике: кодер раскладывает сигнал на частотные составляющие, оценивает порог маскировки (masking threshold)порог маскировки (masking threshold) — Уровень, ниже которого тестовый звук не слышен при наличии маскирующего звука. Выше порога слышимости в тишине рядом с маскером по частоте и времени. и квантует составляющие настолько грубо, чтобы шум квантования (quantization)квантование (quantization) — Замена значения отсчёта одним из конечного набора представимых уровней. Разность между выбранным уровнем и исходным значением называется ошибкой квантования. оставался под порогом. Ниже разобрано, из каких блоков состоит кодер MP3 и где именно он опирается на свойства слуха.

Путь сигнала в кодере

Блоки кодера MP3Сверху блок PCM: кадр из 1152 отсчётов на канал. Слева вниз идут банк фильтров на 32 равные полосы, MDCT на 576 линий, квантование и коды Хаффмана в двух циклах, внизу — кадр MP3. Справа сигнал идёт в БПФ, затем в психоакустическую модель. От модели штриховая стрелка ведёт к MDCT с подписью «тип окна» и к квантованию с подписью «допустимый шум в каждой полосе».PCM: 1152 отсчётаБанк фильтров:32 равные полосыБПФ на 1024точкиMDCT: по 18 линийв полосе, всего 576Психоакустическаямодель: порогмаскировкиКвантование икоды Хаффмана:два циклаКадр MP3: заголовок, побочнаяинформация, коды спектраокнодопустимый шумв каждой полосе
Рис. 2. Упрощённая схема кодера MPEG-1 Layer III по Brandenburg (рис. 2). Сплошные стрелки — путь сигнала, штриховые — управление от психоакустической модели: тип окна MDCT и допустимый шум в каждой полосе.

Кодер берёт по 1152 отсчёта на канал — это один кадр MP3 из двух гранул по 576 отсчётов. Сначала многофазный банк фильтров делит сигнал на 32 полосы равной ширины: при 44,1 кГц каждая шириной 22 050/32≈68922\,050 / 32 \approx 689 Гц. Затем модифицированное дискретное косинусное преобразование (modified discrete cosine transform, MDCT)модифицированное дискретное косинусное преобразование (modified discrete cosine transform, MDCT) — Преобразование блока отсчётов в частотные линии с перекрытием соседних блоков. В MP3 делит каждую из 32 полос ещё на 18 линий. делит каждую полосу ещё на 18 частей. Гранула превращается в 576 частотных линий, около 38 Гц на линию. Такой каскад называют гибридным банком фильтров (Brandenburg, разд. 3.3.1; Raissi, разд. 6.1–6.2). Высокое разрешение по частоте позволяет точнее следовать порогу маскировки и лучше сжимать тональные звуки.

Параллельно кодер вычисляет спектрспектр (spectrum) — Представление сигнала через его частотные составляющие: их частоты, амплитуды и фазы. Ограничение спектра задаёт, какие частоты допускаются в сигнале. быстрым преобразованием Фурье (БПФ) на 1024 точки и передаёт его психоакустической модели. Модель находит преобладающие тональные составляющие, оценивает частотную маскировку и выдаёт допустимый уровень шума для каждой полосы масштабного множителя. Эти полосы примерно соответствуют критическим полосам (critical band)критическая полоса (critical band) — Полоса частот, в пределах которой слух объединяет составляющие при оценке громкости и маскировки. Около 100 Гц до 500 Гц, выше — примерно 20 % средней частоты.; при длинных окнах их 21 (Brandenburg, разд. 3.3.2; Raissi, разд. 5.1.2, 6.4). Модель не входит в стандарт, и от неё больше всего зависит качество кодера.

Модель следит и за резкими изменениями сигнала. Если в гранулу попадает атака, MDCT переключается с одного длинного окна на три коротких: разрешение по частоте падает, зато шум квантования распределяется по более короткому отрезку времени. Так кодер удерживает предэхопредэхо (pre-echo) — Артефакт перцептивного кодирования: шум квантования распределяется по блоку и звучит раньше резкой атаки. Слышен, если выходит за время предмаскировки. в пределах предмаскировки. Переход сглаживают окна-переходники: стартовое перед короткими и завершающее после них (Raissi, разд. 6.2). Даже короткие блоки MP3 длиннее, чем у AAC: импульсная характеристика (impulse response, IR)импульсная характеристика (impulse response, IR) — Отклик линейной системы на единичный импульс. В свёрточной реверберации сохранённая характеристика описывает отклик для выбранного положения источника и приёмника. 18,6 мс против 5,3 мс при 48 кГц (Brandenburg, разд. 4.2).

Квантование неравномерное: значение возводят в степень (power)степень (power) — При положительном целом показателе m запись aᵐ означает произведение m одинаковых множителей a. Показатель 0 даёт 1 при ненулевом основании, отрицательный целый показатель — обратную величину соответствующей положительной степени. 3/4, и большие значения записываются менее точно. Общий шаг квантования (quantization step)шаг квантования (quantization step) — Разность между соседними уровнями равномерного квантования. Для диапазона шириной R, разделённого на 2ᴮ равных интервалов, шаг Δ = R/2ᴮ. задаёт глобальное усиление, а масштабные множители (scalefactors) уменьшают шум в отдельных полосах. Их подбирают двумя вложенными циклами анализа через синтез (Brandenburg, разд. 3.3.3). Внутренний цикл увеличивает шаг, пока закодированные данные не уложатся в доступное число бит. Внешний проверяет шум каждой полосы: если он выше допустимого по модели, множитель этой полосы увеличивается, и внутренний цикл повторяется. Вместе циклы могут не сойтись, поэтому кодер прерывает их по дополнительным условиям.

Квантованные значения записываются кодом Хаффмана (Huffman coding)код Хаффмана (Huffman coding) — Префиксный код, в котором частым значениям назначены короткие кодовые слова, а редким — длинные. В MP3 кодирует квантованные частотные линии.: частым малым значениям достаются короткие коды. Значения кодируются парами, а в области, где остались только −1, 0 и 1, — четвёрками; верхние линии, ставшие нулями, не передаются вовсе. Для разных участков спектра кодер выбирает подходящую таблицу кодов (Brandenburg, разд. 3.3.3; Raissi, разд. 5.1.2).

Таблица 4. Где кодер MP3 опирается на свойства слуха. Каждое свойство разобрано в статье о психоакустике; ссылки на разделы — в тексте под таблицей.
Блок кодераЧто делаетСвойство слуха
Психоакустическая модельоценивает допустимый шум в каждой полосечастотная маскировка, критические полосы, порог слышимости в тишине
Внешний цикл квантованияувеличивает точность в полосах, где шум выше допустимогошум ниже порога маскировки не слышен
Переключение оконвключает короткие окна у атакпредмаскировка скрывает шум лишь около 1–2 мс до начала звука
Ограничение полосыне передаёт частоты выше среза при малом битрейтев музыке срез около 16 кГц трудно услышать
Интенсивностное стереопередаёт верхние полосы одним сигналом с соотношением уровней каналовна высоких частотах направление определяется главным образом разностью уровней

Первые два ряда используют частотную маскировку, критические полосы и порог слышимости (threshold of hearing)порог слышимости (threshold of hearing) — Минимальный уровень звука, который слушатель способен обнаружить в заданных условиях. Зависит от частоты и слушателя; опорные 20 мкПа не задают его для всех частот.: допустимым шумом обычно считают больший из порогов маскировки и слышимости в тишине. Третий ряд связан с временной маскировкой (temporal masking)временная маскировка (temporal masking) — Маскировка тестового звука, звучащего до начала маскера (предмаскировка) или после его окончания (постмаскировка).. Ограничение полосы Brandenburg объясняет так: автору не известен эксперимент, который бы надёжно показал, что слушатели отличают музыку с частотами до 20 кГц от той же музыки с полосой около 16 кГц. При этом постоянный срез звучит лучше, чем граница, которая меняется от кадра к кадру (разд. 5.7). Последний ряд опирается на локализацию по разности уровней и, по Brandenburg, может сдвигать звуковую картину (разд. 3.1).

Кадр MP3

Поток MP3 состоит из кадров по 1152 отсчёта на канал (MPEG-1): 26,1 мс при 44,1 кГц и 24 мс при 48 кГц. Каждый кадр начинается с 4-байтового заголовка (таблица 5). За ним идут необязательная контрольная сумма CRC-16, побочная информация (17 байт для моно (mono)моно (mono) — Аудиоформат с одним каналом. Кадр несжатых монофонических данных содержит один отсчёт. и 32 для стерео), основные данные — масштабные множители и коды Хаффмана — и необязательные дополнительные данные (Raissi, разд. 5.1).

Таблица 5. Заголовок кадра из байтов FF FB 90 64 по описанию Supurovic. Поля идут подряд от старшего бита первого байта.
ПолеБитЗначение в примере
Синхрослово11все единицы
Версия MPEG211 — MPEG-1
Слой201 — Layer III
Защита11 — без CRC
Индекс битрейта41001 — 128 кбит/с
Частота200 — 44 100 Гц
Заполнение10 — без дополнительного байта
Частный бит10
Режим каналов201 — совместное стерео
Расширение режима210 — M/S включено, интенсивностное выключено
Авторское право10
Оригинал11
Предыскажения200 — нет

Длину кадра в байтах вычисляют по битрейту и частоте (Supurovic, MPEG Audio Frame Header):

L=⌊144⋅Rfs⌋+PL = \left\lfloor \frac{144 \cdot R}{f_s} \right\rfloor + P
LL
длина кадра вместе с заголовком, байт;
RR
битрейт из заголовка, бит/с;
PP
бит заполнения: 0 или 1 байт.

Число 144 — это 1152/81152 / 8: кадр длится 1152 отсчёта, а деление на 8 переводит биты в байты. При 128 кбит/с и 44,1 кГц получается 144⋅128 000/44 100≈417,96144 \cdot 128\,000 / 44\,100 \approx 417{,}96, то есть 417 байт. Кадры с битом заполнения занимают 418 байт, и кодер расставляет их так, чтобы средняя длина оставалась 417,96 байта. При 48 кГц деление точное — 384 байта, заполнение не нужно.

Синхрослово может случайно встретиться и внутри данных. Поэтому декодер считает найденный заголовок настоящим, если на расчётном расстоянии стоит следующий (Brandenburg, разд. 6.1). Параметры повторяются в каждом кадре, так что воспроизведение можно начать с любого места потока.

При постоянном битрейте длина кадра фиксирована, а сигнал бывает то простым, то сложным. Битовый резервуар (bit reservoir)битовый резервуар (bit reservoir) — Механизм MP3: кадр может начать свои данные в месте, оставленном свободным предыдущими кадрами. Сложный фрагмент получает больше бит при постоянном битрейте. позволяет кадру использовать место, не занятое предыдущими кадрами. 9-битное поле main_data_begin в побочной информации указывает, на сколько байтов назад от заголовка начинаются основные данные этого кадра, — до 511 байт (Raissi, разд. 5.1.2). Простой фрагмент оставляет запас, а следующая атака его тратит. Поэтому основные данные кадра могут лежать в предыдущих кадрах, и без них такой кадр не декодируется.

Постоянный и переменный битрейт

MPEG-1 Layer III допускает битрейты 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256 и 320 кбит/с (Supurovic). При постоянном битрейте (CBR) все кадры одного размера с точностью до байта заполнения. Индекс битрейта можно менять от кадра к кадру: так получается переменный битрейт (VBR), и декодер обязан его поддерживать (Brandenburg, разд. 3.1, 5.3). При VBR длительность нельзя вычислить по размеру файла и битрейту первого кадра: нужно знать число кадров.

У кодека есть битрейт, ниже которого качество быстро падает, а выше растёт медленно. Для MP3 это около 1,33 бита на отсчёт: 128 кбит/с для стерео при 48 кГц (Brandenburg, разд. 5.6). Для записи CD это отношение 1411,2/128≈111411{,}2 / 128 \approx 11: файл в 11 раз меньше WAV.

Совместное стерео

Заголовок задаёт один из четырёх режимов: моно, два независимых канала (dual channel), стерео и совместное стерео (joint stereo). В совместном стерео кодер может передавать вместо LL и RR их сумму и разность (M/S), если каналы похожи и разность мала. Само преобразование обратимо, как во FLAC, а потери возникают при квантовании каждой из двух составляющих. На низких битрейтах доступно также интенсивностное стерео: верхние полосы передаются одним общим сигналом и соотношением уровней каналов. Оно экономит биты, но может сместить звуковую картину, например сдвинуть инструменты (Brandenburg, разд. 3.1). Расширение режима в заголовке указывает, какие способы включены в кадре.

Теги ID3

Стандарт MPEG не хранит название трека и исполнителя. Их записывают в теги ID3, которые не входят в поток кадров. ID3v1 занимает 128 байт в конце файла: метка TAG, название, исполнитель и альбом по 30 байт, год 4 байта, комментарий 30 байт и код жанра 1 байт. ID3v2 стоит в начале файла с меткой ID3 и имеет переменную длину (Raissi, разд. 5.2). Декодер пропускает такие данные и ищет первый настоящий заголовок кадра (Brandenburg, разд. 6.1).

Артефакты сжатия

Когда битов не хватает, ошибки MP3 звучат иначе, чем привычный шум или гармонические искажения (Brandenburg, разд. 5.1). Кодер может обнулить верхние линии; если граница полосы меняется от кадра к кадру, это слышнее, чем постоянный срез. Шум квантования распределяется по окну и при неудачном выборе окна звучит как предэхо перед ударом. При низком битрейте звук становится шероховатым: характер ошибки меняется примерно каждые 20 мс, а голос может звучать так, будто его записали дважды и наложили. Качество поэтому оценивают прослушиванием, а не отношением сигнал/шум: перцептивный кодер намеренно снижает это отношение, распределяя шум по частотам (разд. 5.5).

Другие форматы: AAC, Opus и ALAC

Кроме разобранных форматов распространены ещё три. AAC (Advanced Audio Coding) — преемник MP3 из MPEG-2 и MPEG-4: тот же принцип, но больше частотных линий, более гибкое совместное стерео и временное формирование шума TNS (Brandenburg, разд. 2.2.1, 4). Opus — открытый кодек IETF для речи и музыки, в том числе в реальном времени (RFC 6716, разд. 2). ALAC (Apple Lossless) — сжатие без потерь от Apple с открытыми исходниками (Apple, ALAC). Таблица 6 сравнивает их с форматами статьи.

Таблица 6. Сравнение форматов. Размеры без потерь — средние для записей CD по van Beurden; битрейты с потерями — ориентиры из Brandenburg и RFC 6716, а не гарантия качества.
ФорматСжатиеКак устроенРазмер или битрейт
WAV, AIFFнетPCM в чанках1411 кбит/с для CD
FLACбез потерьпредсказание и коды Райса52–57 % от WAV
ALACбез потерь16, 20, 24 или 32 бита, до 384 кГц, 1–8 каналов53–55 % от WAV
MP3с потерямигибридный банк фильтров, модель слуха, коды Хаффманаоколо 128 кбит/с для стерео
AACс потерямиMDCT до 1024 линий, короткие блоки, TNSоколо 96 кбит/с для стерео 48 кГц; качество MP3 примерно при 70 % его битрейта
Opusс потерямилинейное предсказание (SILK) и MDCT (CELT), кадры 2,5–60 мсот 6 до 510 кбит/с; 64–128 кбит/с для стерео музыки

Выбор зависит от задачи. Для записи, обработки и архива нужны форматы без потерь: WAV, AIFF, FLAC или ALAC, причём FLAC и ALAC экономят место без потери точности. Сжатие с потерями подходит для конечного распространения, когда ограничены объём или канал связи. Каждое новое кодирование с потерями снова квантует сигнал, и новые ошибки добавляются к прежним, поэтому обрабатывают исходную запись, а не MP3.

Самопроверка

Отсчёты 10, 12, 14, 16, 18. Какие остатки дадут порядки 1 и 2 и каким будет код Райса остатка 2 при k = 1?

Порядок 1 даёт для n=1…4n = 1 \ldots 4 остатки 2, 2, 2, 2, порядок 2 для n=2…4n = 2 \ldots 4 — нули: значения лежат на прямой. Остаток 2 сворачивается в u=4u = 4. При k=1k = 1 частное 2 записывается как 001, остаток 0 — одним битом 0: код 0010, 4 бита.

Почему FLAC не может гарантировать сжатие любого сигнала?

Остаток мал, только если сигнал предсказуем. У некоррелированного белого шума (white noise)белый шум (white noise) — Шум с постоянной спектральной плотностью мощности в рассматриваемой полосе. Полосы одинаковой ширины в герцах содержат одинаковую ожидаемую мощность. соседние отсчёты не помогают предсказать друг друга, и предсказание может не уменьшить размер записи. Тогда кодер может выбрать подкадр без сжатия, а заголовки кадров и метаданные сделают файл немного больше исходного PCM. Это не свойство любого шума: у розового есть временные связи между отсчётами.

Какой длины кадр MP3 при 160 кбит/с и 48 кГц и нужен ли бит заполнения?

144⋅160 000/48 000=480144 \cdot 160\,000 / 48\,000 = 480 байт ровно. Дробной части нет, поэтому заполнение не нужно: все кадры по 480 байт.

Зачем кодеру MP3 короткие окна у резких атак?

Шум квантования распределяется по всему окну. У длинного окна часть шума звучит до атаки и выходит за время предмаскировки — получается предэхо. Короткое окно сокращает этот отрезок, ценой худшего разрешения по частоте.

Источники

Связи

Поиск

Ищем по названиям, тексту статей и английским терминам. Например: «частота дискретизации», «Nyquist», «аналоговый сигнал».