【问题标题】:Scipy filter : force minimal value of SOS coefficient to prepare integer filterScipy过滤器:强制SOS系数的最小值准备整数过滤器
【发布时间】:2021-07-01 18:07:59
【问题描述】:

我尝试使用 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 参数以增加第一行的系数吗? (不能改变采样频率和截止频率)。

提前致谢

【问题讨论】:

    标签: python filter scipy integer butterworth


    【解决方案1】:

    我终于通过后处理解决了它。 回到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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-09
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多