滤波器系数量化后,极点为何会跑偏
算法仿真通过以后,移到MCU或DSP上却出现频响偏差,很多时候不是公式写错,而是系数量化把极点零点搬了位置。数字滤波器的实现精度本身就是设计条件。
定点系数会把连续设计结果压到有限字长网格上。FIR结构通常表现为通带纹波和阻带衰减略变,IIR结构则更敏感,因为反馈系数直接决定极点位置。某个二阶节在浮点仿真里离单位圆还有余量,量化后如果极点半径变大,衰减会变慢,甚至在边界输入下出现长时间振铃。滤波器阶数越高、极点越靠近单位圆,系数字长越不能随便缩。
结构选择也会影响量化风险。直接型实现把多个极点零点集中在同一组系数里,数值条件差时小误差会被放大;级联二阶节能把问题拆小,但节的排列顺序和每节增益分配会影响内部状态峰值。若把高Q节放在前面,状态变量可能先被放大到接近溢出,再被后级衰减,输出看起来正常,内部却已经在饱和边缘。
溢出和舍入不是简单噪声。反馈环里的舍入误差会被递归结构反复带回,某些情况下形成极限环,输入已经为零,输出仍在小幅抖动;饱和算术比回卷安全,但会改变线性模型,强信号下的频响不再等于小信号频响。这类递归算法若用于保护、计量或闭环控制,小抖动可能被阈值或积分器继续放大。
工程实现前应先做定点仿真,而不是把浮点参数直接交给固件。把目标字长、乘加顺序、舍入方式、饱和策略和输入满量程都放进模型,再扫白噪声、阶跃、正弦和最坏幅值组合。只要某个内部节点超出范围,就应重新分配节增益、增加保护位,或者降低单节Q值,而不是等上板后靠经验调系数。
采样率变化也会改写量化敏感度。窄带低频IIR在高采样率下极点常常挤在单位圆附近,系数之间的有效差值很小,有限字长更容易把它们压成近似相同的数。此时换成多速率结构,先抽取再处理,反而能让极点位置更容易表达。代价是抽取前必须有足够抗混叠保护,不能为了数值稳定又引入混叠。
测试时要把频响验证和长时间零输入测试都做完。频响看系数是否偏离目标,零输入能暴露极限环,满幅阶跃能暴露内部溢出。若产品还会在线更新参数,参数切换瞬间也要检查状态变量是否需要清零、平滑过渡或双缓冲切换,否则一次配置变化就可能触发瞬态尖峰。
量产固件还要锁定编译和库函数行为。不同编译器优化级别可能改写乘加顺序,DSP库可能默认采用舍入、截断或饱和中的某一种;同一组系数在仿真脚本和目标芯片上若算术规则不同,频响就可能出现细小但可重复的偏差。把定点内核做成可回归测试,比人工比对几条曲线更稳。日志中还应记录溢出计数和饱和次数,避免问题只在长时间运行后显现,并随版本留档,便于追溯。
所以,数字实现不是成稿后的机械翻译。只有把字长、结构和状态范围一起设计,滤波器的极点才会留在你计算时放置的位置。





