Звуковая волна: от воздуха к числам

Разбираемся, что такое звук физически, прежде чем оцифровывать его.

Звуковая волна — это колебание давления воздуха во времени; громкость задаёт амплитуду колебаний, а высота тона — их частоту.

Чтобы компьютер «услышал» звук, сначала нужно понять, что он слышит. Звук — это не вещь, а процесс: источник (струна, голосовые связки, динамик) толкает воздух, создавая волны сжатия и разрежения. Эти волны добегают до уха или микрофона и заставляют мембрану колебаться.

Две главные характеристики волны

Любую простую волну описывают два числа. Амплитуда — насколько сильно отклоняется давление; чем больше, тем громче. Частота — сколько колебаний в секунду (герцы, Гц); чем выше, тем выше тон. Нота «ля» первой октавы — это 440 Гц, то есть 440 колебаний в секунду.

амплитуда
   ^
 1 |    .-.        .-.        .-.
   |   /   \      /   \      /    0 +--/-----\----/-----\----/-----\---> время
   | /       \  /       \  /       -1 |'         '-'         '-'         '
   |<-- период T -->|
   частота f = 1 / T

Период T — длительность одного полного колебания. Частота — обратная величина: f = 1/T. Если период 1/440 секунды, то частота 440 Гц.

Микрофон: из воздуха в напряжение

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

Сложный звук — сумма простых

Реальный звук (голос, музыка) не похож на чистую синусоиду. Но есть фундаментальная идея: любой сложный звук можно представить как сумму простых синусоид разных частот и амплитуд. Это и есть основа преобразования Фурье, к которому мы придём. Покажем суммирование двух волн кодом.

import math

n = 16
# низкая частота (1 период) + высокая (3 периода), послабее
def wave(i):
    low = math.sin(2 * math.pi * 1 * i / n)
    high = 0.4 * math.sin(2 * math.pi * 3 * i / n)
    return round(low + high, 2)

mixed = [wave(i) for i in range(n)]
print("Сложная волна:", mixed)
print("Размах:", round(max(mixed) - min(mixed), 2))

Вывод:

Сложная волна: [0.0, 0.75, 0.99, 0.77, 0.6, 0.77, 0.99, 0.75, 0.0, -0.75, -0.99, -0.77, -0.6, -0.77, -0.99, -0.75]
Размах: 1.98

Мы сложили две синусоиды и получили волну посложнее. Преобразование Фурье делает обратное — раскладывает такую волну на составляющие частоты.

Полезно представить звук как «волны на воде от брошенного камня». Источник — это камень: голосовые связки или динамик толкают воздух, и от них расходятся кольца уплотнений. Но есть важная оговорка: молекулы воздуха никуда не летят вместе с волной — каждая лишь покачивается туда-сюда вокруг своего места, передавая толчок соседней. Поэтому громкий крик не «гонит» поток воздуха вам в лицо; он передаёт колебание давления. Эта картина объясняет, почему звук слабеет с расстоянием: энергия одного толчка размазывается по всё большей сфере воздуха.

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

Почему идея «сложный звук = сумма синусоид» так важна на практике? Именно она объясняет тембр — почему скрипка и флейта, играющие одну и ту же ноту «ля» 440 Гц, звучат по-разному. Основная частота у них одинаковая, но к ней примешаны разные по силе обертоны: 880 Гц, 1320 Гц и так далее. Ухо слышит эту «приправу» из верхних синусоид как характер инструмента или голоса. Разложив звук на частоты (что и делает Фурье), модель получает доступ ровно к той информации, по которой человек узнаёт говорящего.

Как работает под капотом

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

Частые ошибки

  • Путать амплитуду и частоту. Амплитуда — громкость, частота — высота тона; это независимые величины.
  • Считать звук «одной частотой». Реальный звук — смесь множества частот.
  • Забывать про знак. Отрицательные сэмплы — это не «ошибка», а разрежение воздуха; волна колеблется вокруг нуля.

Итоги

  • Звук — колебание давления воздуха; амплитуда = громкость, частота = высота тона.
  • Микрофон превращает колебания в аналоговое напряжение.
  • Любой сложный звук — сумма простых синусоид (база для Фурье).
  • В компьютере волна — список чисел: индекс = время, значение = амплитуда.
Проверьте себя
1. Что задаёт громкость звука?
AЧастота колебаний
BАмплитуда колебаний
CПериод тишины
DЧисло каналов
2. Как связаны период T и частота f волны?
Af = T
Bf = 1 / T
Cf = T в квадрате
DОни не связаны
3. Почему любой сложный звук можно разложить на синусоиды?
AЭто случайное свойство
BПотому что сложный звук — это сумма простых синусоид разных частот (основа Фурье)
CПотому что звук всегда одна частота
DЭто неверно