Цифровая обработка сигналов

Компрессия: JPEG, MP3, H.264

YouTube стримит 1 миллиард часов видео каждый день. Если бы это шло в RAW 1080p без сжатия - потребовалось бы 200 петабит в секунду на каналы. Реальная нагрузка - около 1 терабита, в 200 000 раз меньше. Эту дельту обеспечивает один трюк, открытый в 1972 году Насиром Ахмедом: дискретное косинусное преобразование. Не более красивая, не более правильная математика, чем Фурье. Просто чуть лучше упаковывает энергию реальных изображений в первые коэффициенты. И вся цивилизация цифрового медиа держится на этой одной формуле.

  • **Netflix transcoding pipeline**: каждый эпизод проходит через ~40 профилей кодирования (H.264/H.265/AV1, разные битрейты), perceptual VMAF score выбирает оптимальный. Экономия на CDN - сотни миллионов долларов в год
  • **WhatsApp голосовые**: AMR-WB при 12.65 kbps. Шеннон сказал бы что речь несёт 30 kbps информации. Психоакустическая модель режет в 2.5 раза без потери разборчивости
  • **Tesla autopilot**: 8 камер 1280x960 @ 36 FPS. Raw поток 1.5 GB/s. После H.264 на чипе FSD - 50 MB/s в neural net. Без компрессии шина не вытянула бы
  • **Apple ProRes vs H.264**: киноиндустрия снимает в ProRes (lossy, но high-bitrate 220 Mbps) - сохраняет цветовую информацию для post-production. На дистрибуции даунгрейд до H.265 4 Mbps - в 55 раз меньше

DCT: косинус вместо синуса

Аналог Фурье, но с одним отличием: только косинусы, никаких синусов. Откуда такая асимметрия? Косинус - чётная функция, и DCT неявно отражает блок 8x8 относительно границы - это даёт лучшее сжатие энергии в первых коэффициентах. Реальные изображения - не белый шум. У них львиная доля энергии сидит в низких пространственных частотах (плавные градиенты неба, кожи, асфальта), а высокочастотный мусор - шум сенсора, текстура травы, артефакты JPEG предыдущих поколений.

DCT-II - стандарт JPEG, MPEG, H.264. Для блока 8x8 пикселей она выдаёт матрицу 8x8 коэффициентов: левый верхний - средняя яркость (DC), остальные 63 - AC компоненты по нарастающим частотам. Тот самый зигзаг-обход коэффициентов от DC к высоким AC, который рисуют в учебниках - это упорядочивание по статистической значимости.

Почему 8x8, а не 4x4 или 16x16? Компромисс. Меньше блок - быстрее, но хуже сжатие энергии. Больше блок - лучше декорреляция, но видимы блочные артефакты. H.265 уже использует адаптивные блоки 4x4 до 64x64 - кодер выбирает размер под содержимое. JPEG в 1992 году выбрал 8x8 как баланс под железо тех лет.

JPEG-кодер обрабатывает фото неба с плавным градиентом. Что произойдёт с DCT-коэффициентами блока 8x8?

Квантование: где умирают биты

DCT не теряет ни одного бита - это просто смена базиса, идеально обратимая. Реальная компрессия начинается шагом ниже. **Квантование** - делим каждый DCT-коэффициент на число и округляем. Малые коэффициенты после деления становятся нулём. В JPEG таблица квантования - матрица 8x8, где левый верхний угол - маленькие делители (10-20), правый нижний - большие (60-120). Это и есть тот самый 'quality slider' в Photoshop: сдвиг значений матрицы вверх или вниз.

Психовизуальная модель: глаз плохо различает мелкие детали в синем канале, лучше - в зелёном. JPEG отдельно квантует Y (яркость) и Cb/Cr (цветоразность), а матрица для Cb/Cr грубее. Плюс перед DCT цвета переводят из RGB в YCbCr и subsample-ят Cb/Cr вдвое (4:2:0) - человек этого не замечает. Аналогично работает квантование в LLM: int4 убивает менее значимые биты весов, и качество модели падает на проценты, а размер - в 8 раз.

Артефакты появляются ровно там, где квантование агрессивно: блочность на границах 8x8 (резкие переходы яркости между блоками), gibbs-кольца у контрастных краёв (высокие частоты убиты, край размылся в пульсацию), цветовое мерцание на красной траве (Cr канал теряется первым).

Quality=10 в JPEG даёт файл в 5 раз меньше quality=80. Что физически происходит с матрицей квантования при понижении quality?

Энтропийное кодирование: финальный удар

После квантования имеется матрица 8x8, где большинство значений - нули, особенно в правом нижнем углу. Это уже половина дела, но нули всё ещё занимают по байту каждое. Энтропийное кодирование забирает оставшийся жирок. JPEG использует две техники последовательно: **zigzag + RLE** превращает 64 коэффициента в поток типа '(skip=5, value=3), (skip=12, value=1), EOB', потом **Хаффман** даёт частым парам короткий код, редким - длинный.

Шеннон в 1948 доказал предел: ни один lossless алгоритм не сожмёт поток сильнее, чем его энтропия. Хаффман подходит к этому пределу с точностью до 1 бита на символ, арифметическое кодирование - вплотную. CABAC в H.264 ещё умнее: вероятности символов оцениваются адаптивно в зависимости от контекста (соседние блоки, тип кадра). Та же идея в LLM: token probabilities оцениваются от context window. Только LLM генерирует, а CABAC сжимает - формальная дуальность.

