为什么我的离散时间傅里叶变换不正确?

Why is my discrete time Fourier transform incorrect?

我创建了一个代码来尝试计算函数的 DTFT。

这是我的代码:

figure
n = linspace(0,2*pi,1500); %example
x = cos(n); %example
l = length(n);
syms k w
Xk = sum(x(1:l).*exp((-1i.*k.*2/l.*pi.*(0:l-1))));
Xk = matlabFunction(Xk);
d = linspace(-5,5,1000);
stem(d,Xk(d))

为了检查我的代码,如您所见,我尝试通过对其进行采样并将其与 cos(x) 的连续时间傅里叶变换进行比较来计算 cos(n) 的离散时间傅里叶变换, 但不幸的是我没有得到相同的结果。

这是我通过 运行 这段代码得到的:

当我增加 n 时,虽然 -1,1 中的值像我们预期的那样增加,但非零值也在增加 相反 符合预期。

(cos(x)的傅立叶变换为deltaFunction(x-1)+deltaFunction(x+1))

感谢您的帮助。我知道 MATLAB 中有这样做的函数,但我尝试自己创建一个。

您看到的是使用 k.

的非整数值的结果

DTFT:

DTFT 假定输入信号为无穷大。你没有这个,你只有一个余弦周期。假设信号的其余部分全为零,您在 t=0 和 t=2π 时从 1 到 0 的过渡中引入了许多高频。您还引入了一些较低的频率。这些频率是您在绘图中看到的频率。

如果你想计算cos(t)的DTFT,t不限于一个周期,那么你的计算中需要一个无穷大的和,你当然不能这样做。

如果您想假设信号是周期性的,那么您就是在计算 DFT。

DFT:

您有一系列样本,您在转换中定义为 n = 0:l-1lequation as shown on Wikipedia 中采用 N 的函数:

在这个等式中,nk都是整数。 k 通常也在 0:l-1 范围内定义,但由于它是周期性的,因此可以将其定义在 -ceil(l/2):ceil(l/2)-1 范围内,例如

在您的代码中将 d 设置为一组整数值,我看到了预期的结果:

d = -10:10;
stem(d,abs(Xk(d)))

首先,您显示的结果对于余弦 window 在 0 和 2π 之间的 DTFT 是正确的。我感觉您对计算从 -∞ 到 +∞ 的余弦的 DFT 很感兴趣, 已经证明了这一点。

我认为简要讨论一下余弦的傅里叶变换、windowed 余弦和 DTFT 会很有用。


余弦的傅里叶变换是

其中余弦定义为t = -∞到+∞,可以通过DFT计算。但是 windowed 余弦

的傅里叶变换

其中 N 是 window(上面的 1)的周期数。在 MATLAB 中绘制此图会产生

所以,在 MATLAB 中,如果你想计算余弦的 DTFT,你的输入应该是从 t = -∞ 到 +∞ 的采样余弦,你的结果应该类似于

因为 DTFT 是周期性的,周期为 2π 而 DFT 不是。余弦的 DTFT 是