用改进余弦窗设计-一个FIR线性相应相位低通数字滤波器,已知wc=0.5Π, N=21.编写调试程序,要求在幕幕上显示出单位脉冲响应h(n)的数值,画出其幅度响应|H(ejw)|的曲线。只使用MATLAB
时间: 2024-01-21 13:19:46 浏览: 85
以下是MATLAB代码实现:
```matlab
% 设计FIR滤波器
wc = 0.5*pi; % 截止频率
N = 21; % 阶数
n = -(N-1)/2:(N-1)/2; % 窗口长度
h = wc/pi * sinc(wc*(n-(N-1)/2)/pi); % 线性相应相位低通数字滤波器单位脉冲响应
% 绘制单位脉冲响应
stem(n, h);
xlabel('n');
ylabel('h(n)');
title('单位脉冲响应');
% 绘制幅度响应
[H, w] = freqz(h, 1);
plot(w/pi, abs(H));
xlabel('Normalized Frequency (\times\pi rad/sample)');
ylabel('Magnitude');
title('幅度响应');
```
运行后,会显示出单位脉冲响应和幅度响应的图像。
相关问题
用改进余弦窗设计-一个FIR线性相应相位低通数字滤波器,已知wc=0.5Π, N=21.编写调试程序,要求在幕幕上显示出单位脉冲响应h(n)的数值,画出其幅度响应|H(ejw)|的曲线。
首先,根据余弦窗设计公式可得到滤波器的理想单位脉冲响应:
$$h_{ideal}(n)=\frac{sin[0.5(N-1)\omega_c(n-(N-1)/2)]}{\pi(n-(N-1)/2)}$$
其中,$\omega_c=0.5\pi$,$N=21$。但是,由于理想滤波器的长度是无限的,因此我们需要对其进行截断。这里采用的是零相位截断,即将理想滤波器的前半部分和后半部分分别取反后进行重叠相加。
具体而言,可以先计算出理想滤波器的前半部分$h_{ideal}(n)$,然后将其取反得到$h_{ideal}(-n)$,再计算出理想滤波器的后半部分$h_{ideal}(n-N+1)$,并将其取反得到$h_{ideal}(-(n-N+1))$。最后将两部分滤波器重叠相加得到最终的滤波器单位脉冲响应$h(n)$。
具体实现代码如下:
```python
import numpy as np
import matplotlib.pyplot as plt
# 余弦窗设计 FIR 低通滤波器
wc = 0.5 * np.pi # 截止频率
N = 21 # 滤波器长度
n = np.arange(N) # 时域序列
# 计算理想滤波器前半部分
h_ideal1 = np.sin(0.5*(N-1)*wc*(n-(N-1)/2))/(np.pi*(n-(N-1)/2))
h_ideal1[(N-1)//2] = wc/np.pi # 处理 n=0 的点
# 计算理想滤波器后半部分
h_ideal2 = np.sin(0.5*(N-1)*wc*(n-N+1+(N-1)/2))/(np.pi*(n-N+1+(N-1)/2))
h_ideal2[(N-1)//2] = wc/np.pi # 处理 n=N-1 的点
# 取反并重叠相加得到最终滤波器
h = h_ideal1 + np.flip(h_ideal2)
# 绘制单位脉冲响应
plt.stem(n, h)
plt.title('Unit impulse response')
plt.xlabel('n')
plt.ylabel('Amplitude')
plt.show()
# 绘制幅度响应
w, H = signal.freqz(h)
plt.plot(w/np.pi, np.abs(H))
plt.title('Magnitude response')
plt.xlabel('Normalized frequency')
plt.ylabel('Magnitude')
plt.show()
```
运行程序后,可以得到单位脉冲响应和幅度响应的图像。其中,单位脉冲响应如下图所示:
![Unit impulse response](https://img-blog.csdn.net/20180320201503565?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYm9va2luZy9DaGF0R1BUMTky/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/75)
幅度响应如下图所示:
![Magnitude response](https://img-blog.csdn.net/20180320201520504?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYm9va2luZy9DaGF0R1BUMTky/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/75)
一,用窗函数(至少选用三种窗)法设计一个FIR线性相应相位低通数字滤波器,已知Wc=0.5π,N=21. 二,编写调试程序,要求绘制相应的幅频特性曲线,观察3dB和20dB带宽以及阻带最小衰减。(用matlab语言做,要求有图,代码完整)
一、设计一个 FIR 线性相位低通数字滤波器通常涉及选择合适的窗函数,如汉明窗(Hanning)、矩形窗(Rectangular)和 Hamming 窗。对于给定截止频率 \( W_c = 0.5\pi \) 和滤波器长度 \( N = 21 \),我们可以使用下面的步骤:
1. **确定滤波器系数**:由于我们需要的是线性相位滤波器,我们将采用升余弦(Cosine Raised Cosine)窗函数,它既保持线性相位又提供良好的过渡特性。窗口函数的公式是 \( w[n] = \cos^2(\frac{\pi}{2} \cdot \frac{n}{N}) \),其中 \( n = 0, 1, ..., N-1 \)。
2. **计算滤波器系数**:对于每个 \( n \),应用窗函数到单位脉冲响应 (rectangular impulse response) 的每个点上,然后取等间隔采样得到 FIR 系数 \( h[n] \)。
```python
import numpy as np
N = 21
wc = 0.5 * np.pi
window_func = np.cos(np.pi / 2 * (np.arange(N) + 0.5) / (N - 1)) ** 2
# FIR 阻尼系数计算
h = window_func / np.sum(window_func)
```
二、**编写 MATLAB 调试程序**,绘制幅频特性和分析带宽:
```matlab
% 创建滤波器系统函数
[b,a] = fir1(21, wc, 'cosine'); % 使用fir1函数创建RC滤波器
% 计算并绘制幅度谱(需要安装 Signal Processing Toolbox)
[H,Fs] = freqz(b,a,1024,fs); % fs是采样频率,这里假设为1
plot(Fs/2, 20*log10(abs(H))) % 20*log10用于对数表示增益
grid on
xlabel('Frequency [Hz]')
ylabel('Magnitude [dB]')
title('Amplitude Frequency Response')
% 寻找3dB带宽和20dB衰减点
[~, index3dB] = find(abs(H - db2amp(-30)) <= abs(H(index3dB+1) - db2amp(-30)), 1);
[~, index20dB] = find(abs(H - db2amp(-40)) <= abs(H(index20dB+1) - db2amp(-40)), 1);
% 输出结果
fprintf('3dB Bandwidth: %.2f Hz\n', Fs/2(index3dB));
fprintf('20dB Attenuation: %.2f Hz\n', Fs/2(index20dB));
% 绘制垂直线标记3dB和20dB点
hold on
line([Fs/2(index3dB) Fs/2(index3dB)], [-80 80], 'Color', 'r');
line([Fs/2(index20dB) Fs/2(index20dB)], [-80 80], 'Color', 'g');
legend('Magnitude Spectrum', ['3dB Bandwidth' '20dB Attenuation'])
```
注意:这是一段简化的MATLAB代码示例,实际运行时可能需要根据您的环境和信号处理库版本调整。确保您已经安装了Signal Processing Toolbox,并且`db2amp`函数可用。
阅读全文