MP3 и AAC устроены принципиально иначе. Не DCT, а MDCT - модифицированная DCT с перекрытием окон, чтобы избежать слышимых стыков. Не пространственная матрица квантования, а психоакустическая модель: какие частоты замаскированы более громкими соседями, какие лежат ниже порога слышимости в этой полосе. Quantize то, что ухо не услышит. Принцип универсален: где органы чувств слепы - там биты дешевле.

В блоке после квантования 60 из 64 коэффициентов нули. После zigzag + RLE сколько примерно символов поступит на вход Хаффмана?

Lossy vs Lossless: где граница

Lossless алгоритмы (PNG, FLAC, gzip) не теряют ни одного бита и сжимают за счёт устранения статистической избыточности: повторы, корреляции соседних пикселей, предсказуемые паттерны. PNG предсказывает каждый пиксель из соседей и кодирует разницу через DEFLATE - типичные коэффициенты сжатия 2-3x. Lossy (JPEG, MP3, H.264) выбрасывает информацию, которую сенсор не способен воспринять - и достигает 10-50x на тех же изображениях. Это не про математику. Это про модель человеческого восприятия.

Современные стандарты движутся к нейронному сжатию. NVIDIA AV1 encoder использует ML для оценки motion vectors. Google's HiFiC применяет GAN для перцептуально-оптимизированного сжатия изображений. Stability AI выпустил Stable Diffusion VAE как фактически экстремальный кодер 8x8 пиксельных блоков в латентное пространство 1x1 - 64x lossy compression со семантической сохранностью. Граница между 'компрессией' и 'генерацией' стирается: VAE декодер галлюцинирует детали, которых на самом деле не было в оригинале, но они правдоподобны.

Битрейт vs perceptual quality - это не линейная зависимость. Кривая RD (rate-distortion) выглядит как гипербола: первые удвоения битрейта дают резкий прирост качества, потом отдача падает до плато. YouTube подбирает битрейт точно у излома, где экономия 30% битов не заметна, но дальнейшее снижение видно глазом. Этот процесс автоматизирован: каждое видео транскодируется в несколько профилей, и зрителю отдаётся самый дешёвый, прошедший perceptual evaluation.

Lossy компрессия 'портит' данные, lossless - 'честная'. Серьёзная задача всегда требует lossless.

Lossy и lossless отвечают на разные вопросы. Lossless: 'сохранить точное представление, ужать избыточность'. Lossy: 'сохранить то, что воспринимает потребитель, выбросить остальное'. Видео без lossy не существовало бы как продукт - битрейт в 100x дороже.

Различение строится на цели. Архив исходного фотоснимка - lossless (DNG, RAW). Распространение - lossy (JPEG, AVIF). Профессиональное аудиомастеринг - WAV/FLAC. Стриминг - Opus/AAC. Медицинские снимки до диагностики - lossless DICOM. После архивирования и анонимизации - lossy JPEG2000. Технология выбирается под этап pipeline, не как философская позиция.

Stable Diffusion VAE сжимает изображение 512x512 RGB в латент 64x64x4. Какой коэффициент сжатия это даёт и почему это не классический JPEG?

Связанные темы

Компрессия медиа стоит на трёх столпах - спектральная декорреляция, психовизуальные модели восприятия, энтропийное кодирование:

  • Фурье и спектральный анализ — DCT - частный случай Фурье на действительных чётных функциях
  • Wavelet transform — JPEG2000 заменил DCT на wavelet для multiresolution компрессии
  • Энтропия Шеннона — Задаёт нижнюю границу размера сжатого файла
  • Quantization в ML — Тот же приём в LLM: int4 веса экономят 8x памяти на GPU

Ключевые идеи

  • **DCT** концентрирует энергию реальных изображений в первых коэффициентах - не lossless, но дешёвая база для последующего квантования
  • **Квантование** - единственный lossy шаг. Делители из таблицы определяют trade-off между размером и качеством. Psychovisual модель: разная агрессивность для Y vs Cb/Cr
  • **Zigzag + RLE + Huffman/CABAC** доводит сжатие до энтропийного предела Шеннона. Артефакты JPEG (блочность, ringing) - физический след агрессивного квантования высоких частот
  • **Lossy vs Lossless** - не философия, а выбор под этап. Архив - lossless. Дистрибуция - lossy с perceptual quality control
  • **Нейронное сжатие** (VAE, GAN-based) - следующая итерация: декодер галлюцинирует детали по обученной prior, граница с генерацией стирается

Вопросы для размышления

  • Если квантовать DCT-блок матрицей с единицами (Q[i][j]=1) - получится lossless? Что произойдёт с размером файла?
  • Почему MP3 не использует DCT, а MDCT с перекрытием окон? Что было бы со звуком на границах блоков без перекрытия?
  • Stable Diffusion VAE - это компрессия или генерация? Чем граница отличается от случая, когда JPEG decoder 'додумывает' детали при quality=10?

Связанные уроки

  • dsp-04 — Фурье и спектральный анализ - база для DCT
  • dsp-13 — Wavelet в JPEG2000 заменил DCT - тот же multiresolution
  • it-04 — Хаффман и арифметическое кодирование - последний шаг компрессии
  • it-01 — Энтропия Шеннона задаёт нижнюю границу сжатия
  • aie-25-multimodal — Vision-LLM получает изображение уже как JPEG/H.264 - артефакты влияют на качество
  • cv-04 — Свёрточные сети тренируются на JPEG-сжатых датасетах ImageNet
  • calc-01-sequences
Компрессия: JPEG, MP3, H.264

0

1

Войти