No BSD License  

Highlights from
basic paraxial optics toolkit

image thumbnail
from basic paraxial optics toolkit by Andri M. Gretarsson
A set of paraxial optics functions for beam propagation and modal decomposition. Numerous examples.

z=HermiteGaussianE(params,x,varargin);
%----------------------------------------------------------------------------------------------
% PROGRAM: HermiteGaussianE
% AUTHOR:  Andri M. Gretarsson
% DATE:    6/26/03
%
% SYNTAX: z=HermiteGaussianE([l,m,q <,lambda,a>],x <,y>);
%           <...> indicates optional arguments
%
% Returns the complex field amplitude of a single polarization Hermite-Gaussian mode.
% The domain of the function is specified in cartesian coordinates x,y. 
% If the input argument a is not specified or is equal to 1, the area under the
% surface z(x,y) is equal to 1.  If z=z(x), i.e. the one dimensional form is being used,
% then the area under the surface formed by rotating z(x) around the z axis equals 1.
% In short the functions are normalized and form an orthonormal basis wrt. the inner
% product formed by multiplying two HermiteE's together and integrating over area.
% The formula is taken from "Principles of Lasers" by Orazio Svelto, 4th ed. Section 5.5.1.3.
%
% Note that it is possible to specify the parameters l,m,q,a,lambda as column vectors.  In that case,
% the matrix returned z, will be a stack of 2D matrixes (i.e. a 3D matrix), where successive 2D matrixes
% in the stack (i.e. successive layers of the 3D matrix) correpsond to successive rows of the 
% l,m,q,a,lambda columns
%
% INPUT ARGUMENTS:
% ----------------
% l,m    = Hermite Gaussian mode numbers (integers, positive or zero). Can be a scalar or a column vector.
% q      = complex radius of curvature of the beam (1/q = 1/R + i*lambda/pi/w^2). 
%          Can be a scalar or a column vector.
% a      = complex prefactor ( includes phase, e.g. for a beam that
%          has been propageted with an ABCD matrix a = 1/(A + [B/q1])^(1+l+m) ).
%          See for example, O. Svelto, Principles of Lasers 4th ed. eqn. 4.7.30.
%          Can be a scalar or a column vector.
% lambda = Wavelength of the light. Can be a scalar or a column vector.
% x      = x position vector or a 2D matrix generated by meshgrid. 
% y      = y position vector or a 2D matrix generated by meshgrid.
%          If y is not specified then the default y is used:  
%          if x is 1D, y=zeros(size(x)). If x is 2D, y=x.
%
% OUTPUT ARGUMENTS:
% -----------------
% z(i,j) = Complex field of the Hermite Gaussian mode with parameters l,m,... at 
%          ( x(i,j),y(i,j) ).  May be a vector or a matrix depending on whether 
%          x and y are vectors or matrixes.  If in addition, l,m,... are columns, 
%          then z(i,j,k) will correspond to the complex field amplitude of the 
%          Hermite Gaussian mode corresponding to the parameters l(k),m(k),...
%
% NOTES:
% ------
% If x and y are not vectors but matrixes generated by
% the matlab function meshgrid, then the output variable z
% is a matrix rather than a vector.  The matrix form allows
% the function HermiteGaussianE to have a plane as it's domain 
% rather than a curve.
%
% If the parameters l,m,q,p,lambda are equal length column vectors rather 
% than scalars, z is a size(x)*length(lambda) matrix.  E.g. if size(x) is n*n
% then each level z(:,:,k) is a 2D field of a Hermite Gaussian with
% the parameters given by [l(k),m(k),q(k),lambda(k),a(k)].
%
% EXAMPLE 1 (2D):  
%      w=[0.001; 0.001];           
%      xseed=[-3*max(w):max(w)/30:3*max(w)];  yseed=xseed';
%      [x,y]=meshgrid(xseed,yseed);
%      lambda = [1.064e-6 ; 1.064e-6];
%      R = [-30 ; -30];
%      q = (1./R - i* lambda./pi./w.^2).^(-1);  a=[1;1];
%      l=[1;2]; m=[0;2];
%      E=HermiteGaussianE([l,m,q,lambda,a],x,y);
%      subplot(2,1,1); h1=pcolor(x,y,abs(E(:,:,1)));  set(h1,'EdgeColor','none'); axis square;
%      subplot(2,1,2); h2=pcolor(x,y,abs(E(:,:,2)));  set(h2,'EdgeColor','none'); axis square; shg;
%
% EXAMPLE 2 (1D):
%       w=[1,2,3,4].'; x=[-10:0.001:10]; lambda=[1,1,1,1].'*656e-9; R=[1,1,1,1].'*1000; 
%       q = (1./R - i* lambda./pi./w.^2).^(-1);  a=[1,1,1,1].'; l = [0,1,2,3].'; m=[0,0,0,0].';
%       E=HermiteGaussianE([l,m,q,lambda,a],x); I=E.*conj(E); phi=angle(E);
%       plot(x,I(:,1),x,I(:,2),x,I(:,3),x,I(:,4));
%
% Last updated: July 18, 2004 by AMG
%----------------------------------------------------------------------------------------------
%% SYNTAX: z=HermiteGaussianE([l,m,q <,lambda,a>],x <,y>);
%----------------------------------------------------------------------------------------------

function z=HermiteGaussianE(params,x,varargin);

defaultcoord2=0;
if nargin>=3, y=varargin{1}; else defaultcoord2=1;  end

if min(size(x))==1
    if size(x,1)<size(x,2), x=x'; end  %make x and y columnar
    if defaultcoord2
        y=zeros(size(x));
    else 
        if size(y,1)<size(y,2), y=y'; end
    end
        
end

if min(size(x)) > 1 
    z=zeros(size(x,1),size(x,2),size(params,1));  % need this since zeros(size(y),10) gives a 2D matrix even if y is 2D!  (Matlab feature.)
    if defaultcoord2, y=transpose(x); end
else
    z=zeros(size(x),size(params,1)); 
end

l=params(:,1);
m=params(:,2);
q=params(:,3);
if size(params,2)>=4
    lambda=params(:,4);
else
    lambda=1064e-9;
end
if size(params,2)>=5
    a=params(:,5);
else
    a=ones(size(q));
end

w=w_(q,lambda);

if min(size(x))>=2
    for u=1:size(params,1)
            z(:,:,u) = a(u)...
                .* sqrt((2/pi))/2^((l(u)+m(u))/2)/sqrt(factorial(l(u))*factorial(m(u)))/w(u)...
                .* HermitePoly(l(u),sqrt(2).*x/w(u)).*HermitePoly(m(u),sqrt(2).*y/w(u))...
                .* exp( -i*2*pi/lambda(u)*(x.^2+y.^2)/2/q(u) ) ;
    end
else
    for u=1:size(params,1)
            z(:,u) = a(u)...
                .* sqrt((2/pi))/2^((l(u)+m(u))/2)/sqrt(factorial(l(u))*factorial(m(u)))/w(u)...
                .* HermitePoly(l(u),sqrt(2).*x/w(u)).*HermitePoly(m(u),sqrt(2).*y/w(u))...
                .* exp( -i*2*pi/lambda(u)*(x.^2+y.^2)/2/q(u) );
    end
end

Contact us at files@mathworks.com