在回答上一个问题时,有人说应该对输入信号进行零填充(在末尾加零,以便至少一半的波形是“空白”) )


这是什么原因?

评论

这取决于您在做什么。这可能是对我的回答的评论。我添加了一些解释。

@endolith:我最初考虑将其作为评论,但是我认为这个问题可能引起普遍关注,如果对此问题的好的答案被埋在某处的评论中,那将是一个遗憾。如果您不同意,我将删除此问题。

嗯,这是一个非常笼统的问题。您可以将零位设为2的幂,也可以将零位设为圆形,使其表现得与非圆形一样,也可以对信号进行重采样,更改频率分辨率等。 >
也相关:dsp.stackexchange.com/questions/331/…

#1 楼

零填充允许人们使用更长的FFT,这将产生更长的FFT结果向量。

更长的FFT结果具有更多频率间隔更紧密的频率区间。但是,它们实际上将提供与原始数据较短的非零填充FFT的高质量Sinc插值相同的结果。

不进行进一步插值绘制时,这可能会导致频谱看起来更平滑。

尽管此插值方法无法解决相邻或附近频率的分辨率或分辨率,但它可能使从视觉上分辨不包含任何频率的单个隔离频率的峰值更容易频谱中明显的相邻信号或噪声。从统计上讲,较高的FFT结果仓格密度可能会使峰值幅度仓格更可能接近随机隔离的输入频率正弦波的频率,并且无需进一步插值(抛物线等)。

但是,实质上,DFT / FFT之前的零填充是对大量点进行插值的一种高效计算方法。

零填充用于互相关,自相关或卷积过滤用于不混合卷积结果(由于循环卷积)。线性卷积的完整结果比两个输入向量中的任何一个都长。如果您没有放置更长的卷积结果的结尾,则FFT快速卷积会将其混入并压缩您想要的结果。零填充可提供一串零,以便将更长的结果混合到其中。而且,将仅与零向量混合/求和的东西解混合起来要容易得多。

评论


$ \ begingroup $
最后一段是对原始问题的关键回答,尽管我认为可以更清楚地表述。可以在相关或卷积的上下文中执行零填充,以确保在频域中实现该过程会产生线性而不是圆形卷积/相关。但是,如果您愿意在一边做一些簿记工作(例如重叠保存和重叠添加算法),则不需要这样做。
$ \ endgroup $
–Jason R
2011年12月1日下午2:47

$ \ begingroup $
@Jason R:实际上,它们都是圆形卷积。普通(未经修剪)的FFT会进行所有乘法运算,并对部分结果进行折回。只是在充分填充零的情况下,所有这些乘和加的值均为零,因此没有人关心在圆上计算和缠绕的零。
$ \ endgroup $
– hotpaw2
2011年12月1日,7:06

$ \ begingroup $
确实;两个信号的DFT相乘确实会实现循环卷积。我应该用不同的措词:在一个信号的末尾填充零,以确保通过对它们进行线性卷积得到的结果与线性对其进行卷积得到的结果相同(假设线性卷积就是您想要的,这就是通常是这样)。
$ \ endgroup $
–Jason R
2011年12月1日下午16:23

#2 楼

在决定对时域信号进行零填充之前,需要考虑一些事项。

1)延长时域数据(不是零填充)以在频域中获得更好的分辨率。

2)如果您希望获得更好的FFT分格定义,但可以增加FFT点的数量,使其超出时域信号长度(零填充),尽管这样做并不能给您带来更多的真实分辨率。您还可以填充以得到2个FFT点的幂。

3)摆弄FFT点时(在上一个点中),请确保您的频率点最终位于所需的位置。这些点的间距是$ f_s / N $,其中$ f_s $是采样频率,而$ N $是FFT点的数量。

在http: //www.bitweenie.com/listings/fft-zero-padding/

最后要提到的一件事:如果将时域中的信号归零,并希望使用开窗功能,则确保在零填充之前先将信号窗口化。如果在零填充后应用窗口功能,则将无法完成窗口应完成的工作。更具体地说,从信号到零的过渡仍然会非常尖锐,而不是从零开始的平滑过渡。

#3 楼

通常,DFT之前的零填充等效于在变换后的域中进行插值或更频繁地采样。

此处快速直观地显示了相反的工作原理。如果您以较高的速率及时采样带宽受限的信号,则会得到更“压缩”的频谱,即两端两端都有更多零的频谱。换句话说,通过在DFT'ing之后简单地对频率进行零填充,然后对零填充的结果进行IDFT',就可以及时获取更多样本。

当零时相同的效果相反-填充及时发生。这是因为只要对信号进行带宽限制并至少以奈奎斯特速率采样,就可以实现完美的信号重建。

