原理
对于前两列反射光的光程差:
其中:
得到:
对于透射光的光程差:
透射光光强分布:
其中相位差:
反射光光强为:
代码
clc
close(findall(0, 'type', 'figure'))
clear;
FPgs();
function FPgs()
default_lam=620;
default_n=1;
default_R=0.9;
%% 界面
Fig=uifigure('Position',[100,100,920,650],'MenuBar','none');
Fig.Color='white';
Pan1=uipanel('Parent',Fig,'Units','normalized','Position',[0.05,0.25,0.9,0.85]);
Pan2=uipanel('Parent',Fig,'Units','normalized','Position',[0.05,0.03,0.9,0.2]);
Axes1=uiaxes(Pan1,'Position',[8,30,400,400]);
Axes2=uiaxes(Pan1,'Position',[408,30,400,400]);
uilabel(Pan1,'Position',[360 430 150 40],'Text','FP干涉','FontSize',24,'FontWeight','bold');
%% 微调器
% 波长
Spilam= uispinner(Pan2,'Enable','on','Editable','on','Position',[100 65 130 30], ...
'Value',default_lam,'FontSize',16,'FontWeight','bold','HorizontalAlignment','center','ValueDisplayFormat','%.0f nm');
uilabel(Pan2,'Position',[55 70 70 20],'Text','波长','FontSize',16);
% 折射率
Spin= uispinner(Pan2,'Enable','on','Editable','on','Position',[350 65 130 30], ...
'Value',default_n,'FontSize',16,'FontWeight','bold','HorizontalAlignment','center','Step',0.1);
uilabel(Pan2,'Position',[290 70 70 20],'Text','折射率','FontSize',16);
% 反射率
SpiR= uispinner(Pan2,'Enable','on','Editable','on','Position',[600 65 130 30], ...
'Value',default_R,'FontSize',16,'FontWeight','bold','HorizontalAlignment','center','Step',0.1,'Limits',[0 1]);
uilabel(Pan2,'Position',[540 70 70 20],'Text','反射率','FontSize',16);
Spilam.ValueChangingFcn=@(Spilam,event) lamspinnerChanging(event);
Spin.ValueChangingFcn=@(Spilam,event) nspinnerChanging(event);
SpiR.ValueChangingFcn=@(Spilam,event) RspinnerChanging(event);
%% 数值编辑框
edtd=uieditfield(Pan2,'numeric','Position',[100 15 120 30],'Value',0.0002,'HorizontalAlignment','center', ...
'ValueChangedFcn',@(edtd,event) dValChanged(event));
uilabel(Pan2,'Position',[55 25 75 20],'Text','间距','FontSize',16);
%% 按钮
uibutton(Pan2, 'Text', '绘图','Position',[600,20, 100, 30],'FontWeight','bold','FontSize',16, ...
'ButtonPushedFcn', @(btn,event) Set());
showimage();
function showimage()
I0=1;
n=Spin.Value;
lambda = Spilam.Value* 1e-9; %波长单位转为:mm
r=SpiR.Value;
d=edtd.Value;
angle=0:0.0001:0.1;
delta=(4*pi/lambda)*d*sqrt(n^2-sin(angle).^2);
It=I0.*(1-r).^2./((1-r).^2+4.*r.*sin(delta./2).^2);
Ir=I0-It;
M = round(length(It)*sqrt(2)-1);
h = round(length(It)/sqrt(2));
Ct = zeros(M,M,3);
Cr=Ct;
[R,G,B] = Lam2rgb(lambda*1e9);
for i=1:M
for j=1:M
dd = round(sqrt((i-h)^2+(j-h)^2));
Ct(i,j,3)= B*It(dd+1);
Ct(i,j,2)= G*It(dd+1);
Ct(i,j,1)= R*It(dd+1);
Cr(i,j,3)= B*Ir(dd+1);
Cr(i,j,2)= G*Ir(dd+1);
Cr(i,j,1)= R*Ir(dd+1);
end
end
image(Ct,'Parent',Axes1,'XData',[0,M],'YData',[0,M])
image(Cr,'Parent',Axes2,'XData',[0,M],'YData',[0,M])
axis(Axes1,[0 M 0 M])
axis(Axes2,[0 M 0 M])
axis(Axes1,'image','off')
axis(Axes2,'image','off')
end
function Set()
showimage();
end
function lamspinnerChanging(event)
if event.Value<380
uialert(Fig,'请输入380-780nm范围的波长','警告');
pause(0.1)
set(Spilam,'Value',380)
elseif event.Value>780
uialert(Fig,'请输入380-780nm范围的波长','警告');
pause(0.1)
set(Spilam,'Value',780)
else
showimage();
end
end
function nspinnerChanging(~)
showimage();
end
function RspinnerChanging(~)
showimage();
end
function dValChanged(~)
showimage();
end
function [r,g,b] = Lam2rgb(lambda)
if (lambda >= 380.0) && (lambda < 440.0)
r = -1.0 * (lambda - 440.0) / (440.0 - 380.0);
g = 0.0;
b = 1.0;
elseif (lambda >= 440.0) && (lambda < 490.0)
r = 0.0;
g = (lambda - 440.0) / (490.0 - 440.0);
b = 1.0;
elseif (lambda >= 490.0) && (lambda < 510.0)
r = 0.0;
g = 1.0;
b = -1.0 * (lambda - 510.0) / (510.0 - 490.0);
elseif (lambda >= 510.0) && (lambda < 580.0)
r = (lambda - 510.0) / (580.0 - 510.0);
g = 1.0;
b = 0.0;
elseif (lambda >= 580.0) && (lambda < 645.0)
r = 1.0;
g = -1.0 * (lambda - 645.0) / (645.0 - 580.0);
b = 0.0;
elseif (lambda >= 645.0) && (lambda <= 780.0)
r = 1.0;
g = 0.0;
b = 0.0;
else
r = 0.0;
g = 0.0;
b = 0.0;
end
% 在可见光谱的边缘处强度较低。
if (lambda >= 380.0) && (lambda < 420.0)
attenuation = 0.3 + 0.7 * (lambda - 380) / (420 - 380);
r = r * attenuation;
g = 0.0;
b = 1.0 * attenuation;
elseif(lambda >= 701.0) && (lambda <= 780.0)
attenuation = 0.30 + 0.70 * (780.0 - lambda) / (780.0 - 700.0);
r = r * attenuation;
g = 0.0;
b = 0.0;
end
end
end