我正在尝试用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
添加到主循环中,或者在最开始时将其删除。两者都给出了错误的结果,为什么呢?一般来说,我应该何时使用fftshift
和ifftshift
,尤其是当我尝试像这种情况一样解决微分方程时?
感谢
答案 0 :(得分:1)
你可以通过将信号绘制成图像并注意到明显的差异来部分地澄清你的疑问,正如我在尝试时所做的那样。
首先,使用fftshift和ifftshift取决于您正在使用的信号类型。
fft函数认为您的信号从0开始,与我们通常用于信号处理的大多数情况不同。与ifft相同。
您的实际负面被认为是倒置并转移到最右侧,基本上使您从实例-5到5的实际情节为0到10.
我们使用fftshift来重新排列数据以使其恢复原状 以0为中心。
如果你想将信号转换回无序形式来计算fft或ifft(你基本上应该这样),你应该使用ifftshift。 它没有转移ifft。与fftshift相反。
好的,简单地按照此切换案例 -
切换(信号): {
案例(信号同时包含-ve和+ ve部分,以零为中心):
案例(信号已经无序):
案例(同时应用fft和ifft):
}