Часть-1

Преобразование Фурье, бесценный инструмент обработки сигналов, представляет собой математический метод, которому более 200 лет. Он по-прежнему продолжает оставаться активной областью исследований. В этой истории я постараюсь изложить некоторые простые, но глубокие аспекты. Если вы эксперт, не стесняйтесь добавлять ценность истории в разделе комментариев, а если вы новичок в этой теме, наслаждайтесь!

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

Интересно, что служит посредниками между этими двумя мирами! Синусоиды! Синусоида, т. е. A cos(ωt+θ) или A sin(ωt+θ) — это уникальный сигнал, наделенный рядом особых свойств. Мы рассмотрим все эти свойства в некоторых других предстоящих историях. Для этой настоящей истории достаточно знать, что синусоида может быть полностью определена тремя величинами, а именно. амплитуда A, фаза θ и частота ω (или 2πf).

Прежде чем приступить к работе с преобразованием Фурье, давайте познакомимся с рядами Фурье. Анализ ряда Фурье помогает нам переопределить периодический сигнал как некоторое представление синусоидального ряда. Информация об амплитуде и фазе извлекается из корреляции синусоид с интересующим нас сигналом на гармонически связанных частотах. Затем график зависимости амплитуды и фазы от частоты дает визуальное описание состава сигнала в частотной области.

Что произойдет, если сигнал не будет периодическим? Предполагается, что апериодический сигнал является периодическим с бесконечным периодом времени. И теперь проводится корреляция между интересующим нас сигналом и бесконечным числом синусоид, частоты которых непрерывно изменяются. Это преобразование Фурье, наш телепорт в частотную область.

Давайте закодируем простую синусоиду с амплитудой 1 и частотой 25, применим преобразование Фурье и посмотрим, как выглядит сигнал в частотной области.

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams[‘figure.figsize’] = [7,4]
plt.rcParams.update({‘font.size’:10})
sig_step = 0.001
t = np.arange(start=0,stop=1,step=data_step)
sig = np.sin(2*np.pi*25*t)
plt.plot(t,sig)

SciPy предоставляет нам модульscipy.fft, который я буду использовать, чтобы проникнуть в частотную область. (Если вы новичок в БПФ, поймите, что БПФ означает быстрое преобразование Фурье, и это алгоритм, который эффективно вычисляет преобразование Фурье последовательности. Я постараюсь подробно рассказать обо всем, что касается БПФ, в каком-нибудь другом посте.)

from scipy.fft import rfft,rfftfreq
n = len(t)
fft_sig = rfft(sig)
f = rfftfreq(n,data_step)
plt.plot(f,np.abs(fft_sig))

Амплитудный спектр преобразования Фурье равен

Интересный! Мы ясно видим пик на частоте 25 и понимаем, что наш сигнал представляет собой синусоиду с частотой 25. Давайте немного изменим наш сигнал.

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = [7,4]
plt.rcParams.update({'font.size':10})

sig_step = 0.001
t = np.arange(start=0,stop=1,step=data_step)
sig = np.sin(2*np.pi*25*t)+np.sin(2*np.pi*75*t)+np.sin(2*np.pi*125*t)

plt.plot(t,sig)

Амплитудный спектр теперь

Мы можем ясно видеть три пика на частотах 25, 75 и 125, что указывает на то, что наш сигнал состоит из трех синусоид с частотами 25, 75 и 125.

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

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = [7,4]
plt.rcParams.update({'font.size':10})

sig_step = 0.001
t = np.arange(start=0,stop=1,step=data_step)
sig = np.sin(2*np.pi*25*t)+5*np.sin(2*np.pi*75*t)+10*np.sin(2*np.pi*125*t)

plt.plot(t,sig)

Снова три пика на 25, 75 и 125, но на этот раз с разной амплитудой. Это указывает на то, что наш сигнал состоит из трех синусоид с различной амплитудой.

Волшебно, верно! Во временной области у нас были амплитуды, изменяющиеся со временем, а в частотной области у нас были амплитуды, изменяющиеся в зависимости от частоты. Можно также сказать, что мы видим своего рода разреженное представление сигнала во временной области в частотной области. Но… Но… сценарии реального мира довольно запутаны. Сигналы, которые мы записываем, часто зашумлены. Давайте посмотрим, что произойдет, если мы добавим случайный шум к вышеуказанному сигналу.

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = [7,4]
plt.rcParams.update({'font.size':10})

sig_step = 0.001
t = np.arange(start=0,stop=1,step=data_step)
sig = np.sin(2*np.pi*25*t)+np.sin(2*np.pi*75*t)+np.sin(2*np.pi*125*t)+np.random.randn(len(t))

plt.plot(t,sig)

Амплитудный спектр показывает пики с шумом вокруг.

Проблемно, да! Можем ли мы что-то сделать, чтобы избавиться от шума? Получаем ли мы какое-то представление об этом изображении, чтобы отфильтровать шум от сигнала!

Сделайте паузу. Мы продолжим нашу дискуссию в следующем посте. Вот Часть-2. Нажмите на нее, чтобы перейти к следующей части истории.