Что я пропустил с кодом Matlab для PSF? - PullRequest
1 голос
/ 19 июня 2020

Я попытался смоделировать функцию рассеяния точки с полиномиальной аберрацией Цернике. Чтобы проверить это, я ссылаюсь на код из электронной книги «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]", но не уверен в этом. Кто-нибудь знает, где я ошибаюсь? Оценили

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...