计算快速变化的双二阶系数的技巧

信息处理 无限脉冲响应 双二阶 手臂
2022-02-27 06:06:04

我有 5 个“负峰值”双二阶,它们将改变中心频率,同时在实时微控制器(ARM cortex-m4)上保持恒定的 Q 和 A(幅度减小),编解码器通过 i2s 控制,i2c 系统以 96kHz 运行。我担心(我的示波器引起的担忧)我将被除法和正弦/余弦所困扰。我能做些什么来加快速度?

使用 RBJ 的 EQ 食谱,峰值滤波器采用以下系数:

w0 = 2*pi*f0/Fs;
A  = sqrt(10^(dBgain/40));
alpha = (sin(w0)/(2*Q));

b0 =   1 + alpha*A;
b1 =  -2*cos(w0);
b2 =   1 - alpha*A;
a0 =   1 + alpha/A;
a1 =  -2*cos(w0);
a2 =   1 - alpha/A;

此外,反馈系数将采用形式 c0 = b0/a0 c1 = b1/a0 c2 = b2/a0 和前馈系数: c3 = a1 / a0;c4 = a2 / a0;

扩大这些部门:

c0 = (1 + (sin(w0)/(2*Q))*A)/(1 + (sin(w0)/(2*Q))/A);
c1 = -2*cos(w0) /  (1 + sin(w0)/(2*Q)/A);
c2 =  (1 - (sin(w0)/(2*Q))*A)/(1 + (sin(w0)/(2*Q))/A);
c3 = c1;
c4 = (1 - (sin(w0)/(2*Q))/A) / (1 + (sin(w0)/(2*Q))/A);

在 MATLAB 中使用带有符号变量 w0、Q 和 A 的 simple(),我们得到:

c0 = (2AQ + A^2*sin(w0))/(2AQ+sin(w0))
c1 = -(4AQ*cos(w0))/(sin(w0) + 2AQ)
c2 = -(A^2*sin(w0) - 2AQ)/(2AQ + sin(w0));
c3 = c1;
c4 =  -(sin(w0)- 2AQ)/(2AQ + sin(w0)); 

如果 Q 和 A 是常数,没问题,这些可以提前计算。将要杀死我的是除法和正弦/余弦计算。

可以使用哪些技巧或过程来加快计算速度,或者如果有的话,可以进一步简化或近似滤波器系数?

1个回答

关于如何更便宜地评估诸如此类的功能,一个较早的答案它们是近似值,但非常好。sin()log()