在进行傅立叶变换之前,为什么要对信号进行零填充?


77

在回答上一个问题时,有人说应该

对输入信号进行零填充(在末尾加零,以便至少一半的波形为“空白”)

这是什么原因?


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

@endolith:我起初以为是要发表评论的,但是我认为这个问题可能引起普遍关注,如果对此问题的好的答案被埋在某处的评论中,那将是一个遗憾。如果您不同意,我将删除此问题。
乔纳斯(Jonas)

9
嗯,这是一个非常笼统的问题。你可以填零,使东西幂的2,你可以零垫,使循环改造表现得像非圆形的变换,你可以做到这一点重新采样信号,以改变频率分辨率,等等,等等
endolith

Answers:


82

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

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

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

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

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

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


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

4
@Jason R:实际上,它们都是圆形卷积。普通(未经修剪)的FFT会进行所有乘法运算,并对部分结果进行折回。只是在充分填充零的情况下,所有这些乘和加的值均为零,所以没有人关心在圆上计算和包裹的内容。
2011年

9
确实; 两个信号的DFT相乘确实会实现循环卷积。我应该用不同的措词:在一个信号的末尾填充零,以确保通过对它们进行线性卷积得到的结果与线性对其进行卷积得到的结果相同(假设线性卷积是您想要的,这就是通常是这样)。
詹森·R

27

在决定对时域信号进行零填充之前,需要考虑一些事项。您可能根本不需要将信号填充为零!

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

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

Fs/ñFsñ

http://www.bitweenie.com/listings/fft-zero-padding/上有一些很好的数字说明了这些观点

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


8

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

这是相反原理的快速可视化。如果以较高的速率及时采样带宽受限的信号,则会得到更“压缩”的频谱,即两端的零均较多的频谱。换句话说,通过在DFT'ing之后简单地对频率进行零填充,然后对零填充的结果进行IDFT',可以及时获取更多样本。

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

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


6

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

XŤwŤwŤXFw ^F

XŤXF FFT,您会在峰值和零交叉点以外的地方看到一些样本,从而揭示了所得频谱中同步函数的形状。那么零填充有什么用呢?在揭示加窗信号的离散变换的性质时,这当然是具有教育意义的,这是通常的情况。从实际意义上讲,它在您对载有载波的孤立包络的频谱形状感兴趣的任何情况下都可能有用。


4

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

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

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


9
这个答案是不正确的。零填充根本不会提高频率分辨率;它只是在较小变换的输出之间进行插值。您可以将零填充视为添加更多的频点,这些频点具有与较小的变换相同的带宽。因此,从滤波器组的角度看,它们的通带重叠。
杰森R

1
如果它有助于理解:您还可以执行相反的操作:对信号进行FFT,然后对结果进行零填充,然后进行逆FFT。这将具有对原始信号进行插值的效果。但是,当然,该信号仍将是相同的信号,具有相同的奈奎斯特带宽。内插不会为您提供比原始频率更高的频率信息。
内含物

1
@Jason R-没错,我的回答有误导性,我试图在上面的原始帖子中进行澄清。我不应该说零填充会提高频率分辨率。
丹·巴里

2

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.