在滤波器设计期间强制多组约束

Forcing multiple sets of constraints during filter design

我目前正在根据预先确定的滤波器要求使用 MATLAB example on generating a Kaiser window finite impulse response (FIR) 滤波器。

Kaiser Window Filter Design

Design a lowpass filter with passband defined from 0 to 1 kHz and stopband defined from 1500 Hz to 4 kHz. Specify a passband ripple of 5% and a stopband attenuation of 40 dB.

fsamp = 8000;
fcuts = [1000 1500];
mags = [1 0];
devs = [0.05 0.01];

[n,Wn,beta,ftype] = kaiserord(fcuts,mags,devs,fsamp);
hh = fir1(n,Wn,ftype,kaiser(n+1,beta),'noscale');

freqz(hh)

就我而言,当我们达到频谱中的 4kHz 标记时(即:过渡带结束,阻带开始),我预计信号衰减至少为 40dB。然而,我有一个额外的要求:滤波器还提供至少 20dB 的衰减到过渡带的中点(i:1250Hz 标记)。我用上面的代码设计的滤波器没有达到这两个要求,因为 Kaiser FIR 实现的初始滚降速度很慢。

是否有直接的方法从一开始就对过滤器强制执行多个约束,即:

Design a lowpass filter with passband defined from 0 to 1 kHz and stopband defined from 1500 Hz to 4 kHz. Specify a passband ripple of 5% and a stopband attenuation of 40 dB, and at least 20dB attenuation by 1250Hz.

到目前为止,唯一想到的解决方案是生成与我上面(一次)相同的 Kaiser window,然后循环多次迭代并增加过滤器顺序,n,每次迭代直到满足我的要求。是否有更精细或更直接的方法,或者我的迭代方法是目前唯一的方法?

我尝试只制作一个在 1250Hz 下衰减 20dB 的滤波器,但是滤波器似乎并没有提供更多的衰减(即:在 1500Hz 下只有 22dB 阻带衰减)。

谢谢!

Kaiser window 过滤器设计器不支持自动求解此类约束。查看 kaiserord 的源代码,它看起来支持低通和高通、带通、带阻和多频带 pass/stop,只要 pass/stop 频带都具有相同的振幅.

解决您问题的最简单方法是将阻带定义为从 1250Hz 开始,衰减 40dB。这将确保 1500Hz 也等于或低于 40dB,但显然可能会导致滤波器的阶数高于您实际需要的阶数。

旁瓣中的衰减与 beta 值直接相关,这意味着增加阶数的唯一效果应该是增加滚降的陡度,因此您的方法似乎是支持的最简单和最直接的方法通过 MATLAB 的滤波器设计工具。不幸的是,它在实践中行不通。

滤波器构建器实现具有通带和阻带约束的截止滤波器的方式 ripple/attenuation 是将截止点设置为恰好在通过约束结束和停止约束开始之间的中间位置。截止点始终限制在 -6dB。因此,无论您使用多高的滤波器阶数,1250Hz 总是 为 -6dB。

我建议像上面描述的那样在 1250Hz/-40dB 处定义阻带,然后减少你的滤波器阶数,直到你不再满足约束。我在写这篇文章时测试了47个订单,但我没有严格检查它。

1250Hz -40dB 的最小阶滤波器:

[n, Wn, beta, ftype] = kaiserord([1000, 1250], [1, 0], [.05, db2mag(-40)], 8000);
hh = fir1(n, Wn, ftype, kaiser(n+1, beta), 'noscale');
freqz(hh)

n = 72

相同的过滤器,阶数减少到 47:

hh = fir1(n-25, Wn, ftype, kaiser(n-25+1, beta), 'noscale');
freqz(hh)