多光束干涉透射条纹的MATLAB仿真:从爱里函数到反射率与精细度 简介面向物理光学与光电信息类专业学习者的Matlab光学仿真资源包围绕多光束干涉中不同反射率对透射光条纹强度分布的影响展开可复现教材图4.3所示曲线适合课程实验与理论验证。压缩包共4个文件、约77KB包含Matlab脚本、条纹模拟图像、分析文档与说明文本脚本基于菲涅尔公式计算各光束的反射透射并叠加光场文档则对条纹间距、对比度变化作了解读。已有1596人学习下载。借助脚本可自由调整反射率等参数并即时观察透射强度分布变化配合图像和分析笔记能够帮助快速掌握多光束干涉仿真思路并可作为后续拓展多层薄膜、非均匀介质干涉实验的起点。1. 多光束干涉透射条纹为什么反射率越高亮纹反而越细做光学仿真的人大概率在 MATLAB 里反复画过那条多光束干涉的透射条纹曲线族横轴是相位差纵轴是透射强度比一组曲线对应不同反射率。第一次看到图的人通常会愣一下——反射率越高透射条纹的亮纹峰值居然始终是 1而背景却被压得越来越低亮纹本身也越来越细。直觉会说反射率高了光都被挡回去了峰值透射应该下降才对。这个反直觉的结论恰恰是多光束干涉最核心的机制也是物理光学教材里那幅「图 4.3」想讲清楚的东西。理解它等于理解法布里-珀罗干涉仪的分辨率极限不理解它后续看精细度、自由光谱范围、激光选模全都会像隔着一层雾。2. 从双光束到多光束透射光强分布是怎么一步步长出来的2.1 先看双光束透射光为什么会变成余弦明暗要理解多光束先退回到两束光。平行平板两个表面各反射一次、各透射一次如果只考虑前两束透射光它们的相位差来自光程差。设平板厚度为 d折射率为 n入射角为 θ则相邻两束透射光之间的光程差是 2nd·cosθ对应的相位差为δ 4πnd·cosθ / λ两束光叠加透射强度是 I I₁ I₂ 2√(I₁I₂)·cosδ简化后得到 I_t/I_0 1 - R·(1 - cosδ) 一类的余弦分布。这条曲线是典型的「亮背景上的暗纹」透射光大部分时候都很亮只有相位差接近 π 的奇数倍时才变暗对比度取决于反射率 R但条纹永远不可能变得很尖锐。双光束的问题在于它只取了透射序列的前两束丢失了第三束、第四束以及更后面所有透射光的信息。实际上一束光进入平行平板后会在两个界面之间来回反射无数次每次反射都漏出一束透射光。这些透射光全部相干叠加才是真正的物理过程。所谓「多光束干涉」本质上就是不再截断这个无限序列。2.2 多光束叠加振幅递推与几何级数求和设入射振幅为 E₀两个界面的反射率为 r透射率为 t这里 r、t 是振幅系数不是强度。第一束透射光的振幅是 E₀·t₁t₂第二束是 E₀·t₁t₂·r₁r₂·e^{iδ}第三束再乘一个 (r₁r₂)·e^{iδ}……于是第 m 束透射光的振幅可以写成E_m E₀·t₁t₂·(r₁r₂)^{m-1}·e^{i(m-1)δ}所有透射光在无穷远或透镜焦平面上相干叠加总复振幅是一个公比为 re^{iδ} 的几何级数。只要 |r| 1级数就收敛E_t E₀·t₁t₂ / (1 - r₁r₂·e^{iδ})取强度并假设两个界面完全对称r₁r₂ Rt₁t₂ T再把能量守恒 T 1 - R 代进去整理后得到著名的爱里函数I_t / I_0 1 / (1 F·sin²(δ/2))其中 F 4R / (1 - R)²称为锐度系数。这个公式所有物理光学教材都有但它的来历值得多看一眼几何级数求和只依赖一个前提——反射率不为 1即级数收敛。也就是说哪怕 R 0.99只要腔不吸收无穷多次反射的透射光叠加后峰值依然可以回到 1。能量没有消失只是被「时间上的多次往返」重新分配到了很窄的相位区间里。2.3 锐度系数 F 与反射率 R 的关系爱里函数的分母里sin²(δ/2) 前面的系数 F 才是条纹形态的真正控制者。当 R 很小比如 0.04 时F ≈ 0.17sin² 项的权重很小分母随 δ 的变化平缓透射曲线接近一条余弦模样的宽条纹。当 R 增大到 0.9F 360sin² 项只要稍稍偏离零点分母就会迅速变大透射强度快速跌落。于是条纹从「宽胖」变成「细锐」而峰值因为 sin²(δ/2) 0 处分母恰好为 1始终等于 1。我一般会这么理解F 放大的是相位偏离的「惩罚力度」。反射率越高光在腔内往返的次数越多等效的参与相干叠加的波前数量越大对相位失配的容忍度就越低。这正是多光束干涉和双光束干涉的本质区别——双光束只有一次相位比较多光束是几十上百次相位比较的累积。3. MATLAB 仿真实现把公式变成一张可操作的图3.1 参数与网格从物理量到 δ 向量的映射仿真第一步不是写公式而是把物理量映射成计算网格。多光束干涉的透射强度是相位差 δ 的周期函数周期为 2π。但实际画图时很多人会扫一个完整的自由光谱范围也就是 δ 从 0 到 4π确保能同时看到两个相邻透射峰。网格点数建议取几千量级因为高反射率下条纹极窄R 0.95 时半宽度只有 0.03π 左右如果网格只有几百点峰值很容易被「漏过去」画出来锯齿感严重。横轴可以直接用 δ/π这样峰位恰好落在 0、2、4 这些整数上方便对照教科书曲线。纵轴用透射强度比 I_t/I_0按爱里函数计算时天然归一化不需要额外缩放。仿真中真正要改的参数只有反射率 R其他物理量——腔长、波长、折射率——都浓缩在 δ 的定义里绘图时不需要显式写出来。3.2 主仿真脚本矩阵化计算与绘图下面这段代码是画「不同反射率下透射光条纹强度分布曲线族」的核心逻辑直接对应教材图 4.3 的目标% 参数设定相位差网格单位 pi覆盖两个自由光谱范围 delta linspace(0, 4*pi, 4001); delta_pi delta / pi; % 以 pi 为单位便于绘图 % 反射率序列从低到高覆盖教材典型取值 R [0.04, 0.2, 0.5, 0.8, 0.9, 0.95]; % 锐度系数 F 4R / (1-R)^2 F 4 * R ./ (1 - R).^2; % 核心计算公式T 1 / (1 F * sin^2(delta/2)) % 利用隐式扩展F(:) 作为列向量sin^2 作为行向量生成矩阵 T 1 ./ (1 F(:) .* sin(delta/2).^2); % 绘图 figure; plot(delta_pi, T., LineWidth, 1.5); xlabel(\delta / \pi); ylabel(透射强度比 I_t / I_0); legend(arrayfun((r) sprintf(R %.2f, r), R, UniformOutput, false), Location, north); grid on; xlim([0 4]);这段代码的关键在矩阵化计算F(:) 是 6×1 的列向量sin(delta/2).^2 是 1×4001 的行向量两者相乘得到 6×4001 的透射率矩阵每一行对应一个反射率。这是 MATLAB R2016b 之后默认开启的隐式扩展老版本环境需要改用 bsxfun 或 meshgrid否则会报维度不匹配。plot 传入矩阵 T 的转置一次调用就能画出所有曲线曲线数量由 R 的长度决定不需要手动循环。3.3 半宽度与精细度的数值验证光看图不够最好把「条纹确实变细了」这件事量化成数值。半宽度FWHM可以从仿真数据里直接提取对某条曲线取峰值的一半做阈值找到左右两个穿越点它们的横坐标差就是半宽度。代码实现起来很直接% 取 R 0.9 这条曲线验证半宽度 T_high T(ismember(R, 0.9), :); % 提取对应曲线 half_max max(T_high) / 2; above_idx find(T_high half_max); % 高于半峰值的所有点 fwhm_pi delta_pi(above_idx(end)) - delta_pi(above_idx(1));实际运行时你会发现R 0.9 的 FWHM 大约是 0.067π而 R 0.04 的曲线在半个周期内都维持在较高水平所谓的「半宽」已经超过周期本身没有意义。这说明半宽度这个指标只在条纹足够锐利时才有明确的物理含义低反射率区间更适合用对比度来描述。数值提取的结果还能反过来验证爱里函数的解析近似——大 R 条件下 FWHM ≈ 4/√F两者误差在网格足够密时小于 1%。4. 反射率 R 如何塑造条纹锐度、半宽度与自由光谱范围4.1 从对比度到半宽度条纹锐度的量化条纹的「锐」有两个层面对比度和半宽度。双光束干涉的条纹对比度由反射率决定但对比度再高条纹轮廓还是余弦型的峰值和谷值之间是平滑过渡。多光束干涉则不同高反射率下条纹变成「针状」峰值两边快速跌落背景趋近于零。用对比度公式 (I_max - I_min) / (I_max I_min) 看多光束干涉任何反射率下对比度都是 1因为 I_min 1/(1F) 永远小于 1这没法区分不同反射率真正能区分条纹形态的是半宽度。半宽度的解析近似来自爱里函数在峰值附近的泰勒展开。令 T 1/2 求 δ 的偏移量小角度近似下 sin(δ/2) ≈ δ/2解得 δ_half 2/√F于是 FWHM ≈ 4/√F。这个近似只在 F 较大R 接近 1时成立但它把「反射率如何决定条纹宽度」这件事量化得非常漂亮半宽度反比于 √F而 F 又按 (1-R)⁻² 增长。也就是说R 从 0.9 提到 0.99F 翻了约 100 倍半宽度缩到原来的十分之一。4.2 自由光谱范围与精细度自由光谱范围FSR是相邻两个透射峰之间的相位差间隔对于平行平板结构就是 2π。仿真图里你看到的每一条峰之间间隔相同与反射率无关反射率改变的只是峰的形状不是峰的位置。这一点在对照教材图 4.3 时特别重要低反射率的宽曲线和高反射率的尖峰应该「长在」完全相同的位置上任何横轴偏移都是实现错误。精细度被定义为 FSR 与 FWHM 之比是衡量干涉仪分辨能力的核心指标。结合上面的近似公式精细度 ≈ π√F / 2 π√R / (1 - R)从这个表达式可以直观地看出精细度几乎完全由反射率主导。R 0.5 时精细度只有个位数R 0.95 时精细度已经超过 60R 0.99 时逼近 300。很多教科书把精细度称为「条纹的锐度」本质上和爱里函数的 F 是同一个物理内容的两面表达。4.3 R、F、半宽度对照表仿真做完后把不同反射率下提取的数值放在一起能更直观看到规律。以下数据来自 4001 点网格、δ 覆盖 0 到 4π 的 MATLAB 仿真半宽度以 π 为单位反射率 R锐度系数 FFWHM×π精细度约0.040.17 2不适用0.21.251.141.80.58.000.454.40.880.00.1414.10.93600.06729.60.9515200.03361.2注意 R 0.04 那一行半宽度超过了周期说明条纹在自由光谱范围内根本没有降到半峰值以下低反射率区间的条纹形态用「宽背景上的微扰」来描述更合适。这也解释了为什么光学仿真里很少有人关注极低反射率下的多光束效应——此时多光束叠加几乎退化为双光束干涉爱里函数里的 sin² 项权重太小曲线长得像余弦。4.4 透射峰恒为 1无吸收假设的边界仿真图上还有一个容易被忽略的细节无论 R 多大峰值永远等于 1。这个结果来自推导时使用的能量守恒 T 1 - R它假设界面上完全没有吸收和散射。实际镀膜镜片不可能做到零损耗反射率越高的镀膜往往吸收也越明显。一旦引入吸收系数 A能量守恒变为 T R A 1峰值透射率变成 T/(1-R)² 的形式严格小于 1。仿真中如果想模拟真实腔镜需要在爱里函数里把 T 和 R 作为独立参数分开设置而不是用 1 - R 直接代换。很多初学者在 MATLAB 里把 R 0.95 的曲线整体压低到 0.5就是把真实损耗混进了理想模型。5. 常见问题排查仿真曲线偏离理想图 4.3 的五个坑5.1 峰值到不了 1无吸收假设被额外修正破坏现象画出来的曲线形态和教材一致但所有峰高都只有 0.8、0.6甚至更低。原因在公式里额外乘了一个 (1 - R) 因子或者把强度反射率 R 直接当成了能量损失率认为反射率越高透射必然越弱于是「手动」压低了曲线。解决回到推导起点确认使用的是 I_t/I_0 1/(1 F·sin²(δ/2))不添加任何额外系数。峰值处 sin²(δ/2) 0分母为 1透射比必然为 1。如果确实要模拟镀膜吸收单独定义 T 和 A 参数不要动理想公式的结构。5.2 条纹宽窄不对δ 范围、网格数与单位的锅现象高反射率曲线看起来不够尖或者低反射率曲线抖动得像噪声。原因δ 网格只扫了 0 到 2π只有半个自由光谱范围或者网格点太少R 0.9 时半宽度只有 0.067π4001 点网格每个点间隔约 0.001π足够采样但 200 点的网格每个点间隔 0.01π峰形被严重抹平。解决δ 至少扫 0 到 4π网格点不低于 2000高反射率对比尽量提高到 4000 以上。横轴统一用 δ/π峰位落在整数上这样也方便检查周期是否正确。5.3 峰顶锯齿或 NaN浮点误差被锐度系数放大现象峰顶出现肉眼可见的锯齿某些反射率下甚至出现 NaN 或 Inf。原因R 取到 0.99 以上时 F 超过 10000sin²(δ/2) 在零点附近的微小浮点误差乘以巨大 F 后分母在 1 附近剧烈抖动如果 R 被设成 1F 变成 Inf整条曲线全 NaN。解决检查 R 是否严格小于 1用 double 精度计算时在 δ/2 接近 π 的整数倍处sin 的计算误差是不可避免的这时可以给 delta 加一个极小偏移扰动比如 delta delta 1e-12绕过奇点。5.4 反射率与透过率混淆R 和 T 的物理含义错位现象曲线形状正确但仔细观察低反射率曲线对比度明显偏大或偏小。原因在计算 F 时误把透过率 T 当成反射率 R 代进去或者因为 T 1 - R 就认为「高透射对应高反射」而把 1 - R 当作 R 用。破解方法记住 F 4R/(1 - R)² 里的 R 是强度反射率镀膜参数写的是反射率还是透过率要看清楚如果你手上的数据是「透过率 95%」对应的 R 是 0.05代入 F 后得到的条纹几乎和双光束一样宽这是符合物理的。5.5 图例与曲线顺序错乱常见低级但隐蔽的绘图失误现象曲线都能画出来但线型、颜色和 R 的对应关系对不上图例标注的位置和曲线不是同一根。原因在有循环或多组数据时legend 的显示顺序与 plot 的调用顺序不一致或者用固定字符串画图时没有把 R 值动态嵌入标签。解决标签用 sprintf 生成例如 sprintf(R %.2f, R(k))绘图时把 R 存成数组数据矩阵的每一行与 R 一一对应legend 直接引用这些标签如果用了循环每次 plot 后立刻记录句柄最后用句柄数组调用 legend。6. 设计取舍法布里-珀罗的「锐度换透过率」与仿真的精度平衡回过头看整条曲线族一个明显的设计张力和取舍浮现出来反射率高了条纹细锐、精细度大但代价是真实腔镜的损耗被放大反射率低了透过峰宽、能量利用效率高但分辨能力急剧下降。光学设计里常说的「反射率越高越好」只对理想无吸收腔成立实际镀膜工艺里高反膜本身就是多层介质膜的叠加吸收和散射随层数增长T_max (1 - R)/(1 - R 吸收项)² 会随 R 升高而下降。仿真里不加约束地取 R 0.99 画出一条细如针尖的曲线很容易但这条曲线对应的物理实现可能根本达不到那么高的峰值透过。MATLAB 仿真本身也存在类似的取舍网格加密能准确还原高反射率下的尖峰却让计算量线性增长隐式扩展让矩阵化代码优雅简洁但 debug 时容易忽略维度广播的方向。我习惯的做法是同时跑两个极端——R 0.04 验证公式连续性和背景形态R 0.95 验证峰位和半宽——只有这两条曲线同时正确中间反射率的结果我才敢信。如果再做进阶验证可以把数值提取的 FWHM 与解析近似 4/√F 画在同一张图里看误差随 R 的变化趋势这样既能发现公式写错的疏漏也能看出网格分辨率的实际瓶颈。这个级别的校验做完图 4.3 的复现才算真正闭环。从那以后我每次做光学仿真、画法布里-珀罗相关的曲线族都会强制自己先走一遍「极端参数对照」的流程否则总觉得少了点什么。希望帮到你。本文还有配套的精品资源点击获取