Любой сигнал, будь то звуковой, тенденции акций Facebook или радиовсплески от далеких звезд, можно разложить на (потенциально бесконечный) набор синусоидальных волн, так что все они складываются в исходный сигнал. Это в двух словах теорема Фурье.

По крайней мере, для меня было совсем не очевидно, почему это должно быть правдой. Далее следует не строгая математическая обработка, а визуальная интуиция.

Преобразование

Рассмотрим этот сложный на вид сигнал. Давайте попробуем разбить это на набор синусоидальных волн.

Мы видим, что сигнал идет от x = 0 к x = 1, и предполагаем, что он просто повторяется после этого (мы скоро разберемся, почему).

Затем мы можем аппроксимировать этот сигнал как синусоидальную волну с частотой 1. Это похоже на построение кривой, и здесь мы оптимизируем амплитуду синусоидальной волны (частота зафиксирована на 1).

Итак, у нас есть первая часть:

sine ( frequency = 1, amplitude = 1 )

Но это далеко не идеально. Давайте посмотрим на разницу между нашим приближением и исходным сигналом, чтобы увидеть, насколько мы ошибались.

Но это всего лишь еще один сигнал, который мы можем приблизить, и мы идем по кроличьей норе рекурсии.

Мы не можем использовать ту же частоту 1, потому что добавление другой волны с той же частотой будет означать, что мы увеличим амплитуду, но мы уже нашли оптимальную амплитуду. Итак, переходим к следующей частоте 2 (почему не 1,1 или 1,5 или любому из бесконечных чисел от 1 до 2? Мы тоже вернемся к этому через минуту).

Итак, у нас есть второй кусок:

sine ( frequency = 2, amplitude = 0.5 )

Давайте еще раз посмотрим на разницу.

Мы обнаружили, что для всех частот до 5 оптимальная амплитуда равна 0, а для частоты 6 - 0,333…, на этом этапе разница равна нулю.

Наш третий кусок:

sine ( frequency = 6, amplitude = 0.333… )

Наконец-то,

original signal = sin(freq=1, amp=1) + sin(freq=2, amp=0.5) + sin(freq=6, amp=0.333…)

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

А как насчет нашего предположения?

Мы предположили, что сигнал просто повторяется. Это означает, что мы можем разложить только конечный сегмент сигнала. Но это предположение, которое мы должны сделать так, чтобы наши частоты были кратны первой (базовой) частоте, здесь целые числа.

Допустим, одна из частей - это синусоида с частотой 1,5. Это означает, что он будет по-разному влиять на сигнал в x = 0.5 и x = 1.5, чего у нас не может быть, поскольку сигнал повторяется с частотой 1.

Даже если у нас все еще может получиться бесконечное количество частей, по крайней мере, это счетный вид.

Что это значит?

Если точка движется по кругу с постоянной скоростью, ее высота над землей имеет синусоидальную функцию. Скорость, с которой движется точка, соответствует частоте, а радиус круга соответствует амплитуде.

Добавляя другие сигналы, мы возвращаем наш исходный сигнал.

Благодаря теореме Фурье мы можем генерировать любой сигнал с кругами соответствующих частот и радиусов. Вот примерная прямоугольная волна, например.

Вы даже можете сделать Гомера Симпсона.

Почему это полезно?

Все это очень круто, но зачем вам это нужно?

  1. Существует быстрый алгоритм, называемый FFT (быстрое преобразование Фурье), который очень быстро дает нам частоты и амплитуды для любого сигнала.
  2. Когда у вас есть все, что вам нужно, очень легко делать такие вещи, как удаление шума, просто удаляя определенные частоты.
  3. Аудио фильтры используют «свертки», которые в остальном очень требовательны к вычислениям, но становятся очень быстрыми и сводятся к простому умножению частот после того, как у вас есть части. Это из-за теоремы о свертке. Следите за моей следующей публикацией об этом.

Спасибо за чтение этого. Я считаю, что это красиво и недооценивается, и надеюсь, что мне удалось заставить вас это увидеть. Я хотел бы услышать ваш отзыв.

Для создания графиков я использовал библиотеку Python thinkdsp Аллена Дауни. Его книга Think DSP и Этот семинар великолепны. Я также использовал код Дэна Шиффмана из Задача кодирования № 125 для создания анимации.