Часть-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. Нажмите на нее, чтобы перейти к следующей части истории.