在matlab中使用fft,ifft和fftshift

Phy*_*ist 5 matlab fft numerical-methods ode ifft

我试图实现分步傅立叶方法来解决光学中的非线性薛定谔方程.它主要分别处理线性部分和非线性部分.它通过傅里叶变换和时域中的非线性部分来求解线性部分.

从书中复制以下代码:

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
Run Code Online (Sandbox Code Playgroud)

A_t脉冲在哪里(要解决的功能).我不明白的是,它最初用于fftshift将零频率移动到中心,但后来又在循环中没有fftshift.我尝试添加fftshift到主循环,或在最开始删除它.两者都给出了错误的结果,为什么呢?在一般情况下,我应该什么时候使用fftshiftifftshift,尤其是当我想在这种情况下,解决微分方程什么样的?

谢谢

I.N*_*ton 2

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

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

  1. fft 函数认为您的信号从 0 开始,这与我们通常在信号处理中使用的大多数情况不同。与 ifft 相同。

  2. 您的实际负侧被认为是反转的并移至最右侧,本质上使您的实际图从示例 -5 到 5 变为 0 到 10。

  3. 这就是我们使用 fftshift 重新排列数据以使其回到以 0 为中心的位置。

  4. 如果您想将信号移回无序形式以计算 fft 或 ifft (您本质上应该这样做),您应该使用 ifftshift。它不会改变 ifft。它与 fftshift 相反。

    好的,为了让事情变得简单,请遵循这个开关案例-

开关(信号):{

情况(信号具有 -ve 和 +ve 部分,以零为中心):

  • 应用 ifftshift 使其在 fft 或 ifft 之前无序
  • 对结果应用 fftshift 以获得与信号形式相同的输出。

情况(信号已经无序):

  • 直接应用 fft 或 ifft。
  • 如果您想以自然类型查看结果,请将 fftshift 应用于结果。

案例(同时应用 fft 和 ifft ):

  • 继续吧,没关系。执行单一操作时担心信号

}