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
可以创建一个包含 n
和 k
的所有组合的矩阵。然后,您获取每个矩阵元素的 exp(...)
。使用 x(:)
,您可以确保 x
是一个列向量,因此您可以进行矩阵乘法 (...)*x
,它会自动对所有 k
求和。其实我只是注意到,这正是众所周知的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
我知道使用 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
范围内。在进行进一步处理时,这很可能不会导致任何错误。您可以通过
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矩阵形式。