F-P干涉仪MATLAB仿真:从爱里函数到钠黄双线分辨
2026/9/23 20:00:27 网站建设 项目流程

简介:面向物理光学与光电信息教学的光学仿真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变量单位/取值示例
波长λ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对应的曲线放在一起,就是教材里最常见的“不同精细度下的爱里函数对比图”。

如果我想复现“钠黄双线分辨”这个物理过程,横轴就有两种选择:

  1. 以板间距d为横轴,固定入射角,画两个波长各自的透射强度I(d)。两个波长的透射峰随d变化的速度不一样,会在某些d区间错开。
  2. 以波长λ为横轴,固定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.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干涉里的体现。

我在调试时试过一组极端参数: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替换成由薄膜矩阵计算出来的等效反射率,核心框架完全不用推翻。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询