我们指定信号的采样率为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*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()
参考:
快速傅里叶变换
网友评论