【问题标题】:Unexpected result with DFT in MATLABMATLAB 中 DFT 的意外结果
【发布时间】:2015-04-30 14:01:08
【问题描述】:

我在 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 的范围内,而峰值的幅度约为656,我不会太在意。 MATLAB FFT 和您的 DFT 例程之间的平方误差之和在1e-20 的范围内,因此基本上为零。但也许其他人有更详细的解释?
  • 我同意@hbaderts。这些值非常小,几乎和 eps 一样小,在这里可以将其视为 0。您的 FFT 解决方案看起来很棒。
  • 感谢您的回答,我知道这个值可以忽略不计,并且不会显示在图中,但是当我想用角度函数绘制相位时,会得到毫无意义的结果。我正在使用 y((y -0.00001)) = 0 来隐藏这个值,但这不是一个优雅的解决方案。

标签: matlab dft


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-05-22
    • 2017-11-12
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 2015-08-02
    • 2011-08-22
    • 1970-01-01
    相关资源
    最近更新 更多