在matlab中使用fft,ifft和fftshift

时间:2017-08-20 01:48:20

标签: matlab fft numerical-methods ode ifft

我正在尝试用split-step fourier方法来解决光学中的非线性薛定谔方程。它主要分别处理线性部分和非线性部分。它通过傅立叶变换和时域中的非线性部分来求解线性部分。

从书中复制以下代码:

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,尤其是当我尝试像这种情况一样解决微分方程时?

感谢

1 个答案:

答案 0 :(得分:1)

你可以通过将信号绘制成图像并注意到明显的差异来部分地澄清你的疑问,正如我在尝试时所做的那样。

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

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

  2. 您的实际负面被认为是倒置并转移到最右侧,基本上使您从实例-5到5的实际情节为0到10.

  3. 我们使用fftshift来重新排列数据以使其恢复原状 以0为中心。

  4. 如果你想将信号转换回无序形式来计算fft或ifft(你基本上应该这样),你应该使用ifftshift。 它没有转移ifft。与fftshift相反。

    好的,简单地按照此切换案例 -

  5. 切换(信号): {

    案例(信号同时包含-ve和+ ve部分,以零为中心):

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

    案例(信号已经无序):

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

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

    • 继续,好吧。在执行单一操作时担心信号

    }