在MATLAB中使用Butterworth滤波器时,如果我选择的阶数太高,有时滤波后的信号会无限增长,如果我降低阶数,问题就消失了,有没有人遇到过同样的问题,为什么?
为什么巴特沃斯滤波器有时会使信号发散?
信息处理
过滤器
2022-02-18 07:05:51
1个回答
基本上,这必然会发生在更高阶滤波器和有限精度的情况下。滤波器的极点越来越接近单位圆,以获得更清晰的过渡带。但是非常接近单位圆的极点会导致某种精度的滤波器不稳定。
你可以做的事情:
- 增加数字类型的精度(例如双精度而不是单精度)
- 将滤波器分解为一系列二阶部分
Matlab 和 Octave 允许您直接计算极点 (p)、零点 (z) 和总增益 (g),而不是滤波器系数 b 和 a:
[z,p,g] = butter(...);
结果可以转换为 SOS 矩阵(二阶部分):
[sos,g] = zp2sos(z,p,g);
矩阵中的每一行sos代表一个二阶二阶 IIR 滤波器。据我所知,使用这个二阶部分分解 - 意思是:串联的几个二阶 IIR 滤波器 - 不太容易受到舍入误差的影响。实际过滤可以用sosfilt代替来完成filter:
y = sosfilt(sos,x)*g;
如果您仍然无法使其稳定,您可能应该替换butter并ellip允许一些通带纹波和/或多次通过相同的低阶滤波器。
其它你可能感兴趣的问题