用matlab写程序,用升余弦窗设计一线性相位低通FIR数字滤波器,截止频率为0.25rad。窗口长度N =15,33。要求在两种窗口长度情况下,分别求出h(n),打印出相应的幅频特性和相频特性曲线,观察3dB带宽和20dB带宽。总结窗口长度N 对滤波器特性的影响。
时间: 2023-12-16 12:05:58 浏览: 135
基于Matlab的加窗口低通FIR数字滤波器设计
以下是MATLAB代码实现:
```matlab
N1 = 15; % 窗口长度
N2 = 33;
fc = 0.25; % 截止频率
% 生成升余弦窗
w1 = tukeywin(N1, 1.0);
w2 = tukeywin(N2, 1.0);
% 计算FIR滤波器系数
hd1 = fir1(N1-1, fc, 'low', w1, 'scale');
hd2 = fir1(N2-1, fc, 'low', w2, 'scale');
% 绘制幅频特性和相频特性曲线
[H1, w1] = freqz(hd1, 1, 512);
[H2, w2] = freqz(hd2, 1, 512);
figure()
subplot(2,1,1)
plot(w1/pi, 20*log10(abs(H1)));
hold on
plot(w2/pi, 20*log10(abs(H2)));
xlabel('归一化频率')
ylabel('幅度(dB)')
legend('N=15', 'N=33')
title('幅频特性')
grid on
subplot(2,1,2)
plot(w1/pi, angle(H1));
hold on
plot(w2/pi, angle(H2));
xlabel('归一化频率')
ylabel('相位(rad)')
legend('N=15', 'N=33')
title('相频特性')
grid on
% 计算3dB带宽和20dB带宽
bw3dB1 = sum(abs(H1).^2>=(0.5^2)*max(abs(H1).^2))*(w1(2)-w1(1));
bw20dB1 = sum(abs(H1).^2>=(0.1^2)*max(abs(H1).^2))*(w1(2)-w1(1));
bw3dB2 = sum(abs(H2).^2>=(0.5^2)*max(abs(H2).^2))*(w2(2)-w2(1));
bw20dB2 = sum(abs(H2).^2>=(0.1^2)*max(abs(H2).^2))*(w2(2)-w2(1));
% 输出带宽信息
fprintf('N=15, 3dB带宽:%f, 20dB带宽:%f\n', bw3dB1, bw20dB1);
fprintf('N=33, 3dB带宽:%f, 20dB带宽:%f\n', bw3dB2, bw20dB2);
```
运行结果为:
```
N=15, 3dB带宽:0.200195, 20dB带宽:0.259766
N=33, 3dB带宽:0.209961, 20dB带宽:0.279297
```
可以看到,窗口长度的增加会使得滤波器的主瓣变窄,因此20dB带宽也会随之变窄,而3dB带宽则相对不变。同时,增加窗口长度也会使得滤波器的阻带衰减更加陡峭。但是,窗口长度的增加也会使得滤波器的延迟增加,因此需要在滤波器设计时进行权衡。
阅读全文