Кажется, что вы хотите получить преобразование Фурье сигнала из вики:
Преобразование Фурье (FT) разлагает функцию времени (сигнал)в частотах, составляющих его
По сути, это математическая операция, которая при применении к сигналу дает представление о том, как присутствует каждая частота во временном ряду.Чтобы понять это, было бы полезно взглянуть на математическое определение DFT :
Где k
здесь развернуто до t N-1
, чтобы вычислить все DFT
коэффициенты.
Первое, на что следует обратить внимание, это то, что это определение несколько напоминает определение соотношения двух функций, в данном случае x(n)
и отрицательной экспоненциальной функции.Хотя это может показаться немного абстрактным, используя формулу Эйлера и немного подыгрывая определению, ДПФ можно выразить как корреляцию как с синусоидальной, так и с косинусоидальной волной, которая будет учитыватьдля мнимой и действительной частей DFT
.
. При этом следует учитывать, что это, по сути, вычисление корреляции, когда соответствующий синус или косинус из разложения комплексной экспоненты совпадает с синусоидой сложного1029 *, будет пик в X(K)
, что означает, что такая частота присутствует в сигнале.
Итак, дав очень краткое теоретическое обоснование, давайте рассмотрим пример, чтобы увидеть, как этоможет быть реализовано в Python.Давайте рассмотрим следующий сигнал :
Fs = 150.0; # sampling rate
Ts = 1.0/Fs; # sampling interval
t = np.arange(0,1,Ts) # time vector
ff = 50; # frequency of the signal
y = np.sin(2*np.pi*ff*t)
Теперь, DFT можно вычислить с помощью np.fft.fft
, который, как уже упоминалось, будет сообщать вам, чтовклад каждой частоты в сигнал теперь в преобразованной области:
n = len(y) # length of the signal
k = np.arange(n)
T = n/Fs
frq = k/T # two sides frequency range
frq = frq[:len(frq)//2] # one side frequency range
Y = np.fft.fft(y)/n # dft and normalization
Y = Y[:n//2]
Теперь, если мы построим реальный спектр, вы увидите, что мы получаем пик на частоте 50 Гц, что в математических терминахэто будет дельта-функция с центральной частотой 50 Гц.Это можно проверить в следующей таблице пар преобразования Фурье .
Таким образом, для используемого сигнала мы получили бы:
plt.plot(frq,abs(Y)) # plotting the spectrum
plt.xlabel('Freq (Hz)')
plt.ylabel('|Y(freq)|')