这种现象与光谱泄漏无关。您正在观察的是零填充的效果。给定多个样本ñ, 有一个最大可能的频率分辨率 Δf _可以实现:
Δf _=Fsñ
在你的情况下Δf _正是2赫兹_. 如果您对信号进行零填充,则无需检索额外信息 - 您只会减少频率间隔。
在上面的例子中,当你增加ñ到1000,你得到一个频率间隔1赫兹_. 所有额外观察到的样本只是一个插值,由窗口函数完成 (小号_ _ _在你的情况下)。您将开始观察窗口频谱的旁瓣。由于您隐式地将信号乘以矩形窗口,这将导致信号频谱(两个狄拉克 + DC)与小号_ _ _功能。
另一种看待它的方式是想象 DFT 基本上是一个滤波器组,由移位的小号_ _ _职能。它们以这样的方式对齐,即一个峰值是所有剩余峰值的零存在的地方。如果您开始在这些零之间寻找,您将开始采集这些样本。这是这样的示例图小号_ _ _过滤器组。
让我们假设存在对应于蓝色滤光片的频率。这将在相应的 bin 中产生幅度。所有剩余的频率都不存在(橙色和黄色),因此您将它们相乘小号_ _ _由0并且在垃圾箱里什么都没有。在零填充的情况下,情况将不再如此。那蓝色的样本小号_ _ _将落在中间 bin 中并进行 sinc 插值。
这是发生的事情ñ= 1000和ñ= 10000:
和一个放大的部分:
注意事项:
显然是重现结果的代码:
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'})