matlab - स्पाइरल




मैटलब में सर्पिल मैशग्रिड (2)

मैं MATLAB का उपयोग करके कुछ कम्प्यूटर उत्पन्न होलोग्राम का निर्माण करने की कोशिश कर रहा हूं। स्थानिक ग्रिड को इनिशियलाइज़ करने के लिए मैंने समान दूरी वाली जाल ग्रिड का इस्तेमाल किया, और मुझे निम्नलिखित चित्र मिला

इस पैटर्न की तरह मैं किस तरह की जरूरत है केंद्र क्षेत्र को छोड़कर फ्रिंज तेज होना चाहिए लेकिन धुंधला होना चाहिए। मुझे लगता है कि यह मेष ग्रिड की समस्या हो सकती है मैंने ध्रुवीय निर्देशांक में एक ग्रिड उत्पन्न करने की कोशिश की और MATLAB के pol2cart फ़ंक्शन का उपयोग करके इसे कार्टेशियन निर्देशांक में नक्शा। दुर्भाग्यवश, यह भी काम नहीं करता है एक सुझाव दे सकता है कि ठीक ग्रिड का उपयोग करना यह भी काम नहीं करता है मुझे लगता है कि अगर मैं एक सर्पिल जाल ग्रिड उत्पन्न कर सकता हूं, शायद समस्या हल हो सकती है इसके अलावा, सर्पिल बाहों की संख्या सामान्य रूप से, मनमानी हो सकती है, क्या कोई मुझे इस पर एक संकेत दे सकता है?

मैंने कोड संलग्न किया है (मेरी अंतिम परियोजनाएं बिल्कुल वैसी नहीं हैं, लेकिन इसकी एक समान समस्या है)

clc; clear all; close all;
%% initialization
tic
lambda = 1.55e-6;
k0 = 2*pi/lambda;
c0 = 3e8;
eta0 = 377;
scale = 0.25e-6;
NELEMENTS = 1600;
GoldenRatio = (1+sqrt(5))/2;
g = 2*pi*(1-1/GoldenRatio);

pntsrc = zeros(NELEMENTS, 3);
phisrc = zeros(NELEMENTS, 1);
for idxe = 1:NELEMENTS
  pntsrc(idxe, :) = scale*sqrt(idxe)*[cos(idxe*g), sin(idxe*g), 0];
  phisrc(idxe) = angle(-sin(idxe*g)+1i*cos(idxe*g));
end
phisrc = 3*phisrc/2; % 3 arms (topological charge ell=3)

%% post processing
sigma = 1;
polfilter = [0, 0, 1i*sigma; 0, 0, -1; -1i*sigma, 1, 0]; % cp filter

xboundl = -100e-6; xboundu = 100e-6;
yboundl = -100e-6; yboundu = 100e-6;
xf = linspace(xboundl, xboundu, 100);
yf = linspace(yboundl, yboundu, 100);
zf = -400e-6;
[pntobsx, pntobsy] = meshgrid(xf, yf);
% how to generate a right mesh grid such that we can generate a decent result?
pntobs = [pntobsx(:), pntobsy(:), zf*ones(size(pntobsx(:)))];
% arbitrary mesh may result in "wrong" results

NPNTOBS = size(pntobs, 1);
nxp = length(xf);
nyp = length(yf);

%% observation
Eobs = zeros(NPNTOBS, 3);

matlabpool open local 12
parfor nobs = 1:NPNTOBS
  rp = pntobs(nobs, :);
  Erad = [0; 0; 0];
  for idx = 1:NELEMENTS
    rs = pntsrc(idx, :);
    p = exp(sigma*1i*2*phisrc(idx))*[1 -sigma*1i 0]/2; % simplified here
    u = rp - rs;
    r = sqrt(u(1)^2+u(2)^2+u(3)^2); %norm(u);
    u = u/r; % unit vector
    ut = [u(2)*p(3)-u(3)*p(2),...
      u(3)*p(1)-u(1)*p(3), ...
      u(1)*p(2)-u(2)*p(1)]; % cross product: u cross p
    Erad = Erad + ... % u cross p cross u, do not use the built-in func
      c0*k0^2/4/pi*exp(1i*k0*r)/r*eta0*...
      [ut(2)*u(3)-ut(3)*u(2);...
      ut(3)*u(1)-ut(1)*u(3); ...
      ut(1)*u(2)-ut(2)*u(1)]; 
  end
  Eobs(nobs, :) = Erad; % filter neglected here
