matlab中的IIR滤波器设计

信息处理 过滤器设计 在家工作 无限脉冲响应
2022-02-01 15:04:50

我必须设计 2 个具有以下规格的 IIR 带通滤波器:

采样频率 1000 Hz 通带 50 Hz 至 200 Hz 6 阶,使用双线性变换和脉冲不变性以及巴特沃斯原型模拟滤波器。

我很困惑,因为我用来制作过滤器的两种方法有不同的结果。

fs = 1000;
fNq = fs/2;
f1 = 50/fNq;
f2 = 200/fNq;
[z,p,k] = buttap(6);
[A,B,C,D] = zp2ss(z,p,k);
[zd,pd,kd] = bilinear(z,p,k,fs);
Bw = f2-f1;
Wo = sqrt(f1*f2);
[At,Bt,Ct,Dt] = lp2bp(A,B,C,D,Wo,Bw);
[b,a] = ss2tf(At,Bt,Ct,Dt);

[Ad,Bd,Cd,Dd] = bilinear(At,Bt,Ct,Dt,fs);
[bz, az] = ss2tf(Ad,Bd,Cd,Dd);
fvtool(bz,az);

(我认为)上面的代码创建了一个模拟原型,转换为状态空间形式,应用双线性转换,将低通滤波器转换为带通滤波器,转换为传递函数并绘制它。

我的问题是它与以下内容明显不同:

[num,den] = butter(6, [f1, f2], 's');
[B,A] = bilinear(num, den, fs);
fvtool(B, A);

我对脉冲不变性方法有类似的问题。

有人可以给我一个提示我做错了什么吗?

1个回答

问题已解决:butter() 函数自动进行双线性变换,您只需指定归一化为 Nyqyist 频率的频率。