MATLAB复现多光束干涉透射条纹:从爱里函数到F-P腔精细度

发布时间:2026/10/14 20:10:16
MATLAB复现多光束干涉透射条纹:从爱里函数到F-P腔精细度
简介面向物理光学、光电信息科学与工程等方向的学习者与研究者这份 Matlab 多光束干涉仿真资源用于绘制不同反射率下透射光条纹的强度分布曲线可对照物理光学教材图 4.3 理解干涉理论。zip 压缩包共 4 个文件、约 77KB依次包含 1 个 m 脚本、1 张 jpg 结果图、1 份 docx 分析文档和 1 份 txt 使用说明脚本负责设置波长、入射角、折射率与反射率等参数并完成干涉场计算图像直观展示条纹分布文档进一步解读条纹间距与对比度变化整体便于按模块复现。已有 1596 人学习下载可作为物理光学课程实验、毕业设计或自学复现经典图样的入门参考。通过调节反射率可观察透射光条纹的明暗、间距与相位变化既能验证教科书结论也能为多层薄膜、非均匀介质等扩展仿真提供基础。1. 这个仿真到底在复现什么先看懂图4.3的数值规律第一次在 MATLAB 里复现物理光学教材图 4.3 的多光束干涉透射光条纹强度分布曲线时我犯过一个想当然的错误反射率越高透射光的峰值应该越低——毕竟腔镜把光“挡”住了。真正画出来才发现理想无吸收腔里反射率从 0.04 一路拉到 0.87透射峰值的 I_t/I_0 始终接近 1变化的只有条纹宽度低反射率曲线又胖又平高反射率曲线尖得像刀片。这张图正是多光束干涉与双光束干涉最本质的区别也是法布里-珀罗腔设计里带宽、精细度指标的起点。这篇笔记从爱里函数公式开始给出可直接运行的 MATLAB 脚本、参数校准表和仿真里的具体坑。适合做光学课程仿真、F-P 干涉仪实验预处理或只是想搞懂这张经典曲线的人。2. 多光束干涉透射强度公式爱里函数与两项关键参数的取值逻辑2.1 从多次反射求和到透射率公式T 与 δ 的关系多光束干涉的物理图像比双光束复杂光进入两片平行腔镜后在腔内来回反射每次透射出去一束光最终探测器上接收到的是无穷多束透射光的相干叠加。设两镜面的强度反射率都为 R振幅反射率为 r满足 R r²腔长为 h腔内介质折射率为 n入射角为 θ。相邻两束透射光之间的相位差为δ 4π n h cosθ / λ这里 δ 用的是“往返相位差”也就是光在腔内走一个来回产生的相位延迟。对透射复振幅做几何级数求和可以得到透射强度比I_t / I_0 (1-R)² / [(1-R)² 4R sin²(δ/2)]分子分母同除 (1-R)²就变成更常见、也更适合写代码的形式T 1 / [1 F sin²(δ/2)]其中 F 4R / (1-R)²这个 F 是爱里函数里的锐度系数它决定条纹的尖锐程度。先不管整条曲线单点验证公式是必要的在 MATLAB 里直接算两个特征点R 0.87; F 4*R / (1-R)^2; delta_peak 2*pi; % 相长干涉位置 T_peak 1 / (1 F * sin(delta_peak/2)^2) % 理想情况应为 1 delta_valley pi; % 相消干涉位置 T_valley 1 / (1 F * sin(delta_valley/2)^2) % 谷值 1/(1F)这段代码验证了两个关键结论峰值处 sin²(δ/2)0T1说明理想无吸收腔的透射峰不会被反射率压低谷值处 sin²(δ/2)1T1/(1F)反射率越高谷值越接近 0。公式里我们暂不考虑镜面吸收和散射这两类损耗会把峰值从 1 拉低后面的避坑章节会专门讨论。2.2 不同反射率 R 如何改变条纹形状先看对比度再看半宽把几组典型反射率代入上面两个特征点可以直观看到 R 对曲线形态的影响。物理光学教材里这张图最常用的几组取值是 0.04、0.27、0.64、0.87它们覆盖了从“几乎看不出条纹”到“尖锐如刀”的完整过渡。RF 4R/(1-R)²谷值 T_min 1/(1F)半宽 Δδ (rad)精细度 ℱ 2π/Δδ0.040.170.8524.801.310.272.030.3301.404.470.6419.80.0480.4514.00.872060.00480.13945.1注意表里的 R 是强度反射率。如果教材或镜片参数给的是振幅反射率 r必须先换算成 R r²。表里的半宽是透射峰两侧半高点之间的相位差全宽近似公式为 Δδ ≈ (1-R)/√R后面验证章节会用它核对仿真曲线。除半宽外条纹的明暗对比也值得量化对比度 C T_max / T_min 1F可见度 V (C-1)/(C1) F/(F2)。R0.04 时可见度只有 0.08条纹几乎融进背景R0.87 时可见度约 0.99背景接近全黑峰值尖锐且完整。这里有一个反直觉的点值得展开为什么反射率提高了透射峰却没有变矮因为相长干涉位置 δ2mπ 上所有透射子波同相叠加理想无吸收情况下能量守恒要求透射峰必须到达入射光强反射率改变的只是“偏离相长位置时强度跌落的速度”。这正是多光束干涉与双光束干涉的最大区别双光束干涉条纹是余弦形峰宽永远和条纹周期同数量级而多光束干涉靠高反射率把能量压缩到极窄的相位区间里。2.3 横轴到底画什么相位差、光程差与自由光谱范围的对应关系教材图 4.3 的横轴标注在不同版本里并不统一常见的有三种往返相位差 δ、单程相位差 φ、光程差 Δ。三者本质是同一个物理量差一个常数倍写脚本前必须先确认自己用的是哪一种否则峰值间隔会差出一倍甚至更多。横轴变量与 δ 的关系相邻峰间隔往返相位差 δδ 4πnh cosθ/λ2π单程相位差 φφ 2πnh cosθ/λ δ/2π光程差 Δ 2nh cosθδ 2πΔ/λλ我的习惯是统一用 δ 作为横轴因为自由光谱范围 FSR 在 δ 域正好是 2π半宽、精细度的公式也都是按 δ 写的。若只想贴近教材的单峰图横轴取 0 到 2π 即可想同时看到相邻两个峰并标注周期取 0 到 4π。脚本里我会把 xlim 写在显眼位置方便切换。3. 用 MATLAB 复现不同反射率下的透射光强曲线最小脚本与教材版式3.1 能跑通的最小脚本一条爱里函数画完第一种反射率整张图的核心计算只有一行T 1 ./ (1 F * sin(delta/2).^2)。其余全是坐标、采样和样式问题。下面是最小可运行版本复制到 MATLAB 编辑器里直接执行就能看到 R0.27 的透射光强分布% 多光束干涉透射光强单条曲线最小脚本 delta linspace(0, 4*pi, 4001); % 相位差范围两个自由光谱范围 R 0.27; % 强度反射率 F 4*R / (1-R)^2; % 锐度系数 T 1 ./ (1 F * sin(delta/2).^2); % 爱里函数 plot(delta, T, b-, LineWidth, 1.5); xlabel(相位差 \delta (rad)); ylabel(透射强度比 I_t/I_0); grid on;这里有几个细节值得说明。第一delta 是行向量sin(delta/2) 也是向量所以除法必须用点除./平方必须用.^2否则 MATLAB 会把它当成矩阵运算直接报维度错误。第二4001 个点不是随手写的R0.87 时峰值半宽只有 0.139 rad整段 4π 范围内取 4001 点采样间隔约 0.00314 rad峰值半宽内能落到约 44 个点画出来才光滑。第三R0.27 是刻意选的中间档单看一条曲线时既有明显的明暗变化又不需要太高的采样密度适合先跑通流程。跑完这段脚本你可以把 R 改成 0.87 再看会发现曲线中段几乎贴到 0只在 δ0、2π、4π 三个位置突然竖起尖峰。这就是高反射率多光束干涉的典型形貌。3.2 多曲线对照与教材版式四组反射率叠在一张图教材图 4.3 通常是多条曲线叠在一张图里用不同线型区分反射率。下面这个脚本用循环画出四组反射率并设置坐标刻度、图例和线型打印出来也不至于混淆delta linspace(0, 4*pi, 4001); R_list [0.04 0.27 0.64 0.87]; linestyle {r-, b--, g-., k:}; figure(Color, w, Position, [80 80 760 480]); hold on; for k 1:length(R_list) R R_list(k); F 4*R / (1-R)^2; T 1 ./ (1 F * sin(delta/2).^2); plot(delta, T, linestyle{k}, LineWidth, 1.5); end xlim([0 4*pi]); xticks(0:pi/2:4*pi); xticklabels({0,\pi/2,\pi,3\pi/2,2\pi,5\pi/2,3\pi,7\pi/2,4\pi}); legend(arrayfun((r) sprintf(R%.2f, r), R_list, ... UniformOutput, false), Location, northeast); xlabel(相位差 \delta (rad)); ylabel(透射强度比 I_t/I_0); set(gca, FontSize, 11); grid on;循环里每次重新计算 F 和 T再以不同线型画到同一张图上。arrayfun 配合 sprintf 自动生成图例文本比手动写四个 legend 条目省事得多。xticks 和 xticklabels 让横轴显示为 π 的倍数这是物理光学图里最标准的刻度方式比显示 0、1、2… 更直观。如果只想复现教材里单峰的那张图把 xlim 改成 [0 2*pi] 即可纵轴范围不用动四条曲线的峰值依然都在 1 附近。3.3 采样点数怎么定先算半宽再写 linspace采样点不足是复现这张图最常见的翻车点尤其是高反射率那条曲线。R0.87 时半宽约 0.139 rad如果整段 4π 只取 101 个点采样间隔约 0.125 rad比半宽还大峰值附近完全采不到真实形状画出来要么是削平的山丘要么是锯齿。把两种采样密度放在同一个图里对比问题一目了然R 0.87; F 4*R / (1-R)^2; delta_coarse linspace(0, 4*pi, 101); delta_fine linspace(0, 4*pi, 4001); T_coarse 1 ./ (1 F * sin(delta_coarse/2).^2); T_fine 1 ./ (1 F * sin(delta_fine/2).^2); subplot(2, 1, 1); plot(delta_coarse, T_coarse); title(101 点峰值被削平曲线成锯齿); subplot(2, 1, 2); plot(delta_fine, T_fine); title(4001 点峰形完整);通用原则是采样间隔至少小于半宽的十分之一。先用近似公式 Δδ ≈ (1-R)/√R 估算半宽再决定 linspace 的点数比盲目取几千点更靠谱。R0.87 半宽 0.139 rad间隔取 0.014 rad 以下才能保证峰形平滑R0.04 半宽 4.8 rad间隔取 0.1 rad 都绰绰有余。对采样密度要求极高时也可以只在峰值附近加密先用粗网格找峰位再用 linspace(2π-0.1, 2π0.1, 2000) 局部加密最后拼接数组。这个技巧在 R 接近 0.95 以后非常实用。4. 参数数量级校准反射率、半宽度、精细度怎么对齐原图4.1 反射率取值怎么选从 0.04 到 0.87 拉开三个数量级画这张图时反射率取值不是随手写的。教材图 4.3 之所以常选 0.04、0.27、0.87 这组数是因为对应的锐度系数 F 从 0.17 跳到 206跨越了三个数量级曲线形态差异一目了然。如果取值太接近比如 0.85 和 0.87画出来的两条尖峰几乎重合图例都分不清如果全部取低反射率比如 0.02、0.04、0.06则所有曲线都胖乎乎地堆在一起完全体现不出多光束干涉“变尖锐”的核心特征。我一般会这样选值低档取 0.04 或 0.05表现接近双光束干涉的余弦形条纹中档取 0.27 或 0.3表现条纹开始变窄但仍能看到明显背景高档取 0.87 或 0.9表现接近理想 F-P 腔的尖锐峰值。需要提醒的是R0.9 以上时峰值半宽已经小于 0.06 rad采样和数值误差都会被放大所以前几轮调试先用 0.87 而不是 0.95。另外如果教材的图是用振幅反射率 r 标注的记得先把 r² 换算成 R 再代入公式。比如 r0.93 对应 R≈0.865直接拿 0.93 当 R 用画出来的条纹会明显偏宽。4.2 半宽度与精细度用数值法验证曲线参数画完曲线不能只看“像不像”还要用数值验证半宽和精细度是否和理论对得上。下面这段脚本在 δ2π 附近找到透射率降到 0.5 的两个交点用线性插值求出准确位置再和近似公式对比R 0.87; F 4*R / (1-R)^2; delta linspace(0, 4*pi, 10001); T 1 ./ (1 F * sin(delta/2).^2); % 只看 2*pi 附近的峰避免把相邻峰算进来 mask (delta 2*pi - 0.5) (delta 2*pi 0.5); dm delta(mask); Tm T(mask); % 上升沿从 0.5 变到 0.5下降沿从 0.5 变到 0.5 idx_up find(Tm(2:end) 0.5 Tm(1:end-1) 0.5); idx_dn find(Tm(2:end) 0.5 Tm(1:end-1) 0.5); cross_up dm(idx_up(1)) ... (0.5 - Tm(idx_up(1))) * (dm(idx_up(1)1) - dm(idx_up(1))) / ... (Tm(idx_up(1)1) - Tm(idx_up(1))); cross_dn dm(idx_dn(1)) ... (0.5 - Tm(idx_dn(1))) * (dm(idx_dn(1)1) - dm(idx_dn(1))) / ... (Tm(idx_dn(1)1) - Tm(idx_dn(1))); fwhm_num cross_dn - cross_up; fwhm_approx (1 - R) / sqrt(R); fprintf(数值半宽 %.4f rad\n, fwhm_num); fprintf(近似半宽 %.4f rad\n, fwhm_approx);对 R0.87两者应该都约等于 0.139 rad误差在 1% 以内。如果数值法和近似公式对不上先查两件事一是 mask 范围是否包含了完整半峰二是采样间隔是否足够小。近似公式的推导思路是峰值半高处有 F sin²(δ/2)1小角度近似下 δ/2 ≈ 1/√F (1-R)/(2√R)全宽就是 (1-R)/√R。注意这是“全宽”有些教材写的是“半宽度”的单侧值会差一倍对照时先确认定义。4.3 从仿真曲线看 F-P 腔设计带宽、精细度和使用边界仿真做出来不只是为了交差这张曲线直接对应 F-P 腔的两个关键指标。自由光谱范围 FSR 在 δ 域固定为 2π3dB 带宽就是 FSR/ℱ 2π/(2π/Δδ) Δδ ≈ (1-R)/√R。想压窄滤波器带宽就提高反射率 R精细度 ℱ π√R/(1-R) 在 R0.87 时约 45到 R0.95 时约 61R0.99 时约 313。看起来 R 越高越好但代价是腔镜对平行度、平面度和波长稳定性极其敏感微小腔长误差造成不同位置的 δ 不一致高 R 下透射率随 δ 的变化率极大宏观看到的效果就是条纹对比度下降、峰值变矮。所以做工程选型时我一般先用这张仿真曲线确认目标带宽对应的 R 范围再回头查镜片参数能否达到。5. 复现图 4.3 最容易翻车的五个坑从平顶锯齿到公式少因子这一章写的是我和身边同学复现这张图时集体踩过的坑。有意思的是问题几乎都不在多光束干涉物理本身而在参数习惯和 MATLAB 细节上。每一条都按现象、原因、解决三部分记录照着核对能省下不少排查时间。5.1 峰值高度随反射率“长高”公式里少了 (1-R)² 因子现象四条曲线画出来反射率越高峰值越矮R0.87 的峰值甚至只有 0.7 左右和教材图完全对不上。原因把透射复振幅公式里的单次透射强度因子写错了。如果直接用 E_t t²E_0/(1-r²e^{iδ}) 再取模t 是振幅透射系数t²1-R 要取平方后代入强度即分子是 (1-R)²只乘一个 (1-R) 或直接拿 R 当 r 用都会让峰值被压低。解决回到最稳的强度公式 T 1/(1F sin²(δ/2))这个形式里已经约掉了分子分母的公共因子不容易错。画图后养成检查习惯δ2π 处打印 T应严格等于 1。5.2 高反射率曲线平顶锯齿采样点数与半宽不匹配现象R0.87 的尖峰变成梯形峰顶是平的或锯齿状峰值明显低于 1而 R0.04 的曲线很光滑。原因整段 4π 范围采样点数太少采样间隔大于峰值半宽。101 个点画 4π间隔约 0.125 radR0.87 的半宽才 0.139 rad相当于整个尖峰只落进一两个采样点里当然画不出真实形状。解决先用近似公式 Δδ ≈ (1-R)/√R 算出半宽再保证采样间隔至少小于半宽的十分之一。R0.87 时取 4001 点足够R0.95 以上建议用局部加密或直接上 20001 点。5.3 强度反射率当成振幅反射率用整组曲线宽度全偏现象按教材给的反射率数值画图所有曲线都比原图宽尤其是高反射率那条本该尖锐的峰明显发胖。原因教材或镜片规格书给的是振幅反射率 r而公式里的 R 是强度反射率两者关系是 Rr²。比如 r0.27 时 R 只有 0.0729锐度系数 F 从 2.03 掉到约 0.34曲线自然宽得多。解决脚本开头统一写一行 R r^2或者直接规定变量名 R 只能存强度反射率并在注释里标清楚。这个坑特别隐蔽因为“反射率”三个字在口语里经常混用一不留神就带偏整张图。5.4 相位差定义差一倍峰值间距对不上教科书现象自己画的曲线峰值间隔是 π教材图里是 2π或者反过来。原因把单程相位差 φ2πnh cosθ/λ 当成了公式里的 δ。爱里函数中的 δ 是往返相位差 4πnh cosθ/λ两者差一倍。有的资料把横轴标成 φ那么透射峰出现在 φ0, π, 2π…有的资料直接标 δ峰在 δ0, 2π, 4π…。解决先确认公式和横轴用的是同一个定义再检查峰值间隔。最笨也最可靠的方法是在 δ0、2π、4π 三个位置打印 T如果都等于 1 就说明定义一致。5.5 有损耗腔硬套无损耗公式峰值和谷值同时被抬高或压低现象实验测得的透射曲线峰值到不了 1谷值也比理论值高整条曲线整体下压。原因真实腔镜存在吸收和散射光每次往返都有能量损失理想无吸收公式 T 1/(1F sin²) 不再严格成立。直接调大 R 也不能模拟损耗加大 R 只会让峰值更尖不会把峰值从 1 拉低。解决先按无损耗模型校准 R 和 δ再在整体上乘一个强度系数 η写成 T η / (1F sin²(δ/2))。η 由单程透过率和镜面吸收决定工程上通常用实测峰值反推。处理实验数据时先做这一步再谈半宽拟合。6. 验证与进阶曲线画得像不算数数值要对得上6.1 画完先做三个检查峰值、谷值和半宽每次跑完脚本我都按固定顺序做三个数值检查全部通过才认为这张图画对了。第一峰值δ2π 处 T 应等于 1无损耗第二谷值δπ 处 T 应等于 1/(1F)第三半宽用第 4.2 节的数值法算出来与近似公式 (1-R)/√R 对比误差应在 1% 左右。三个检查可以塞进同一个脚本末尾T_peak 1 / (1 F * sin(2*pi/2)^2); % 应为 1 T_valley 1 / (1 F * sin(pi/2)^2); % 应为 1/(1F) fprintf(峰值 %.4f谷值 %.4f\n, T_peak, T_valley);6.2 进阶技巧从谷值反推反射率 R这张曲线图不只是理论作业还能反过来当测量工具用。如果实验得到一条 F-P 透射曲线读出谷值 T_min就能反推腔镜的强度反射率完全不需要知道腔长和波长。推导过程很简单T_min 1/(1F)所以 F 1/T_min - 1再解 F 4R/(1-R)² 这个二次方程取小于 1 的根T_min 0.048; % 从实测曲线读出的谷值 f 1/T_min - 1; % 锐度系数 u 2 4/f; R_est (u - sqrt(u^2 - 4)) / 2; fprintf(估计反射率 R %.3f\n, R_est);T_min0.048 时输出 R≈0.64和理论值对得上。这个方法对低反射率尤其敏感R0.04 的谷值是 0.852T_min 很小的测量误差就会让 R 估计偏出几个百分点而 R0.87 的谷值只有 0.0048动态范围大测量相对更稳。做实验数据处理时我通常先用这张图确定 R 的数量级再决定要不要用更精密的半宽拟合法。我最早画这张图时就是在第三节那个坑里折腾了大半个晚上R0.87 的曲线被 101 个点削成平顶我还以为是公式问题翻来覆去检查推导。后来养成了习惯凡是画这种窄峰曲线先按半宽估算采样间隔再写 linspace这个习惯救了我很多次。希望帮到你。本文还有配套的精品资源点击获取