Это явление не имеет ничего общего со спектральной утечкой. То, что вы наблюдаете - это эффект заполнения нулями. Учитывая количество выборок N , существует максимально возможное разрешение по частоте Δ F которое может быть достигнуто:
Δ F= фsN
В вашем случае Δ F точно 2H z . Если вы добавляете сигнал к нулю, никакой дополнительной информации для извлечения нет - вы только уменьшитечастотный интервал.
В приведенном выше примере, когда вы увеличиваете N до 1000 , вы получаете разнос частот 1H z . Все дополнительные наблюдали образцы просто интерполяция, сделанная с помощью оконной функции ( с я н с в вашем случае). Вы начнете наблюдать боковые лепестки окна спектра. Так как вы неявно умножили свой сигнал на прямоугольное окно, это приведет к свертке спектра вашего сигнала (два Дирака + DC) с функцией с я н с .
Другой способ взглянуть на это - представить, что DFT - это, по сути, банк фильтров, состоящий из сдвинутых с я н сс я н с
Давайте представим, что частота, соответствующая синему фильтру, присутствует. Это даст амплитуду в соответствующем бине. Все остальные частоты нет (оранжевый и желтый), таким образом , вы умножьте те с я н с0с я н с
N= 1000N= 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'})