end
matlabpool close
Eobs = Eobs/max(max(sum(abs(Eobs), 2))); % normailized

%% source, gaussian beam
E0 = 1;
w0 = 80e-6;
theta = 0; % may be titled
RotateX = [1, 0, 0; ...
  0, cosd(theta), -sind(theta); ...
  0, sind(theta), cosd(theta)];

Esrc = zeros(NPNTOBS, 3);
for nobs = 1:NPNTOBS
  rp = RotateX*[pntobs(nobs, 1:2).'; 0];
  z = rp(3);
  r = sqrt(sum(abs(rp(1:2)).^2));
  zR = pi*w0^2/lambda;
  wz = w0*sqrt(1+z^2/zR^2);
  Rz = z^2+zR^2;
  zetaz = atan(z/zR);
  gaussian = E0*w0/wz*exp(-r^2/wz^2-1i*k0*z-1i*k0*0*r^2/Rz/2+1i*zetaz);% ...
  Esrc(nobs, :) = (polfilter*gaussian*[1; -1i; 0]).'/sqrt(2)/2;
end
Esrc = [Esrc(:, 2), Esrc(:, 3), Esrc(:, 1)];
Esrc = Esrc/max(max(sum(abs(Esrc), 2)));  % normailized
toc

%% visualization
fringe = Eobs + Esrc; % I'll have a different formula in my code
normEsrc = reshape(sum(abs(Esrc).^2, 2), [nyp nxp]);
normEobs = reshape(sum(abs(Eobs).^2, 2), [nyp nxp]);
normFringe = reshape(sum(abs(fringe).^2, 2), [nyp nxp]);

close all;
xf0 = linspace(xboundl, xboundu, 500);
yf0 = linspace(yboundl, yboundu, 500);
[xfi, yfi] = meshgrid(xf0, yf0);
data = interp2(xf, yf, normFringe, xfi, yfi);
figure; surf(xfi, yfi, data,'edgecolor','none');
% tri = delaunay(xfi, yfi); trisurf(tri, xfi, yfi, data, 'edgecolor','none');
xlim([xboundl, xboundu])
ylim([yboundl, yboundu])
% colorbar
view(0,90)
colormap(hot)
axis equal
axis off
title('fringe thereo. ', ...
  'fontsize', 18)

क्षमा करें, आंकड़े पोस्ट नहीं कर सकते लेकिन यह मदद कर सकता है मैंने इसे आयाम के स्थानिक मॉड्यूलर्स के साथ प्रयोग के लिए लिखा था ...

R=70;           % radius of curvature of fresnel lens (in pixel units)
A=0;             % oblique incidence by linear grating (1=oblique 0=collinear)
B=1;             % expanding by fresnel lens (1=yes 0=no)
L=7;            % topological charge
Lambda=30;       % linear grating fringe spacing (in pixels)
aspect=1/2;      % fraction of fringe period that is white/clear
xsize=1024;       % resolution (xres x yres number data pts calculated)
ysize=768;        % 

% define the X and Y ranges (defined to skip zero)
xvec = linspace(-xsize/2, xsize/2, xsize);     % list of x values
yvec = linspace(-ysize/2, ysize/2, ysize);     % list of y values

% define the meshes - matrices linear in one dimension
[xmesh, ymesh] = meshgrid(xvec, yvec);

% calculate the individual phase components
vortexPh = atan2(ymesh,xmesh);       % the vortex phase
linPh = -2*pi*ymesh;           % a phase of linear grating
radialPh = (xmesh.^2+ymesh.^2);     % a phase of defocus

% combine the phases with appropriate scales (phases are additive)
% the 'pi' at the end causes inversion of the pattern
Ph = L*vortexPh + A*linPh/Lambda + B*radialPh/R^2;

% transmittance function (the real part of exp(I*Ph))
T = cos(Ph);
% the binary version
binT = T > cos(pi*aspect);

% plot the pattern
% imagesc(binT)
imagesc(T)
colormap(gray)

मैंने आपका कोड नहीं पढ़ा था क्योंकि यह इतनी सी बड़ी बात करना बहुत लंबा है मैंने अपना लिखा था और इसका परिणाम है:

कोड है

%spiral.m
function val = spiral(x,y)

  r = sqrt( x*x + y*y);
  a = atan2(y,x)*2+r;                  

  x = r*cos(a);
  y = r*sin(a);

  val = exp(-x*x*y*y);

   val = 1/(1+exp(-1000*(val)));   

endfunction


%show.m
n=300;
l = 7;
A = zeros(n);

for i=1:n
for j=1:n
    A(i,j) = spiral( 2*(i/n-0.5)*l,2*(j/n-0.5)*l);
end
 end


imshow(A) %don't know if imshow is in matlab. I used octave.

धारियों के लिए महत्वपूर्ण रेखा है

val = 1/(1+exp(-1000*(val))); 

यह रसद फ़ंक्शन है संख्या 1000 परिभाषित करता है कि आपकी छवि कितनी तेज होगी। इसलिए इसे अधिक धूमिल छवि के लिए कम या तेज करने के लिए इसे उच्चतर करें।

हम उम्मीद करते है कि यह आपके सवाल का जवाब दे देगा ;)

