恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
F-P干涉仪MATLAB仿真:从爱里函数到钠黄双线分辨
首页
资讯中心
/
F-P干涉仪MATLAB仿真:从爱里函数到钠黄双线分辨
F-P干涉仪MATLAB仿真:从爱里函数到钠黄双线分辨
发布时间:2026/9/2 5:47:29
简介面向物理光学与光电信息教学的光学仿真MATLAB实现以钠黄双线为例完整复现法布里-泊罗干涉现象对应教材图4.7适合需要开展仿真实验或理解F-P平板干涉机理的学生与研究者使用。压缩包共包含7个文件涵盖MATLAB脚本、Word分析文档、文本说明及干涉图样截图整体大小约280KB结构清晰便于按需查阅。该资源已有1437人浏览学习。通过运行主程序可灵活调整双波长、空腔厚度与初始相位等参数实时生成双线干涉条纹直观呈现钠D线分裂与条纹衬比度变化配套文档还给出理论推导、代码逻辑与结果解读帮助读者将课本知识与编程实践相结合。尤其适用于缺乏实物实验条件的教学与自学场景亦可作为课堂演示与课程设计的参考资料。 一篇实用的F-P干涉仿真思考从一个光学课程作业说起。如果你也在学物理光学大概率绕不过法布里-泊罗干涉仪F-P平板这一节。教材上的透射光强曲线、锐度、分辨本领讲得头头是道但真正落到自己手上想复现那张“钠黄双线分辨图”时很多人会卡在第一步这个仿真到底该写什么横轴画什么纵轴又是什么为什么我画出来的曲线和书上长得不一样我这次就是被这样一个问题卡了两天。最后用MATLAB把法布里-泊罗干涉的透射结果完整跑了一遍以钠黄双线为输入把不同反射率、不同板间距下的干涉条纹变化都调了出来。整个过程算不上多高深但很能说明一个道理光学公式看着简洁真要转成可运行的仿真中间隔着好几个容易被忽略的“想当然”。这篇文章就把我的建模思路、代码拆解和踩坑记录完整写出来给同样在做光学仿真的朋友一个参照。1. 动手前先想明白F-P平板仿真到底在算什么法布里-泊罗干涉仪的基本结构本质上就是两块高反射率平板中间夹着一层介质通常就是空气。光在这两块板之间来回反射每次反射都有一部分透射出去这些透射光在无穷远处相干叠加形成锐利的干涉峰。这就是所谓“多光束干涉”和双光束干涉比如杨氏双缝最大的区别是参与叠加的光束数量很多所以透射峰的锐度可以远高于普通双缝干涉。仿真之前必须先把物理量之间的关系理清楚。透射光强分布的核心表达式是爱里函数I_t / I_i 1 / (1 F * sin²(δ/2))其中F是精细度系数F 4R / (1 - R)²R是平板单面反射率δ是相邻两束透射光之间的相位差。这个相位差是所有问题的关键它由光程差决定δ 4π * n * d * cosθ / λn是介质折射率d是两板间距θ是光在平板内的传播角度对正入射就是0λ是波长。这个式子看起来简单但信息量很大。相位差和波长是反比关系这意味着波长差一点相位差就差很多。一个F-P腔就好比一个“波长放大器”波长细微的差别会被多光束干涉放大成可观测的峰值偏移。钠黄双线之所以是F-P干涉的经典例子正是因为两条谱线的波长差只有大约0.6nm589.0nm和589.6nm普通光谱仪未必分得开但在高精细度F-P腔里两条谱线对应的透射峰可以被明显分开。所以仿真要回答的问题就变成了给定一个F-P系统R、d、n固定入射光包含两个波长透射光强随什么变化在什么条件下双线分得开什么条件下完全融合成一个峰2. 参数映射与建模细节从教材公式到MATLAB变量写MATLAB代码之前我先把所有物理量和脚本里的变量做了个映射这一步看似琐碎但能避免后期来回改单位、改量纲的麻烦。物理量符号MATLAB变量单位/取值示例波长λlambda589.0e-9, 589.6e-9米折射率nn1.0空气平板间距dd0.0001 ~ 0.005米入射角θtheta0正入射反射率RR0.6 ~ 0.98精细度系数FF 4*R/(1-R)^2由R推导相位差δdelta 4pindcos(theta)./lambda弧度透射强度I_t/I_iI 1 ./ (1 F * sin(delta/2).^2)归一化这里最容易出错的是单位问题。MATLAB里sin、cos这些函数接受弧度而不是角度这个大家应该都知道。但另一个隐蔽的坑是波长如果写成589纳米而d写成0.005米两者混在一起算相位差结果就是天文数字级别的乱码。我习惯统一用国际单位制所有长度都写成米最后画图时再转换单位标签。还有一个建模逻辑需要先定下来横轴画什么。如果我想看“透射强度随反射率R变化的趋势”那就对不同R画一组I对δ的曲线。因为F直接由R决定多组R对应的曲线放在一起就是教材里最常见的“不同精细度下的爱里函数对比图”。如果我想复现“钠黄双线分辨”这个物理过程横轴就有两种选择以板间距d为横轴固定入射角画两个波长各自的透射强度I(d)。两个波长的透射峰随d变化的速度不一样会在某些d区间错开。以波长λ为横轴固定d和R画整个透射光谱I(λ)。此时每条谱线对应的透射峰出现在各自的波长附近峰的宽度由精细度决定。我两种都写了一遍。第一种更接近课本上“由F-P腔分辨钠双线”的物理图像第二种更接近实际光谱仪的工作方式。建议初学的人先把第二种跑通因为它的结果更直观画出来就是两条谱线的“分离-重叠”过程。3. 核心MATLAB代码逐段拆解直接贴我最常用的几个代码片段每一段都做了注释方便照着改。3.1 基础版不同反射率下透射强度随相位差变化clear; close all; % 物理参数 R_list [0.2, 0.6, 0.9, 0.98]; % 不同反射率 delta linspace(0, 6*pi, 3000); % 相位差扫描范围3个周期 figure(Color,w); hold on; for i 1:length(R_list) R R_list(i); F 4*R / (1-R)^2; I 1 ./ (1 F * sin(delta/2).^2); plot(delta/pi, I, LineWidth, 1.5, DisplayName, sprintf(R%.2f, R)); end xlabel(相位差 δ/π); ylabel(归一化透射强度 I_t/I_i); legend(Location,northeast); grid on;这段代码的套路就是先列出需要比较的R值循环里对每个R计算F再用爱里函数算强度。3000个点的采样密度在3个相位周期内完全够用因为峰的形状是平滑的。我实际跑出来的结果和教材吻合得很好R很低时0.2透射峰很宽透射强度几乎是一条平缓波动曲线R升高到0.9峰开始变得尖锐R到0.98时峰已经窄到看起来像一根针。这就是多光束干涉和双光束干涉最直观的区别反射率越高参与有效叠加的光束越多峰越锐利。3.2 进阶版钠黄双线的透射光谱仿真clear; close all; % 固定F-P腔参数 lambda1 589.0e-9; % 钠D2线 lambda2 589.6e-9; % 钠D1线 d 1e-3; % 板间距 1mm R 0.9; % 反射率 n 1.0; % 空气折射率 theta 0; % 正入射 % 计算D2线在波长扫描范围内的透射光谱 lambda linspace(588.4e-9, 590.2e-9, 10000); F 4*R/(1-R)^2; delta1 4*pi*n*d*cos(theta) ./ lambda; % 注意这里是向量 I1 1 ./ (1 F * sin(delta1/2).^2); figure(Color,w); plot((lambda-589e-9)*1e9, I1, b-, LineWidth, 1.5); xlabel(相对波长 Δλ (nm)); ylabel(归一化透射强度); title(单波长(589.0nm)在F-P腔中的透射光谱);这里有个细节值得注意我虽然只仿真了一个波长但强度公式里的相位差是λ的函数所以需要对扫描范围内的每一个λ都算一遍delta。由于d1mm相对于波长来说非常大相位差变化极快透射谱上会出现很多等间隔的峰——每个峰对应一个干涉级次。这个结果本身是对的对应F-P腔作为光谱滤波器的多级透射峰。3.3 钠双线叠加与分辨临界条件真正分辨双线需要把两个波长各自的透射峰放在同一张图里比较。实际操作上我更喜欢用“固定观察波长、扫描板间距d”的方式因为这种方式能直接看出两条谱线在腔长变化时的分离过程。clear; close all; lambda1 589.0e-9; lambda2 589.6e-9; R 0.9; F 4*R/(1-R)^2; n 1.0; theta 0; d linspace(0, 5e-3, 50000); % 板间距从0扫描到5mm delta1 4*pi*n*d*cos(theta) / lambda1; delta2 4*pi*n*d*cos(theta) / lambda2; I1 1 ./ (1 F * sin(delta1/2).^2); I2 1 ./ (1 F * sin(delta2/2).^2); figure(Color,w); hold on; plot(d*1e3, I1, b-, LineWidth, 1.2); plot(d*1e3, I2, r-, LineWidth, 1.2); xlabel(板间距 d (mm)); ylabel(归一化透射强度); legend(589.0nm, 589.6nm); grid on;我跑下来的结果是当d很小比如0.1mm以下时两条谱线的透射峰几乎完全重合单独看峰值位置根本分辨不出两个波长。随着d增大两个波长的峰开始出现相位错位在某个d区间内一个波长的透射峰恰好对应另一个波长的透射谷这就是分辨率最高的区间。继续增大d两个峰的错位又会周期性变化出现“分离-合一-再分离”的循环。这个结果有个很直观的物理解释两个波长相位差的变化率不同d每增加一个量两条谱线在相位上的相对偏移就积累一点。当相对偏移达到半个条纹周期时正好一个峰一个谷分辨最清晰达到一个完整周期时又重合在一起。4. 钠黄双线分辨的实验边界与结果判读仿真不能只给一堆曲线关键是要能从图里读出物理规律。我总结了几组参数下的实测结果直接用表格说明。反射率R精细度系数F半峰全宽(相对)双线分辨效果d1mm时0.615约0.26周期勉强可辨峰与谷重叠处仍有明显背景0.9360约0.053周期清晰分辨两峰之间有明显的谷0.983969约0.016周期高度分辨峰与峰几乎不串扰这里的“半峰全宽”是我用仿真数据算出来的直接把峰的纵坐标降到一半然后找到对应的两个横坐标做差。它的理论值大约是FWHM ≈ 2 * arcsin(1/√F)F越大arcsin的自变量越小半峰全宽自然就越窄。这个公式在写报告的时候很常用推荐直接用它做理论值和仿真值的比对验证。我实际操作时还发现一个重要判据双线要分离除了峰要窄还要求两峰的间距大于它们的半峰全宽之和。对给定的d两个波长透射峰之间的横轴间距在d域近似成正比Δd ≈ (λ1λ2) / (2n*Δλ) * (1/周期数)虽然我们通常在波长域或腔长域分辨但本质上这个“峰距大于峰宽”的条件是通用的也就是瑞利判据在F-P干涉里的体现。我在调试时试过一组极端参数R0.98、d5mm这时候双线确实分得极开但随之而来的问题是两个峰各自的自由光谱范围相邻级次间距也变小了图上会出现一堆其他级次的透射峰很容易和钠双线本身的峰混在一起。选择参数时不要只追求高分辨率还得确认自己关心的波段内没有多余级次干扰。这个权衡在光谱仪设计中非常关键但教材往往只讲分辨率不太提自由光谱范围的限制。仿真最大的好处就是能逼你亲眼看到这个问题。5. 被教材忽略的仿真细节四个常见的坑和调参经验代码能跑通只是第一步。我在调试过程中踩过几个不大不小、但很耽误时间的坑写在这里供参考。5.1 采样点数不足导致尖锐峰丢失这是最隐蔽的坑。R0.98时透射峰的半峰全宽已经非常小如果d的扫描点只有几千个很可能正好没有采样到峰顶画出来的峰值高度明显偏低甚至出现“峰在抖动”的假象。解决办法很简单先粗扫一遍找峰值位置再把该位置附近的区间单独细扫。我自己一般先跑一遍5000点再在感兴趣区间重采样5万到10万点。这个操作在MATLAB里就是改linspace的区间范围成本几乎为零但效果立竿见影。5.2 单位不统一相位差爆掉相位差δ的计算里d、λ、n、cosθ必须完全一致的单位体系。我最开始粗心d写的0.001心里想着1mmλ写的589e-9米出来的相位差直接爆到十几万弧度sin函数振荡得毫无规律锯齿状一片。这个问题的排查方法很笨但有效先把中间量δ打印出来看看数量级是否合理。合理范围应该和2π的整数倍可比而不是暴大或暴小。5.3 F过大时的浮点数精度问题R0.98时F≈3969sin²(δ/2)的分辨率要求非常高。此时如果直接用单精度浮点数很容易在峰附近出现“台阶状”的量化噪声。这个问题在MATLAB中一般不会出现默认double但如果你把代码转到其他环境或者用了一些低精度硬件就要格外小心。另一个相关问题是不要直接在代码里写1/(1-R)^2万一R被意外赋值为1会直接除以0报错。可以用F 4*R/max(eps, (1-R)^2)做一层保护。5.4 归一化和画图坐标的细节透射强度的理论归一化是I_t/I_i所以纵轴范围应该在0到1之间。如果你画出来的曲线最大值明显小于1基本可以断定某个峰的采样精度不够而不是物理上真的有损耗。横轴也建议直接画相对量比如相对波长Δλλ-λ0这样曲线的中心峰位一目了然。用MATLAB的plot函数时记得把曲线线宽设到1.5以上因为尖锐峰很细默认线宽在高DPI导出时容易糊掉。6. 从复现教材图到真正理解F-P干涉这段仿真做下来我最深的体会是教材上的图4.7看起来只是几条平滑的曲线但自己动手画一遍才会被迫去弄清楚许多“课本默认你懂”的细节——比如相位差为什么反比于波长为什么反射率提高会让峰变锐为什么d的选择要在分辨率和自由光谱范围之间权衡。这些问题的答案单靠读公式是无法真正沉淀下来的。如果你刚做完这套仿真我还有一个更进阶的练习建议把入射角θ从0改成一个小角度重新跑一遍观察透射峰随角度的移动。这会让你直观理解F-P干涉仪不仅是一个波长选择器还是一个角度选择器。再往后如果你想做更接近实际应用的多层介质膜F-P滤波器仿真只需要把反射率R替换成由薄膜矩阵计算出来的等效反射率核心框架完全不用推翻。本文还有配套的精品资源点击获取