mirror of
https://github.com/c-sooyoung/fold_slice.git
synced 2026-09-17 22:59:07 +09:00
64 lines
1.8 KiB
Matlab
64 lines
1.8 KiB
Matlab
% FUNCTION [u_1, H, h, dH] = near_field_evolution(u_0, z, lambda, extent, use_ASM_only)
|
|
% Description: nearfield evolution function, it automatically swithch
|
|
% between ASM and Fraunhofer propagation
|
|
|
|
function [u_1, H, h, dH] = near_field_evolution(u_0, z, lambda, extent, use_ASM_only)
|
|
|
|
|
|
H = [];
|
|
h = [];
|
|
u_1 = [];
|
|
dH = [];
|
|
|
|
|
|
if nargin < 5
|
|
use_ASM_only = false;
|
|
end
|
|
|
|
extent = extent(:)' .* ones(1,2);
|
|
if z == 0
|
|
H = 1;
|
|
u_1 = u_0;
|
|
return
|
|
end
|
|
if z == inf
|
|
return
|
|
end
|
|
|
|
Npix = size(u_0);
|
|
|
|
xgrid = (0.5+(-Npix(1)/2:Npix(1)/2-1))/Npix(1);
|
|
ygrid = (0.5+(-Npix(2)/2:Npix(2)/2-1))/Npix(2);
|
|
|
|
k = 2 * pi / lambda(1);
|
|
|
|
% Undesamplling parameter
|
|
F = mean( extent.^2 ./ (lambda(1) .* z .* Npix ));
|
|
|
|
if abs(F) < 1 && ~use_ASM_only
|
|
% farfield propagation
|
|
warning('Farfield regime, F/Npix=%g', F )
|
|
Xrange = xgrid*extent(1);
|
|
Yrange = ygrid*extent(2);
|
|
[X,Y] = meshgrid(Xrange, Yrange);
|
|
h = exp(1i*k*z +1i*k/(2*z) * (X'.^2 + Y'.^2));
|
|
|
|
% this serves as low pass filter for the far nearfield
|
|
H = ifftshift(fft2(fftshift(h)));
|
|
H = H / abs(H(end/2+1, end/2+1)); % renormalize to conserve flux in image
|
|
else
|
|
% standard ASM
|
|
kx = 2 * pi .*xgrid / extent(1) * Npix(1);
|
|
ky = 2 * pi .*ygrid / extent(2) * Npix(2);
|
|
[Kx, Ky] = meshgrid(kx, ky);
|
|
|
|
dH = ( -1i*(Kx'.^2+Ky'.^2)/(2*k) );
|
|
|
|
H = exp( 1i*z*sqrt( k^2 - Kx'.^2-Ky'.^2)); % it make it a bit more sensitive to z distance
|
|
h = [];
|
|
end
|
|
|
|
u_1 = ifft2( bsxfun(@times, ifftshift(H), fft2(u_0)));
|
|
end
|
|
|