如何用dt = 0.02计算DFT?

时间:2017-11-13 02:49:52

标签: matlab dft

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

功能是

enter image description here

enter image description here

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);

我期待结果为

enter image description here

但我已经

enter image description here

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

更新

如果我从8添加N到80,那么我有下面的图表但是 这个结果似乎也是错误的。

enter image description here

频率出现为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?

1 个答案:

答案 0 :(得分:1)

您获得了应该得到的确切结果。阅读函数here的描述。

所以发生了哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇由于您的功能是真实的,而不是复杂的,因此DFT是对称的,并且在80个样本的中点附近被激活,意味着大约40个。

(你也在索引空间中绘图,而不是频率空间!)

从40开始,你就得到了对称傅里叶变换,其正和负频率相同(时空中的实际函数)。如果从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)|')