MATLAB信号处理学习2-设计模拟滤波器的几种编程方法的相同和不同

以巴特沃斯为例子,给出滤波器的具体指标,

一种方法:由buttord和butter这两个函数求出模拟滤波器的系数;

二种方法:已知滤波器的阶数,先求出巴特沃斯原型低通滤波器的零极点及原型低通滤波器的系数,再按频带变换转换到要求的频带滤波器上,求出要求滤波器的系数。

用2种方法设计一个巴特沃斯低通滤波器,要求为wp=0.2pi,ws=0.3pi,Ap=3,As=20。

%用2种方法设计一个巴特沃斯低通滤波器,要求为wp=0.2pi,ws=0.3pi,Ap=3,As=20
% pr3_2_2 
clear all; close all; clc;

wp=0.2*pi;                       % 设置通带频率
ws=0.3*pi;                       % 设置阻带频率
Rp=3; Rs=20;                     % 设置波纹系数

[N,Wn]=buttord(wp,ws,Rp,Rs,'s'); % 求巴特沃斯滤波器阶数
[bn,an]=butter(N,Wn,'s');        % 求巴特沃斯滤波器系数
fprintf('巴特沃斯滤波器 N=%4d\n',N) % 显示滤波器阶数
% 显示系数
fprintf('%5.6e   %5.6e   %5.6e   %5.6e   %5.6e   %5.6e   %5.6e\n',bn);
fprintf('%5.6e   %5.6e   %5.6e   %5.6e   %5.6e   %5.6e   %5.6e\n',an);

[z,p,k]=buttap(N);               % 设计低通原型数字滤波器
[Bap,Aap]=zp2tf(z,p,k);          % 零点极点增益形式转换为传递函数形式
[bb,ab]=lp2lp(Bap,Aap,Wn);       % 低通滤波器频率转换
% 显示系数
fprintf('%5.6e\n',bb);
fprintf('%5.6e   %5.6e   %5.6e   %5.6e   %5.6e   %5.6e   %5.6e\n',ab);

结果:

设计的时候用任何一种方法都可。

差别:由buttord和butter这两个函数求出的滤波器系数中,系数是一个1×7的矢量,虽然前面都是0,但是有7个系数。

而通过低通滤波器原型和频带变换求出的滤波器系数中,是一个数值。

它们在给出系数的结构上不同。

设计一个巴特沃斯模拟带通滤波器,用频带转换方法编程。带通值wp1=0.2pi,wp2=0.3pi,带阻值ws1=0.1pi,ws2=0.4pi,Rp=1,Rs=20。

% pr3_2_3 
clear all; close all; clc;

wp=[0.2*pi 0.3*pi];              % 设置通带频率
ws=[0.1*pi 0.4*pi];              % 设置阻带频率
Rp=1; Rs=20;                     % 设置波纹系数

% 巴特沃斯滤波器设计
[N,Wn]=buttord(wp,ws,Rp,Rs,'s'); % 求巴特沃斯滤波器阶数
fprintf('巴特沃斯滤波器 N=%4d\n',N) % 显示滤波器阶数
[bn,an]=butter(N,Wn,'s');        % 求巴特沃斯滤波器系数
W1=Wn(1); W2=Wn(2);              % 设置W1,W2
Wo=sqrt(W1*W2);
Bw=W2-W1;
[z,p,k]=buttap(N);               % 设计低通原型数字滤波器
[Bap,Aap]=zp2tf(z,p,k);          % 零点极点增益形式转换为传递函数形式
[bb,ab]=lp2bp(Bap,Aap,Wo,Bw);    % 低通滤波器频率转换
W=0:0.01:2;                      % 设置模拟频率
[Hn,wn]=freqs(bn,an,W);          % 求巴特沃斯滤波器频率响应
[Hb,wb]=freqs(bb,ab,W);          % 求巴特沃斯滤波器频率响应
% 作图
plot(wn/pi,20*log10(abs(Hn)),'r','linewidth',2)
hold on
plot(wb/pi,20*log10(abs(Hb)),'k')% 作图
title('两种编程方法设计巴特沃斯带通滤波器');
xlabel('圆频率{\omega}/{\pi}'); ylabel('幅值/dB')
set(gcf,'color','w'); 
axis([0 max(wb/pi) -30 2]); 
legend('第1种编程方法','第2种编程方法')
line([0 max(wb/pi)],[-20 -20],'color','k','linestyle','--');
line([0 max(wb/pi)],[-1 -1],'color','k','linestyle','--');
line([0.2 0.2],[-30 2],'color','k','linestyle','--');
line([0.3 0.3],[-30 2],'color','k','linestyle','--');

得到的结果:曲线是重合的。

肤浅的学习,好多深层问题还没有思考明白。欢迎指出问题和提出问题。

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值