快速傅里叶变换(FFT)中为什么要“补零”?
在数字信号处理中,快速傅里叶变换(FFT)是分析信号频率成分的核心工具。然而,直接对有限长度的采样数据做FFT,得到的频谱图往往呈现锯齿状,难以精确观察频率细节。此时,在数据末尾追加零值点,即“补零”(Zero-Padding),成为一种常用的视觉增强手段。
补零操作能在不改变原始信号信息的前提下,显著提高频谱的视觉分辨率,使谱线更光滑、峰值定位更清晰。不过,这一提升本质上是插值效应带来的视觉效果,并未改善信号固有的物理频率分辨率——后者仍由实际采样时间决定。本文将通过几组对比具体看看补零之后针对视觉分辨率的优化效果。
我们给出一个原始信号,含有3个频率分量,分别是50,100,100.5Hz,幅度都是1。采样频率是fs为1000Hz,采集时长T为1s,总共采集N=1000个点。时域上的原始波形和未补零的波形如下。

在采集1s原始信号的情况下,实际上频率分辨率就只是1Hz,相同的幅度下,50Hz频点处的信号幅度是可以和我们原始信号的幅度对应起来的。但是由于当前的采样时间下的信号做FFT之后,FFT频率分辨率δf为1/T ,直接做FFT,频域的数据间隔为1Hz。从上图可以看到50Hz频点处的信号频率和幅值都是正常的。
对于100Hz和100.5Hz信号,我们放大该频点的信号可以看到下图,100Hz的信号幅度更高。信号在这个频点发生了频谱泄露,因为对采集到的1s原始信号直接做FFT等于给信号加了一个矩形窗,1s的采集时长也不足以把整个原始信号的周期都采集完。原始信号的100.5Hz的能量泄漏到了附近的100Hz和101Hz的频点。
所以我们在这种情况下没办法看到实际上的100.5Hz的频率分量,而且由于频谱泄露(没有采到完整信号周期),还容易误判100Hz的频点的能量更高。

针对这种情况,“补零”可以起到一定的作用。
接着上图的解释,我们先理解一下“栅栏效应”。由于频率分辨率只是1Hz,相当于目前我们只是通过1间距为1Hz的栅栏,从空隙中观察真实的FFT信号,但是100.5Hz的信号刚好被栅栏挡住了,见下图,我们是没有办法看到该频点具体情况的。
为了可以观察更多的频点数据,可以先试试把栅栏的间距调小一点,见下图,观察到更多的频点数据。而“补零”可以让这种这些栅栏的间距小一些。

我们对原始数据补24个零值,长度补到1024个点。

可以看到,“补零”之后,FFT数据点更多了,delta f也成为了更小的0.976Hz。

FFT波形的点数变多了,看上去相比直接做FFT更连贯顺滑一点。补零点数不够的时候可能会不明显,但是补到2000个点,看上去效果更明显一点。



上图可以看到补零的点数越多,做出来的FFT点数越多,但是上图看到的即便补零到2000点,FFT能看到的100Hz和100.5Hz频点的幅度也是不正常的。
这就涉及到刚开始说到的视觉分辨率了。
实际采集到的频率分辨率只和采集时间T有关,我们对数据进行“补零”操作,比如增加到1024个点,对于视觉效果优化,可以理解为我们按照1000Hz采样率采集了1024个点,1.024s的数据,这个时候FFT画出来的图形,频率分辨率是1/1.024= 0.9765625Hz。
同理,补零到2000个点,画出来的图形的频率分辨率是0.5Hz。所以相对来说,FFT的数据点更多,还出来的图形更连贯顺滑。但是原始数据是不变的,我们增加的全都是零值,这个只影响FFT画图画出来的数据点多少,本质上没有增加任何原始数据。这也是即便补零补到2000个数据点,看到的100Hz和100.5Hz频点幅度也是超过1的原因。
但是,“补零”后显示效果优化了,相比我们没进行“补零”前的数据,起码现在我们可以知道在100.5Hz频点能量和100Hz处能量是一致的。
如果想看到更真实的数据,也可以调整下采集时间,比如下图,直接调到2s采集时间,实际的频率分辨率可以到0.5Hz,看到的FFT效果还是比较理想的。












评论