나는 주어진 입력 필드 U0가 주어지면 프레 넬의 전파 (회절)를 실행한다고 가정하는 짧은 matlab 스크립트 파일을 작성하여 필드가 거리 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