【python】 【绘图】实现快速傅里叶变换

版权声明:本文为博主原创文章,未经博主允许不得转载。保留追究法律责任,转载联系博主。交流欢迎加QQ群463339221。 https://blog.csdn.net/m0_37362454/article/details/82115148
# -*- coding: utf-8 -*-
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()

实现结果

结果验证

假设我们有一个信号,它含有一个频率为180Hz,幅度为7V的交流信号;一个频率为390Hz,幅度为1.5V的交流信号;一个频率为600Hz,幅度为5.1V的交流信号。用数学表达式就是如下: 
y=7*np.sin(2*np.pi*180*x) + 1.5*np.sin(2*np.pi*390*x)+5.1*np.sin(2*np.pi*600*x) 
从图中我们可以看到,在第181点、第391点、和第601点附近有比较大的值。分别计算这三个点的模值,结果如下: 
181点: 4900 
391点:1030 
601点:2600 
按照公式,可以计算出180Hz信号的幅度为:4900/(N/2)=384/(1400/2)=7;390Hz信号的幅度为:1030/(N/2)=1030/(1400/2)=1.5。可见,从频谱分析出来的幅度是正确的。 
注:600Hz信号的幅度异常,具体原因为检查出来,后期更新。

猜你喜欢

转载自blog.csdn.net/m0_37362454/article/details/82115148
今日推荐