Идея Фурье: любой сигнал — сумма синусов
Постигаем центральную идею всего частотного анализа: сложное колебание складывается из простых синусов.
Идея Фурье: любой (достаточно «приличный») сигнал можно представить как сумму синусоид разных частот, амплитуд и фаз. Набор этих синусов — спектр сигнала.
Это одна из красивейших идей в математике и инженерии. Жан-Батист Фурье в 1822 году показал: даже резкий, угловатый сигнал — например, прямоугольный меандр — можно собрать из плавных синусоид. Звучит невероятно, но мы сейчас увидим это своими глазами, складывая синусы и наблюдая, как из них «вырастает» прямоугольник.
Ряд Фурье для периодического сигнала
Для периодического сигнала разложение называется рядом Фурье: сигнал = сумма гармоник, частоты которых кратны основной. Меандр раскладывается в сумму нечётных гармоник синуса с убывающими амплитудами: (4/pi)*(sin(w) + sin(3w)/3 + sin(5w)/5 + ...). Соберём приближение из одной и из трёх гармоник.
import math
def square_approx(t, terms):
s = 0.0
for k in range(1, 2 * terms, 2): # 1, 3, 5, ...
s += (4 / math.pi) * math.sin(2 * math.pi * k * t) / k
return s
one = [round(square_approx(i / 8, 1), 3) for i in range(8)]
three = [round(square_approx(i / 8, 3), 3) for i in range(8)]
print("1 гармоника: ", one)
print("3 гармоники: ", three)
Вывод:
1 гармоника: [0.0, 0.9, 1.273, 0.9, 0.0, -0.9, -1.273, -0.9] 3 гармоники: [0.0, 1.02, 1.103, 1.02, 0.0, -1.02, -1.103, -1.02]
С одной гармоникой это ещё гладкий синус. С тремя — вершина уже «приплюснулась» и стала ближе к плоской верхушке прямоугольника. Чем больше гармоник складываем, тем точнее воспроизводится резкий меандр.
Почему это работает: ортогональность синусов
Синусы разных частот «не мешают» друг другу: если перемножить два синуса с разными частотами и просуммировать за период, получится ноль. Это свойство называется ортогональностью. Благодаря ему каждую частоту можно «выудить» из сигнала независимо от других — на этом и держится анализ Фурье.
import math
N = 16
def dot(f1, f2):
return round(sum(math.sin(2 * math.pi * f1 * n / N) *
math.sin(2 * math.pi * f2 * n / N) for n in range(N)), 3)
print("sin(1)*sin(2):", dot(1, 2), "(разные частоты -> 0)")
print("sin(3)*sin(3):", dot(3, 3), "(одна частота -> не 0)")
Вывод:
sin(1)*sin(2): 0.0 (разные частоты -> 0) sin(3)*sin(3): 8.0 (одна частота -> не 0)
Скалярное произведение разных частот — ноль, одинаковых — нет. Значит, умножив сигнал на синус частоты f и просуммировав, мы измерим, «сколько частоты f в нём содержится». Это и есть один коэффициент спектра.
Как работает под капотом
Ряд Фурье годится для периодических сигналов, представляя их дискретным набором гармоник. Для непериодических вводят интеграл Фурье (преобразование Фурье) — там спектр непрерывный. А для конечного набора отсчётов в компьютере используют дискретное преобразование Фурье (ДПФ), которое мы реализуем в следующих уроках. Все три — варианты одной идеи: разложить сигнал по базису синусов (точнее, комплексных экспонент). Резкие фронты, как у меандра, требуют бесконечно много гармоник; обрыв ряда на конечном числе даёт характерные «звоны» у краёв — эффект Гиббса, который виден как небольшие выбросы возле скачков.
Частые ошибки
- Думать, что сигнал «состоит» из синусов физически. Это математическое представление: синусы — удобный базис, а не «настоящие» компоненты внутри провода.
- Ждать идеального меандра из конечного числа гармоник. Из-за эффекта Гиббса у краёв всегда остаётся выброс ~9%, сколько гармоник ни бери.
- Путать ряд и преобразование Фурье. Ряд — для периодических (дискретный спектр), преобразование — для непериодических (непрерывный спектр).
Итог
- Любой сигнал представим как сумма синусоид разных частот — идея Фурье.
- Ряд Фурье раскладывает периодический сигнал на кратные гармоники.
- Синусы разных частот ортогональны — это позволяет измерять каждую частоту отдельно.
- Резкие фронты требуют много гармоник; обрыв ряда даёт эффект Гиббса.