MATLAB:等倾干涉仿真

原理

对于前两列反射光的光程差:

\Delta L=n_{2}(AB+BC)-n_{1}AD+\frac{\lambda }{2}

其中:

AB=BC=\frac{d}{cos\theta },

AD=ACsin(i),

AC=2d\cdot tan\theta,

n_{1}sin(i)=n_{2}sin\theta\l

得到:\Delta L=2d\sqrt{n_{2}^{2}-n_{1}^{2}sin^{2}i}+\frac{\lambda }{2}

对于透射光的光程差:\Delta L=2d\sqrt{n_{2}^{2}-n_{1}^{2}sin^{2}i}

透射光光强分布:

I_{T}=\frac{I_{0}}{1+\frac{4Rsin^{2}\frac{\delta }{2}}{(1-R)^{2}}}

其中相位差:

\delta =\frac{2\pi}{\lambda }\Delta L

反射光光强为:I_{R}=I_{0}-I_{T}

代码

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

仿真结果

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
等厚干涉是一种光学现象,当两个等厚介质之间存在相干的光波时,会发生干涉现象。在使用Matlab进行等厚干涉仿真时,可以通过以下步骤进行实现: 1. 准备工作:首先需要安装Matlab软件,并准备好相关的光学参数。包括介质折射率、波长等。 2. 设置仿真区域:在Matlab中创建一个仿真区域,可以使用矩阵表示光的传播路径。可以根据需要设置仿真区域大小和分辨率。在仿真区域中,通过将介质的折射率分布表示为矩阵,来模拟等厚介质的分布。 3. 设置光源:为了进行等厚干涉仿真,需要设置一个或多个光源。可以选择单色或多色光源,根据需要设置光源的位置、频率和幅度。例如,可以使用正弦函数或高斯函数来模拟光源。 4. 进行传播计算:在仿真区域中,通过光的传播方程进行计算。采用数值方法,如有限差分法或有限元法,可以模拟光在等厚介质中的传播过程。基于光的传播路径和光源设置,计算出在仿真区域中的光干涉分布。 5. 可视化结果:通过Matlab提供的图形函数,可将仿真结果可视化输出。可以绘制等高线图或三维图,展示光的干涉效应。根据仿真结果,可以得出实际观察中可能出现的干涉条纹、干涉图案等。 综上所述,使用Matlab进行等厚干涉仿真,可以通过设置仿真区域、光源和进行传播计算等步骤来实现。这样可以方便地研究和分析等厚干涉现象,并通过可视化结果展示干涉效应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值