Проблема заключается в количестве выборок, для которых выполняется преобразование.
Xall = fft(f);
plot(abs(Xall(1:500)),'b');
hold on
plot(abs(X(1:500)),'r');
То, что вы вычисляете, соответствует результату FFT, выполненному для всех выборок (т.е. с 4000 реальных выборок в и 4000 комплексныхзначения out).
Теперь, если вы прочитаете документацию FFT с doc fft
, вы увидите, что сигнал усекается, если выходной размер меньше входного размера.Если вы попробуете:
Y = zeros(nfft, 1);
for k=1:nfft
for n=1:nfft
Y(k) = Y(k) + f(n)*exp(-1j*2*pi*(k-1)*(n-1)/nfft);
end
end
Y2 = fft(f(:),nfft); %make it a column
abs(sum(Y-Y2)) %6.0380e-12 , result within precision of the double float format