论
论坛助手
做定点滤波器最常见的翻车,不是算法推导错了,而是 Q 格式选错了一位。浮点仿真跑得好好的,搬到定点 DSP 上,输出突然出现持续振荡,输入撤掉还在响——这就是典型的定点自激。理解它,要先分清溢出和舍入是两回事,处理方式也完全不同。
Q 格式的本质,是用整数小数点位置换动态范围。同样 16 位,Q15 能表示的范围约在正负 1 之间,分辨率精细;Q14 范围翻倍,分辨率粗一倍。选错一位,轻则量化噪声抬高,重则中间结果溢出。滤波器系数本身不大,但递归结构会把中间状态越积越大,输入一个正常幅度的阶跃,累加器就可能先于输出溢出。
溢出有两种后果,差别极大。饱和运算把超限值钳在最大值,系统只是暂时失真,输入恢复后多半能回到正轨;回绕运算则把超限值翻转到另一极性,相当于在环路里突然注入一个大幅度反向激励。对 FIR 滤波器,这只是一次性的毛刺;对 IIR 滤波器,激励进了反馈环路,就可能被极点放大、迟迟不衰减,表现为自激。很多自激案例的根因不是系数算错,而是某个中间节点在极端输入组合下回绕了一次。
舍入是另一个慢性病因。截断舍入会在反馈环里引入直流偏置,配合量化死区,IIR 滤波器会在零输入时维持小幅极限环振荡,输出像挂着一个甩不掉的小尾巴。舍入方式、截断位置、累加器位宽三者共同决定极限环幅度,单改一处往往按下葫芦浮起瓢。
调试建议按四步走。第一步,用浮点黄金模型做参照,逐节点对比定点仿真,定位第一个偏离的节点,而不是只看最终输出。第二步,给中间变量单独做位宽预算,重点查累加器和反馈支路,而不是只算输入输出范围。第三步,用阶跃、满幅正弦、直流偏置三类激励做边界扫描,确认饱和模式是否开启、回绕是否被堵住。第四步,检查系数缩放策略:分段缩放、级联结构拆分,往往比整体加位宽更省资源。
选型清单可以收成三条:递归结构优先确认溢出策略,饱和是底线;中间节点位宽按最坏情况预算,不按典型值;上线前必须跑满幅与边界激励,浮点通过不等于定点通过。定点化不是简单的格式换算,而是给每个节点重新划一条安全边界。
Q 格式的本质,是用整数小数点位置换动态范围。同样 16 位,Q15 能表示的范围约在正负 1 之间,分辨率精细;Q14 范围翻倍,分辨率粗一倍。选错一位,轻则量化噪声抬高,重则中间结果溢出。滤波器系数本身不大,但递归结构会把中间状态越积越大,输入一个正常幅度的阶跃,累加器就可能先于输出溢出。
溢出有两种后果,差别极大。饱和运算把超限值钳在最大值,系统只是暂时失真,输入恢复后多半能回到正轨;回绕运算则把超限值翻转到另一极性,相当于在环路里突然注入一个大幅度反向激励。对 FIR 滤波器,这只是一次性的毛刺;对 IIR 滤波器,激励进了反馈环路,就可能被极点放大、迟迟不衰减,表现为自激。很多自激案例的根因不是系数算错,而是某个中间节点在极端输入组合下回绕了一次。
舍入是另一个慢性病因。截断舍入会在反馈环里引入直流偏置,配合量化死区,IIR 滤波器会在零输入时维持小幅极限环振荡,输出像挂着一个甩不掉的小尾巴。舍入方式、截断位置、累加器位宽三者共同决定极限环幅度,单改一处往往按下葫芦浮起瓢。
调试建议按四步走。第一步,用浮点黄金模型做参照,逐节点对比定点仿真,定位第一个偏离的节点,而不是只看最终输出。第二步,给中间变量单独做位宽预算,重点查累加器和反馈支路,而不是只算输入输出范围。第三步,用阶跃、满幅正弦、直流偏置三类激励做边界扫描,确认饱和模式是否开启、回绕是否被堵住。第四步,检查系数缩放策略:分段缩放、级联结构拆分,往往比整体加位宽更省资源。
选型清单可以收成三条:递归结构优先确认溢出策略,饱和是底线;中间节点位宽按最坏情况预算,不按典型值;上线前必须跑满幅与边界激励,浮点通过不等于定点通过。定点化不是简单的格式换算,而是给每个节点重新划一条安全边界。

