美文网首页
用python进行快速傅里叶变换(FFT)

用python进行快速傅里叶变换(FFT)

作者: 一位学有余力的同学 | 来源:发表于2021-03-17 15:36 被阅读0次

我们指定信号的采样率为1kHz,采样时间为1.5s

import numpy as np
from scipy.fftpack import fft,ifft

Fs = 1000 #采样频率
T = 1/Fs #采样周期,只相邻两数据点的时间间隔
L = 1500 #信号长度
t = list(range(1500)*T)

构造一个信号,其中包含幅值为 0.7 的 50 Hz 正弦量和幅值为 1 的 120 Hz 正弦量。
S = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t)

S = 0.7*np.sin(2*np.pi*50*t) + np.sin(2*np.pi*120*t)

添加符合标准正太分布的噪声信号:

X = S + np.random.rand(L)

在时域中绘制含噪声的信号:

plt.plot(t[:50], X[:50])
plt.xlabel("Time(s)")
plt.ylabel("Amplitude")
plt.title("Signol with random noise")
plt.show()
时域信号

计算信号的傅里叶变换

Y = fft(X)
p2 = np.abs(Y)   # 双侧频谱
p1 = p2[:int(L/2)]

定义频域 f 并绘制单侧幅值频谱 P1。与预期相符,由于增加了噪声,幅值并不精确等于 0.7 和 1。

f = np.arange(int(L/2))*Fs/L;
plt.plot(f,2*p1/L) 
plt.title('Single-Sided Amplitude Spectrum of X(t)')
plt.xlabel('f (Hz)')
plt.ylabel('|P1(f)|')
plt.show()
幅频图

完整代码

import numpy as np
from scipy.fftpack import fft,ifft
from matplotlib.pylab import plt

Fs = 1000 #采样频率
T = 1/Fs #采样周期,只相邻两数据点的时间间隔
L = 1500 #信号长度
t = np.arange(L)*T

S = 0.7*np.sin(2*np.pi*50*t) + np.sin(2*np.pi*120*t)
X = S + np.random.rand(L)

plt.plot(t[:50], X[:50])
plt.xlabel("Time(s)")
plt.ylabel("Amplitude")
plt.title("Signol with random noise")
plt.show()

Y = fft(X)
p2 = np.abs(Y)   # 双侧频谱
p1 = p2[:int(L/2)]
f = np.arange(int(L/2))*Fs/L;
plt.plot(f,2*p1/L) 
plt.title('Single-Sided Amplitude Spectrum of X(t)')
plt.xlabel('f (Hz)')
plt.ylabel('|P1(f)|')
plt.show()

参考:
快速傅里叶变换

相关文章

网友评论

      本文标题:用python进行快速傅里叶变换(FFT)

      本文链接:https://www.haomeiwen.com/subject/wozscltx.html