在MATLAB中使用DFT的意外结果

时间:2015-04-30 14:01:09

标签: matlab dft

我在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

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

我用来生成方波的代码:

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的经验,而且我没有在论坛中找到与此问题相关的信息。我希望有人可以帮助我。

提前致谢。

1 个答案:

答案 0 :(得分:0)

这将是一个数值问题。值在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的众所周知的矩阵形式。