此示例说明如何使用 Signal Processing Toolbox® 产品中的 designfilt
函数,根据频率响应设定设计 FIR 和 IIR 滤波器。该示例重点讲述低通滤波器,但大多数结果也适用于其他响应类型。
此示例主要介绍数字滤波器的设计,而不是其应用。如果您要了解有关数字滤波器应用的详细信息,请参阅数字滤波实践介绍。
FIR 滤波器的缺点之一是它们需要很大的滤波器阶数才能满足某些设计设定。如果波纹保持不变,滤波器阶数与过渡带宽度成反比。通过使用反馈,使用小得多的滤波器阶数即可满足一组设计设定。这就是 IIR 滤波器设计背后的思想。“无限冲激响应” (IIR) 一词源于这样的事实:当冲激施加到滤波器时,输出永远不会衰减到零。
当计算资源非常宝贵时,IIR 滤波器非常有用。然而,稳定的因果 IIR 滤波器无法提供完美的线性相位。在要求相位线性的情况下,避免使用 IIR 设计。
使用 IIR 滤波器的另一个重要原因是相对于 FIR 滤波器,IIR 滤波器的群延迟较小,从而瞬时响应更短。
Butterworth 滤波器
Butterworth 滤波器是具有最大平坦度的 IIR 滤波器。通带和阻带中的平坦度导致过渡带非常宽。需要较大的阶数才能获得具有窄过渡带宽度的滤波器。
设计一个最小阶 Butterworth 滤波器,其通带频率为 100 Hz,阻带频率为 300 Hz,最大通带波纹为 1 dB,阻带衰减为 60 dB。采样率为 2 kHz。
Fp = 100;
Fst = 300;
Ap = 1;
Ast = 60;
Fs = 2e3;
dbutter = designfilt('lowpassiir','PassbandFrequency',Fp,...
'StopbandFrequency',Fst,'PassbandRipple',Ap,...
'StopbandAttenuation',Ast,'SampleRate',Fs,'DesignMethod','butter');
Chebyshev I 类滤波器
通过允许通带波纹,Chebyshev I 类滤波器的过渡带宽度小于同阶 Butterworth 滤波器。
Butterworth 和 Chebyshev I 类滤波器都具有最平坦的阻带。对于给定的滤波器阶数,需要在通带波纹和过渡带宽度之间进行权衡。
设计与上述 Butterworth 滤波器设定相同的 Chebyshev I 类滤波器。
dcheby1 = designfilt('lowpassiir','PassbandFrequency',Fp,...
'StopbandFrequency',Fst,'PassbandRipple',Ap,...
'StopbandAttenuation',Ast,'SampleRate',Fs,'DesignMethod','cheby1');
Chebyshev II 类滤波器
Chebyshev II 类滤波器具有最平坦的通带和等波纹阻带。
由于通常不需要非常大的衰减,我们可以通过允许一些阻带波纹,以相对较小的阶数获得所需的过渡带宽度。
设计一个最小阶 Chebyshev II 类滤波器,其设定与前面示例中相同。
dcheby2 = designfilt('lowpassiir','PassbandFrequency',Fp,...
'StopbandFrequency',Fst,'PassbandRipple',Ap,...
'StopbandAttenuation',Ast,'SampleRate',Fs,'DesignMethod','cheby2');
椭圆滤波器
椭圆滤波器通过允许通带和阻带中的波纹来泛化 Chebyshev 和 Butterworth 滤波器。随着波纹变小,椭圆滤波器可以任意逼近 Chebyshev 或 Butterworth 滤波器的幅值和相位响应。
椭圆滤波器能够以最小的阶数获得给定的过渡带宽度。
dellip = designfilt('lowpassiir','PassbandFrequency',Fp,...
'StopbandFrequency',Fst,'PassbandRipple',Ap,...
'StopbandAttenuation',Ast,'SampleRate',Fs,'DesignMethod','ellip');
比较四个 IIR 滤波器的响应和阶数。
对于相同的设定约束,Butterworth 方法产生最高阶,椭圆方法产生最小阶。
FilterOrders = [filtord(dbutter) filtord(dcheby1) filtord(dcheby2) filtord(dellip)]
FilterOrders = 1×4 7 5 5 4
hfvt = fvtool(dbutter,dcheby1,dcheby2,dellip);
zoom(hfvt,[0 1e3 -80 2])
legend(hfvt,'Butterworth', 'Chebyshev Type I',...
'Chebyshev Type II','Elliptic')
% 放大通带以查看波纹差异。
zoom(hfvt,[0 150 -3 2])
与通带或阻带设定完全匹配
对于最小阶设计,理想阶数需要舍入到下一个整数。这一额外的小数阶允许算法实际上超过设定。
使用 'MatchExactly'
参数来约束设计算法,使其与一个频带完全匹配。另一个频带超出其设定。
默认情况下,Chebyshev I 类设计匹配通带,Butterworth 和 Chebyshev II 类匹配阻带,椭圆设计同时匹配通带和阻带(当超过阻带边缘频率时):
dellip1 = designfilt('lowpassiir','PassbandFrequency',Fp,...
'StopbandFrequency',Fst,'PassbandRipple',Ap,...
'StopbandAttenuation',Ast,'SampleRate',Fs,'DesignMethod','ellip',...
'MatchExactly','passband');
dellip2 = designfilt('lowpassiir','PassbandFrequency',Fp,...
'StopbandFrequency',Fst,'PassbandRipple',Ap,...
'StopbandAttenuation',Ast,'SampleRate',Fs,'DesignMethod','ellip',...
'MatchExactly','stopband');
hfvt = fvtool(dellip, dellip1, dellip2);
legend(hfvt,'Matched passband and stopband','Matched passband',...
'Matched stopband');
zoom(hfvt,[0 1e3 -80 2])
匹配通带的设计和同时匹配通带与阻带的设计在 100 Hz 的通带频率值下具有正好 1 dB 的波纹。
群延迟比较
对于 IIR 滤波器,我们不仅需要考虑波纹/过渡带宽度的权衡,还需要考虑相位失真的程度。我们知道无法在整个奈奎斯特区间内都有线性相位。因此,我们可能想查看相位响应离线性有多远。实现此目的的一个好方法是观察(理想情况下为常量的)群延迟,查看它的平坦度。
比较上面设计的四个 IIR 滤波器的群延迟。
如果关注相位问题,请记住 Butterworth 和 Chebyshev II 类设计具有最平坦的群延迟,因此引入的失真最小。
hfvt = fvtool(dbutter,dcheby1,dcheby2,dellip,'Analysis','grpdelay');
legend(hfvt,'Butterworth', 'Chebyshev Type I',...
'Chebyshev Type II','Elliptic')
在此示例中,您学习了如何使用 designfilt
获得各种具有不同约束和设计方法的低通 FIR 和 IIR 滤波器。designfilt
也可用于获得高通、带通、带阻、任意幅值、微分器和 Hilbert 设计。要了解有关所有可用选项的详细信息,请访问滤波器设计库。