Я попытался смоделировать функцию рассеяния точки с полиномиальной аберрацией Цернике. Чтобы проверить это, я ссылаюсь на код из электронной книги «Computational Fourier Optics a MATLAB Tutorial - David Voelz». Вот моя функция рассеяния точки с полиномиальной аберрацией Цернике ниже:
%Sampling
M=1024;
L=1e-3;
du=L/M;
u=-L/2:du:L/2-du; v=u;
%Parameters of the lens
lambda=0.55e-6;
k=2*pi/lambda;
Dxp=20e-3; wxp=Dxp/2; %lens size
zxp=100e-3; %focal lengrh
lz=lambda*zxp;
% aberration coefficients
z2 = 0*lambda;
z3 = 0*lambda;
z4 = 0*lambda;
z5 = 0*lambda;
z6 = 0*lambda;
z7 = 0*lambda;
z8 = 0*lambda;
z9 = 0*lambda;
z10 = 0*lambda;
z11 = 0*lambda;
fu=-1/(2*du):1/L:1/(2*du)-(1/L); %image freq coords
[Fu,Fv]=meshgrid(fu,fu);
% wavefront
W=zernike_10(-lz*Fu/wxp,-lz*Fv/wxp,...
z2,z3,z4,z5,z6,z7,z8,z9,z10,z11);
% coherent transfer function
H=circ(sqrt(Fu.^2+Fv.^2)*lz/wxp).*exp(-j*k*W);
% point spread function
h2=abs(ifftshift(ifft2(fftshift(H)))).^2;
figure(1) % psf image and profiles
imagesc(u,v,nthroot(h2,2)); axis xy; axis square
xlabel('u (m)'); ylabel('v (m)'); colormap('gray')
function[zer] = zernike_10(X,Y,...
z2,z3,z4,z5,z6,z7,z8,z9,z10,z11)
p = sqrt(X.^2 + Y.^2);
a = atan2(Y,X);
%zernike polynomial
zer = 1+z2*2*p.*cos(a)+...
z3*2*p.*sin(a)+...
z4*sqrt(3)*(2*p.^2-1)+...
z5*sqrt(6)*(p.^2)*sin(2*a)+...
z6*sqrt(6)*(p.^2)*cos(2*a)+...
z7*sqrt(8)*(3*p.^3-2*p)*sin(a)+...
z8*sqrt(8)*(3*p.^3-2*p)*cos(a)+...
z9*sqrt(8)*(p.^3)*sin(3*a)+...
z10*sqrt(8)*(p.^3)*cos(3*a)+...
z11*sqrt(5)*(6*p.^4-6*p.^2+1);
end
%circle function
function[out]=circ(r)
out=abs(r)<=1;
end
Мой вопрос в том, что все в порядке, пока коэффициенты аберрации «z4» не будут, после этого функция рассеяния точки кажется неправильной. Я ввожу «1» в качестве коэффициента аберрации для каждого из них по одному, например, я ввожу «z6 = 1», а все остальные коэффициенты равны 0, чтобы увидеть каждый член полинома его PSF. Я предполагаю, что есть ошибка в "function [zer]", но не уверен в этом. Кто-нибудь знает, где я ошибаюсь? Оценили