上帖中有我的一个试验分享,介绍了IIR和FIR数字滤波器的设计,在这篇博客中我想详细的介绍一下IIR滤波器的设计过程。(以Butterworth滤波器为例)
一、MATLAB IIR LP AF(Butterworth)
首先明确几个指标:
(1)通带上限截止频率;
(2)阻带下限截止频率;
(3)通带允许{zd0}衰减;
(4)阻带允许最小衰减。
这是计算模拟滤波器:
指标C和N的前提;手动计算,及使用已知的四个指标组合为方程组计算C与N,通带{zd0}衰减为3dB时,C为1;使用MATLAB函数buttord可计算阶次N以及3dB处频率如下:
% iir1
% 通带截止频率3400Hz
% 阻带截止频率4000Hz
% 原题没有给出采样率,假设为10000Hz
% 频率参数单位对于模拟滤波器为rad/s
fp = 3400;
fs = 4000;
Fs = 10000;
wp = 2*pi*fp/Fs;
ws = 2*pi*fs/Fs;
wp = tan(wp/2);
ws = tan(ws/2);
% 通带{zd0}衰减为3dB,阻带最小衰减为40dB
[N, wn] = buttord(wp, ws, 3, 40, 's');
% 模拟低通滤波器极零点
[z, p, k] = buttap(N);
% 由极零点获得转移函数参数
[b, a] = zp2tf(z, p, k);
% 由原型滤波器获得实际低通滤波器
[B, A] = lp2lp(b, a, wp);
二、AF to DF
方法有冲击相应不变法以及双线性z变换法。冲击相应不变法,根据s平面到z平面的映射规则,其不可避免的就是求得数字滤波器幅频特性在模拟滤波器幅频特性周期扩展叠加的频谱混叠,只适用于低通、带通并且采样率较高的情况。
双线性z变换法根据正切函数的固有特性,使s平面往z平面映射时只映射一次,避免了频谱的混叠。下面使用双线性z变换法获得数字滤波器。
% iir2
[bz, az] = bilinear(B, A, .5);
[h, w] = freqz(bz, az, 256, Fs);
plot(w, 20*log10(abs(h)))
grid on
figure
plot(w, abs(h))
grid on
滤波器如下,为了显示衰减情况,绘制对数纵轴:
实际滤波器频率响应如上图。
对于HP、BP、DS滤波器,需要进行频率转换,lamda = f(n),然后同样进行上面的程序,只是从原型滤波器转换为实际滤波器时分别使用lp2hp,lp2bp,lp2bs函数。
未尽之处,欢迎大家探讨。