如何解决Scipy 滤波器:强制 SOS 系数的最小值来准备整数滤波器
我尝试用 Scipy 设计一个低通滤波器(削减大约 40Hz),它似乎可以使用以下代码:
fs = 100000 # Sampling frequency = 100kHz
N,Wn = signal.buttord(40/(fs/2),50/(fs/2),0.1,5)
sos = signal.butter(N,Wn,'low',output='sos')
这个过滤器最终必须嵌入在没有 FPU 的板上,所以我必须将 SOS 转换为整数数组。
但问题在于:SOS 矩阵第一行的某些系数太低,无法转换为 32 位整数:
[ 8.00108536e-32 1.60021707e-31 8.00108536e-32 1.00000000e+00
-9.97022785e-01 0.00000000e+00]
将几乎为零的值替换为 0 或 1(一旦所有其他系数都按比例放大)不起作用。
您是否知道一种 scipy 实用程序,它可以强制过滤器的设计与转换为整数兼容?
如果没有,您知道如何更改 buttord
或 butter
参数以增加第一行的系数吗? (采样频率和截止频率不能改变)。
提前致谢
解决方法
我终于通过后处理解决了。 回到 SOS 的定义,前三列是级联 biquad filters 分子的系数。
因此第一行系数的负幂可以分布在所有行上。 例如如下:
power = int(np.log10(np.abs(sos[0,0:3]).mean())-1)
power_by_line = -power // len(sos)
scale = 10 ** (-power_by_line)
for i in range(1,len(sos)):
sos[i,0:3] = sos[i,0:3] * scale
remaining = (len(sos)-1)*power_by_line
sos[0,0:3] = sos[0,0:3] * 10**remaining
结果过滤器似乎具有相同的行为(对于我需要的数值精度)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。