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

我们指定信号的采样率为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()

参考:
快速傅里叶变换

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容