我在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的经验,而且我没有在论坛中找到与此问题相关的信息。我希望有人可以帮助我。
提前致谢。
答案 0 :(得分:0)
这将是一个数值问题。值在1e-15
范围内,而信号的DFT值在1e+02
范围内。在进行进一步处理时,很可能不会导致任何错误。您可以通过
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
,您可以创建一个包含n
和k
所有组合的矩阵。然后,您可以获取每个矩阵元素的exp(...)
。使用x(:)
,您确保x
是列向量,因此您可以执行矩阵乘法(...)*x
,它会自动对所有k
进行求和。实际上,我只是注意到,这正是DFT的众所周知的矩阵形式。