如何计算 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)|')
现在我想了解 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)|')