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
到主循环,或在最开始删除它.两者都给出了错误的结果,为什么呢?在一般情况下,我应该什么时候使用fftshift
和ifftshift
,尤其是当我想在这种情况下,解决微分方程什么样的?
谢谢
您可以通过将信号绘制为图像并注意到明显的差异来部分澄清您的疑问,就像我尝试相同时所做的那样。
首先,是否使用 fftshift 和 ifftshift 取决于您正在处理的信号类型。
fft 函数认为您的信号从 0 开始,这与我们通常在信号处理中使用的大多数情况不同。与 ifft 相同。
您的实际负侧被认为是反转的并移至最右侧,本质上使您的实际图从示例 -5 到 5 变为 0 到 10。
这就是我们使用 fftshift 重新排列数据以使其回到以 0 为中心的位置。
如果您想将信号移回无序形式以计算 fft 或 ifft (您本质上应该这样做),您应该使用 ifftshift。它不会改变 ifft。它与 fftshift 相反。
好的,为了让事情变得简单,请遵循这个开关案例-
开关(信号):{
情况(信号具有 -ve 和 +ve 部分,以零为中心):
情况(信号已经无序):
案例(同时应用 fft 和 ifft ):
}
归档时间: |
|
查看次数: |
819 次 |
最近记录: |