术语“分辨率”取决于您如何定义它。对我来说,这意味着可以可靠地(统计地)区分时间或频率上两个相邻观察点。在这种情况下,由于频谱泄漏,分辨率实际上取决于DFT大小。也就是说,窗口尺寸更小,转换后的信号更加模糊或模糊,反之亦然。它不同于您采样的频率或我所说的“定义”。例如,您可能以高速率(高清晰度)采样了非常模糊的图像,但是与以较低速率采样相比,您仍然无法获得更多信息。因此,总而言之,零填充根本不会提高分辨率,因为您不会获得比以前更多的信息。

#4 楼

如果人们对用来隔离时域样本的加窗函数的频谱感兴趣,那么零填充将增加加窗函数的频率分辨率。

如果时间信号是$ x(t)w(t)$,其中$ w(t)$是开窗函数,则总频谱为$ X(f)* W(f )$,其中$ * $表示卷积。

如果窗口函数是一个简单的矩形(从$ x(t)$中提取了一组值,那么$ X(f)$是同步函数。例如,如果Nfft与矩形的宽度相同,并且正好在一个bin频率处具有正弦曲线,然后出现在该bin中心的同步函数样本恰好落在非高峰零交叉处,而且您根本看不到频谱中的同步波形。如果现在将数据零填充到FFT中,您会在峰值和零交叉以外的其他位置看到一些样本,从而揭示了因此,零填充有什么用?在揭示窗口信号离散变换的本质时,这在教育上很有用,这是通常的情况。在任何情况下,如果您对载波上的孤立包络的频谱形状感兴趣,那么

#5 楼

可能有不同的原因,这取决于傅立叶变换之前和之后执行的任何过程。最常见的原因是在任何结果转换中都实现了更高的频率分辨率。就是说,在转换中使用的样本数量越大,所得功率谱中的二进制宽度越窄。请记住:binwidth = sample_frequency / transform_size(通常称为窗口大小)。由此可以想象,随着变换大小的增加,binwidth会减小(=更好的频率分辨率)。零填充是一种在不将新信息引入信号的情况下增加变换大小的方法。

那么,为什么不进行更大的变换而没有零填充呢?那会不会达到同样的效果?好问题。在许多情况下,您可能需要分析时域数据流,为此您可能正在使用短时傅立叶变换(stft)。这涉及根据所需的时间分辨率,每N个样本进行一次转换,以表征频谱变化。问题就在这里。窗口太大,您将失去时间分辨率;窗口太小,您将失去频率分辨率。然后,解决方案是采用较小的时域窗口,以提供良好的时间分辨率,然后对其进行零填充以提供良好的频率分辨率。希望这对您有用

更新
我没有很好地解释。我应该更好地澄清它。谈到窗口化变换,实际上您没有获得“实际的”更大的频率分辨率,但出于可视化目的(用眼睛读取功率谱),它可以提供更清晰的结果。使用临界采样率,每个旁瓣都占据一个单元,这取决于制图技术可能会产生误导。零填充可提供内插频谱,这可能会更清楚。此外,如果您使用简单的峰采集方法进行频率估计,则零填充的频谱插值效果将使您的频谱样本更接近主瓣的真实峰值。该链接提供了一些有用的图表:http://www.dsprelated.com/dspbooks/sasp/Practical_Zero_Padding.html

评论


$ \ begingroup $
这个答案不正确。零填充根本不会提高频率分辨率;它只是在较小变换的输出之间进行插值。您可以将零填充视为添加更多的频点,这些频点具有与较小的变换相同的带宽。因此,从滤波器组的角度看,它们的通带重叠。
$ \ endgroup $
–Jason R
2011年12月1日下午2:41

$ \ begingroup $
如果它有助于理解:您也可以执行相反的操作:对信号进行FFT,然后对结果进行零填充,然后对FFT进行逆运算。这将对原始信号进行插值。但是当然,该信号仍将是相同的信号,具有相同的奈奎斯特带宽。插值不会为您提供比原始频率更高的频率信息。
$ \ endgroup $
– Endolith
2011年12月1日19:18

$ \ begingroup $
@Jason R-对,您的回答是误导性的,我试图在原始帖子中进行澄清。我不应该说零填充会提高频率分辨率。
$ \ endgroup $
–丹·巴里
2011-12-7 11:56

#6 楼

我没有在先前的良好响应中看到这些内容,因此我将添加以下零填充的其他重要原因:

基数2算法效率更高,因此将零填充到下一个2的幂(或在某些情况下对于基数为4的幂),或者更重要的是避免任何大的素数可以提高实时性能。同样,当使用FFT进行分析时,通常会执行零填充来计算DTFT的样本,例如确定FIR的频率响应:比较fft([1 1 1 1])与fft([1 1 1 1], 512),与freqz([1 1 1 1])相同。