我目前正在根据预先确定的过滤器要求使用MATLAB example on generating a Kaiser window finite impulse response(FIR)过滤器。
凯撒窗户滤清器设计
设计一个低通滤波器,其通带定义为0到1 kHz和 阻带定义为1500 Hz至4 kHz。指定通带纹波 5%,阻带衰减为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。但是,我有一个额外的要求:滤波器还通过过渡带的中间点(i:1250Hz标记)提供至少20dB的衰减。我用上面的代码设计的滤波器没有达到这两个要求,因为Kaiser FIR实现的初始滚降很慢。
是否存在从get-go强制过滤器的多个约束的直接方法,即:
设计一个低通滤波器,其通带定义为0到1 kHz和 阻带定义为1500 Hz至4 kHz。指定通带纹波 5%,阻带衰减为40 dB,衰减至少为20dB 1250Hz。
到目前为止,我想到的唯一解决方案是生成与上面相同的Kaiser窗口(一次),但是然后循环多次迭代并递增滤波器顺序n
,每次迭代直到我的要求很满意。是否有更精细或直接的方法,或者我的迭代方法是目前唯一的方法?
我尝试制作一个衰减20dB到1250Hz的滤波器,但是滤波器似乎没有提供更多的衰减(即:1500Hz的阻带衰减只有22dB)。
谢谢!
答案 0 :(得分:1)
Kaiser窗口过滤器设计器不支持自动解决这种约束。查看kaiserord
的来源,只要通过/阻止频段具有相同的幅度,它看起来像支持低通和高通,带通,带阻和多频带通过/停止。
解决问题的最简单方法是将阻带定义为从1250Hz开始,衰减为40dB。这将确保1500Hz也处于或低于40dB,但显然可能导致更高阶滤波器而不是实际需要。
旁瓣的衰减与β值直接相关,这意味着增加阶数的唯一影响应该是滚降的陡度增加,所以你的方法似乎是MATLAB支持的最简单和最直接的方法。过滤器设计工具。不幸的是,它在实践中不起作用。
滤波器构建器实现具有通带和阻带纹波/衰减约束的截止滤波器的方式是将截止点设置为通过约束的结束和停止约束的开始之间的正好一半。截止点始终限制在-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)