如何计算 dt=0.02 的 DFT?

How do I calculate the DFT with dt=0.02?

现在我想了解 DFT 是如何工作的。 所以我用 matlab 实现了这个来做下面的 matlab 代码。

函数是

clear all
clc

N=8;
dt=0.02;
fs=1/dt;
T=0.16;
tspan = (0:N-1)/fs;
y = 5+cos(2*pi*12.5*tspan)+sin(2*pi*18.75*tspan);


X=zeros(1,N);

for k = 0:N-1
    for n = 0:N-1
        X(k+1) = X(k+1) + y(n+1)*exp(-j*(2*pi/N)*k*n);
    end
end

x_mag = abs(X);
plot(0:N-1,x_mag);

我期待这样的结果

但我有

我应该怎么做才能得到正确的结果?

更新

如果我将 N 从 8 添加到 80,那么我得到了下图但是 这个结果好像也是错误的。

频率显示为 20 和 30,而不是 12.5 和 18.75。

更新 #1

我在下面的 Matlab 代码中发现了一些规则。当我 运行 和 N=350 然后 enter image description here

   dt=0.02 
    fs=1/dt % hz = 1/0.02 (delta T)

     N=350;

     tspan = (0:N-1)*dt; 
     y = 5+cos(2*pi*12.5*tspan)+sin(2*pi*18.75*tspan);

    X=y;

    X=zeros(1,N);

    for k = 0:N-1
        for n = 0:N-1
            X(k+1) = X(k+1) + y(n+1)*exp(-j*(2*pi/N)*k*n);
        end
    end

    x_mag = abs(X);
    plot(0:N-1,x_mag);

当我有 N=50 时,我可以得到下图 enter image description here

我认为当我有N=50时,它似乎是更正确的结果。

但是我不明白我们如何确定合适的N?

您得到了您应该得到的准确结果。阅读函数 here.

的说明

所以,如果您正在采样 80 个时间点,那么您将获得 80 个频率点 space。由于您的函数是真实的而不是复杂的,因此 DFT 是对称的并围绕 80 个样本的中点排列,这意味着大约 40 个样本。

(而且您也在绘制索引-space,而不是频率 space!)

从 40 开始,您有正负频率相同的对称傅立叶变换(时间实函数 space)。如果您从 40 数起,您可能会得到恰好在 12.5 (52.5) 和 18.75 (58.75) Hz 处的峰值。

希望这对您有所帮助。

来自 documentation 的一些代码:

Y = fft(X);
P2 = abs(Y/L);
P1 = P2(1:L/2+1);
P1(2:end-1) = 2*P1(2:end-1);

f = Fs*(0:(L/2))/L;
plot(f,P1) 
title('Single-Sided Amplitude Spectrum of X(t)')
xlabel('f (Hz)')
ylabel('|P1(f)|')