Chirp-Z 变换 / Zoom-DFT 模拟器 返回
信号处理模拟器

Chirp-Z 变换 / Zoom-DFT 模拟器 — 窄带高分辨率频谱分析

普通 DFT 把频率 0~F_s/2 等分为 N 个 bin,而 CZT(Chirp-Z 变换)可在任意区间 [f_start, f_end] 上进行 M 点 Zoom 分析。实时可视化两个邻近频率分量的分离过程。

参数设置
第 1 频率 f_1
Hz
第 2 频率 f_2
Hz
CZT 起始频率 f_start
Hz
CZT 终止频率 f_end
Hz

采样频率 F_s = 1000 Hz、样本数 N = 256、CZT 输出点数 M = 256 固定。输入信号:x[n] = sin(2π f_1 n/F_s) + sin(2π f_2 n/F_s)。

计算结果
DFT 分辨率 F_s/N (Hz)
CZT 分辨率 (f_end-f_start)/M (Hz)
目标双频差 Δf (Hz)
CZT 分辨出的峰数
DFT(上)与 CZT(下)的幅度谱

上图:DFT 幅度 |X[k]|(蓝色),将 0~F_s/2 等分为 N 个 bin。下图:CZT 幅度(红色),在 [f_start, f_end] 内 M 个 bin。黄色竖线 = f_1, f_2。

理论与主要公式

Chirp-Z 变换(CZT)是一种广义 DFT,它沿 Z 平面上的等比螺旋采样 M 个点:

$$X[k] = \sum_{n=0}^{N-1} x[n]\,A^{-n}\,W^{nk}, \qquad k = 0,1,\dots,M-1$$

其中 $A = A_0 e^{j\theta_0}$,$W = W_0 e^{-j\phi_0}$。Zoom-DFT 取:

$$A = e^{j\,2\pi f_\text{start}/F_s}, \qquad W = e^{-j\,2\pi (f_\text{end}-f_\text{start})/(M\,F_s)}$$

于是输出在 $[f_\text{start}, f_\text{end}]$ 上等分为 M 点。普通 DFT 在 $0..F_s/2$ 上分为 N 点,因此分辨率分别为:

$$\Delta f_\text{DFT} = \frac{F_s}{N}, \qquad \Delta f_\text{CZT} = \frac{f_\text{end}-f_\text{start}}{M}$$

默认设置(F_s=1000、N=M=256、f_start=90、f_end=120)下,DFT 为 3.91 Hz/bin,CZT 为 0.117 Hz/bin,分辨率提升约 33 倍。

Chirp-Z 变换 / Zoom-DFT 模拟器是什么

🙋
我用 DFT 想分开 100Hz 和 105Hz,结果只看到一个峰,这是怎么回事?
🎓
这就是 DFT 的「分辨率墙」。简单地说,DFT 把 0 到 F_s/2 等分为 N 个 bin,分辨率是 $\Delta f = F_s/N$。F_s = 1000Hz、N = 256 时大约 3.91Hz/bin。5Hz 的差刚好在边缘,再加上窗函数的泄漏,两个峰就糊在一起了。看上面的蓝色 DFT 曲线——100Hz 附近就只有一个鼓包。
🙋
那增加采样数不就行了吗?
🎓
理论上是。但要 0.1Hz/bin 就需要 N = 10000,也就是 10 秒数据,对实时分析或非平稳信号来说是致命的。这时就轮到 CZT(Chirp-Z 变换)出场了:$X[k] = \sum_n x[n] A^{-n} W^{nk}$。选好 $A$ 和 $W$,就能「只对 90~120Hz 用 256 点 Zoom 分析」。看下面的红色 CZT 曲线——同样只用 256 个样本,100Hz 与 105Hz 已经清清楚楚地分成两个峰了。
🙋
真的诶!分辨率变成 0.117Hz/bin 了,因为 30Hz 带宽除以 256。这听起来像魔法,没什么代价吗?
🎓
好问题。代价是「观测时间」和「噪声抑制」。N 没变,所以观测时间 N/F_s = 0.256 秒也没变。「真正」的频率分辨能力(由 $1/T$ 决定的 Rayleigh 极限)并没改善。CZT 改善的是「在感兴趣带宽内把 bin 分得更细」。在雷达距离-多普勒成像、机械模态分析等场合非常实用。
🙋
CZT 和 FFT 在计算量上有什么区别?
🎓
FFT 是 $O(N \log N)$,按定义直接算 CZT 是 $O(N \cdot M)$。但用 Bluestein 算法可以把 CZT 转成 3 次 FFT,复杂度变成 $O((N+M) \log(N+M))$。本工具 N=M=256,直接计算就够快(65,536 次乘加,瞬间完成);当 N 上万时,就必须用 Bluestein 了。numpy/scipy.signal.czt 内部就是这么实现的。

