零填充的公式与作用
:采样率
:采样点数(实际采到的点数,不包含零填充)
其中FFT 的分辨率完全取决于采样时间长度 ,和采样率 ,与零填充无关。
如果原始信号长度是 ,我们在末尾补零到 点(通常取到 2 的幂,比如 或 ):
FFT 之后的频率刻度变成:
频率分辨率 Δf 并没有变: 依旧是 ,因为“有效采样时长”没变。
只是增加了插值点:频谱曲线变得平滑,看起来像“更细”;实质是对原本 FFT 结果做了sinc 内插**。
方便峰值估计:QIFFT(抛物线插值)+ 零填充,能更稳地找到峰值;但不能替代真正增加采样时长。
采 1 秒的信号,不管零填充到 4k 还是 64k 点,频率分辨率始终是 1 Hz;只是零填充后,频谱图上的线条更密,看起来“平滑”,便于肉眼或算法做峰值检测,实际上要真的让分辨率更细,必须采更久。
零填充 = 频谱插值 ≠ 增加分辨率
做一个小可视化对比:同样 1 秒、1 kHz 正弦波,分别用 1024 点 FFT 和 1024 点+零填充到 8192 点 FFT,画出来两张图,直观展示“曲线更平滑,但 Δf 没变”

image-20250920082326123
图里清楚地展示了 零填充的效果:
橙色曲线(无零填充,N=8000):频谱点很稀疏,每隔 1 Hz 才有一个采样点。
蓝色曲线(零填充到 M=8192):频谱曲线变得平滑,点数更密,看起来像“更精细”。
但关键是:
主峰依然宽度相同,旁瓣位置没变;频率分辨率 Δf 仍然是 1 Hz,因为实际采样时长还是 1 秒。
零填充 = 插值绘图,让曲线更平滑;不能改变频率分辨率;要真想更细,还说只能采更久(增加 N 点数)。
做一个“同样 Δf=1 Hz,但是零填充和非零填充下的 QIFFT 基频估计对比”,展示为什么它能帮忙“读取峰更准”

真实频率:1000.37 Hz
无零填充 (N=8000):QIFFT 估计 ≈ 1000.322 Hz,已经挺准,但和真实值有约 0.05 Hz 的偏差。
零填充到 65536 点:QIFFT 估计 ≈ 1000.370 Hz,几乎与真实值完全一致。
零填充 不增加分辨率(Δf 仍是 1 Hz),但是:它让谱线在峰附近更平滑、密集;配合 QIFFT 之类的插值算法时,能更精确地“锁定峰值”。
所以工程里常见做法是:用 Hann/Blackman 窗减少泄漏;零填充到 4N、8N;再做 QIFFT → 获得比 Δf 更细的频率估计。