(Преобразование Фурье) Простой результат ДПФ отличается от БПФ - PullRequest
0 голосов
/ 22 ноября 2018

Я хочу понять дискретное преобразование Фурье, реализовав его самостоятельно.Хотя результат, возвращаемый моим DFT, неверен, в версии, включенной в Matlab, отображаются правильные частоты исходного сигнала.Так что вопрос в том, куда я пошёл не так.Это математика или проблема реализации?

%% Initialisation
samples=2000;
nfft = 1024;
K = nfft / 2 + 1;
c = 264;
e = 330;
t = -1:1/samples:1-1/samples;
[~, N] = size(t);
f = (sin(2*c*pi*t)+cos(2*e*pi*t)).*exp(-pi*(2*t-1).^2);
X = zeros(nfft, 1);

%% Discrete Fourier Transform
if true
    for k=1:nfft
        for n=1:nfft
            X(k) = X(k) + f(n)*exp(-j*2*pi*(k-1)*(n-1)/N);
        end
    end
else
    X=fft(f, nfft);
end
R = abs(X(1:K));
[V,I] = sort(R,'descend');
F1 = samples*(I(1)-1)/nfft;
F2 = samples*(I(2)-1)/nfft;
disp(F1)
disp(F2)
plot(1:K, R, 1:K, real(X(1:K)), 1:K, imag(X(1:K)))

1 Ответ

0 голосов
/ 22 ноября 2018

Проблема заключается в количестве выборок, для которых выполняется преобразование.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...