简介:面向物理光学与光电信息教学的光学仿真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.6nm(589.0nm和589.6nm),普通光谱仪未必分得开,但在高精细度F-P腔里,两条谱线对应的透射峰可以被明显分开。
所以仿真要回答的问题就变成了:给定一个F-P系统(R、d、n固定),入射光包含两个波长,透射光强随什么变化?在什么条件下双线分得开,什么条件下完全融合成一个峰?
2. 参数映射与建模细节:从教材公式到MATLAB变量
写MATLAB代码之前,我先把所有物理量和脚本里的变量做了个映射,这一步看似琐碎,但能避免后期来回改单位、改量纲的麻烦。
| 物理量 | 符号 | MATLAB变量 | 单位/取值示例 |
|---|---|---|---|
| 波长 | λ | lambda | 589.0e-9, 589.6e-9(米) |
| 折射率 | n | n | 1.0(空气) |
| 平板间距 | d | d | 0.0001 ~ 0.005(米) |
| 入射角 | θ | theta | 0(正入射) |
| 反射率 | R | R | 0.6 ~ 0.98 |
| 精细度系数 | F | F = 4*R/(1-R)^2 | 由R推导 |
| 相位差 | δ | delta = 4pindcos(theta)./lambda | 弧度 |
| 透射强度 | I_t/I_i | I = 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。由于d=1mm相对于波长来说非常大,相位差变化极快,透射谱上会出现很多等间隔的峰——每个峰对应一个干涉级次。这个结果本身是对的,对应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 | 半峰全宽(相对) | 双线分辨效果(d=1mm时) |
|---|---|---|---|
| 0.6 | 15 | 约0.26周期 | 勉强可辨,峰与谷重叠处仍有明显背景 |
| 0.9 | 360 | 约0.053周期 | 清晰分辨,两峰之间有明显的谷 |
| 0.98 | 3969 | 约0.016周期 | 高度分辨,峰与峰几乎不串扰 |
这里的“半峰全宽”是我用仿真数据算出来的:直接把峰的纵坐标降到一半,然后找到对应的两个横坐标,做差。它的理论值大约是:
FWHM ≈ 2 * arcsin(1/√F)F越大,arcsin的自变量越小,半峰全宽自然就越窄。这个公式在写报告的时候很常用,推荐直接用它做理论值和仿真值的比对验证。
我实际操作时还发现一个重要判据:双线要分离,除了峰要窄,还要求两峰的间距大于它们的半峰全宽之和。对给定的d,两个波长透射峰之间的横轴间距(在d域)近似成正比:
Δd ≈ (λ1λ2) / (2n*Δλ) * (1/周期数)虽然我们通常在波长域或腔长域分辨,但本质上这个“峰距大于峰宽”的条件是通用的,也就是瑞利判据在F-P干涉里的体现。
我在调试时试过一组极端参数:R=0.98、d=5mm,这时候双线确实分得极开,但随之而来的问题是:两个峰各自的自由光谱范围(相邻级次间距)也变小了,图上会出现一堆其他级次的透射峰,很容易和钠双线本身的峰混在一起。选择参数时不要只追求高分辨率,还得确认自己关心的波段内没有多余级次干扰。
这个权衡在光谱仪设计中非常关键,但教材往往只讲分辨率,不太提自由光谱范围的限制。仿真最大的好处就是能逼你亲眼看到这个问题。
5. 被教材忽略的仿真细节:四个常见的坑和调参经验
代码能跑通只是第一步。我在调试过程中踩过几个不大不小、但很耽误时间的坑,写在这里供参考。
5.1 采样点数不足导致尖锐峰丢失
这是最隐蔽的坑。R=0.98时透射峰的半峰全宽已经非常小,如果d的扫描点只有几千个,很可能正好没有采样到峰顶,画出来的峰值高度明显偏低,甚至出现“峰在抖动”的假象。解决办法很简单:先粗扫一遍找峰值位置,再把该位置附近的区间单独细扫。我自己一般先跑一遍5000点,再在感兴趣区间重采样5万到10万点。这个操作在MATLAB里就是改linspace的区间范围,成本几乎为零,但效果立竿见影。
5.2 单位不统一,相位差爆掉
相位差δ的计算里,d、λ、n、cosθ必须完全一致的单位体系。我最开始粗心,d写的0.001(心里想着1mm),λ写的589e-9(米),出来的相位差直接爆到十几万弧度,sin函数振荡得毫无规律,锯齿状一片。这个问题的排查方法很笨但有效:先把中间量δ打印出来,看看数量级是否合理。合理范围应该和2π的整数倍可比,而不是暴大或暴小。
5.3 F过大时的浮点数精度问题
R=0.98时,F≈3969,sin²(δ/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替换成由薄膜矩阵计算出来的等效反射率,核心框架完全不用推翻。
本文还有配套的精品资源,点击获取