0

我尝试使用 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 实用程序,它强制过滤器的设计与转换为整数兼容吗?

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

提前致谢

4

1 回答 1

0

我终于通过后处理解决了它。回到 SOS 的定义,前三列是级联双二阶滤波器分子的系数。

因此,第一行系数的负幂可以分布在所有行上。例如如下:

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

生成的过滤器似乎具有相同的行为(对于我需要的数值精度)。

于 2021-07-01T10:07:59.847 回答