繁体   English   中英

在matlab中使用fft,ifft和fftshift

[英]use of fft, ifft and fftshift in matlab

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

从书中复制以下代码:

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取决于你正在做什么类型的信号。

  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):

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

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM