雷达 · 通信 · 电子战 / 基础精学 134
重叠相加将长序列拆成互不重叠的输入块,对每块进行零填充频域卷积,再相加重叠输出以恢复完整线性卷积。
FIR长度K,输入块长B,FFT长度 N≥ B+K−1;输入和系数块外均零延拓。
B:输入块长(sample)
K:FIR长度(tap)
N:FFT长度(point)
yq:第q块局部输出(幅度)
记块 xq[r]=x[qB+r],仅 0≤ r<B 非零,则
利用卷积线性与移位性质
每块线性卷积长度至多 B+K−1。当 N≥ B+K−1 时,零填充后的循环卷积与线性卷积一致:
相邻局部输出起点相隔B,局部长度 B+K−1,所以存在K-1点重叠。全输出为
![y[qB+r]\mathrel{+}=y_q[r],\quad0\leq r<B+K-1.](http://mmo.508mallsys.com/image/loading/transparent.png)
重叠样本必须相加而非覆盖,最后一个不足B的输入块需补零但输出仅保留真实线性卷积长度。
长度为 B 的输入块与长度 K 的滤波器线性卷积共有 B+K−1 项。若 FFT 长度小于这一长度,循环结果把超出部分折返到块首:
重叠相加只能正确相加不同输入块的线性尾部,不能撤销单块内部已经发生的循环折叠。
因此必须先满足 N≥ B+K−1。长度 Nx 的完整输入最终应产生
个样本,最后不足一块的输入可补零参与运算,但补零产生的无关尾部需要按此长度裁剪。
最后一块输入结束后仍存在滤波器尾部;过早停止输出会使中间各块完全正确而整体卷积仍不完整。
每个输入块都向其后的K-1个时刻贡献滤波尾部,输出重叠正是卷积记忆的体现。
以257点输入、17抽头FIR、B=48及N=64验证完整重叠相加与直接卷积,另外令FFT长度不足,展示循环折叠误差。
| 量 | 数值 |
|---|---|
| 输入长度 | 257 |
| 滤波器长度 | 17 |
| 块长 | 48 |
| FFT 长度 | 64 |
| 块数 | 6 |
| equivalence max error | 2.49800180541e-16 |
| short fft max error | 0.127968090048 |
图 1 重叠相加快速卷积的理论关系与固定参数验证
表中数值和图中曲线由 MATLAB 实际运行得到,随机种子为 20261053;运行版本与完整结果另存为独立文件。
RTL实现64位加宽的输出重叠加法 a+b,a为当前块样本、b为缓冲尾部样本;FFT及尾部地址控制由外部负责。测试覆盖正负极值,64位输出避免16位相加回绕。
RTL 采用同步有效信号和异步低有效复位;空拍保持状态且输出无效。除另有说明外,输入为16位有符号整数,结果为64位有符号整数,测试范围内不截断或饱和。
输出在采样时钟上升沿更新。自检覆盖连续样本、空拍和复位;未进行器件布局布线、时序收敛或功耗验证。
独立自检程序已在 Icarus Verilog 13.0 中实际运行并通过。该结果不包含器件综合、静态时序分析或板级测试。
重叠相加适用于长FIR和离线大记录卷积。各输入块可独立执行FFT,之后按绝对输出索引累加尾部,因此便于块任务并行。实时处理时还需要给尾部缓存、块等待时间及FFT吞吐量分别分配预算。
错误FFT长度使局部循环卷积混叠。
最后一块的补零和输出截断必须明确。
块长影响延迟和运算效率,不能只追求大FFT。
重叠相加将长序列拆成互不重叠的输入块,对每块进行零填充频域卷积,再相加重叠输出以恢复完整线性卷积。
内容依据:每日精学第 134 课《重叠相加快速卷积》。图表沿用原课固定参数数值结果,属于数值验证,不代表设备实测。