IIR 滤波器的设计方法有很多种,一种比较简单的方法是先设计对应的模拟滤波器,然后将模拟滤波器转换为对应的数字滤波器。模拟滤波器到数字滤波器的转换最常见的方法是双线性变换法。下面就介绍一下怎么利用SCILAB提供的函数利用这种方法设计一个IIR 滤波器。
hz=iir(n,ftype,fdesign,frq,delta)
[p,z,g]=iir(n,ftype,fdesign,frq,delta)
Arguments
N : 滤波器的阶数
Ftype 滤波器的类型,’lp’ 表示低通,'hp' 表示高通,'bp' 表示带通,'sb' 表示带阻。
Fdesign:指定模拟滤波器的类型,可以为 'butt', 'cheb1', 'cheb2' ,'ellip'
Frq: 长度为2的向量,指定滤波器的截止频率,这里的频率为归一化的频率,采样频率归一化为1。对于低通和高通滤波器,只有第一个参数有用,带通和带阻滤波器这两个截止频率都要用到。
Delta:长度为2的向量,对于cheb1型滤波器,只有第一个参数有用, 对于cheb2 型滤波器,只用到第二个参数,ellip 滤波器这两个参数都用到了 0
对cheb1 型滤波器:1-delta(1)
对cheb2 型滤波器: 0
对ellip 型滤波器:
在通带,1-delta(1)
在阻带,0
Hz:计算出的系统函数
P:给出了滤波器的各个零点
z:给出了滤波器的各个极点
G:增益
下面给个具体的例子:
hz=iir(3,'bp','ellip',[.15 .25],[.08 .03]);
这个例子设计的是一个 3 阶带通椭圆滤波器。通带截止频率为 0.15 和 0.25,通带允许波动为 0.08, 阻带允许波动为 0.03。
计算出的滤波器传递函数为:
下面画出频响曲线:
[hzm,fr]=frmag(hz,256);
plot2d(fr',hzm')
xtitle('Discrete IIR filter band pass 0.15 < fr < 0.25 ',' ',' ');
如果我们需要零极点信息的话,可以这样计算:
[p,z,g]=iir(3,'bp','ellip',[.15 .25],[.08 .03]);
Z 给出的是零点的位置,q是极点位置:
z =
0.7632657 + 0.6460848i
0.7632657 - 0.6460848i
1.
- 0.3182662 - 0.9480014i
- 0.3182662 + 0.9480014i
- 1.
p =
0.5561319 - 0.7583880i
0.5561319 + 0.7583880i
0.2703756 + 0.7688681i
- 0.0034896 + 0.9267011i
- 0.0034896 - 0.9267011i
0.2703756 - 0.7688681i