Как вычислять объём цифрового звука и растрового изображения?

Дискретизация заменяет непрерывный сигнал конечным набором отсчётов и уровней. Для звука измеряют амплитуду через равные интервалы времени, для растра разбивают изображение на…

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

Звуковая запись

Несжатый объём звука находят как произведение частоты дискретизации, разрядности одного отсчёта, длительности и числа каналов. Частота измеряется в отсчётах за секунду, разрядность — в битах. Стереозапись содержит два канала, поэтому при остальных равных занимает вдвое больше монофонической.

Растровая графика

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

Цветовые модели

RGB описывает излучаемый цвет тремя компонентами и типичен для экранов. CMYK связан с печатными красками, а HSB разделяет тон, насыщенность и яркость. Одинаковое число каналов не гарантирует одинаковый смысл компоненты, поэтому модель нельзя подменять простой арифметикой байтов.

Где появляется сжатие

Форматы без потерь сохраняют точные значения отсчётов или пикселей, а методы с потерями отбрасывают детали, менее заметные человеку. Коэффициент сжатия применяют к исходному объёму в указанном направлении: если файл уменьшился в четыре раза, итог составляет четверть первоначального размера, а не минус четыре процента.

Техника проверки

Запишите формулу с единицами до подстановки чисел. После вычисления битов отдельно переведите их в байты и более крупные единицы. Оцените порядок величины: минута многоканального звука не должна случайно оказаться меньше короткой текстовой строки. Такая оценка быстро обнаруживает забытые каналы и множитель восемь.

Расчёт как проверяемая функция

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

def pcm_bytes(seconds: float, hz: int, bits: int, channels: int) -> int:
    total_bits = seconds * hz * bits * channels
    return int(total_bits / 8)

def raster_bytes(width: int, height: int, bits_per_pixel: int) -> int:
    return width * height * bits_per_pixel // 8

print(pcm_bytes(90, 48_000, 24, 2))
print(raster_bytes(1920, 1080, 24))

Результат описывает сырой поток без заголовка, выравнивания и сжатия. Это не недостаток формулы, если допущение записано. Ошибка возникает, когда рассчитанный сырой объём молча называют размером конкретного WAV, PNG или другого контейнера.

Практика: медиапакет для эксперимента

Рассчитайте объём пяти минут монофонической записи 44,1 кГц и 16 бит, затем стереозаписи с теми же параметрами. Для изображения 3840×2160 сравните 24 и 32 бита на пиксель. Представьте ответы в байтах, МиБ и битах, сохраняя промежуточные единицы. После этого предположите коэффициент сжатия 3:1 и отдельно подпишите, что это модельный коэффициент, а не гарантированное свойство формата.

Источники