每日精学 139|FFT逐级缩放与位宽增长

2026-09-25

雷达 · 通信 · 电子战 / 基础精学 139

基二蝶形的峰值增长可通过保护位或逐级除二控制,整体归一化与每级舍入误差必须分开记账。

01
模型与符号

N为2的幂,复输入幅度有界,旋转因子为单位模;定点模型使用足够宽中间量后进行明确的除二取整。

As:第s级最大模(幅度)

p:层数(stage)

g:整体缩放(无量纲)

ϵs:第s级舍入误差(幅度)

02
从模型到公式

峰值增长

蝶形 u=a+Wb 满足

|u|\leq|a|+|b|\leq2A_s.

所以 As+1≤2As,p级后 Ap≤ NA0。这里用复数模界,不能直接把独立实虚部满量程当作同一个模上界。

逐级归一化

每级除以2后 As+1≤ As,总缩放为

g=\prod_{s=1}^{p}2^{-1}=1/N.

输出对应 X[k]/N;若报告原始DFT幅度,必须乘回N。

误差传播

对缩放蝶形算子 Bs 和舍入误差向量 es,递推为

\widehat x_s=B_s\widehat x_{s-1}+e_s.

展开得到

\widehat x_p-x_p=\sum_{s=1}^{p}B_pB_{p-1}\cdots B_{s+1}e_s.

误差发生位置影响最终结果,不能把所有缩放前置后宣称逐位等价。


逐级截断误差的传播

对每级除二的蝶形,设该级新增误差向量为

\boldsymbol e_s

精确级算子为 As。累计误差满足

\boldsymbol d_{s+1}=A_s\boldsymbol d_s+\boldsymbol e_s.

以复数模的最大值作范数,单位模旋转加和后除二给出

\|A_s\|_\infty\le1

因而

\|\boldsymbol d_p\|_\infty\le\sum_{s=0}^{p-1}\|\boldsymbol e_s\|_\infty.

此界用于每级完整复数误差,不应把单个实分量的一单位界直接当作复数模界。

若仅有实虚分量分别向下截断,复误差模可达 \sqrt2 个输出单位以内;旋转常数量化还需另计。逐级缩放防止增长,但改变了输出标度,六级除二后的结果对应原 DFT 除以六十四。


03
物理含义

保护位保留动态范围但增加存储与乘法代价,逐级缩放保持范围却在每层付出精度损失。

04
固定参数算例

使用N=64的整数输入实现逐级舍入DIT,比较缩放后浮点FFT,记录最大各级幅值及误差;另用满幅常值验证未缩放直流增长N倍。

固定参数数值验证结果
量数值
length64
级数6
总缩放系数0.015625
max fft error1.15593469923
输入峰值16012.7584757
final peak2759.02337794
unscaled dc peak640000
图 1:FFT逐级缩放与位宽增长的理论关系与固定参数验证图 1:FFT逐级缩放与位宽增长的理论关系与固定参数验证

图 1 FFT逐级缩放与位宽增长的理论关系与固定参数验证

表中数值和图中曲线由 MATLAB 实际运行得到,随机种子为 20261058;运行版本与完整结果另存为独立文件。

05
数字实现的边界

RTL实现一层实数蝶形的算术右移缩放:输出 (a+b)\gg1 与 (a-b)\gg1。输入先加宽,右移向负无穷取整;测试包括奇数和负数。

RTL 采用同步有效信号和异步低有效复位;空拍保持状态且输出无效。除另有说明外,输入为16位有符号整数,结果为64位有符号整数,测试范围内不截断或饱和。

输出在采样时钟上升沿更新。自检覆盖连续样本、空拍和复位;未进行器件布局布线、时序收敛或功耗验证。

独立自检程序已在 Icarus Verilog 13.0 中实际运行并通过。该结果不包含器件综合、静态时序分析或板级测试。

06
适用范围

逐级缩放用于有限字长FFT中的范围管理。每级缩放计划可与输入峰值限制、旋转因子精度及后级幅度标定共同设计。测试应包含相干同相叠加形成的高峰值,而不只使用平均功率较低的随机记录。

07
工程上需要注意

旋转因子量化也会贡献误差和轻微增益变化。

若按实虚部分量限定范围,需考虑旋转后的分量增长。

后级幅度标定必须包含全部级缩放。

基二蝶形的峰值增长可通过保护位或逐级除二控制,整体归一化与每级舍入误差必须分开记账。

内容依据:每日精学第 139 课《FFT逐级缩放与位宽增长》。图表沿用原课固定参数数值结果,属于数值验证,不代表设备实测。

阅读8
分享
写评论...