TA的每日心情 | 慵懒 2023-11-6 08:23 |
---|
签到天数: 274 天 [LV.8]以坛为家I
小白
- 积分
- 5
|
使用透镜阵列进行
1.我之前为了计算方便,针对这种光纤圆孔衍射写了一个matlab gui,如图所示。
2.关于圆柱坐标系衍射计算,需要注意的就是数值计算可能会涉及的采样问题,不能直接使用FFT,这个这个需要满足线性空不变条件。很明显针对圆柱坐标系无法满足这样条件;
3.针对圆柱坐标系的光场传输计算,需要使用的是贝瑟儿变换。
4.其次光纤孔不一定是纯粹的圆孔,使用椭圆孔的计算可能会更好一些,这个可以参见我发的代码。
附上代码:
clear
clc
PlotCos = ['Num = get(hs,"Value");','set(heNum,"String",num2str(Num));'];
hf = figure('Position',[200 200 600 400],'Name','椭圆孔夫琅禾费衍射','NumberTitle','off');
ha = axes('Position',[0.4 0.1 0.5 0.7],'Box','on');
% ------- 定义初始参数 ---------
lambda = 632.8;
R=1.0e3;
a=1;
b = 2;
sample = 501;
x = linspace(-1e-6,1e-6,sample);
y = linspace(-1e-6,1e-6,sample);
%% ------- 编辑波长的可编辑文本框 和 静态文本 ---------
% ---------- 显示可编辑文本框 --------
varX_wavelength = [ 'NumStr = get(heNum_wavelength,"String");',...
'Num = str2num(NumStr);','x = 0:0.1:Num*pi;'];
heNum_wavelength = uicontrol(hf,'Style','edit','Position',[50 320 100 30],'String','632.8','CallBack',varX_wavelength);
% --------- 静态文本 ------------
htWavelength = uicontrol(hf,'Style','text','Position',[50 350 100 30],'String','Wavelength(nm)');
%% ------- 编辑 孔径大小 的可编辑文本框 和 静态文本 ---------
% ---------- 显示可编辑文本框 --------
varX_aperture_a = [ 'NumStr = get(heNum_thickness_a,"String");',...
'Num = str2num(NumStr);','x = 0:0.1:Num*pi;'];
heNum_thickness_a = uicontrol(hf,'Style','edit','Position',[50 240 100 30],'String','1','CallBack',varX_aperture_a);
% --------- 静态文本 ------------
htthickness_a = uicontrol(hf,'Style','text','Position',[50 270 100 30],'String','Half shaft length a(um)');
%% ------- 编辑 孔径大小 的可编辑文本框 和 静态文本 ---------
% ---------- 显示可编辑文本框 --------
varX_aperture_b = [ 'NumStr = get(heNum_thickness_b,"String");',...
'Num = str2num(NumStr);','x = 0:0.1:Num*pi;'];
heNum_thickness_b = uicontrol(hf,'Style','edit','Position',[50 160 100 30],'String','2','CallBack',varX_aperture_b);
% --------- 静态文本 ------------
htthickness_b = uicontrol(hf,'Style','text','Position',[50 190 100 30],'String','Half shaft length b(um)');
%% ------- 编辑 衍射屏到达观察屏的距离 的可编辑文本框 和 静态文本 ---------
% ---------- 显示可编辑文本框 --------
varX_distance = [ 'NumStr = get(heNum_distance,"String");',...
'Num = str2num(NumStr);','x = 0:0.1:Num*pi;'];
heNum_distance = uicontrol(hf,'Style','edit','Position',[50 80 100 30],'String','1000','CallBack',varX_distance);
% --------- 静态文本 ------------
htdistance = uicontrol(hf,'Style','text','Position',[50 110 100 30],'String','Focus length(um)');
% ----------- 等倾干涉条纹显示 -------------
hb_equal_inclination = uicontrol(hf,...
'Style','pushbutton','Position',[320,340,150,30],...
'String','Fraunhofer Diffraction','CallBack',['subplot(ha);','a = str2double(get(heNum_thickness_a,"String"));','lambda=str2double(get(heNum_wavelength,"String"));',...
'b = str2double(get(heNum_thickness_b,"String"));','R = str2double(get(heNum_distance,"String"));','h1=imshow(eliptic_diffraction(lambda,a,b,R));']);
hbClose = uicontrol(hf,'Style','pushbutton','Position',[50 20 100 30],'String','退出','CallBack','close(hf)');
%% -------------------------------------------------------------------------------------------------------------------------------------
function I = eliptic_diffraction(lambda,a,b,R)
%ELIPTIC_DIFFRACTION 此处显示有关此函数的摘要
% 此处显示详细说明
% -------------------------------------------
% ----- 此函数主要用于 显示圆孔衍射条纹 ------
% ----- lambda 表示波长 -------
% ----- x 和 y 用于构成观察面 ----
% ----- a 表示圆孔的半径 ----------
% ----- R 表示观察屏到衍射屏的距离 ------------
% ----------------------------------
lambda = lambda*1e-9;
a = a*1e-6;
b = b*1e-6;
R = R*1e-6;
k=(2*pi)/lambda; % wavelength of light in vaccuum
Io=100.0; % relative intensity
% ---------- 设置网格面 --------
Y=(-0.25e-2:1e-5:0.25e-2); Z=Y ; % coordinates of the screen
[x,y] = meshgrid(Y,Z);
% ------- 进行坐标系转换 ---------
[beta,rho] = cart2pol(x,y);
% --------- 坐标系转换 ----------
I(1:length(Y),1:length(Z))=0;
ampli(1:length(Y),1:length(Z)) = 0;
% calculating diffracted intensity
for i=1:length(Y)
for j=1:length(Z)
v = k*rho(i,j)/R*sqrt(a^2*(cos(beta(i,j)))^2+(b*sin(beta(i,j)))^2);
ampli(i,j) = besselj(1,v)/v;
I(i,j) = Io*(besselj(1,v)/v)^2;
end
end
end
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
|