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

Chirp-Z 变换 / Zoom-DFT 模拟器 — 狭带宽高分辨率分析

DFT 将频率 0〜F_s/2 平均分为 N 等份,但 CZT(Chirp-Z 变换)可以对任意频率范围 [f_start, f_end] 进行 M 点缩放分析。实时可视化接近两个频率的分离。

参数设置
第 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)。

暂停时,拖动滑块即可即时更新结果。

计算结果
缩放起始 f_start (Hz)
缩放终止 f_end (Hz)
CZT 点数 M
CZT 分辨率 Δf (Hz)
分离的峰值 (Hz)
CZT 缩放分析实时可视化

时间信号(上)、z 平面上的 CZT 围线(左)、全频带 DFT 与扫描中的缩放窗(右上)、分离接近峰值的 CZT 缩放(右下)。缩放窗自动扫描。

理论·主要公式

Chirp-Z 变换(CZT)沿 Z 平面上的等比螺旋对 M 个点进行采样,是通用的 DFT:

$$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 份,所以分辨率是 $\Delta f = F_s/N$。采样 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 个点进行缩放"。看下面的红色曲线——同样 256 个样本,100Hz 和 105Hz 却清晰地分开成两个峰!
🙋
确实!分辨率变成 0.117Hz/bin 了。30Hz 频带分成 256 点。但这像魔法一样,有什么代价吗?
🎓
有权衡的。主要是"观测时间"和"噪声抑制"。样本数 N 没变,所以观测时间 N/F_s = 0.256 秒也没变。这意味着"真实的"频率识别能力(由 Rayleigh 限制 $1/T$ 决定)也不变。CZT 的优势在于"把目标范围缩小,可以让那个范围的频箱变细"。在实际应用中,雷达的多普勒分析和机械振动固有频率识别就大量使用 CZT。
🙋
与 FFT 的计算量有什么区别?
🎓
FFT 是 $O(N \log N)$,直接计算 CZT 是 $O(N \cdot M)$。但用 Bluestein 算法可以把 CZT 转换为 3 次 FFT(2 次前向,1 次逆向),长度为 L = 2^ceil(log2(N+M-1)),计算量变成 $O(L \log L)$。本工具中 N=M=256 很小,直接计算就够快(65,536 次运算瞬间完成),但 numpy.scipy.signal.czt 内部用的就是 Bluestein 法。

常见问题

FFT 用 O(N log N) 计算 N 点的 DFT。CZT 本质上是 O(N·M) 的直接计算,但使用 Bluestein 算法可以转换为长度 L = 2^ceil(log2(N+M-1)) 的 FFT 3 次(前向 2 次,逆向 1 次),计算复杂度为 O(L log L)。本工具中 N=M=256 较小,直接计算足够快,但实现上 Bluestein 法是标准方法。
在雷达多普勒分析和机械振动固有频率识别中,关注频带通常只占整个频谱的很小部分。FFT 实现全带宽高分辨率需要长时间采样,而 CZT 只需对关注频带进行缩放。例如以 256 点分析 100Hz±10Hz,可得到 20/256 = 0.078Hz 的分辨率,相当于 DFT 需要 N = F_s/Δf = 12,800 点。
Goertzel 是一种高效计算单一频率(或少数频率)DFT 系数的算法,O(N) 时间内获得 1 个频率。M 个频率则为 O(N·M)。CZT 虽然也是 O(N·M),但 CZT 计算等比螺旋上的 M 个点,更适合相邻频率群的分析。Goertzel 用于 DTMF 检测等稀疏频率检测,CZT 用于获取完整的缩放频谱。
CZT 的频率分辨率是 (f_end − f_start)/M,这是频箱宽度的最小分辨率。但真实精度由信噪比和窗函数决定,采用抛物线插值或零填充插值可以将频率推估精度提高到频箱宽度的 1/10 以下。本工具中 30Hz 频带分为 256 点,得到 0.117Hz/bin,加上插值后可实现 0.01Hz 级的频率推估。

实世界应用

