【发布时间】: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 来隐藏这个值,但这不是一个优雅的解决方案。