在 MATLAB 中创建的逆 DFT 函数存在轻微错误

问题描述 投票:0回答:1

我正在尝试在 MATLAB 中编写自己的逆 DFT 函数,因为我需要实空间中这些傅里叶模式基的子集来用于应用程序。然而,当我根据 Matlab 的 ifft 函数和原始波形提取傅立叶系数后检查逆 DFT 例程时,似乎存在轻微错误。代码如下所示。

% 1D fft and inverse fft
clear; clc; close all;
L=1; % total domain size
n=100;
x=linspace(0,L,n); %define x values
dx=x(1)-x(2);
F=1*cos(2*pi*5*x); %declare the function
figure(1)
plot(x,F,'linewidth',2,'Displayname','Original');
Fhat=fftshift(fft(F));%compute fft and shift to center
if(mod(n,2)==0) % even split
    dk=2*pi/L.*[-n/2:1:1:n/2-1];
else %odd split
    dk=2*pi/L*[-(n-1)/2:1:(n-1)/2];
end
figure % plot FFt results
plot(dk/(2*pi),abs(Fhat),'displayname','Frequency')
% Now here is my inverse fft
f=zeros(1,n);
for i=1:n
    f=f+Fhat(i).*exp(1j*dk(i).*x)
end
f=f*1/n;
figure(1); hold on;
plot(x,real(f),'b-.','linewidth',2,'displayname','From my own invDFT')
plot(x,ifft(ifftshift(Fhat)),'M--','linewidth',2,'displayname','From matlab ifft')
xlabel('x','fontsize',16)
ylabel('y','fontsize',16)
legend()

下图显示了波形之间的差异。 方法比较

我不确定这个问题是否是浮点问题或者我的频率箱是否不正确。这是我第一次使用fft。任何见解都将不胜感激。

matlab fft
1个回答
0
投票

好吧,首先你的信号是周期为

L
的周期性信号,所以当你使用一个向量
x
0
一直到
L
时,你会重叠到信号的下一个周期,这将导致混乱。

这就是说,DFT(及其逆)没有明确使用频率,它们使用以信号长度

n
为索引的箱:

enter image description here

复制这些垃圾箱将降低混淆的风险,就您而言:

clear; clc; close all;
L=1; % total domain size
n=100;
x=linspace(0,L,n); %define x values
F=1*cos(2*pi*5*x); %declare the function
figure(1)
plot(x,F,'linewidth',2,'Displayname','Original');
Fhat=fftshift(fft(F));%compute fft and shift to center
if(mod(n,2)==0) % even split
    dk=2*pi/n.*[-n/2:1:1:n/2-1]; % <-- using n
else %odd split
    dk=2*pi/n*[-(n-1)/2:1:(n-1)/2]; % <-- using n
end
figure % plot FFt results
% plot(dk/(2*pi),abs(Fhat),'displayname','Frequency')
% Now here is my inverse fft
f=zeros(1,n);
for i=1:n
    f=f+Fhat(i).*exp(1j*dk(i).*(0:(n-1))) % <-- critical difference
end
f=f*1/n;
figure(1); hold on;
plot(x,real(f),'b-.','linewidth',2,'displayname','From my own invDFT')
plot(x,ifft(ifftshift(Fhat)),'M--','linewidth',2,'displayname','From matlab ifft')
xlabel('x','fontsize',16)
ylabel('y','fontsize',16)
legend()

关键的区别在于,上一个方程中的指数

j-1
不会一直到
n
,而只是到
n-1
,这与你的
x/L
所做的相反。它与按因子
n/(n-1)
重新采样所有频率具有相同的效果,因此您观察到的频率略有变化。

结果现在是连贯的:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.