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


12

让我们考虑这个例子:

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)在信号中显示的频率处为零,所以我不明白为什么会发生泄漏?


零填充不会减少明显的频谱泄漏,而只会使频谱泄漏的凸起显得更平滑。
罗伯特·布里斯托

Answers:


18

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

ΔF=Fsñ

在你的情况ΔF正好是2Hž。如果您将信号调零,则没有其他信息可检索-您只会减小频率间隔

在上面的示例中,将ñ增加到1000,频率间隔为1个Hž。所有额外的观察样本仅仅是插值,由窗函数来完成(s一世ñC你的情况)。您将开始观察窗谱的旁瓣。既然你隐含矩形窗口乘以你的信号,这将导致你的信号与频谱(二狄拉克+ DC)的卷积s一世ñC功能。


另一种方式来看待它是想象DFT基本上是一个滤波器组,组成的移动s一世ñC功能。那些以这样的方式对齐,即1的峰值是所有其余1的出现的位置。如果您开始在这些之间寻找,则将开始获取这些样本。这里是这样的示例曲线s一世ñC滤波器组。

在此处输入图片说明

s一世ñC0s一世ñC


ñ=1000ñ=10000

在此处输入图片说明

放大部分:

在此处输入图片说明

注意事项:

  • ñ=500

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

  • ñ=10000s一世ñC


很明显,用于重现结果的代码:

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'})

1
非常完整的答案+1。“ [...]您只会增加频率间隔。” 我想应该是减少
Matt L.

2

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

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


1

泄漏是由于有限长度的窗口而引起的,实际上您经常会遇到这种情况。但是,如果正弦分量的周期数正好是整数,则FFT固有的周期化就好像正弦是“无穷大”一样,其频率恰好落在离散化的区间上。因此,由于纯粹的运气,泄漏以某种方式消除了:如果您提前知道信号的周期,则无需使用傅立叶工具进行分析。

使用零填充时,您不再拥有纯正弦。都不具有非整数周期的多个窗口。您正在串联在窗口边界处发生突变的一系列正弦波。因此,整个周期信号不再是“无限正弦”。因此,您可以获得与泄漏同化的效果,但这是零填充效果,正如@jojek完美解释的那样。

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.