常见问题

FFT 用 O(N log N) 计算 N 点 DFT。CZT 直接按定义式计算时为 O(N·M),但若使用 Bluestein 算法,可以将其转换为 3 次长度 L = 2^ceil(log2(N+M-1)) 的 FFT(两次正向、一次反向),复杂度变为 O(L log L)。本工具 N=M=256 较小,直接计算即可即时完成;实际工程中通常使用 Bluestein 算法。
雷达多普勒处理或机械模态分析中,关注频带通常只占整个频谱的一小部分。要用普通 FFT 在该带内获得相同分辨率,需要极长的采样时间;而 CZT 能仅对感兴趣的窄带进行 Zoom 分析。例如对 100±10Hz 用 256 点解析,分辨率为 20/256 = 0.078Hz,相当于 N = F_s/Δf = 12,800 点的 DFT。
Goertzel 用于高效计算单个(或少数几个)频率的 DFT 系数,每个频率耗时 O(N),M 个频率为 O(N·M)。CZT 直接计算同样为 O(N·M),但它一次性计算 Z 平面等比螺旋上的 M 个点,更适合密集相邻频率群的分析。Goertzel 适合 DTMF 等稀疏频率检测;CZT 适合获取整段 Zoom 频谱。
CZT 的频率分辨率为 (f_end − f_start)/M,即每个 bin 的最小可显示分辨率。但实际精度由信噪比和分析窗共同决定,配合抛物线插值或补零插值,通常可将频率估计精度提高到 bin 宽的 1/10 以下。本工具默认 30Hz 带宽 256 点 → 0.117Hz/bin,加上插值可达到 0.01Hz 量级的频率估计。

实际应用

雷达 / 声呐的高分辨率多普勒分析:脉冲多普勒雷达中,目标速度对应的多普勒频带只占整个雷达带宽的一小部分。CZT 可仅对该多普勒带做高分辨率分析,从而分辨编队飞行的飞机、相邻气象回波等近距离目标。同样的思路也用于气象雷达的风速反演与医学超声的彩色多普勒成像。

机械振动模态分析与结构健康监测(SHM):旋转机械的轴承故障诊断、桥梁与建筑物的常时微动测量,需要追踪固有频率的细微偏移(材料劣化或损伤的早期征兆)。用 CZT 在感兴趣的模态带(例如 50~60Hz 的一阶弯曲模态)做 Zoom 分析,可实现 0.01Hz 量级的频率追踪,大幅提升 SHM 系统的灵敏度。

通信信号的载波频率估计:卫星通信和窄带 IoT(LoRa、NB-IoT)需要补偿因多普勒漂移或本振漂移造成的载波频率微小偏差。在期望载波附近做高分辨率 CZT,可显著改善 AFC(自动频率控制)的跟踪性能,使接收机始终保持锁定。

音乐与乐器声学的谐波结构分析:乐器音色、歌唱声的纹理取决于各次谐波的微小频率变化(颤音、合唱效果)。在每个谐波周边做 CZT Zoom 分析,可暴露普通 FFT 看不到的微调制,对乐器设计、语音合成与音质评估都很有价值。

常见误解与注意事项

最常见的误解是认为 CZT 能分辨任意接近的两个频率。CZT 改善的只是「bin 间距」(显示分辨率),并不改变信号本身的频率分辨能力——后者由观测时间 $T = N/F_s$ 通过 Rayleigh 极限 $\Delta f_R = 1/T$ 决定。在本工具默认设置下,$1/0.256 \approx 3.9$Hz 才是真极限。5Hz 差勉强能分开,但若把 f_2 降到 102Hz,你会发现 CZT 的两个峰也会糊成一个——再细的 bin 也救不了。

第二个误解是 CZT 永远比 FFT 快。直接计算的 CZT 是 $O(N \cdot M)$,N=M=8192 时是 67,108,864 次乘加,比 FFT 的约 106,496 次慢 600 倍以上。CZT 真正具有竞争力是借助 Bluestein 算法的 $O((N+M) \log(N+M))$ 实现。本工具为了教学清晰用了直接定义式,实际应用请使用 scipy.signal.czt 或专用 CZT IP 核。

最后请注意,不能直接将 CZT 输出的幅度与 DFT 的幅度做绝对比较。CZT 的每个 bin 实质上对应不同的相位旋转 $A^{-n}$,因此各 bin 之间的主瓣宽度与旁瓣电平并不一致。要测量绝对幅度,需对每个 bin 单独标定,或在输入信号 x[n] 上施加 Hann/Hamming 等窗函数并除以相应的窗校正系数。本工具的纵轴只是相对幅度,不适合作为绝对幅度的测量值。