我正在尝试实现split-step fourier方法来解决光学中的非线性schrodinger方程。它基本上将线性部分和非线性部分分开对待。它通过使用傅立叶变换求解线性部分,并在时域中求解非线性部分。

以下代码是从书中复制的:

alpha = 0
beta_2 = 1
gamma = 1

T = linspace(-5,5,2^13);
delta_T = T(2)-T(1);

L = max(size(A));
delta_omega = 1/L/delta_T*2*pi;
omega = (-L/2:1:L/2-1)*delta_omega;

A = 2*sech(T);
A_t = A;
step_num = 1000;
h = 0.5*pi/step_num;
results = zeros(L,step_num);

A_f = fftshift(fft(A_t));
for n=1:step_num
    A_f = A_f.*exp(-alpha*(h/2)-1i*beta_2/2*omega.^2*(h/2));
    A_t = ifft(A_f);
    A_t = A_t.*exp(1i*gamma*(abs(A_t).^2*h));
    A_f = fft(A_t);
    A_f = A_f.*exp(-alpha*(h/2)-1i*beta_2/2*omega.^2*(h/2));
    A_t = ifft(A_f);
    results(:,n) = abs(A_t);
end

其中A_t是脉冲(要求解的函数)。我不明白的是,一开始它就使用fftshift将零频率移到中心,但是后来在循环中它没有fftshift。我尝试将fftshift添加到主循环中,或者在一开始就将其删除。两者都给出错误的结果,为什么呢?通常,何时应使用fftshiftifftshift,尤其是在这种情况下尝试求解微分方程时?

谢谢

最佳答案

您可以通过将信号绘制为图像并注意到明显的差异来部分澄清您的疑问,就像我尝试相同时所做的那样。

首先,是否使用fftshift和ifftshift取决于您正在处理的信号类型。

  • fft函数认为您的信号从0开始,这与我们通常在信号处理中通常使用的大多数情况不同。与ifft相同。
  • 您的实际消极面被认为是反转的,并移到了最右边,实质上使您的实际情节从示例-5到5变为0到10。
  • 这就是我们使用fftshift重新排列数据以将其返回到的地方
    以0为中心。
  • 如果您想将信号移回无序形式以计算fft或ifft(本质上应该如此),则应使用ifftshift。 它不会移动ifft。与fftshift相反。

    好,为了使事情变得简单,请遵循以下切换案例-

  • 切换(信号):
    {

    大小写为(信号同时具有-ve和+ ve部分,以零为中心):
  • 在fft或ifft之前应用ifftshift使它无序
  • 将fftshift应用于结果以返回与信号形式相同的输出。

  • 大小写为(信号已经无序):
  • 直接应用fft或ifft。
  • 如果要以自然类型查看结果,
  • 将fftshift应用于结果。

  • 情况(同时应用fft和ifft):
  • 继续,没问题。执行单个操作时担心信号

  • }

    关于matlab - 在MATLAB中使用fft,ifft和fftshift,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45777764/

    10-12 17:23