Амплитуда, частота и фаза

Разбираем три ручки, которыми задают любое гармоническое колебание.

Гармонический сигнал полностью описывается тремя числами: амплитудой A (размах), частотой f (как часто колеблется) и фазой phi (с какого места начинается).

Формула x[n] = A*sin(2*pi*f*n/fs + phi) — это вся ДНК синусоиды. Три параметра, и каждый отвечает за своё ощущение: амплитуда — за громкость, частота — за высоту тона, фаза — за сдвиг во времени. Понять их по отдельности — значит понять язык спектра.

Амплитуда — размах и громкость

Амплитуда A — максимальное отклонение от нуля. Удвоить A — удвоить размах сигнала; для звука это примерно +6 дБ громкости. Амплитуда не влияет на то, какая это нота, только на то, насколько громко она звучит.

Частота — высота тона

Частота f — число полных колебаний в секунду, в герцах. 440 Гц — это нота «ля» первой октавы. Удвоение частоты — на октаву выше. Частота определяет положение пика в спектре.

Фаза — сдвиг старта

Фаза phi (в радианах) говорит, с какого места цикла начинается волна. Сдвиг на pi/2 превращает синус в косинус. На слух фазу одиночного тона мы не различаем, но при сложении нескольких волн фаза решает всё: совпадающие по фазе складываются, противофазные гасят друг друга.

import math

fs = 16
A, f, phi = 2.0, 1.0, math.pi / 2   # амплитуда 2, фаза pi/2 -> косинус*2
x = [round(A * math.sin(2 * math.pi * f * n / fs + phi), 3) for n in range(8)]
print("A=2, phi=pi/2:", x)
print("Максимум:", max(x), "(= амплитуде A)")

Вывод:

A=2, phi=pi/2: [2.0, 1.848, 1.414, 0.765, 0.0, -0.765, -1.414, -1.848]
Максимум: 2.0 (= амплитуде A)

Фаза в деле: сложение и гашение

Сложим два одинаковых синуса. В фазе — амплитуда удваивается. В противофазе (сдвиг на pi) — они полностью гасят друг друга. На этом эффекте работает активное шумоподавление в наушниках.

import math

fs = 16
a = [math.sin(2 * math.pi * n / fs) for n in range(8)]
in_phase = [round(2 * v, 3) for v in a]                       # сумма с собой
anti = [round(v + math.sin(2 * math.pi * n / fs + math.pi), 3) for n, v in enumerate(a)]

print("В фазе (сумма):   ", in_phase)
print("В противофазе:    ", anti)

Вывод:

В фазе (сумма):    [0.0, 0.765, 1.414, 1.848, 2.0, 1.848, 1.414, 0.765]
В противофазе:     [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, -0.0, -0.0]

Два сигнала с одинаковой амплитудой и частотой, но фазой, отличающейся на pi, дают чистый ноль. Фаза — не «мелочь», а полноправный параметр.

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

Удобно объединить амплитуду и фазу в одно комплексное число. Колебание A*cos(2*pi*f*n/fs + phi) — это вещественная часть от A*e^(i*phi) * e^(i*2*pi*f*n/fs). Множитель A*e^(i*phi) называют комплексной амплитудой: его модуль — это A, а аргумент — это phi. Именно поэтому преобразование Фурье выдаёт комплексные числа: каждое несёт сразу амплитуду (модуль) и фазу (аргумент) соответствующей частоты. Так два параметра из трёх упаковываются в одно число, а третий — частота — задаётся индексом в спектре.

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

  • Считать, что фаза не важна. Для одиночного тона на слух — да, но при сложении и фильтрации фаза определяет результат.
  • Путать частоту и угловую частоту. f в герцах, w = 2*pi*f в радианах/с; в формулах легко перепутать множитель 2*pi.
  • Менять амплитуду, ожидая смены ноты. Высоту тона задаёт только частота; амплитуда — это громкость.

Итог

  • Синус задаётся тремя числами: амплитуда A, частота f, фаза phi.
  • Амплитуда — громкость, частота — высота тона, фаза — сдвиг старта.
  • Противофазные волны гасят друг друга — основа активного шумоподавления.
  • Амплитуду и фазу удобно объединить в комплексную амплитуду — это язык Фурье.
Проверьте себя
1. Какой параметр синусоиды отвечает за высоту тона?
AАмплитуда
BЧастота
CФаза
DДлина массива
2. Что получится при сложении двух одинаковых синусов в противофазе (сдвиг pi)?
AУдвоенная амплитуда
BПолное гашение (ноль)
CУдвоенная частота
DШум
3. Почему преобразование Фурье выдаёт комплексные числа?
AИз-за ошибок округления
BКаждое число несёт сразу амплитуду (модуль) и фазу (аргумент) частоты
CЧтобы усложнить расчёт
DЭто случайность реализации