MATLAB复现钠黄双线法布里-泊罗干涉:从物理光学图到仿真代码 简介这份资源面向光电信息科学与工程、物理光学方向的学生与教师用MATLAB复现法布里-泊罗干涉仪在钠黄双线入射下的干涉图样对应物理光学教材图4.7适合课堂演示、课程设计或自学仿真时对照参考。压缩包共7个文件约280KB包含2个m脚本、3张jpg干涉图、1份docx分析文档和1份txt说明脚本负责参数控制与干涉场绘制图片直观展示不同设置下的条纹变化文档则梳理理论背景与结果分析。已有1439人学习下载说明该案例在光学仿真教学中具有一定参考价值。读者可借此理解多光束干涉原理、双波长叠加对条纹对比度的影响并掌握用MATLAB进行光学场数值模拟与可视化的基本思路为无法开展实物实验的场景提供替代方案。1. 用 MATLAB 复现钠黄双线的法布里-泊罗干涉从物理光学图 4.7 说起物理光学教材里那张法布里-泊罗干涉图很多人第一次看都觉得“不就是一组同心圆环”真动手用 MATLAB 画一遍才发现环的锐度、双线是否分得开、中心是不是亮斑全都被反射率、腔长、波长差这几个参数死死拿捏。钠黄双线是个特别好的例子589.0 nm 和 589.6 nm 只差 0.6 nm拿它去照 F-P 平板干涉级次一高两条谱线的同级条纹就会错开出现“一套环里套着另一套环”的现象。这篇笔记就围绕光学仿真、MATLAB、法布里-泊罗干涉、钠黄双线、F-P 平板这几个关键词把教材图 4.7 背后的公式、代码、参数和踩坑一次讲透。适合正在做物理光学课程设计、干涉光谱仿真或者想用 MATLAB 快速验证多光束干涉结论的人。2. 法布里-泊罗干涉的物理模型为什么钠黄双线能把环“劈开”2.1 多光束干涉的强度公式到底在算什么F-P 平板本质是两块高反射率平行板夹一层介质光在腔内反复反射、透射出射光是无穷多束相干光的叠加。设平板反射率为 (R)透射率为 (T)忽略吸收时 (RT1)两相邻透射光的光程差为[ \Delta 2nh\cos\theta ]其中 (n) 是腔介质折射率(h) 是板间距(\theta) 是腔内折射角。对应的相位差[ \delta \frac{2\pi}{\lambda}\Delta \frac{4\pi n h \cos\theta}{\lambda} ]多光束干涉的透射强度归一化形式为[ \frac{I_t}{I_i} \frac{1}{1 F\sin^2(\delta/2)}, \quad F \frac{4R}{(1-R)^2} ]这里的 (F) 叫精细度系数(R) 越接近 1(F) 越大透射峰越尖锐。很多同学第一次写代码时直接把 (R0.5) 代进去结果画出来的环又粗又糊还以为是公式错了。其实不是公式错是反射率太低多光束干涉退化成接近双光束干涉条纹自然不锐。钠黄双线的意义在于两条波长只差 0.6 nm但 F-P 的干涉级次 (m \Delta/\lambda) 通常很大比如 (h2) mm、(n1)、(\theta0) 时(m \approx 2\times2\text{mm}/589\text{nm} \approx 6790)。级次这么高0.6 nm 的波长差会让两条谱线的同级条纹相位差达到[ \Delta\delta \delta_1 - \delta_2 4\pi n h \left(\frac{1}{\lambda_1}-\frac{1}{\lambda_2}\right) ]代入数值(\Delta\delta) 可能达到几个 (\pi)于是两套环在空间上明显错开。这就是教材图 4.7 里“双线分裂”的根源。2.2 为什么用 MATLAB 而不是直接画解析圆环有人会问环的半径公式不是现成的吗直接按 (r f\tan\theta) 画圆不就行了问题在于F-P 的条纹不是简单的几何圆而是强度随 (\theta) 剧烈变化的干涉图样。你要看的是“亮环有多锐、双线错开多少、中心是不是亮斑”这些必须把强度公式逐点算出来。MATLAB 的优势是矩阵化运算可以把 (\theta_x,\theta_y) 网格一次性代入公式得到二维强度图再映射成灰度或伪彩色。这样既能复现教材图又能改参数做对比实验。常见做法是先建立观察屏上的坐标网格再用小角度近似 (\theta \approx r/f)把相位差写成 (r) 的函数最后算强度。这个近似在近轴条件下足够准而且计算量小。如果你要做大角度或高精度仿真就得用精确的 (\cos\theta) 表达式但那样代码会复杂一些后面会讲怎么切换。2.3 钠黄双线的参数怎么设才合理钠黄双线的标准波长一般取 589.0 nm 和 589.6 nm强度比接近 2:1D2 线略强于 D1 线但很多教材简化为等强度。仿真时如果只关心条纹位置可以设成等强度如果要看对比度变化最好按实际强度比加权。F-P 平板的参数没有唯一标准但为了复现教材图 4.7 那种“细锐环双线分裂”的效果我一般会这样起步参数符号推荐值说明波长 1λ₁589.0 nm钠黄双线短波波长 2λ₂589.6 nm钠黄双线长波板间距h2 mm太小则级次低双线分不开介质折射率n1.0空气腔简化处理反射率R0.90低于 0.8 条纹太粗透镜焦距f0.5 m决定环半径尺度观察屏半宽L5 mm保证能看到多级环这张表不是死规定但如果你第一次跑出来发现环太粗或者双线完全重合先回来检查 (R) 和 (h)。(R) 决定锐度(h) 决定级次和分裂程度这两个是最敏感的。3. 用 MATLAB 跑通第一版仿真从网格到干涉图3.1 建立观察屏坐标网格与相位差矩阵先写最核心的一段生成二维网格算每个点的相位差。这里用小角度近似 (\theta r/f)其中 (r\sqrt{x^2y^2})。注意 (x,y) 的单位要统一成米后面波长也用米避免量纲混乱。% 基本参数 lambda1 589e-9; % 波长1单位米 lambda2 589.6e-9; % 波长2单位米 h 2e-3; % 板间距2 mm n 1.0; % 空气腔 R 0.90; % 反射率 f 0.5; % 透镜焦距0.5 m L 5e-3; % 观察屏半宽5 mm N 1000; % 网格点数 % 坐标网格 x linspace(-L, L, N); y linspace(-L, L, N); [X, Y] meshgrid(x, y); r sqrt(X.^2 Y.^2); % 小角度近似下的相位差 theta r / f; delta1 4 * pi * n * h * cos(theta) / lambda1; delta2 4 * pi * n * h * cos(theta) / lambda2; % 精细度系数 F 4 * R / (1 - R)^2;这段代码里linspace生成等间距坐标meshgrid转成二维矩阵r是每个点到中心的距离。cos(theta)在小角度下接近 1但保留它能让边缘环的位置更准。F只算一次后面两个波长共用。注意如果你把h设成 0.2 mm级次降一个数量级双线分裂会明显减弱甚至看起来像单线。这不是代码错是物理规律。3.2 计算双线叠加强度并映射成灰度图有了相位差直接套强度公式。两条谱线分别算再按强度比叠加。这里简化为等强度如果你要更真实可以给第二条乘 0.5 左右的权重。% 单波长透射强度 I1 1 ./ (1 F * sin(delta1/2).^2); I2 1 ./ (1 F * sin(delta2/2).^2); % 双线叠加等强度 I_total I1 I2; I_total I_total / max(I_total(:)); % 归一化到 0~1 % 显示 figure; imagesc(x*1e3, y*1e3, I_total); colormap(gray); axis image; xlabel(x (mm)); ylabel(y (mm)); title(钠黄双线 F-P 干涉图R0.90, h2mm); colorbar;imagesc会自动把矩阵映射成图像axis image保证横纵比例一致不然圆环会被拉成椭圆。x*1e3是把米换成毫米方便读坐标。归一化那一步很重要否则双线叠加后最大值可能到 2显示时一片白。跑完这段你应该能看到中心亮斑、往外一圈圈细锐的环而且仔细看某些环上会有“双边缘”或“分裂”的痕迹。如果看不到分裂先把h调大或者把R调高再试。3.3 沿径向取一条线看双线到底分没分开图像有时候不够直观最可靠的办法是沿半径方向取一条强度曲线看峰值位置。这一步能帮你定量判断双线分裂程度。% 沿 x 轴取一条径向线 y0 0; [~, idx] min(abs(y - y0)); I_line I_total(idx, :); figure; plot(x*1e3, I_line, LineWidth, 1.2); xlabel(径向位置 (mm)); ylabel(归一化强度); title(径向强度分布y0); grid on;如果双线分开了你会看到每个干涉级次附近出现两个靠得很近的峰或者一个峰明显变宽、顶部有凹陷。峰间距和理论值对一下就能验证仿真是否可信。常见做法是拿中心附近第一级环来对比因为那里近似误差最小。提示min(abs(y - y0))是找最接近 y0 的行索引比直接写y0稳妥避免浮点误差导致找不到。4. 参数扫描与对比实验反射率、腔长、波长差各管什么4.1 反射率 R 从 0.5 扫到 0.98条纹锐度怎么变反射率是 F-P 干涉里最“玄学”的参数差 0.1 效果天差地别。写个循环把不同 R 下的径向曲线画在一起一眼就能看出规律。R_list [0.5, 0.7, 0.9, 0.95, 0.98]; figure; hold on; for R R_list F 4 * R / (1 - R)^2; I1 1 ./ (1 F * sin(delta1/2).^2); I2 1 ./ (1 F * sin(delta2/2).^2); I_tmp I1 I2; I_tmp I_tmp / max(I_tmp(:)); I_line I_tmp(idx, :); plot(x*1e3, I_line, DisplayName, [R num2str(R)]); end xlabel(径向位置 (mm)); ylabel(归一化强度); title(不同反射率下的径向强度); legend show; grid on;跑完你会发现R0.5 时峰很胖双线基本糊在一起R0.9 时峰变尖双线开始分离R0.98 时峰极窄双线分得很开但旁瓣也压得很低。这就是精细度 (F) 的直观体现。实际仿真里R 取 0.9 到 0.95 是比较平衡的选择既能看清分裂又不会因为峰太窄导致网格分辨率不够而漏峰。4.2 板间距 h 改变级次和分裂间距板间距直接决定干涉级次。h 越大级次越高同样的波长差对应的相位差越大双线分裂越明显。但 h 太大也有代价环会变得更密观察屏上可能挤满条纹反而不好分辨。h_list [0.5e-3, 1e-3, 2e-3, 4e-3]; figure; hold on; for h h_list delta1 4 * pi * n * h * cos(theta) / lambda1; delta2 4 * pi * n * h * cos(theta) / lambda2; F 4 * R / (1 - R)^2; I1 1 ./ (1 F * sin(delta1/2).^2); I2 1 ./ (1 F * sin(delta2/2).^2); I_tmp I1 I2; I_tmp I_tmp / max(I_tmp(:)); I_line I_tmp(idx, :); plot(x*1e3, I_line, DisplayName, [h num2str(h*1e3) mm]); end xlabel(径向位置 (mm)); ylabel(归一化强度); title(不同板间距下的径向强度); legend show; grid on;注意这里h在循环里被重新赋值delta1和delta2也要跟着重算。如果你只改h不重算相位曲线不会变这是新手常犯的错。跑完对比一下h0.5 mm 时双线几乎重合h4 mm 时分裂非常清楚但环也密了一倍。4.3 波长差与强度比对条纹对比度的影响钠黄双线的波长差是固定的但你可以改波长差做敏感性分析看看多小的波长差还能被 F-P 分辨。这在光谱测量里很有意义。dlambda_list [0.2e-9, 0.4e-9, 0.6e-9, 1.0e-9]; figure; hold on; for dlam dlambda_list lambda2 lambda1 dlam; delta1 4 * pi * n * h * cos(theta) / lambda1; delta2 4 * pi * n * h * cos(theta) / lambda2; F 4 * R / (1 - R)^2; I1 1 ./ (1 F * sin(delta1/2).^2); I2 1 ./ (1 F * sin(delta2/2).^2); I_tmp I1 I2; I_tmp I_tmp / max(I_tmp(:)); I_line I_tmp(idx, :); plot(x*1e3, I_line, DisplayName, [\Delta\lambda num2str(dlam*1e9) nm]); end xlabel(径向位置 (mm)); ylabel(归一化强度); title(不同波长差下的径向强度); legend show; grid on;结果很直观波长差越小双线越难分开直到完全重合。这个“刚好能分开”的阈值和 F-P 的精细度有关精细度越高能分辨的波长差越小。如果你在做光谱仪设计这个扫描就是选参数的依据。5. 避坑与排查仿真跑不出教材图时先查这 5 条5.1 环是椭圆或者被拉长现象图像里圆环变成椭圆或者横纵比例明显不对。 原因imagesc默认按矩阵索引显示没有强制等比例坐标。如果 x 和 y 的物理范围一样但矩阵点数不同或者忘了axis image就会拉伸。 解决加axis image并确保x和y用同样的linspace范围和点数。如果还是不对检查imagesc的坐标参数是不是x*1e3, y*1e3别把单位搞混。5.2 中心不是亮斑而是暗斑现象图中心一片黑第一圈亮环在外面。 原因相位差公式里cos(theta)在中心等于 1delta是 (4\pi n h/\lambda)。如果这个值刚好让sin(delta/2)接近 1中心就是暗的。这取决于h和lambda的具体组合不是代码错。 解决微调h或lambda让中心相位接近 (2m\pi)。或者接受这个结果因为实际 F-P 干涉图中心亮暗本来就取决于腔长调谐。教材图 4.7 的中心是亮斑说明那组参数刚好满足中心透射极大。5.3 双线完全重合看不到分裂现象径向曲线上每个级次只有一个峰没有双峰或展宽。 原因h太小导致级次低或者R太低导致峰太宽把分裂淹没了。 解决先把h调到 2 mm 以上再把R调到 0.9 以上。如果还不行检查lambda2是不是真的和lambda1差了 0.6 nm别写成 589.0 和 589.0。5.4 网格太粗导致漏掉细锐峰现象R 很高时径向曲线上的峰忽高忽低或者图像上环有断点。 原因N1000在 L5 mm 时空间分辨率是 10 μm。如果条纹间距小于这个值就会采样不足。 解决把N加到 2000 或 4000或者减小L只看中心区域。代价是内存和计算时间增加但现代机器跑 4000×4000 的矩阵没问题。5.5 强度归一化后对比度不对现象双线叠加后亮环和暗环的对比度比预期低。 原因两条谱线等强度叠加时暗环位置如果错开叠加后暗环会被填亮对比度下降。这是物理效应不是 bug。 解决如果你想看单波长对比度就单独画I1如果看双线合成效果就接受对比度下降。另外检查有没有误用I_total I1 I2后忘了归一化导致显示饱和。6. 进阶技巧用精确角度公式和动画验证双线分裂前面一直用小角度近似 (\theta \approx r/f)这在近轴没问题但如果你想看大角度环或者验证近似误差可以换成精确公式。精确情况下观察屏上一点对应出射角 (\theta_{out})腔内折射角由 Snell 定律决定。空气腔时 (n1)腔内角等于出射角所以 (\theta \arctan(r/f))。把cos(theta)换成cos(atan(r/f))就行。% 精确角度版本 theta_exact atan(r / f); delta1_exact 4 * pi * n * h * cos(theta_exact) / lambda1; delta2_exact 4 * pi * n * h * cos(theta_exact) / lambda2; F 4 * R / (1 - R)^2; I1e 1 ./ (1 F * sin(delta1_exact/2).^2); I2e 1 ./ (1 F * sin(delta2_exact/2).^2); I_exact I1e I2e; I_exact I_exact / max(I_exact(:)); figure; imagesc(x*1e3, y*1e3, I_exact); colormap(gray); axis image; xlabel(x (mm)); ylabel(y (mm)); title(精确角度下的钠黄双线 F-P 干涉图); colorbar;对比近似版和精确版你会发现中心区域几乎一样边缘环的位置略有偏移。这个偏移量就是近似的误差L/f 越小误差越小。我一般先用近似版快速调参确认效果后再用精确版出图。另一个实用技巧是做动画把h从 1 mm 连续调到 3 mm看双线分裂怎么从无到有、从窄到宽。这能帮你直观理解“级次调谐”对干涉图的影响。figure; for h linspace(1e-3, 3e-3, 50) delta1 4 * pi * n * h * cos(theta) / lambda1; delta2 4 * pi * n * h * cos(theta) / lambda2; F 4 * R / (1 - R)^2; I1 1 ./ (1 F * sin(delta1/2).^2); I2 1 ./ (1 F * sin(delta2/2).^2); I_tmp I1 I2; I_tmp I_tmp / max(I_tmp(:)); imagesc(x*1e3, y*1e3, I_tmp); colormap(gray); axis image; title([h num2str(h*1e3, %.2f) mm]); drawnow; end这段动画跑起来你能看到环从稀疏变密集双线从重合到分裂。drawnow是刷新窗口的关键少了它 MATLAB 会攒到最后一次性画出来。帧数 50 是我试过比较流畅的值太多会卡太少跳跃感强。最后说个血泪经验别一上来就追求高分辨率大图先用 N500、L3 mm 跑通逻辑确认双线分裂出现了再逐步加 N 和 L。我见过太多人卡在“为什么我的图全白”结果是因为 N5000 导致内存爆了MATLAB 默默返回空矩阵。仿真这事先跑通再优化比一步到位靠谱得多。希望帮到你。本文还有配套的精品资源点击获取