MCU定点滤波的位宽与反馈精度取舍
把浮点滤波器移到没有浮点加速的 MCU,计算变快并不代表结果仍然可信。定点实现既要防止中间乘加超出可表示范围,也要检查反馈量化是否让零输入下的状态持续振荡,这两类风险需要分别验证。
数值范围应从中间结果开始核算。有符号十五位小数格式通常以十六位整数保存数值,两个操作数相乘后,小数位数增加,不能直接按原输入格式解释。更关键的是多个乘积相加会扩大峰值,即便输入与系数都小于一,累加和仍可能超过输出范围。若实现使用的累加器保护位不足,错误可能先表现为整数回绕,后续再做饱和也无法恢复已经改变符号的中间结果。看输出位宽不足以判断安全。
对有限长滤波器,可利用输入峰值与系数绝对值之和估算保守输出上界,再结合累加器宽度预留保护位。对递归滤波器,仅检查前向系数不够,还需考察各级状态与内部节点的峰值,尤其是高品质因数和瞬态激励下的放大。相同输入下,某一节的内部幅值可能明显大于最终输出。因此,多级滤波器的次序与节间缩放需要一起确定,不能将浮点设计系数直接逐个转换后就视为移植完成。
右移缩放能够降低溢出风险,却会牺牲有效分辨率。库函数提供的输出移位参数,也可能同时影响系数解释与输出增益,具体行为应逐项查清。普通版本与快速版本可能使用不同精度的乘积和累加方式,不能仅凭函数名相近就假定误差一致。测试应包括正负满幅、阶跃和接近共振频率的连续输入,并记录每一级最大中间值。饱和次数最好单独统计,以免最终曲线平滑掩盖内部长期触顶。
范围全部合法之后,反馈仍可能引入量化问题。递归结构每次把状态存回有限位宽变量,都会产生舍入或截断误差;这个误差随后又作为下一次运算的输入进入反馈路径。当系统极点靠近单位圆时,小误差衰减得慢,在某些系数组合和舍入规则下,内部状态可能进入一个有限循环。于是外部输入已经归零,输出仍保留小幅周期变化。这是离散数值实现的行为,不能直接认定模拟输入仍有噪声。
系数量化也会改变反馈极点的位置。理论设计稳定,只能说明未量化模型满足条件,不能自动保证目标格式下同样稳定。应使用实际整数系数重新检查稳定边界,并在位精确模型中复现目标乘法、舍入、移位与饱和规则。对于需要极低截止频率的实现,状态变化可能接近最小量化步长,此时单纯增加采样率未必改善表现,反而可能把系数推向更敏感的数值区域,需要重新评估格式与结构。
验证 MCU 固件时,应先给滤波器一次有限激励,再将输入严格置零,观察不同初始状态下输出是否持续循环。单看正弦稳态频响容易漏掉这类问题。增加状态精度、采用更合适的节结构或改进舍入方式,通常比盲目提高输出位数更有针对性;人为加入死区虽然可能压住微小振荡,却会改变小信号响应,必须由业务允许的误差决定。不能把清零状态当成每次计算后的通用补丁,否则滤波器记忆本身也被破坏。
定点移植需要两份结论:最坏激励下中间运算不会失真,零输入下反馈状态也符合误差目标。位宽预算与递归量化同时受控,节省算力才不会变成隐藏的数值代价。





