Глубина кодирования для FLAC
Erstellt am: 23. Januar 2025
Erstellt am: 23. Januar 2025
Музыкальная группа планирует записать трёхминутный сингл. Стереозвук пишется в домашней студии с частотой дискретизации 48 000 Гц. Глубину кодирования студия предлагает группе выбрать самостоятельно.
Полученная запись записывается в формат FLAC со сжатием в 2 раза.
По правилам радиостанции файл не может занимать больше 30 Мбайт.
Укажи все возможные варианты глубины кодирования, которые может позволить себе группа.
Разберём задачу шаг за шагом.
Исходные данные:
Общий объём в битах для всей записи:
Подставим числа:
Переводим биты в байты, разделив на 8:
Теперь переведём байты в мегабайты (по байт в 1 МБ):
После сжатия вдвое получаем:
Обозначим
Численно это приближённо даёт . Значит
Файл не должен превышать 30 МБ, поэтому:
Так как глубина кодирования — целое число, получаем:
Таким образом, любая целочисленная глубина кодирования от 1 до 29 бит включительно даёт итоговый FLAC-файл объёмом не более 30 МБ.
В аудиопрактике, правда, обычно используются «круглые» значения 8, 16, 24, 32 бита (иногда 20). Из них, согласно расчёту, 8, 16 и 24 бита проходят по объёму (≤ 30 МБ), а 32 бита уже превышают лимит.
Представление/хранение чисел
Напомним алгоритм получения дополнительного кода для отрицательного числа -X:
Получить прямой код числа X.
Инвертировать, то есть в представлении числа X поменять 0 на 1, а 1 на 0.
Прибавить к результату 1.
Например, при хранении в 4 битах дополнительный код числа -6 получается так:
Чтобы найти дополнительный код числа в 5 битах, выполните следующие шаги:
Запишите прямой код числа в 5 битах
Инвертируйте все биты (меняете 0 на 1 и 1 на 0)
Прибавьте 1 к полученному результату
Таким образом, дополнительный код числа в 5 битах:
Кодирование текста
Напомним основные сведения о кодировке UTF-8.
Количество отводимых на символ байтов зависит от того, к какой группе кодовой таблицы он относится.
Текст на армянском языке сохранён в файле в кодировке UTF-8. Треть всех символов — это пробелы, цифры и знаки препинания.
Размер файла составляет 150 Кбайт.
Каков будет размер файла, если сохранить его в кодировке UTF-32?
Для решения задачи важно учесть, что в UTF‑8 символы из разных диапазонов занимают разное число байт. По условию:
Пусть:
В UTF‑8:
Итого размер (в байтах) в UTF‑8:
По условию, это .
Тогда
В UTF‑32 любой символ занимает ровно 4 байта. Следовательно, при тех же символах объём станет
Таким образом, при сохранении в UTF‑32 размер файла составит 360 КБ (если 1 KB принимается равным 1024 байтам).
Кодирование изображений
Один из распространённых способов сжатия называется RLE (Run-Length Encoding). Он используется, когда в изображении часто встречаются последовательности одинаковых по цвету пикселей.
Пиксели из прямоугольной формы вытягиваются в линию, и каждый кусок одинакового цвета кодируется отдельно: сначала количество пикселей в нём, потом их цвет.
Если в изображении не больше 256 пикселей, то на количество пикселей в последовательности достаточно отвести 1 байт (8 бит). А каждый кусок одинаковых пикселей будет кодироваться 4 байтами.
По приведённой ниже картинке определи:
размер изображения в байтах при хранении цвета каждого пикселя:
размер изображения в байтах при сжатии алгоритмом RLE:
Ниже разберёмся, как в целом решаются подобные задачи, а в конце приведём пример расчёта. К сожалению, без конкретного изображения (его точного распределения пикселей по цветам) нельзя назвать точные числа. Но алгоритм вычисления всегда один и тот же.
Обычно предполагается, что каждый пиксель хранится в 24-битном (трёхбайтовом) формате: 1 байт на красный канал (R), 1 байт на зелёный (G) и 1 байт на синий (B).
Если в изображении пикселей, то при «сыром» хранении (без сжатия) объём будет
Часто в задачах говорится, что «изображение прямоугольное, имеет ширину и высоту », тогда общее число пикселей .
Алгоритм RLE (Run-Length Encoding) «вытягивает» все пиксели по строкам (или иногда иначе, но стандартно — слева направо, сверху вниз) в одну последовательность, а затем ищет подряд идущие пиксели одинакового цвета. Каждая такая серия (run) кодируется отдельно:
Итого на одну серию (кусок одинаковых по цвету подряд идущих пикселей) уходит 4 байта.
Чтобы найти объём сжатого RLE-файла, нужно:
Допустим, у нас есть простое изображение шириной 8 пикселей и высотой 1 пиксель (всего 8 точек). Его цвета слева направо такие:
Тогда:
Без сжатия (каждый пиксель по 3 байта):
С учётом RLE:
Заметим, что 12 байт в RLE против 24 байт без сжатия — это ровно вдвое меньше.
В тексте задачи упоминается «По приведённой ниже картинке…», но сама картинка нам здесь недоступна. Чтобы ответить на вопрос с конкретными числами, нужно знать:
Итоговые формулы:
где — количество «кусков» одинакового цвета.
В самой задаче, скорее всего, нужно было просто подсчитать (по картинке) число серий , а затем умножить на 4. После чего сравнить с .
Размер при хранении цвета каждого пикселя
Размер при сжатии RLE
Без конкретных данных о самой картинке точные цифры назвать нельзя, но именно так они рассчитываются в классическом задании.