微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Scipy 滤波器:强制 SOS 系数的最小值来准备整数滤波器

如何解决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 实用程序,它可以强制过滤器的设计与转换为整数兼容?

如果没有,您知道如何更改 buttordbutter 参数以增加第一行的系数吗? (采样频率和截止频率不能改变)。

提前致谢

解决方法

我终于通过后处理解决了。 回到 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 举报,一经查实,本站将立刻删除。