Перейти к основному содержимому

Принцип сжатия FLAC

Алгоритм кодирования звука в формате FLAC состоит из нескольких этапов, включающих разностное кодирование, прогнозирующее кодирование и энтропийное кодирование. Вот пошаговый алгоритм процесса кодирования:

Шаг 1: Разбиение на кадры

На первом этапе входной аудиопоток делится на кадры фиксированного размера. Каждый кадр содержит определенное количество выборок. Размер кадра обычно выбирается так, чтобы минимизировать накладные расходы на заголовки, но при этом обеспечить эффективное сжатие.

Шаг 2: Разностное кодирование

Для каждого кадра выполняется разностное кодирование. Вместо хранения абсолютных значений каждой выборки, сохраняются разницы между текущим значением и предыдущими. Это уменьшает амплитуду значений, что упрощает дальнейшее сжатие.

Шаг 3: Прогнозирующее кодирование

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

Формула линейного предсказателя:

image.png

где:

  • e\[n]e\[n] — ошибка предсказания,
  • x\[n]x\[n] — текущее значение выборки,
  • a_ka\_k — коэффициенты предсказания,
  • pp — порядок предсказания.

Коэффициенты предсказания могут быть найдены методом наименьших квадратов или другими методами оптимизации.

Шаг 4: Энтропийное кодирование

Следующим шагом является применение энтропийного кодирования к ошибкам предсказания. Обычно используется кодирование методом Хаффмана или арифметическое кодирование. Эти методы позволяют эффективно сжимать данные, уменьшая их избыточность.

Кодирование Хаффманом:

Каждому символу присваивается код переменной длины, причем чаще встречающиеся символы получают короткие коды, а реже встречающиеся — длинные. Это позволяет уменьшить общий объем данных.

Шаг 5: Упаковка данных

Все полученные данные упаковываются в структуру кадра FLAC. Кадр включает в себя заголовок, содержащий информацию о размере кадра, количестве выборок, частоте дискретизации и других параметрах, а также сами сжатые данные.

Шаг 6: Запись в выходной файл

Кадры записываются последовательно в выходной файл формата FLAC. Файл может содержать несколько блоков метаданных, таких как информация об исполнителе, альбоме, названии трека и т.д.

Итоговый алгоритм:

  1. Разбить аудиопоток на кадры.
  2. Выполнить разностное кодирование для каждого кадра.
  3. Применить прогнозирующее кодирование с помощью линейного предсказателя.
  4. Использовать энтропийное кодирование (например, Хаффман) для ошибок предсказания.
  5. Упаковать данные в структуру кадра FLAC.
  6. Записать кадры в выходной файл.

Таким образом, процесс кодирования в FLAC представляет собой сочетание различных методов сжатия без потерь, позволяющее сохранить высокое качество звука при значительном уменьшении объема данных.

Вложения