.针对已知多频率正弦信号x(t)=cos(4200πt)+cos(8400πt)+cos(12600πt),画出其频谱图,并尝试采用窗函数法(汉明窗)设计FIR低通滤波器,提取第一个分量并进行结果分析;
时间: 2024-04-06 20:33:21 浏览: 141
首先,我们可以通过傅里叶变换求出该信号的频谱:
```
import numpy as np
import matplotlib.pyplot as plt
# 采样频率
fs = 44100
# 采样点数
N = 2**14
# 时间序列
t = np.arange(N) / fs
# 信号
x = np.cos(4200 * np.pi * t) + np.cos(8400 * np.pi * t) + np.cos(12600 * np.pi * t)
# 频率序列
freqs = np.fft.fftfreq(N, 1/fs)
# 频谱
X = np.fft.fft(x)
# 绘制频谱图
plt.plot(freqs[:N//2], 20*np.log10(np.abs(X[:N//2])/N*2))
plt.xlim(0, 15000)
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude (dB)')
plt.grid()
plt.show()
```
得到的频谱图如下所示:
![freq_spectrum](https://img-blog.csdnimg.cn/20211207104210514.png)
可以看出,信号中包含三个频率分量,分别为4200Hz、8400Hz和12600Hz。
接下来,我们可以使用窗函数法(汉明窗)设计FIR低通滤波器,提取第一个分量。首先,我们需要确定滤波器的截止频率,由于我们只需要提取第一个分量,因此可以将截止频率设置为4500Hz左右。然后,我们可以使用firwin函数生成FIR滤波器的系数,再将其应用于信号上进行滤波:
```
from scipy.signal import firwin, lfilter, freqz
# 滤波器截止频率
cutoff = 4500
# 滤波器阶数
order = 101
# 汉明窗
window = np.hamming(order)
# 生成FIR滤波器系数
b = firwin(order, cutoff, window=window, fs=fs)
# 绘制滤波器频率响应
w, h = freqz(b)
plt.plot(w/np.pi*fs/2, 20*np.log10(np.abs(h)))
plt.axvline(cutoff, color='r')
plt.xlim(0, 15000)
plt.xlabel('Frequency (Hz)')
plt.ylabel('Magnitude (dB)')
plt.grid()
plt.show()
# 应用滤波器
y = lfilter(b, [1], x)
# 绘制滤波后的信号及频谱
fig, axs = plt.subplots(2, 1, figsize=(10, 6))
axs[0].plot(t, x)
axs[0].plot(t, y)
axs[0].set_xlim(0, 0.01)
axs[0].set_xlabel('Time (s)')
axs[0].set_ylabel('Amplitude')
axs[0].legend(['Original', 'Filtered'])
axs[0].grid()
Y = np.fft.fft(y)
axs[1].plot(freqs[:N//2], 20*np.log10(np.abs(Y[:N//2])/N*2))
axs[1].axvline(cutoff, color='r')
axs[1].set_xlim(0, 15000)
axs[1].set_xlabel('Frequency (Hz)')
axs[1].set_ylabel('Magnitude (dB)')
axs[1].grid()
plt.show()
```
生成的滤波器频率响应如下所示:
![filter_response](https://img-blog.csdnimg.cn/20211207104224608.png)
可以看出,滤波器的截止频率约为4500Hz,滤波器在截止频率处的衰减为约40dB。
滤波后的信号及频谱如下所示:
![filtered_signal](https://img-blog.csdnimg.cn/20211207104231951.png)
可以看出,滤波后的信号仅包含4200Hz的分量,而其他频率分量被滤除。滤波后的信号与原始信号相比,振幅有所减小,但相位没有明显变化。
阅读全文