首页 > 解决方案 > (傅里叶变换)简单 DFT 结果与 FFT 不同

问题描述

我想通过自己实现离散傅立叶变换来理解它。虽然我的 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)))

标签: matlabmathfftdft

解决方案


问题在于完成转换的样本数量。

Xall = fft(f);
plot(abs(Xall(1:500)),'b');
hold on
plot(abs(X(1:500)),'r');

您计算的结果与对所有样本进行的 FFT 的结果相匹配(即输入 4000 个真实样本和输出 4000 个复数值)。

现在,如果您阅读 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

推荐阅读