雷达和声纳的高分辨率多普勒分析:脉冲多普勒雷达中,目标速度对应的多普勒频率范围只占整个雷达频带的很小部分。使用 CZT 只对关注多普勒频率范围进行高分辨率分析,可以实现近距离多目标(如编队飞行的航空器)的速度识别。同样的思想也应用于气象雷达的风速推估和医疗超声的彩色多普勒成像。

机械振动固有频率识别(模态分析):旋转机械轴承异常诊断和桥梁、建筑物常时微动测量中,需要检测固有振动频率的微小变化(材料劣化或损伤的征兆)。对关注频段(如 50~60Hz 的 1 阶弯曲模式)使用 CZT 缩放分析,可实现 0.01Hz 量级的频率追踪,大幅提升结构健康监测(SHM)的灵敏度。

通信信号载波频率推估:卫星通信和窄带 IoT 通信中,需要补偿多普勒移频或振荡器漂移引起的载波频率偏差。使用 CZT 对接收信号的载波附近进行高分辨率分析,可以提升 AFC(自动频率控制)的追踪性能。也应用于 LoRa 等窄带调制方式的同步处理。

音响和乐器的倍音结构分析:乐器音色和歌声分析中,基频及其倍音(谐波)的微小偏差和波动(颤音、和声效果)决定了音色。使用 CZT 对各倍音附近进行缩放分析,可以可视化普通 FFT 无法看到的微细频率变化,用于乐器音色设计和语音合成品质提升。

常见误解和注意事项

最常见的误解是认为"用 CZT 就能分离任何接近的频率"。CZT 改进的是"频箱宽度"(显示分辨率),而不是信号的固有频率识别能力。观测时间 $T = N/F_s$ 决定的 Rayleigh 极限 $\Delta f_R = 1/T$ 不会因为用 CZT 而改变。本工具设置下,$1/0.256 \approx 3.9$ Hz 是真正的极限。5Hz 差异正好在极限边界,可以勉强分离,但 3Hz 以下的差异再怎么细化频箱也会融合。试试把 f_2 改成 102Hz,你会看到 CZT 也只显示一个峰。

另一个常见错误是以为"CZT 总是比 FFT 快"。直接计算的 CZT 是 $O(N \cdot M)$,N=M=8192 时就是 67,108,864 次运算,比 FFT($N \log_2 N \approx 106,496$)慢 600 多倍。CZT 的真正优势在于 Bluestein 算法实现的 $O((N+M) \log(N+M))$,才能和 FFT 相当。本工具出于教学目的用直接定义式,但实务中应该用 scipy.signal.czt 或 CZT 专用 IP 核。

最后要注意的是,不能把 CZT 输出的频谱振幅和 DFT 的直接对比。CZT 的每个频箱施加的是不同的分析窗(实质上是 $A^{-n}$ 的位相旋转),频箱间的频谱形状(主瓣宽度、旁瓣电平)并不相等。如果要测量绝对振幅,需要对各频箱分别做响应标定,或者在输入信号 x[n] 上施加 Hanning、Hamming 等窗函数,再用窗修正系数修正。本工具的纵轴是相对振幅,不适合绝对值测量。

使用指南

  1. 设置采样频率(例:1000Hz)和信号长度 N(例:1024 点),确认 DFT 的频率分辨率 F_s/N
  2. 用滑块 slF1Val 和 slF2Val 输入两个信号频率(例:100Hz 和 105.5Hz),确定目标频率差 Δf
  3. 用滑块 slFstartVal 和 slFendVal 指定缩放对象的频率范围(例:95Hz~110Hz),计算并运行 CZT 分辨率 (f_end-f_start)/M

具体计算示例

采样频率 F_s=2000Hz、信号长度 N=2048 点时,DFT 分辨率为 F_s/N=0.977Hz。包含 100Hz 和 104.5Hz 两个正弦波的信号,用普通 DFT 分析时两个峰会融合,但用 Chirp-Z 变换对 95Hz~110Hz 范围用 M=512 点分析,CZT 分辨率为 (110-95)/512=0.029Hz,可以清晰分离两个峰。在测量仪器频率响应分析或结构健康监测(SHM)中,识别相邻固有振动频率(例:风力发电机叶片 1.5Hz 和 1.6Hz)时非常有效。

实务中的注意事项