菲涅耳衍射分两步

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)

Ben*_*y13 5

调用后fft2,你也调用fftshift中间有直流频率。

但是当您调用 时ifft2,该函数假定您仍然具有 (1,1) 处的直流频率。所以你必须在做逆 FFT 之前回到这种格式。

因此将最后一行更改为U = ifft2(fftshift(O.*H))可能会解决问题。

编辑

我刚刚看到 Matlab 建议ifftshiftfftshift两次 insteaf之后使用ifftshift(找不到引入它的版本)。根据文档,在奇数大小的情况下,调用序列ifftshift(fftshift(X))ifftshift(fftshift(X))并不等效。

所以我认为最好这样做:U = ifft2(ifftshift(O.*H))在代码的最后一步。