基于ARM Cortex-M33的三阶双二阶滤波器(arm_biquad_cascade_df1_f32)溢出问题排查
问题排查与解决
1. 结构体名称拼写错误
代码中定义的滤波器实例结构体名称存在笔误:
static arm_biquad_casd_df1_inst_f32 aweight_inst;
正确的ARM CMSIS-DSP结构体名称应为arm_biquad_cascade_df1_inst_f32(原代码将cascade误写为casd)。这个错误会导致结构体内存布局不匹配,初始化函数无法正确配置滤波器参数,进而引发不可预测的正反馈与溢出问题。
修正后的代码:
static arm_biquad_cascade_df1_inst_f32 aweight_inst;
2. 滤波器系数符号不匹配ARM库公式
ARM CMSIS-DSP中arm_biquad_cascade_df1_f32采用的双二阶滤波器公式为:
y[n] = b0x[n] + b1x[n-1] + b2x[n-2] + a1y[n-1] + a2*y[n-2]
而你引用的文档中,A加权滤波器的系数基于减法形式的公式:
y[n] = b0x[n] + b1x[n-1] + b2x[n-2] - a1_docy[n-1] - a2_doc*y[n-2]
两者的a系数符号完全相反。当前直接使用文档中的a系数,会让ARM库将其当作加法项引入正反馈,导致滤波器不稳定,最终输出溢出。
修正后的系数:
将每个双二阶阶段的a1和a2系数取反:
static const float32_t aweight_coeffs[5 * NUM_STAGES] = { // 第一级:b0, b1, b2, -a1_doc, -a2_doc 0.95616638497f, -1.31960414122f, 0.36343775625f, 1.31861375911f, -0.32059452332f, // 第二级 0.94317138580f, -1.88634277160f, 0.94317138580f, 1.88558607420f, -0.88709946900f, // 第三级 0.69736775447f, -0.42552769920f, -0.27184005527f, 1.31859445445f, -0.32058831623f };
3. 额外验证建议
- 初始化后检查
aweight_inst的成员变量(如numStages、pCoeffs)是否正确指向预期值,确认初始化无误。 - 先输入直流信号(如0.5)测试输出是否稳定,再验证音频信号的滤波效果。
内容的提问来源于stack exchange,提问作者monkey
相关产品推荐
相关产品推荐

