嗯?这么好的问题!
其实这个问题非常的有用,做工程,科研的谁没有见过上面 FFT,窗函数啥的,但是来龙去脉倒是散步在各种文章的角落里面,没有人来一篇综述一样的文章。
但是它最牛逼还是第一个 F=Fast,就是快,快就以为着效率高。那为什么会有这么多窗函数,其实源自 频域指标之间的“矛盾”,不同窗函数就是在这些矛盾中找到不同的折中。不可能“三全其美”:主瓣窄 / 旁瓣低 / 幅度准 → 无法同时满足。
窗函数的基本作用
在做 FFT 频谱分析 时,如果信号频率不是整数 bin,就会发生 谱泄漏(能量扩散到所有 bin)。 加窗函数的目的就是:
降低旁瓣(sidelobe) → 抑制泄漏,把能量限制在主瓣附近。
改善幅度估计 → 减少 scalloping loss,保证幅度更准确。
控制 ENBW(噪声带宽) → 影响噪声地板,决定噪声测量的准确性。
影响主瓣宽度 → 决定频率分辨率(能不能区分两条很近的谱线)。
窗函数之间的矛盾(关键指标)
主瓣宽度 vs 旁瓣高度
-
主瓣窄 → 分辨率高,但旁瓣就会高(Rect 窗就是极端)。 -
主瓣宽 → 泄漏抑制强(BH4/Nuttall),但分辨率下降。
幅度精度 vs 噪声带宽
-
Flat-top 窗让主瓣“平”,幅度几乎无误差,但 ENBW 超大(噪声地板高)。 -
Hann 窗 ENBW 小,噪声地板低,但 scalloping loss 仍有 −1.4 dB。
ENBW vs 动态范围
-
ENBW 小(Rect、Hann) → SNR 测量更准,但旁瓣高会污染动态范围。 -
ENBW 大(BH4、Flat-top) → 动态范围好,但噪声被“放大”。
因此需要“很多种窗”
不同窗函数就是在 主瓣宽度 / 旁瓣高度 / ENBW / 幅度精度 之间做取舍:
-
Rect:分辨率最好,但泄漏严重,只能在相干采样下用。 -
Hann/Hamming:折中,常用于 ENOB/SNR 测试。 -
Blackman/Blackman-Harris/Nuttall:牺牲分辨率,换取超低旁瓣,适合做 SFDR/THD。 -
Flat-top:幅度精度最优,适合校准。 -
Kaiser:加了一个参数 β,可以在“分辨率–旁瓣–ENBW”之间灵活调整。
换句话说: 没有一种窗能在所有场景下最优,所以才会有这么多选择;可以把“窗函数”理解成“不同滤波器设计”(FIR 的):
Rect = 硬切 → 最锐利但振铃(泄漏)
Hann = 温和过渡 → 常用折中
BH4/Nuttall = 高级滤波器 → 抑制振铃,代价是带宽更宽
Flat-top = 为幅度测量专门优化
Kaiser = 可调设计,用参数 β 决定“锐利还是平滑”
其中在频谱分析里,最核心的矛盾就是:
主瓣宽度(决定分辨率) → 越窄越能分辨相邻谱线,但泄漏容易扩散;
首旁瓣高度(决定泄漏抑制) → 越低越能看清弱小谐波,但主瓣就会变宽。
如果把“主瓣宽度”画在横轴,“旁瓣高度(dB)”画在纵轴,不同窗函数就在图上落在不同的区域。
越往右 → 主瓣越宽(分辨率降低)越往下 → 旁瓣越低(泄漏抑制越强)
数学推导(离散窗化 FFT 的核心结论)
信号、窗口与 DFT
采样长度 ,采样频率 ,设输入为单一余弦
加窗 后做 点 DFT:
把余弦写成指数并整理,可得(令 为“归一化频率(以 bin 为单位)”):
其中
是窗口的离散频响。
当 时,第一项占主导,因此谱泄漏的形状完全由 决定:矩形窗对应的 是 Dirichlet 核,旁瓣高;多项式余弦窗(Hann/Blackman/Blackman-Harris/Nuttall…)把旁瓣压低、但主瓣变宽。
一致性增益(Coherent Gain, CG)与幅度还原
若 相干采样( 为整数),主瓣峰值位于 ,有
定义
于是幅度无偏还原公式(单纯看峰值)是
当 非相干采样()时,能量分散到邻近 bin(泄漏),单 bin 幅度会低估。工程上常配合峰值插值(如三点抛物/Quinn/IpDFT)改善 和 。
ENBW(等效噪声带宽)与处理增益
把窗口看作一个 FIR:对白噪声,一个 FFT bin 的期望噪声功率与窗口平方和成正比。结论:
换算到 Hz:。
同样,处理增益(噪声地板相对时域的下降量):
所以:ENBW 越小,噪声地板越低;但通常伴随旁瓣较高或主瓣较窄/宽的权衡。
主瓣宽度、旁瓣与分辨率/动态范围
频率分辨率:主瓣越窄、越容易分开相近的两根谱线(以“零点到零点”或“3 dB 宽度”衡量)。
动态范围/泄漏抑制:首旁瓣越低、越不“污染”远处频点(计算 THD/SFDR/SNR 时更干净)。
典型趋势:Rect 主瓣最窄但旁瓣高;Hann/Blackman 逐步降低旁瓣、主瓣也随之变宽;Blackman-Harris 4-term / Nuttall 4-term 旁瓣可达 −90 dB 级别;Flat-top 强调平顶以减小“半 bin 频偏的幅度起伏”。
Scalloping Loss(波峰起伏)与插值
当正弦频率恰好落在两个 bin 的正中间(),若只取“最近整数 bin 的峰值 + CG 还原”,会产生最糟糕的幅度低估,称 scalloping loss。理想幅度 0 dB,对不同窗会出现 −3.9 dB(Rect)到约 −0.01…−0.5 dB(Flat-top/高阶窗)的差异。
插值(如三点抛物)可以明显缓解,但 Flat-top 天生让主瓣更“平”,因此对幅度测量最友好。
在默认非相干采样场景:
幅度最准确(做幅度/增益标定):Flat-top(5-term)。scalloping 极小,插值后 MAPE 最低;缺点是主瓣很宽、ENBW 大(噪声地板抬高、近线可分性变差)。
通用 SNR/ENOB 测试:Hann 是业界常用折中(ENBW≈1.5 bin、旁瓣约 −31 dB)。
要极低泄漏/做 THD、SFDR:Blackman-Harris 4-term 或 Nuttall 4-term(首旁瓣 ~ −90 dB 级),代价是更宽主瓣、略大 ENBW。
只要分辨率(两线很近)且“严格相干采样”:Rect(或加上整周采样)。这时没有泄漏,主瓣最窄;非相干则最不稳。
希望可调旁瓣/主瓣折中:Kaiser(调 ),例如 可得 ~ −60 dB 旁瓣。
其中要估计频率、又要抑制泄漏 → BH4 / Nuttall4(插值配合);如果相邻谐波很近(电机/逆变器) → 先考虑更长记录 ;若 受限,偏向主瓣较窄的窗(Hann/Hamming),并结合谱峰拟合/多谱融合。

