在定点DSP上实现快速傅里叶变换时,溢出是最常见也最隐蔽的故障来源。定点数的表示范围是有限的,蝶形运算中的加法和乘法都可能让中间结果超出这个范围,一旦溢出,结果不是慢慢变差,而是突然出现大幅跳变,频谱上表现为杂散和底噪抬升,而且这种错误很难通过事后滤波消除。因此,定点FFT的设计重点从来不只是算法正确,更是全程的动态范围管理。

溢出的根因可以从FFT的增益特性说起。一次基二FFT的每一级蝶形运算都可能让信号幅度翻倍,经过多级累积,理论上的最大增益与点数成正比。虽然实际信号很少在每一级都达到最坏情况,但工程设计不能赌运气,必须按最坏情况留出余量。动态范围预算就是在设计之初算清楚这笔账:输入信号的最大幅度是多少,中间各级可能放大多大倍数,输出需要保留多少有效位数,噪声底又在哪里。只有把这几个量放在同一张表里,才能决定每一级的缩放系数。

常见的缩放策略有三种,各有取舍。第一种是每级统一右移一位,也就是每级除以二,这种方法最保守,绝对不会溢出,但会逐级损失精度,小信号在长FFT里可能被量化噪声淹没。第二种是按需缩放,只在检测到可能溢出时才缩放,这种方法精度保持得最好,但需要额外的溢出检测和控制逻辑,实时性要求高的场合要仔细评估开销。第三种是分段缩放,根据信号统计特性在前几级多缩放、在后几级少缩放,兼顾安全与精度,但需要先用典型数据做仿真验证,不能凭感觉定系数。

选择策略时还要考虑输入信号的特性。语音、振动这类动态范围大的信号,峰值因子高,预算要按峰值而不是均值来算;通信基带信号经过成形滤波后峰均比较高,同样不能只看平均功率。一个实用的做法是先用浮点模型跑出各级信号的最大值和均方根值分布,再把定点预算建立在这个分布之上,并留出一定的裕量应对实际数据超出仿真样本的情况。

调试定点FFT溢出也有固定的排查顺序。先用单频信号和冲激信号做定点与浮点对照,定位溢出发生在第几级;再检查该级的输入幅度和缩放系数是否匹配;然后确认舍入方式是截断还是四舍五入,截断会引入直流偏置,长期累积也会抬升误差;最后检查乘法器的中间位宽是否足够,常见的错误是把乘法结果直接截断到输入位宽,而没有保留足够的保护位。把缩放策略写进设计文档,把各级的最大幅度仿真结果存档,后续换点数、换位宽时才有据可依,不用每次重新试错。