版权声明:本文为博主原创文章,未经博主允许不得转载。保留追究法律责任,转载联系博主。交流欢迎加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信号的幅度异常,具体原因为检查出来,后期更新。