I'm currently working with wavefront and psf.
I'm trying to convert a wavefront map extracted from opticstudio to a psf using a rather complicated but accurate numerical method, not a linear approximation method, but I'm not getting the right results.Â
I am attaching the matlab code I am currently using.
Please let me know if there are any fixes.
Thanks.
Â
CODE:
function psf_out=wavefront2psf(wvf, center_wvf, data_space_wvf, lambda, film_Dist, rect, data_space_psf)
  Â
% wvf: wavefront map of n x n size from opticsutdio
% center_wvf: center coordinate of the wavefront map
% data_space_wvf: data space of the wavefront map
% lambda: the wavelength
% film_Dist: distance between film and the last lens
% rect : point spread are estimated within the rectangle
% data_space_psf: data space of the point spread function
  dr=1;
  min_dA=2;
  cx=center_wvf(1);
  cy=center_wvf(2);
  Â
  rr= ];
  th=r];
  RR=0;
  TH=0;
  AA=pi;
  h_wf, ~]=size(wvf);
  Â
  Â
  for p=1:dr:((h_wf/2)-3)
    r=p;
    r1=r;
    r2=r+dr;
    area_dR=pi*(r2^2-r1^2);
    n_th=ceil(area_dR/min_dA);
    n_th=ceil(n_th/4)*4;
    if mod(n_th,2)==1
      n_th=n_th+1;
    end
    ths=linspace(0, 2*pi, n_th+1);
    ths=ths(1:end-1);
    dth=ths(2)-ths(1);
    dA=dth/2*(r2^2-r1^2);
    r_=(r1+r2)/2*ones(size(ths));
    a_=dA*ones(size(ths));
    RR=ÂRR r_];
    TH=iTH ths];
    AA= AA a_];
  end
  Rxc, yc]=pol2cart(TH, RR);
  xc=xc+cx;
  yc=yc+cy;
  wsf_rth=interp2(wvf, xc, yc);
  x_=(xc-cx)*data_space_wvf;
  y_=(yc-cy)*data_space_wvf;
    Â
  hh= rect(1):data_space_psf:rect(2)];
  ww=trect(3):data_space_psf:rect(4)];
  Â
  phase_sum=zeros(size(hh,2), size(ww,2));
  eh_psf, w_psf]=size(phase_sum);
  Â
  Â
  for p=1:h_psf
    for q=1:w_psf
      px=(p-h_psf/2)*data_space_psf;
      py=(q-w_psf/2)*data_space_psf;
      ipx=x_-px;
      ipy=y_-py;
      path=sqrt(ipx.^2+ipy.^2+(film_Dist).^2);
      phase=(wsf_rth)+(path-film_Dist)/(lambda);
      phase_sum(p,q)=sum(AA.*exp(i*phase(:)'));
    end
  end
  Â
  psf_out=sqrt(abs(phase_sum).^2);
  psf_out=psf_out/sum(psf_out(:));
end
Â
(Mod note: moved to more appropriate forum for ZOS-API-related discussions.]Â