雷达 · 通信 · 电子战 / 基础精学 143
Goertzel算法用二阶实系数递推求取指定DFT频点,在只需少量频率时可减少完整FFT及其存储开销。
长度N有限记录,指定整数DFT索引k,角频率 ω=2π k/N;递推状态起始为零。
s[n]:二阶递推状态(幅度)
ω:目标频率(rad/sample)
N:记录长度(sample)
X[k]:目标DFT值(幅度谱)
采用
![s[n]=x[n]+2\cos(\omega)s[n-1]-s[n-2],\quad s[-1]=s[-2]=0.](http://mmo.508mallsys.com/image/loading/transparent.png)
其传递函数为 1/(1−2cos(ω)z−1+z−2),分母因式为
处理N个样本后定义
对应有限冲激响应求和可得
![v=\sum_{m=0}^{N-1}x[m]e^{\mathrm j\omega(N-1-m)}](http://mmo.508mallsys.com/image/loading/transparent.png)
故
整数k时该前因子等于
不能在需要绝对相位时遗漏。
实输入状态为实数,前因子模为1,因此
只需要功率时可避免末端复数旋转,但仍需正确处理状态增长。
Goertzel 二阶递推的极点位于单位圆。其状态冲激响应可写成
长度 N 的输入若满足 |x[n]|≤ X,三角不等式给出保守状态界
状态需求随块长增长,并在接近直流或 Nyquist 时使该界变松。
有限块内可正确完成频点求和,不意味着递推可无限运行而保持有界。块开始清零与末端相位组合都是定义的一部分,不能把跨块残留状态当成新的独立 DFT 结果。
递推谐振器积累指定频率的相干贡献,有限记录结束时再组合状态消去不需要的另一极点。
N=96、k=16时系数 2cosω=1,以显式递推比较直接复指数内积的复值和功率,检查末端相位因子。
| 量 | 数值 |
|---|---|
| length | 96 |
| bin | 16 |
| recursion coefficient | 1 |
| complex value error | 9.87117515866e-14 |
| power identity error | 9.09494701773e-13 |
| state peak | 56.0507860065 |
| omitted phase error rad | 1.0471975512 |

图 1 Goertzel单频递推的理论关系与固定参数验证
表中数值和图中曲线由 MATLAB 实际运行得到,随机种子为 20261062;运行版本与完整结果另存为独立文件。
RTL实现 s← x+s1−s2,对应 ω=π/3 的Goertzel状态更新,并输出最新两个状态;
末端复数相位旋转由外部完成。 RTL 采用同步有效信号和异步低有效复位;空拍保持状态且输出无效。除另有说明外,输入为16位有符号整数,结果为64位有符号整数,测试范围内不截断或饱和。
输出在采样时钟上升沿更新。自检覆盖连续样本、空拍和复位;未进行器件布局布线、时序收敛或功耗验证。
独立自检程序已在 Icarus Verilog 13.0 中实际运行并通过。该结果不包含器件综合、静态时序分析或板级测试。
Goertzel递推适用于少量已知频点的幅度测量和基础音调检测。目标频点数量很少时,可避免计算和保存其余频谱。若需要绝对相位、非整数频率或跨块相干比较,则末端相位因子和记录起点必须明确保留。
极点在单位圆上,无限时长运行不构成BIBO稳定滤波器。
每个有限块必须按约定复位。
频率接近直流或Nyquist时内部状态可能显著增长。
Goertzel算法用二阶实系数递推求取指定DFT频点,在只需少量频率时可减少完整FFT及其存储开销。
内容依据:每日精学第 143 课《Goertzel单频递推》。图表沿用原课固定参数数值结果,属于数值验证,不代表设备实测。