基於python的快速傅里葉變換FFT(二)
本文在上一篇博客的基礎上進一步探究正弦函數及其FFT變換。
知識點
FFT變換,其實就是快速離散傅里葉變換,傅立葉變換是數字信號處理領域一種很重要的算法。要知道傅立葉變換算法的意義,首先要了解傅立葉原理的意義。傅立葉原理表明:任何連續測量的時序或信號,都可以表示為不同頻率的正弦波信號的無限疊加。而根據該原理創立的傅立葉變換算法利用直接測量到的原始信號,以累加方式來計算該信號中不同正弦波信號的頻率、振幅和相位。
和傅立葉變換算法對應的是反傅立葉變換算法。該反變換從本質上說也是一種累加處理,這樣就可以將單獨改變的正弦波信號轉換成一個信號。因此,可以說,傅立葉變換將原來難以處理的時域信號轉換成了易於分析的頻域信號(信號的頻譜),可以利用一些工具對這些頻域信號進行處理、加工。最后還可以利用傅立葉反變換將這些頻域信號轉換成時域信號。
假設FFT之后某點n用復數a+bi表示,那么這個復數的模就是An=sqrt(a*a+b*b)(某點處的幅度值An = A*(N/2))
代碼實現
包的安裝步驟見上一篇博客。
y = sin(2*pi*fs*t);Fs=150Hz,fs=25Hz。具體代碼如下:
import matplotlib.pyplot as plt import numpy as np import seaborn Fs = 150.0; # sampling rate采樣率 Ts = 1.0/Fs; # sampling interval 采樣區間 t = np.arange(0,1,Ts) # time vector,這里Ts也是步長 ff = 25; # frequency of the signal信號頻率 y = np.sin(2*np.pi*ff*t) n = len(y) # length of the signal k = np.arange(n) T = n/Fs frq = k/T # two sides frequency range frq1 = frq[range(int(n/2))] # one side frequency range YY = np.fft.fft(y) # 未歸一化 Y = np.fft.fft(y)/n # fft computing and normalization 歸一化 Y1 = Y[range(int(n/2))] fig, ax = plt.subplots(4, 1) ax[0].plot(t,y) ax[0].set_xlabel('Time') ax[0].set_ylabel('Amplitude') ax[1].plot(frq,abs(YY),'r') # plotting the spectrum ax[1].set_xlabel('Freq (Hz)') ax[1].set_ylabel('|Y(freq)|') ax[2].plot(frq,abs(Y),'G') # plotting the spectrum ax[2].set_xlabel('Freq (Hz)') ax[2].set_ylabel('|Y(freq)|') ax[3].plot(frq1,abs(Y1),'B') # plotting the spectrum ax[3].set_xlabel('Freq (Hz)') ax[3].set_ylabel('|Y(freq)|') plt.show()
結果
結果驗證
某點處的幅度值An = A*(N/2),A表示原始信號的幅值,N表示采樣點。
1、原函數頻率fs=25Hz,所以ts=1/25=0.04。與圖中第一個波形相同。
2、已知A=1,N=150,由此可以計算出An=75。與圖中第二個波形相同。
3、歸一化幅度值=An/n=75/100=0.75。
---------------------
作者:趙至柔
來源:CSDN
原文:https://blog.csdn.net/qq_39516859/article/details/79770564
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!