IIR 设计:SciPy CMSIS-DSP 系数格式

信息处理 无限脉冲响应 scipy 嵌入式系统
2022-02-17 17:29:35

您如何协调 Scipy.signal 的 IIR 设计与 CMSIS-DISP 的 API?Scipy.signal 以 3 种形式之一输出:

  • 分子/分母
  • 零极
  • 二阶部分。

CMSIS 需要一个长度为五的倍数的数组。每 5 个值是滤波器状态的系数 b0、b1、b2、a1 和 a2:“系数 b0、b1 和 b2 乘以输入信号 x[n],称为前馈系数。系数 a1 和 a2 乘以输出信号 y[n] 和称为反馈系数。注意反馈系数的符号。一些设计工具使用差分方程

Scipy 的格式似乎不兼容:分子/分母使用“b”和“a”术语,但返回 2 个数组:长度为 6 的分子数组和长度为 6 的分母数组。SOS 格式也返回长度为 6 的数组。

这与 FIR 形成对比,FIR 是一对一的映射。即两者都使用对应于卷积核的系数数组。相比之下,IIR 似乎更加多样化。

scipy.signal.iirdesign

CMSIS-DSP双二阶级联

1个回答

scipy.signal设置时返回一个 sos 矩阵output='sos',它是级联的二阶部分,形状为(n_sections, 6).

每行对应一个二阶部分,并且您[b0, b1, b2, a0, a1, a2]按顺序排列。标准化这些系数以确保a0=1,然后a0从数组中删除 - CMSIS 假设a=1您只需要 5 个系数。

值得一提的是,分母的符号在 scipy 和 CMSIS 中是不同的。CMSIS 中定义的差分方程由下式给出

y[n]=b0x[n]+b1x[n1]+b2x[n2]a1y[n1]a2y[n2]

但是它在 scipy/MATLAB 中由

y[n]=b0x[n]+b1x[n1]+b2x[n2]+a1y[n1]+a2y[n2]

所以你必须改变所有分母的符号。最后,所有部分的级联系数,你得到长度数组n_sections * 5

[b01,b11,b21,a11,a21,b02,b12,b22,a12,a22,,b0N,b1N,b2N,a1N,a2N]
其中是双二阶部分的数量,在 CMSIS 中定义。NnumStages