MATLAB 中 DFT 的意外结果

Unexpected result with DFT in MATLAB

我在 MATLAB 中计算离散傅里叶变换时遇到问题,显然得到了正确的结果,但是当绘制获得的频率的幅度时,您可以看到非常接近零的值,应该正好为零。我使用自己的实现:

function [y] = Discrete_Fourier_Transform(x)
    N=length(x);
    y=zeros(1,N);
    for k = 1:N
        for n = 1:N
            y(k) = y(k) + x(n)*exp( -1j*2*pi*(n-1)*(k-1)/N );
        end;
    end;
end

我知道使用 MATLAB 的 fft 更好,但我需要使用我自己的实现,因为它是大学。

我用来生成方波的代码:

x = [ones(1,8), -ones(1,8)];
for i=1:63
    x = [x, ones(1,8), -ones(1,8)];
end

MATLAB 版本:R2013a(8.1.0.604) 64 位

我已经尝试了所有发生在我身上的事情,但我没有太多使用 MATLAB 的经验,而且我没有在论坛中找到与此问题相关的信息。我希望有人能帮助我。

提前致谢。

这将是一道数值题。这些值在 1e-15 范围内,而信号的 DFT 值在 1e+02 范围内。在进行进一步处理时,这很可能不会导致任何错误。您可以通过

计算 DFT 和 MATLAB fft 函数之间的总平方误差
y = fft(x);
yh = Discrete_Fourier_Transform(x);
sum(abs(yh - y).^2)
ans = 
    3.1327e-20

基本为零。因此我会得出结论:你的 DFT 函数工作得很好。

一点小提示:您可以轻松地将 DFT 向量化。

n = 0:1:N-1;
k = 0:1:N-1;
y = exp(-1j*2*pi/N * n'*k) * x(:);

使用 n'*k 可以创建一个包含 nk 的所有组合的矩阵。然后,您获取每个矩阵元素的 exp(...)。使用 x(:),您可以确保 x 是一个列向量,因此您可以进行矩阵乘法 (...)*x,它会自动对所有 k 求和。其实我只是注意到,这正是众所周知的DFT矩阵形式。