如果频率分辨率很好,为什么在零填充后 DFT 中会出现频率泄漏?

信息处理 fft 频谱 自由度
2021-12-21 07:34:32

让我们考虑这个例子:

Fs=1000; 
Ns=500;
t=0:1/Fs:(Ns-1)*1/Fs;
f1=10;
f2=400;
x=5+5*sin(2*pi*f1*t)+2*sin(2*pi*f2*t);
X=fft(x);

在这种情况下,频率分辨率为 2,并且所有频率分量都被正确捕获。但是,如果我这样做:

  X=fft(x,1000);

频率分辨率为 1,但存在频谱泄漏。在这里可以看到类似的效果在我看来,两个窗口的傅立叶变换(一个长度为 500,一个长度为 1000)在信号中出现的频率处为零,所以我不明白为什么会发生泄漏?

3个回答

这种现象与光谱泄漏无关。您正在观察的是零填充的效果。给定多个样本N, 有一个最大可能的频率分辨率 ΔF可以实现:

ΔF=Fsñ

在你的情况下ΔF正是2Hz. 如果您对信号进行零填充,则无需检索额外信息 - 您只会减少频率间隔

在上面的例子中,当你增加ñ1000,你得到一个频率间隔1Hz. 所有额外观察到的样本只是一个插值,由窗口函数完成 (s一世nC在你的情况下)。您将开始观察窗口频谱​​的旁瓣。由于您隐式地将信号乘以矩形窗口,这将导致信号频谱(两个狄拉克 + DC)与s一世nC功能。


另一种看待它的方式是想象 DFT 基本上是一个滤波器组,由移位的s一世nC职能。它们以这样的方式对齐,即一个峰值是所有剩余峰值的存在的地方。如果您开始在这些之间寻找,您将开始采集这些样本。这是这样的示例图s一世nC过滤器组。

在此处输入图像描述

让我们假设存在对应于蓝色滤光片的频率。这将在相应的 bin 中产生幅度。所有剩余的频率都不存在(橙色和黄色),因此您将它们相乘s一世nC0并且在垃圾箱里什么都没有。在零填充的情况下,情况将不再如此。那蓝色的样本s一世nC将落在中间 bin 中并进行 sinc 插值。


这是发生的事情ñ=1000ñ=10000

在此处输入图像描述

和一个放大的部分:

在此处输入图像描述

注意事项:

  • 为了ñ=500,没有任何泄漏。有完美的尖峰,代表您的每个频率和直流偏移。

  • 我们还可以观察到最底部的 FFT 噪声。

  • 为了ñ=10000的形状s一世nC功能清晰可见。


显然是重现结果的代码:

Fs=1000; 
Ns=500;
Ns2=1000;
Ns3=10000;
t=0:1/Fs:(Ns-1)*1/Fs;
f1=10;
f2=400;
x=5+5*sin(2*pi*f1*t)+2*sin(2*pi*f2*t);

X1 = abs(fft(x))/length(x);
X2 = abs(fft(x, Ns2))/Ns;
X3 = abs(fft(x, Ns3))/Ns;

F1 = 0:Fs/Ns:Fs-Fs/Ns;
F2 = 0:Fs/Ns2:Fs-Fs/Ns2;
F3 = 0:Fs/Ns3:Fs-Fs/Ns3;

plot(F1, 20*log10(X1))
hold on
plot(F2, 20*log10(X2))
plot(F3, 20*log10(X3))
xlim([0, Fs/2])
grid on
legend({'N=500', 'N=1000', 'N=10000'})

频谱泄漏通常是 Sinc 卷积效应的另一个名称,或者是另一个域(在您的情况下为 t 或时间)中矩形窗口的伪影。零填充是通过将矩形窗口(这是您的原始非零填充数据)添加到更长的 FFT 来完成的。

您关于 FT 应该为零但只有一个频率的假设通常是错误的。任何有限长度(和非零)信号都将具有无限范围的非零频谱。这种无限范围的频谱(Sinc 形或其他窗口的变换)恰好在 DFT/FFT 结果中不可见,仅对于纯正弦波,而不是跨越整个 FFT 宽度,在该宽度上具有精确的整数周期性。零填充不允许这样做。

泄漏会在有限长度的窗口中显着出现,这在实践中总是存在的。但是,如果您的正弦分量恰好有整数个周期,则 FFT 固有周期化的作用就像正弦是“无限的”,并且它的频率正好落在离散的 bin 上。因此,泄漏以某种方式被消除了,纯粹是因为运气:如果您事先知道信号的周期,则无需使用傅立叶工具对其进行分析。

使用零填充,您不再有纯正弦。既不具有非整数周期多窗口。您正在连接在窗口边界处发生突然变化的正弦块。因此,整个周期化信号不再是“无限正弦”。因此,正如@jojek 完美解释的那样,您可以通过泄漏获得您所吸收的东西,但这是一种零填充效果。