我的文章里面经常在 FFT 里面出现 bin,bin,bin,其实之前也小小的解释了一下,但是可能太多了,大家没有注意,这里就单独的写一个小 Tips~
FFT 把长度 的时域序列分解成 个复数频率分量。
每一个输出点就是一个 bin(频率槽),它代表一个离散频率:
在实际分析里,我们通常只取前一半(0 ~ ),因为实数信号的 FFT 是共轭对称的。
第 0 个 bin (k=0) :直流分量(DC)。
第 1 个 bin:频率 = ,就是 1 个频率分辨率。
第 k 个 bin:对应频率 ,其中 。
Nyquist bin (k=N/2):对应 ,再往后就是镜像。
bin 宽度 = 频率分辨率 Δf:
意味着一个 bin 就是一个频率间隔。
如果信号频率恰好是 ,它的能量会全部落到这个 bin,非常干净(相干采样)。
如果信号频率不是 bin 的整数倍,就会“跨 bin 泄漏”,能量分散到邻近 bin → 看起来峰值偏移、幅值掉落。
采样率 Hz,采样点数 。
频率分辨率 Hz。
bin #1 = 1 Hz, bin #2 = 2 Hz, … bin #100 = 100 Hz …
如果你有一个 100 Hz 的正弦波,它会全部落在 bin #100;如果是 100.5 Hz → 不在整数 bin 上,就会泄漏到 100 Hz 和 101 Hz 的 bin,导致 FFT 看上去峰值“不稳”。
bin = 频率格子,信号能量会落在哪个格子,取决于 是否正好对齐。
相干采样:让 正好对齐 bin → 峰值稳定。
非相干采样: 落在格子之间 → 峰值分散、幅值掉。
零填充:不是增加 bin 数,而是把格子切得更细,方便看(相当于插值),Δf 本质还是由采样时长决定;建议看上面的文章来卡这句话。
把 FFT 想象成一排收音机频道(bin),频率分辨率 Δf = 每个频道间隔。
你的信号(1 kHz)就像一个广播电台;如果频道间隔刚好是 1 Hz,且你对准 1000 Hz 频道,信号“能量”就全在这一格;如果电台是 1000.37 Hz,正好卡在两个频道之间,它的能量就会分到两边的 bin;零填充 = 在刻度上“插更多点”,让你更清楚看到它其实在 1000.37 Hz,而不是 1000 Hz 或 1001 Hz。

image-20250920161204849
这张图正好展示了 bin 的概念和它对 FFT 结果的影响:
f0=50 Hz:信号频率正好对齐到 bin(Δf≈3.91 Hz 的整数倍),能量全部集中在一个谱线里,主瓣尖锐。
f0=50.5 Hz:频率卡在两个 bin 之间,能量分散到相邻的 bin,主峰变矮,旁边也冒出“裙边”。
f0=50.9 Hz:更靠近下一个 bin,能量更多地泄到后一格,看起来峰值位置也“漂移”。
bin 就是 FFT 的“频率格子”;信号频率如果对齐格子 → 峰值稳定;信号频率夹在格子之间 → 峰值泄漏到多个 bin,看似“变频/抖动”。

书接上文~
这张对比图说明了 零填充的作用:
原始 FFT (N=256):Δf≈3.91 Hz,f0=50.5 Hz 卡在 50 Hz 和 53.9 Hz 两个 bin 中间 → 峰值矮、能量分散,看不出“0.5 Hz 的细节”。
零填充到 M=4096:频谱点更密,主峰在 50.5 Hz 附近清晰可见 → 视觉上更平滑,但 Δf 还是 3.91 Hz(没变)。
零填充不改变分辨率(Δf),只是把频谱曲线“插值”得更细;配合 QIFFT 等插值算法时,可以更准确估算出 真实频率 f0,即使它不对齐 bin。