use*_*734 5 matlab physics propagation fresnel
我写了一个简短的 matlab 脚本文件,假设运行菲涅耳的传播(衍射),这样给定一个特定的输入字段 U0,它会告诉你该字段在距离 z0 后的样子。我将结果与教科书的结果进行了比较,看起来我的程序运行良好。问题是如果我尝试采取两个传播步骤而不是一个。即,不是通过程序的一次迭代来传播距离 z0,而是通过程序的两次迭代来传播距离 z0/2。然后我就完全胡说八道了,我无法弄清楚是什么问题。任何建议将被接受,非常感谢。这是代码:
function U = fresnel_advance (U0, dx, dy, z, lambda)
% The function receives a field U0 at wavelength lambda
% and returns the field U after distance z, using the Fresnel
% approximation. dx, dy, are spatial resolution.
k=2*pi/lambda;
[ny, nx] = size(U0);
Lx = dx * nx;
Ly = dy * ny;
dfx = 1./Lx;
dfy = 1./Ly;
u = ones(nx,1)*((1:nx)-nx/2)*dfx;
v = ((1:ny)-ny/2)'*ones(1,ny)*dfy;
O = fftshift(fft2(U0));
H = exp(1i*k*z).*exp(-1i*pi*lambda*z*(u.^2+v.^2));
U = ifft2(O.*H);
Run Code Online (Sandbox Code Playgroud)
调用后fft2
,你也调用fftshift
中间有直流频率。
但是当您调用 时ifft2
,该函数假定您仍然具有 (1,1) 处的直流频率。所以你必须在做逆 FFT 之前回到这种格式。
因此将最后一行更改为U = ifft2(fftshift(O.*H))
可能会解决问题。
编辑
我刚刚看到 Matlab 建议ifftshift
在fftshift
两次 insteaf之后使用ifftshift
(找不到引入它的版本)。根据文档,在奇数大小的情况下,调用序列ifftshift(fftshift(X))
和ifftshift(fftshift(X))
并不等效。
所以我认为最好这样做:U = ifft2(ifftshift(O.*H))
在代码的最后一步。
归档时间: |
|
查看次数: |
10496 次 |
最近记录: |