长周期光纤光栅透射谱MATLAB仿真:耦合模理论、传输矩阵与参数扫描全解析

发布时间:2026/9/2 2:49:15
长周期光纤光栅透射谱MATLAB仿真:耦合模理论、传输矩阵与参数扫描全解析 简介这份仿真资源围绕长周期光纤光栅透射谱展开面向光纤通信、光纤传感方向的学生与研发人员旨在通过数值建模帮助读者理解其相位匹配耦合机理并系统考察周期、芯径、包层厚度、折射率差等参数对透射谱的影响。压缩包内含4个文件3个MATLAB脚本构成完整流程Run.m作为主程序调度仿真并绘图CoreDichotamy.m和CoreFormula.m分别用于求解芯层导模有效折射率与芯层折射率模型另附1份PDF文档给出理论推导、仿真步骤与结果解释便于对照学习。资源包仅289KB轻量易用已有2120人学习下载。运行脚本时可自由调整光栅周期、光栅长度等变量直观观察透射峰位置和深度的变化从而在免去实物制备的情况下完成LPG性能预测与优化设计这一思路同样适用于温度、应力等传感场景的响应分析对课题研究和工程选型均有参考价值。 做LPFG仿真最初是从一次实验准备开始的。当时要写长周期光纤光栅的温度传感方案手头没有现成的写入平台也不想每换一组参数就排队等曝光、等光谱仪扫描于是想着先用MATLAB把透射谱算出来把周期、长度、折射率调制深度这些核心参数摸一遍再决定怎么设计实验。这个长周期光纤光栅透射谱的仿真MATLAB仿真项目核心就是用耦合模理论配合传输矩阵法计算LPFG在不同波长下的透射率最终得到完整的透射谱曲线。它适合正在做光纤通信滤波器件、光纤传感课题的学生也适合刚接触光纤光栅仿真、想快速搭起一个可复现仿真框架的工程师。我一直觉得LPFG的MATLAB仿真是原理看着简单跑通才知道坑在哪的典型。公式书上三五行耦合模方程展开成大括号矩阵就是一大片代码而真正影响谱形能不能算对的往往是那些不起眼的细节——有效折射率的求解精度、包层模式阶数取到多少、波长步长设多大。这篇文章我就按自己实际跑通的路径把原理、代码、参数扫描和排错经验完整写一遍。1. 长周期光纤光栅的物理模型与仿真思路1.1 LPFG到底在仿真什么长周期光纤光栅Long Period Fiber Grating, LPFG的周期通常在100到700微米之间远大于布拉格光栅FBG的亚微米周期。正是这个周期尺度决定了它的工作方式它不是把光反射回去而是把纤芯基模的能量耦合到同向传输的包层模式中。由于包层模式在传输很短一段距离后会因弯曲、涂覆层吸收等因素迅速损耗掉宏观表现就是透射谱上出现一系列衰减峰反射谱上几乎看不到明显信号。仿真要输出的就是这个透射谱横坐标是波长纵坐标是归一化透射率。一个典型的LPFG透射谱在谐振波长处会出现一个深度可达-10到-20 dB的损耗峰峰的位置、深度、3 dB带宽三个指标直接决定了这个光栅适合做带阻滤波器还是高灵敏度传感器。所谓仿真透射谱实际就是在给定光纤结构参数和光栅写入参数的条件下把这几个关键指标准确算出来。1.2 为什么选耦合模理论加传输矩阵而不是其他方法我见过有人用FDTD时域有限差分去仿真LPFG那真是杀鸡用牛刀——结构尺寸从微米级到厘米级FDTD的网格数量会爆炸普通工作站跑一次要几个小时。也有人用光束传播法BPM但处理包层模式耦合时边界条件比较复杂容易引入伪模式。耦合模理论Coupled Mode Theory, CMT是处理弱周期性波导微扰最经典的方法。LPFG的折射率调制深度一般在1e-4到1e-3量级相对于纤芯和包层的折射率差来说属于弱扰动完全满足耦合模理论的使用前提。在这个框架下光栅被看作一个线性系统纤芯模和包层模之间的能量交换用一组一阶微分方程描述求解方式非常成熟。但直接用解析方法算非均匀光栅会遇到困难所以我在代码里选用耦合模理论建模传输矩阵法求解的组合把整个光栅沿轴向分成很多小段每一段内近似认为参数均匀用解析解写出这一段的传输矩阵然后所有小段的矩阵连乘。这样做的好处很明显想加切趾apodization、想模拟非均匀周期、甚至以后想加相移只需要改每一小段的矩阵参数主程序骨架完全不用动。2. 从公式到MATLAB代码的关键实现2.1 三层阶跃光纤的有效折射率计算仿真LPFG的第一个硬骨头是计算纤芯基模和各个包层模的有效折射率。这个值不是随便查表能得到的它随波长变化是整个仿真里最频繁调用的基础数据。这里采用标准的三层阶跃折射率光纤模型纤芯、包层、空气或涂覆层。常用的参数表如下参数数值说明纤芯折射率 n11.4681掺锗纤芯约1550 nm处包层折射率 n21.4628纯石英纤芯半径 a14.15 μm常规单模光纤包层半径 a262.5 μm常规单模光纤光栅周期 Λ100~700 μm扫描变量折射率调制深度 δn1e-4 ~ 1e-3紫外写入强度决定求解思路是对光纤横截面的每个区域写出标量波动方程的解然后在纤芯-包层、包层-空气两个边界上施加电场和磁场的连续条件最终得到一个只含有效折射率 n_eff 的特征方程。这个方程没有解析解只能在MATLAB里用fzero或者fsolve在目标折射率区间内搜索根。我自己在代码里是这么组织的% 求解纤芯基模HE11和包层模HE1m的有效折射率 % neff_range: 搜索区间通常在 n2 到 n1 之间 % m: 包层模式阶数 function neff solve_neff(lambda, m, fiber_params) n1 fiber_params.n1; n2 fiber_params.n2; n3 1.0; a1 fiber_params.a1; a2 fiber_params.a2; k0 2*pi/lambda; % 特征方程函数neff为未知数 f (neff) characteristic_eq(neff, k0, n1, n2, n3, a1, a2, m); % 在(n2, n1)区间内搜索第m个根 neff fzero_bracket(f, n21e-6, n1-1e-6, m); end注意这里的搜索第m个根不是一件简单的事。包层模式有多个阶数对应不同的有效折射率如果搜索区间或者根的排序处理不好很容易把HE13算成HE12后面的耦合波长全都会偏离。我的做法是把区间细分为很多小段在每个小段内检测符号变化然后把解出来的根按从大到小排序确保模式阶数是连续的。2.2 耦合模方程与传输矩阵的离散化得到有效折射率之后就可以进入核心计算。LPFG中纤芯模A和某一阶包层模B之间的耦合方程可以写成dA/dz -j·κ·B·exp(-j·δ·z) dB/dz -j·κ·A·exp(j·δ·z)其中失谐量 δ 0.5·(β_core - β_clad - 2π/Λ)β 2π·n_eff/λκ 是耦合系数与折射率调制深度和模场重叠积分正相关。谐振发生的条件就是相位匹配β_core - β_clad 2π/Λ也就是 λ_res (n_core - n_clad)·Λ。谐振波长大致与周期成正比所以改变光栅周期可以直接移动损耗峰的位置。对均匀光栅这个方程组有解析解。定义 γ² κ² δ²长度为L的光栅透射率为T 1 - (κ²/γ²)·sin²(γ·L)对于非均匀光栅沿轴向把光栅切成N段每一段长度 ΔL L/N在段内 κ 和 δ 近似不变这段的传输矩阵为M_i [cos(γ·ΔL) - j·δ/γ·sin(γ·ΔL), -j·κ/γ·sin(γ·ΔL); -j·κ/γ·sin(γ·ΔL), cos(γ·ΔL) j·δ/γ·sin(γ·ΔL)]整个光栅的传输矩阵是所有 M_i 的连乘。我实际用的代码主体就是这样一个循环function T lpfg_transmission(lambda, L, Lambda, kappa_fun, neff_core, neff_clad) N 200; % 分段数200段对均匀光栅足够 dz L / N; beta_core 2*pi*neff_core(lambda)/lambda; beta_clad 2*pi*neff_clad(lambda)/lambda; M_total eye(2); for i 1:N delta 0.5*(beta_core - beta_clad - 2*pi/Lambda); kappa kappa_fun(lambda); % 耦合系数这里可加入空间分布 gamma sqrt(kappa^2 delta^2); if gamma 0 gamma eps; end M_i [cos(gamma*dz) - 1j*delta/gamma*sin(gamma*dz), ... -1j*kappa/gamma*sin(gamma*dz); -1j*kappa/gamma*sin(gamma*dz), ... cos(gamma*dz) 1j*delta/gamma*sin(gamma*dz)]; M_total M_total * M_i; end % 入射条件纤芯模输入A1包层模输入B0 A_out M_total(1,1); T abs(A_out)^2; end需要注意kappa在均匀光栅里是常数但如果要做切趾就把它改成随位置变化的函数例如高斯型 κ(z) κ0·exp(-((z-L/2)/(L/4))²)这样在传输矩阵循环里每一段的κ都不同能直接压制旁瓣。这也是传输矩阵法比直接套解析公式灵活的地方。2.3 波长扫描与绘图参数设置主程序里需要对波长进行扫描然后逐点调用透射率函数。扫描范围和步长的选择直接影响计算量和谱线平滑度。如果目标谐振峰在1550 nm附近我一般扫描1520到1620 nm步长是0.1 nm。步长太大会丢失峰的细节太小则多出几百次重复计算。这里有一个性能优化点有效折射率是对每个波长都要重新求解的而求根过程又比较慢。我的做法是先用较粗的波长间隔比如5 nm算出 n_eff 的离散值再用interp1插值到细网格上。实测下来计算量能降低一个数量级而且对谱形几乎没有影响。lambda_coarse linspace(1520e-9, 1620e-9, 21); neff_core_coarse arrayfun((l) solve_neff(l, 0, params), lambda_coarse); neff_clad_coarse arrayfun((l) solve_neff(l, m, params), lambda_coarse); % 插值到细网格 neff_core interp1(lambda_coarse, neff_core_coarse, lambda_fine, spline); neff_clad interp1(lambda_coarse, neff_clad_coarse, lambda_fine, spline);3. 透射谱结果分析与参数扫描实战3.1 第一张透射谱图出来的那一刻用上面的代码固定周期 Λ550 μm、光栅长度 L3 cm、调制深度 δn5e-4计算出来的透射谱在1554 nm附近会出现一个明显的损耗峰。峰值深度大约-18 dB3 dB带宽在20 nm左右这个量级和文献报道的实验结果很接近。第一次跑出平滑的损耗峰时我特意把谱线和理论谐振波长 λ_res (n_core - n_clad)·Λ 做了一次对比计算值和仿真值偏差小于0.3 nm。这种相互印证很重要——仿真代码写完之后先找一个能用理论值估算的极限情况验证正确性再去做参数扫描不然数据算出来也不知道该不该信。需要提醒的是LPFG透射谱通常会有多个损耗峰对应不同阶次的包层模耦合。低阶模的谐振波长通常更长峰也更深高阶模的谐振波长更短峰深度相对浅一些。如果代码里一次性计算多个模式最终透射谱是每个模式单独透射谱的乘积。这一点很容易踩坑我一开始把多模式的结果做了叠加平均导致峰深度明显偏小后来才意识到应该各算各的透射率然后相乘。3.2 三大核心参数对透射谱的影响规律参数扫描是LPFG仿真最有价值的部分因为实验里改一次光栅参数就要重新写栅、重新曝光而在MATLAB里只是改一个变量重新运行而已。我系统扫了三个参数规律整理如下参数主要影响近似规律光栅周期 Λ谐振峰位置峰位随周期增大近似线性红移光栅长度 L峰深度和带宽L增大峰变深、带宽变窄但存在最佳长度调制深度 δn耦合强度δn增大峰变深、变宽旁瓣也升高周期的影响最容易理解因为相位匹配条件直接决定了 λ_res 和 Λ 成正比。我扫描 Λ 从400 μm到600 μm损耗峰波长从1480 nm漂移到1620 nm线性度非常好。做传感器设计时可以通过周期大致粗调工作波长再用其他参数微调。长度的影响更有意思。一开始我以为光栅越长耦合越充分、峰越深但实际扫下来发现当 κ·L 超过一定值后能量会从包层模重新耦合回纤芯模峰深度反而开始回退这就是所谓过耦合现象。在 L4 cm 之后-18 dB 的峰会上升到 -12 dB而且谱线形状明显变差。所以设计光栅长度时不能贪长要结合 κ 的值算出最佳长度大约在 κ·L ≈ π/2 附近。调制深度对耦合系数 κ 近似成正比它影响的是峰的深度和宽度。δn 从2e-4增加到8e-4峰深从-9 dB加深到-25 dB同时3 dB带宽也从12 nm展宽到25 nm。传感应用一般希望峰窄一点、深一点所以调制深度不是越大越好要平衡。3.3 切趾设计的一个实例刚才提到切趾能压制旁瓣这个我实际验证过。不加切趾时透射峰两侧会有一串旁瓣有时候旁瓣高度能到-3 dB这在滤波应用里完全不可接受。把耦合系数改成高斯分布之后旁瓣被压到-25 dB以下但代价是主峰深度略微变浅、带宽变宽。主峰深度从-20 dB变成-16 dB左右对于大多数传感场景完全可以接受。% 高斯切趾在传输矩阵循环中修改kappa z_center L/2; sigma L/4; for i 1:N z (i-0.5)*dz; kappa_z kappa0 * exp(-((z - z_center)/sigma)^2); % 后续同原逻辑 end如果既想要深主峰又想要低旁瓣可以尝试π相移光栅结构在光栅中间插入一个π相移段会在透射谱通带中间打开一个极窄的透射窗口这种结构在窄带滤波和传感解调中非常实用。传输矩阵法支持这种设计只需在相应位置插入一个相移矩阵。4. 常见问题与排查技巧实录4.1 谐振波长总是和理论值对不上这是所有新跑LPFG仿真的人都会遇到的第一道坎。我最初算出的谐振波长比理论值偏大了将近10 nm怎么检查公式都没发现错后来才发现是包层模的阶数取错了——特征方程求根时把不同模式根的顺序搞反了。有效折射率越高模式阶数越低所以必须对求出的根进行降序排序再编号。另一个常见原因是搜索区间设置不当。如果求解特征方程的搜索区间没有包含目标根fzero可能会跳过它甚至收敛到纤芯模而不是包层模。解决办法是把搜索区间按折射率差细分比如每个区间宽度不超过 0.0005然后从左到右依次找根。4.2 透射峰出现分裂或异常毛刺如果你在透射谱上看到本应是平滑的损耗峰出现了一个个小抖动先别怀疑物理模型绝大多数情况是数值精度问题。波长扫描步长太大时峰的极值点可能刚好落在两个扫描点之间画出来就显得峰是平顶或者分裂的。把扫描步长从1 nm改成0.1 nm这种问题立刻消失。还有一种情况是分段数N不足。均匀光栅用50段其实也基本够用但如果加了切趾或者非均匀周期50段就会因为每段参数变化太突兀而产生数值振荡。我后来统一用N500计算时间依然在几秒量级但谱线平滑度明显提升。4.3 多阶包层模叠加后谱形混乱LPFG的透射谱是多个包层模耦合效应的叠加高阶模的数量可能达到几十个。我在仿真时一开始只取了前5个模式结果谱线不够丰富峰值和实验对比不起来。后来增加到前20个模式计算量增加了4倍但谱形的整体轮廓终于和实验吻合了。这里分享一个实用技巧不需要每一个波长都重新计算所有模式的有效折射率。模式的有效折射率和波长之间的关系是平滑的所以先用21个粗波长点算出各模式的 n_eff再用样条插值到细波长网格上速度和精度能同时兼顾。这个优化做完之后之前需要跑40秒的仿真压缩到5秒以内跑参数扫描时体验完全不一样。4.4 旁瓣太高怎么办旁瓣是均匀周期光栅的固有特性源于光栅两端截断造成的等效矩形窗。要压低旁瓣最直接的办法是加切趾。我试过余弦型、高斯型、升余弦型三种窗函数效果都还不错其中升余弦型的旁瓣抑制最彻底但不光主峰深度下降主峰宽度也会明显增加。气体传感应用需要分辨率高我会倾向用高斯切趾在旁瓣抑制和峰宽之间取平衡。如果切趾之后旁瓣还是不理想可以检查一下折射率调制的空间分布是不是出现了直流分量。实际实验中紫外曝光可能引入平均折射率升高反映在仿真里相当于每个分段多了一个常数项这会让旁瓣不对称甚至出现额外的小峰。在代码里加入一个可调节的直流折射率增量参数对比有和没有这个分量时的谱形能辅助判断实验数据的异常来源。最后再分享一点个人体会LPFG仿真做久了最大的感受是越简单的模型越要敬畏细节。耦合模理论本身并不复杂传输矩阵法的代码也就百来行但真正把透射谱算到和实验量级一致需要在模式阶数、有效折射率精度、分段数量这些细节上反复打磨。给刚开始做的朋友一个建议不要一上来就追求多模式、非均匀光栅、切趾这些花活。先固定一个模式和一组标准参数跑出干净的透射谱验证谐振波长和理论值对上再逐步加复杂度。每一层新功能都要有对应的验证手段比如切趾之后检查旁瓣是否有变化非均匀周期之后检查峰位是否按预期移动。这样代码出问题时能快速定位而不是面对几百行代码无从下手。后续如果想让这个仿真更贴近工程应用可以试着加入温度或应变响应模型把外界扰动对有效折射率的影响映射成透射谱的波长偏移这会让项目直接升级成一个传感性能预估工具。我就是这么一步步把当初的透射谱仿真脚本扩展成了自己的LPFG传感设计工作台。本文还有配套的精品资源点击获取