संपादित करें: यह साथ खेलने के लिए मजेदार है यहाँ एक और सर्पिल है:

function val = spiral(x,y)

   s= 0.5;

   r = sqrt( x*x + y*y);
   a = atan2(y,x)*2+r*r*r;                  

  x = r*cos(a);
  y = r*sin(a);

  val = 0;  
  if (abs(x)<s )
    val = s-abs(x);
    endif
 if(abs(y)<s)
    val =max(s-abs(y),val); 
    endif

   %val = 1/(1+exp(-1*(val)));

endfunction

संपादित करें 2: मज़ा, मज़ा, मज़ा! यहां हथियार पतले नहीं होते हैं

  function val = spiral(x,y)

   s= 0.1;

   r = sqrt( x*x + y*y);
   a = atan2(y,x)*2+r*r;                  % h

  x = r*cos(a);
  y = r*sin(a);

  val = 0;  
  s = s*exp(r);
  if (abs(x)<s )
    val = s-abs(x);
    endif
 if(abs(y)<s)
    val =max(s-abs(y),val); 
    endif
 val = val/s;   
 val = 1/(1+exp(-10*(val)));

 endfunction

आपके प्रश्न को धिक्कारना, मुझे सचमुच मेरी परीक्षा के लिए अध्ययन की ज़रूरत है, अरघ्ह!

Edit3:

मैंने कोड को सचेत किया और यह बहुत तेजी से चलाता है।

%spiral.m
  function val = spiral(x,y)   
   s= 2;

   r = sqrt( x.*x + y.*y);
   a = atan2(y,x)*8+exp(r);                  

  x = r.*cos(a);
  y = r.*sin(a);

  val = 0;  
  s = s.*exp(-0.1*r);
  val = r;
  val =  (abs(x)<s ).*(s-abs(x));
  val = val./s;

 % val = 1./(1.+exp(-1*(val)));  
 endfunction


%show.m

n=1000;
l = 3;
A = zeros(n);
[X,Y] = meshgrid(-l:2*l/n:l);
A = spiral(X,Y);
imshow(A)






matlab-figure