概述
目录
FIR 滤波器设计
IIR 滤波器设计
此示例说明如何使用 Signal Processing Toolbox® 产品中的 designfilt 函数,根据频率响应设定设计 FIR 和 IIR 滤波器。该示例重点讲述低通滤波器,但大多数结果也适用于其他响应类型。
此示例主要介绍数字滤波器的设计,而不是其应用。如果要了解有关数字滤波器应用的详细信息,可以参考数字滤波实践介绍。
FIR 滤波器设计
低通滤波器
在理想情况下,低通滤波器使信号中低于指定截止频率 ωc 的所有频率分量保持不变,并拒绝高于 ωc 的所有分量。由于实现理想低通滤波器所需的脉冲响应是无限长的,因此无法设计出理想的 FIR 低通滤波器。理想脉冲响应的有限长度逼近会导致滤波器的通带 (ω<ωc) 和阻带 (ω>ωc) 中都出现波纹,并导致通带和阻带之间的过渡带宽度非零。
当用有限脉冲响应逼近时,通带/阻带波纹和过渡带宽度都是不希望出现的,且不可避免地与理想低通滤波器存在偏差。下图说明了这些偏差:
-
实际的 FIR 设计通常包括过渡带宽度和最大通带和阻带波纹不超过允许值的滤波器。除了这些设计设定之外,还必须选择滤波器阶数,它等效于选择截断的脉冲响应的长度。
滤波器设计中的设计设定可形象地比喻为下图所示的三角形,每个设定对应其中一个角。
三角形相当于选择设计设定时可用的自由度。由于各角之和是固定值,因此最多只能选择两个设定的值。第三个设定将由特定设计算法确定。此外,就像三角形中的各角一样,如果我们使一个设定更大/更小,它将影响其他一个或两个设定。
FIR 滤波器广受欢迎,因为它们非常稳定,并可以设计成具有线性相位的滤波器。尽管如此,这些滤波器仍可能有长瞬时响应,在某些应用中的计算成本可能很高。
最小阶 FIR 设计
通过指定通带和阻带频率以及通带波纹和阻带衰减,可以获得最小阶设计。然后,设计算法会选择符合设定的最小滤波器长度。
设计最小阶低通 FIR 滤波器,其通带频率为 0.37*pi 弧度/采样点,阻带频率为 0.43*pi 弧度/采样点(因此过渡带宽度等于 0.06*pi 弧度/采样点),通带波纹为 1 dB,阻带衰减为 30 dB。
Fpass = 0.37;
Fstop = 0.43;
Ap = 1;
Ast = 30;
d = designfilt('lowpassfir','PassbandFrequency',Fpass,...
'StopbandFrequency',Fstop,'PassbandRipple',Ap,'StopbandAttenuation',Ast);
hfvt = fvtool(d);
如图所示:
可以使用 filtord 函数查询生成的滤波器阶数。
N = filtord(d)
N = 39
可以使用info函数获取用于设计滤波器的参数的有关信息
info(d)
ans = 17x44 char array
'FIR Digital Filter (real) '
'------------------------- '
'Filter Length : 40 '
'Stable : Yes '
'Linear Phase : Yes (Type 2) '
' '
'Design Method Information '
'Design Algorithm : Equiripple '
' '
'Design Specifications '
'Sample Rate : N/A (normalized frequency)'
'Response : Lowpass '
'Specification : Fp,Fst,Ap,Ast '
'Passband Ripple : 1 dB '
'Stopband Atten. : 30 dB '
'Passband Edge : 0.37 '
'Stopband Edge : 0.43 '
-
默认情况下,
designfilt
函数会选择一个等波纹设计算法。线性相位等波纹滤波器是令人满意的,因为对于给定阶数,这种滤波器与理想滤波器的最大可能偏差最小。
然而,请注意,也可以使用 Kaiser 窗获得最小阶设计。即使 Kaiser 窗方法对相同设定产生更大的滤波器阶数,当设计设定非常严格时,该算法的计算成本更低,并且不太可能出现收敛问题。如果应用需要非常窄的过渡带宽度或非常大的阻带衰减,就可能出现这种情况。
使用 Kaiser 窗方法设计与上述设定相同的滤波器,并将其响应与等波纹滤波器进行比较。
dk = designfilt('lowpassfir','PassbandFrequency',Fpass,...
'StopbandFrequency',Fstop,'PassbandRipple',Ap,...
'StopbandAttenuation',Ast, 'DesignMethod', 'kaiserwin');
addfilter(hfvt,dk);
legend(hfvt,'Equiripple design', 'Kaiser window design')
如图所示:
N = filtord(dk)
N = 52
以赫兹为单位指定频率参数
如果知道滤波器工作将使用的采样率,可以指定采样率和频率(以赫兹为单位)。重新设计采样率为 2 kHz 的最小阶等波纹滤波器。
Fpass = 370;
Fstop = 430;
Ap = 1;
Ast = 30;
Fs = 2000;
d = designfilt('lowpassfir','PassbandFrequency',Fpass,...
'StopbandFrequency',Fstop,'PassbandRipple',Ap,...
'StopbandAttenuation',Ast,'SampleRate',Fs);
hfvt = fvtool(d);
如图所示:
固定阶、固定过渡带宽度
固定阶设计适用于对计算负载敏感或对滤波器系数个数有限制的应用。一种选择是以控制通带波纹/阻带衰减为代价来固定过渡带宽度。
假设一个 30 阶低通 FIR 滤波器,其通带频率为 370 Hz,阻带频率为 430 Hz,采样率为 2 kHz。对于这组特定设定,可使用两种设计方法:等波纹法和最小二乘法。下面我们为每种方法设计一个滤波器,并比较结果。
N = 30;
Fpass = 370;
Fstop = 430;
Fs = 2000;
% Design method defaults to 'equiripple' when omitted
deq = designfilt('lowpassfir','FilterOrder',N,'PassbandFrequency',Fpass,...
'StopbandFrequency',Fstop,'SampleRate',Fs);
dls = designfilt('lowpassfir','FilterOrder',N,'PassbandFrequency',Fpass,...
'StopbandFrequency',Fstop,'SampleRate',Fs,'DesignMethod','ls');
hfvt = fvtool(deq,dls);
legend(hfvt,'Equiripple design', 'Least-squares design')
如图所示:
等波纹滤波器非常适合必须满足特定容差的应用,例如设计具有给定最小阻带衰减或给定最大通带波纹的滤波器。另一方面,如果我们想最小化通带/阻带中(理想滤波器和实际滤波器之间)的误差能量,这些设计可能并不理想。
-
如果要尽可能降低某个频带内信号的能量,请使用最小二乘设计。
在上述示例中,设计的滤波器在通带和阻带中具有相同的波纹。我们可以使用权重来减少其中一个频带内的波纹,同时保持滤波器阶数固定。例如,如果希望阻带波纹是通带波纹的十分之一,则为阻带赋予的权重必须是通带权重的十倍。根据上述情况重新设计等波纹滤波器。
deqw = designfilt('lowpassfir','FilterOrder',N,'PassbandFrequency',Fpass,...
'StopbandFrequency',Fstop,'SampleRate',Fs,...
'PassbandWeight',1,'StopbandWeight',10);
hfvt = fvtool(deq,deqw);
legend(hfvt,'Equiripple design', 'Equiripple design with weighted stopband')
如图所示:
固定阶、固定截止频率
可以使用窗口设计方法设计具有固定滤波器阶数和截止频率的滤波器。
-
可以使用不同窗口来控制阻带衰减,同时保持滤波器阶数不变。
例如,假设有截止频率为 60 Hz、采样率为 1 kHz 的 100 阶低通 FIR 滤波器。比较使用 Hamming 窗和使用旁瓣衰减为 90 dB 的 Chebyshev 窗产生的设计。
dhamming = designfilt('lowpassfir','FilterOrder',100,'CutoffFrequency',60,...
'SampleRate',1000,'Window','hamming');
dchebwin = designfilt('lowpassfir','FilterOrder',100,'CutoffFrequency',60,...
'SampleRate',1000,'Window',{'chebwin',90});
hfvt = fvtool(dhamming,dchebwin);
legend(hfvt,'Hamming window', 'Chebyshev window')
如图所示:
可以通过其他方式指定具有固定阶数的滤波器:固定截止频率、通带波纹和阻带衰减;固定过渡带宽度;以及固定半功率 (3dB) 频率。
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);
axis([0 1e3 -80 2]);
legend(hfvt,'Butterworth', 'Chebyshev Type I',...
'Chebyshev Type II','Elliptic')
如图所示:
放大通带以查看波纹差异。
axis([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');
axis([0 1e3 -80 2]);
如图所示:
匹配通带的设计和同时匹配通带与阻带的设计在 100 Hz 的通带频率值下具有正好 1 dB 的波纹。
群延迟比较
对于 IIR 滤波器,我们不仅需要考虑波纹/过渡带宽度的权衡,还需要考虑相位失真的程度。我们知道无法在整个 Nyquist 区间内都有线性相位。因此,我们可能想查看相位响应离线性有多远。实现此目的的一个好方法是观察(理想情况下为常量的)群延迟,查看它的平坦度。
比较上面设计的四个 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 设计。要了解有关所有可用选项的详细信息,可以参考滤波器设计库。
最后
以上就是优秀皮卡丘为你收集整理的数字滤波器设计实践介绍的全部内容,希望文章能够帮你解决数字滤波器设计实践介绍所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复