我寫了一個簡短的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);
非常感謝!果然,問題出在fftshift。現在它可以工作 – user1627734