Вращающаяся комплексная матрица с произвольным углом в Matlab? - PullRequest
1 голос
/ 26 февраля 2020

Я реализовал функцию Эрмита-Гаусса в Matlab для создания различных режимов. Луч света вдоль направления z можно рассматривать как сложную матрицу на плоскости.

Функция для режимов HG такая, как показано ниже.

%Hermite polynomial
function hk = HermitePoly(n)

if n==0 
    hk = 1;
elseif n==1
    hk = [2 0];
else

    hkm2 = zeros(1,n+1);
    hkm2(n+1) = 1;
    hkm1 = zeros(1,n+1);
    hkm1(n) = 2;

    for k=2:n

        hk = zeros(1,n+1);

        for e=n-k+1:2:n
            hk(e) = 2*(hkm1(e+1) - (k-1)*hkm2(e));
        end

        hk(n+1) = -2*(k-1)*hkm2(n+1);

        if k<n
            hkm2 = hkm1;
            hkm1 = hk;
        end
    end  
end
% this is the function of HG modes in z position.
function [HGBeam,X,Y] = Hermite_Gaussian(N,hx,hy,w0,delta,lamda,z) 

   [X Y]=meshgrid((-N/2:N/2-1)*delta);
   [theta,rad] = cart2pol(X,Y);

   k=2*pi/lamda;
   zr=pi*w0^2/lamda;
   wz=w0*sqrt(1+(z/zr)^2);
   qz=z+1i*zr;
   q0=1i*zr;

   if z==0
      rz=Inf;
   else 
      rz=z*(1+(zr/z)^2);
   end

   AmpLGB=sqrt(2/(2^(hx+hy)*pi*factorial(hx)*factorial(hy)*w0^2)).*(q0/qz).*(-conj(qz)/qz)^((hx+hy)/2).*exp(-(rad.*rad)/(wz)^2).*polyval(HermitePoly(hx),sqrt(2)*X/wz).*polyval(HermitePoly(hy),sqrt(2)*Y/wz);   
   PsLGB=exp(-1i*(k*(rad.*rad)/(2*rz)+k*z-(hx+hy+1)*atan(z/zr)));

   HGBeam=AmpLGB.*PsLGB;

end

Теперь я приведу один пример для HG (2,0) следующим образом ( example1 ):

clc
clear all;
close all;

lambda=809e-9;    % optical wavelength 
w0=0.025;         %optical beam waist 15mm
k=2*pi/lambda;    % optical wavenumber
Zr=pi*w0^2/lambda; % Rayleigh range 

z0=0;          % start position z=0; but careful 0*Inf is undefined, here 0*Inf=NAN

N=1024;       % samples/side length at source plane
D1=0.25;      % side length [m]  at source plane
delta1=D1/N;  % grid spacing [m]
x1=-D1/2:delta1:D1/2-delta1;  % source plane x and y coordinates
y1=x1; 

%% HG modes
HGx=2;  
HGy=0;  

HGintheory=Hermite_Gaussian(N,HGx,HGy,w0,delta1,lambda,z0);

h7=figure(7);
imagesc(x1,y1,abs(HGintheory).^2);
title(sprintf('z=%d; HG(%d,%d)',z0,HGx,HGy))
xlabel('x (m)'); ylabel('y (m)');

График светового поля будет выглядеть следующим образом на левой стороне (его интенсивность): enter image description here

Мы можем использовать функцию rot90() для поворота матрицы HGintheory (то есть добавить код из одной строки: HGintheory=rot90(HGintheory);), и тогда поле повернется на 90 градусов (правая сторона графика интенсивности).

Потому что я хочу работать со световым полем. Итак, вопрос в том, как я могу повернуть комплексную матрицу HGintheory на произвольный угол ? Например 45 градусов?

Кто-нибудь знает, как повернуть сложную матрицу с большим размером? Если что-то не так или неясно, пожалуйста, укажите и спасибо заранее!

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Вы можете разбить ваше сложное поле на два реальных поля (амплитуду и фазу), повернуть оба с помощью imrotate и затем комбинировать их по пикселям

Hamp=abs(HGintheory);
Hphase=angle(HGintheory);

RotAngle=45;
HampRot=imrotate(Hamp,RotAngle,'bilinear','crop');
HphaseRot=imrotate(Hphase,RotAngle,'bilinear','crop');
HfullRot=HampRot.*exp(1i*HphaseRot);

figure(1);
imagesc(x1,y1,abs(HGintheory).^2);

figure(2);
imagesc(x1,y1,abs(HfullRot).^2);

enter image description here

0 голосов
/ 26 февраля 2020

Вы можете повернуть свою начальную сетку с помощью:

[X,Y] = meshgrid(x1,y1)
xyc = [mean(x1), mean(y1)];
angel = 45;
R = [cosd(angel), -sind(angel); sind(angel), cosd(angel)];
XY = xyc' + R * ([X(:) Y(:)]-xyc)';
XR = reshape(XY(1,:),size(X));
YR = reshape(XY(2,:),size(Y));

и затем использовать эти преобразованные координаты для построения графика:

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