Кодирование звука: дискретизация
Разбираемся, как непрерывный звук превращается в числа: что такое дискретизация, частота и глубина кодирования звука.
Дискретизация — это измерение звука много раз в секунду и запись каждого замера числом. Так непрерывная волна превращается в набор цифр.
Звук — это волна
Когда ты говоришь или играет музыка, воздух колеблется — это звуковая волна. Микрофон превращает её в плавно меняющийся электрический сигнал. Но компьютер не умеет хранить «плавное» — ему нужны числа, причём дискретные (отдельные). Как же записать гладкую волну набором чисел? Здесь и приходит на помощь дискретизация.
Дискретизация: измеряем волну по точкам
Представь, что ты снимаешь высоту волны на верёвочке. Гладкую кривую целиком записать нельзя, зато можно очень часто измерять её высоту: сейчас 5, через миг 7, потом 6, потом 2... Получится список чисел, который приблизительно повторяет форму волны. Чем чаще измеряешь — тем точнее приближение.
Это похоже на то, как кино состоит из множества отдельных кадров: показывают их так быстро, что глаз видит непрерывное движение. Звук в компьютере — это тоже «кадры», только звуковые. Их называют отсчётами (или сэмплами).
Два главных параметра
Качество оцифрованного звука зависит от двух чисел.
- Частота дискретизации — сколько замеров делают за одну секунду. Измеряется в герцах (Гц). Для музыки обычно берут
44100Гц — то есть 44100 замеров в секунду! Чем выше частота, тем точнее и чище звук. - Глубина кодирования — сколько бит отводят на запись одного замера. Чаще всего 16 бит. Чем больше бит, тем точнее записана громкость каждого отсчёта.
Чем выше частота дискретизации и глубина кодирования, тем качественнее звук — и тем больше места занимает файл.
Почему 44100 — не случайное число
Откуда взялась эта странная цифра — 44100 замеров в секунду? Она связана с устройством нашего слуха. Человеческое ухо различает звуки частотой примерно до 20000 колебаний в секунду (20 кГц); выше — уже ультразвук, который слышат собаки и летучие мыши, но не мы. Существует математическое правило (теорема о дискретизации): чтобы точно записать звук, надо делать замеры как минимум вдвое чаще самой высокой частоты звука. Вдвое больше 20000 — это 40000, а с небольшим запасом получилось 44100. Так что частота 44.1 кГц выбрана не наугад, а ровно такой, чтобы захватить весь слышимый человеком диапазон. Для телефонной речи, где важна разборчивость, а не музыкальное богатство, хватает и 8000 Гц — поэтому голос в телефоне звучит «уже», чем музыка в наушниках.
Как посчитать объём звука
Логика та же, что и с картинкой: перемножаем всё, что влияет на размер. Для одного канала (моно):
Объём = частота × глубина × время (в битах)
Если звук стерео (два канала — левый и правый), результат умножают ещё на 2. Посчитаем на примере.
Попробуй сам
Вычислим объём 5 секунд стереозвука хорошего качества. Числа получатся внушительные — поймёшь, почему музыку сжимают в mp3.
chastota = 44100 # замеров в секунду (Гц)
glubina = 16 # бит на один замер
vremya = 5 # секунд
kanaly = 2 # стерео = 2 канала
obem_bit = chastota * glubina * vremya * kanaly
obem_bayt = obem_bit // 8
obem_mb = obem_bayt / 1024 / 1024
print("Замеров всего:", chastota * vremya * kanaly)
print("Объём в битах:", obem_bit)
print("Объём в байтах:", obem_bayt)
print("Объём в Мбайт:", round(obem_mb, 2))
Вывод:
Замеров всего: 441000 Объём в битах: 7056000 Объём в байтах: 882000 Объём в Мбайт: 0.84
Почти мегабайт всего за 5 секунд! Целая песня заняла бы десятки мегабайт. Поменяй kanaly на 1 (моно) — объём уменьшится вдвое. А снизишь chastota до 8000 (как у телефона) — звук станет глуше, зато файл намного легче. Вот тебе и компромисс между качеством и размером.
MP3 и магия «незаметного» сжатия
Мы посчитали, что качественный звук «весит» огромными темпами: пять секунд — почти мегабайт, а целая песня заняла бы десятки мегабайт. Но в плеере песни занимают в разы меньше. Снова работает сжатие, и формат MP3 — самый знаменитый его пример. Его придумали, изучив, как устроен человеческий слух. Оказалось, мы многого не слышим: очень тихий звук рядом с громким «теряется», часть частот ухо не различает. MP3 безжалостно выбрасывает всё, что мы всё равно не услышим, и за счёт этого ужимает файл в 10 и более раз почти без заметной потери качества. Это сжатие с потерями — точь-в-точь как JPG для картинок, только для звука. Благодаря этой идее в карман помещаются тысячи песен, а музыка мгновенно загружается из интернета. Удивительно, но в основе всего этого — простое понимание того, как мы слышим, и готовность пожертвовать тем, что ухо всё равно не заметит. Вот так знание про дискретизацию и объём звука превращается в технологию, которой пользуются миллиарды людей каждый день.
Частые ошибки
- Забывать про число каналов. Стереозвук вдвое тяжелее моно — не пропусти множитель 2.
- Путать частоту дискретизации с частотой звука. Частота дискретизации — это сколько замеров в секунду, а не высота тона.
- Не переводить биты в байты. Формула даёт биты; для байтов делим на 8.
Запомни
- Дискретизация превращает звуковую волну в набор чисел-отсчётов.
- Частота дискретизации — число замеров в секунду (обычно 44100 Гц).
- Глубина кодирования — число бит на один замер (обычно 16).
- Объём = частота × глубина × время × число каналов (бит), делим на 8 для байт.