来看看仿真结果:
窗口指标4096 点:包含
STDOUT/STDERR
窗口指标(4096 点)
Window CG ENBW (bins) Mainlobe 3dB width (bins) First sidelobe (dB) Scalloping @0.5 bin (dB)
Rect 1.000000 1.000000 0.453125 0.000000 -3.925724
Hamming 0.539888 1.363065 0.656250 0.000000 -1.751259
Hann 0.499878 1.500366 0.734375 0.000000 -1.422916
Kaiser(β=8.6) 0.420698 1.721792 0.828125 0.000000 -1.108702
Blackman 0.419897 1.727179 0.828125 0.000000 -1.098338
BH(4-term) 0.358662 2.004842 0.953125 0.000000 -0.825168
Nuttall(4-term) 0.355681 2.021726 0.968750 0.000000 -0.811357
Flattop(5-term) 0.999756 3.771085 1.875000 -0.000725 -0.015598
一致性增益 CG
ENBW(以 bin 为单位)
3 dB 主瓣宽度(bin)
首旁瓣电平(dB) (这里还有一个文章)
0.5 bin 频偏时的 scalloping loss(dB)
Monte Carlo(200 次随机频偏)三点抛物插值的幅度 MAPE:
典型地,会看到(示意):
Monte Carlo:随机频偏幅度估计平均相对误差
Window MAPE (parabolic, %)
Flattop(5-term) 0.689884
BH(4-term) 1.100685
Nuttall(4-term) 1.101500
Kaiser(β=8.6) 1.676467
Blackman 1.730524
Hann 2.477651
Hamming 3.729344
Rect 13.479280
条形图显示了不同窗在随机频偏时的平均相对误差(MAPE),能看出 Flat-top 最稳。
泄漏演示图:同一非相干正弦(同幅度、同频偏),不同窗的谱泄漏“裙摆”可比;展示“真实信号在 FFT 里会被污染成什么样”。
各窗的频响(dB)图:前 30 个 bin 范围,直观看主瓣宽度与旁瓣高度:展示“窗函数自身的滤波特性”,告诉你它在分辨率、泄漏抑制上的取舍。
Rect 窗 → 泄漏最严重,“裙摆”很宽,强信号会掩盖邻近弱信号。
Hann/Hamming → 泄漏明显减轻,裙摆下降到 −30 dB~−40 dB。
BH/Nuttall/Flattop → 泄漏抑制最强,裙摆快速衰减到 −80 dB 甚至 −100 dB,能看清弱谐波。
上面的图是展示每个窗函数本身的频谱特性:
主瓣宽度(决定分辨率,能否分开相近频率)。
首旁瓣高度(决定泄漏抑制能力,动态范围能到多少)。
其中主瓣越窄 → 频率分辨率越好。
如果旁瓣越低 → 谱泄漏越小,动态范围越大。
上面的图可以对比不同窗的“指标性能”,指导实际应用中怎么选:
做 SNR/ENOB → 选 Hann(主瓣适中,噪声地板低)。
做 THD/SFDR → 选 BH4/Nuttall(旁瓣最低)。
做 幅度精度 → 选 Flattop(scalloping 最小)。
窗的幅度还原(单峰)
三点抛物插值(幅度谱)设 ,则
插值后频率估计 ,幅度用 代入上式做还原。
ENBW(bin)
SNR/THD 评估的“排除带”:做总功率积分时,需在基波及其 个 bin(视窗主瓣宽度而定)设置防护带再积分噪声;否则把主瓣“裙摆”当成噪声会高估噪声。
总结一下相干采样就用矩形窗(峰值与功率最“干净”、ENBW=1)
条件:,并尽可能整数周期采样 + 去直流偏置。
非相干且需要幅度准确 → Flat-top + 抛物(或 Quinn)插值。
典型幅度误差 < 1%,对 THD/增益标定友善。
如果做 ENOB/SNR → 多用 Hann(折中);若谐波/邻峰干扰,升到 BH4/Nuttall4;记得用 ENBW 修正噪声谱密度;对主瓣设置足够排除带。
如果要区分很近的两条线 → 首先加长记录 N(真正的分辨率是 );若 N 受限,再用主瓣较窄的窗(Hann/Hamming/甚至 Rect,但注意泄漏)。
|
|
|
|
|
|---|---|---|---|
| 分辨率优先 |
|
|
|
| 折中型 |
|
|
|
| 低泄漏型 |
|
|
|
| 幅度精度型 |
|
|
|
| 可调型 |
|
|
|
https://zh./wiki/%E5%BF%AB%E9%80%9F%E5%82%85%E9%87%8C%E5%8F%B6%E5%8F%98%E6%8D%A2