尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

长周期光纤光栅Rsoft仿真实战:从参数扫描到模式耦合分析

长周期光纤光栅Rsoft仿真实战:从参数扫描到模式耦合分析 做光纤光栅仿真这些年我一直觉得长周期光纤光栅LPFG是个原理不复杂、但实际调参能让人挠头很多天的方向。它的物理图像非常好懂光在纤芯里本来走得好好的遇到一段周期性折射率扰动一部分能量就被“拐”到了包层模上透射谱上于是出现几个干净的损耗峰。可一旦你真用Rsoft这种通用光波导仿真平台去复现这个现象并把谐振波长、损耗深度、带宽都调到目标值就会发现前期的模型简化、参数扫描策略、模式归属判断每一步都可能卡住。这篇文章我把完整的实操链路和踩过的坑整理出来希望对正在做LPFG设计或相关光纤传感课题的朋友有帮助。我默认的目标读者是有一定光纤光学基础、但刚开始用Rsoft做周期性波导结构仿真的同学。文中涉及BeamPROP模块的使用、LPFG参数扫描方法、谐振峰的模式耦合分析也适合拿来给毕业设计或小论文提供一套可复现的仿真流程。1. 问题定义与仿真设计思路1.1 LPFG的物理图像与相位匹配条件长周期光纤光栅的“长”是相对于布拉格光栅FBG说的。FBG周期在亚微米量级把正向纤芯模反射回反向模LPFG周期通常是几十到几百微米它做的事是把正向纤芯模耦合到前向包层模而不是反射回来。正因为能量往包层里走透射谱上才表现为一系列损耗峰。耦合发生的条件叫相位匹配条件写出来非常简洁[ n_{\mathrm{eff,core}} - n_{\mathrm{eff,clad},m} \frac{\lambda}{\Lambda} ]这里 (n_{\mathrm{eff,core}}) 是纤芯基模的有效折射率(n_{\mathrm{eff,clad},m}) 是第m阶包层模的有效折射率(\lambda) 是真空波长(\Lambda) 是光栅周期。由于包层模有效折射率比纤芯模低不了太多两者差值通常在 (10^{-3}) 到 (10^{-2}) 量级所以为了让某个波长 (\lambda) 满足相位匹配周期 (\Lambda) 就得取到数百微米。我通常在建模前先用这个公式粗算一遍。比如目标波长1550 nm假设基模有效折射率约1.445某个高阶包层模有效折射率约1.440那么 (\Delta n_{\mathrm{eff}} \approx 0.005)(\Lambda \approx 1550 / 0.005 310\ \mu m)。这个估算能帮我确定扫描周期的量级避免在Rsoft里漫无目的地乱扫。1.2 为什么选Rsoft的BeamPROP做这个仿真LPFG的长度通常是1到4厘米如果问能不能用FDTD时域有限差分来做答案在多数民用工作站上是否定的。FDTD要求空间步长在波长的1/10到1/20对1550 nm来说就是七八十纳米。整个计算域即使只取200 μm见方的横截面再乘以2 cm的纵向长度网格点数也是天文数字级别内存和时间都承受不住。BeamPROP用的是光束传播法BPM核心假设是光场沿传播方向近似单向传播把二阶纵向导数忽略掉只做慢变包络的推进。这个假设在LPFG里非常成立因为折射率调制深度很小典型值 (10^{-4}) 量级光栅周期又远大于波长背向反射可以忽略。BPM允许纵向步长放到微米量级横向步长也能根据光纤结构适当放宽同样的模型跑起来比FDTD快了不止两个数量级。所以我的结论很明确LPFG的透射谱仿真、参数扫描、模式耦合分析首选BeamPROP。FullWAVE那类FDTD工具更适合做光子晶体、微环等强散射或强谐振结构硬搬到LPFG上是自己给自己找麻烦。1.3 仿真目标与实际指标拆解开始建模之前一定要先把设计指标写清楚否则后续扫描真的会变成无底洞。以最常见的LPFG应用场景为例我通常会把目标拆成三项中心波长 (\lambda_c)谐振峰出现的位置比如1550 nm附近。消光比损耗深度谐振波长处的透射衰减常见设计期望是10到20 dB。3 dB带宽谐振峰半高点宽度取决于光谱仪或传感系统的解调分辨率。这三项不是独立变量。周期 (\Lambda) 主要决定中心波长折射率调制深度 (\Delta n) 和光栅长度 (L) 一起决定损耗深度而带宽主要由 (L) 和 (\Delta n) 共同控制。搞清楚这些对应关系后仿真计划就清晰了先定 (\Lambda)再调 (\Delta n) 和 (L) 的组合最后看带宽并决定是否需要加切趾。2. 仿真模型搭建与关键参数设置2.1 几何结构与材料参数Rsoft里搭建光纤结构我的习惯是先做一个基础的单模光纤模型再往里面加周期性调制。这里给一组我常用的初始参数接近标准通信单模光纤的量级参数数值说明纤芯半径 (a)4.1 μm单模条件合适包层半径 (b)62.5 μm标准光纤外径的一半纤芯折射率 (n_1)1.4490641550 nm附近包层折射率 (n_2)1.4440241550 nm附近背景空气折射率1.0包层外边界目标波长1550 nm谐振波长这组参数算出来的归一化频率V在2.0左右刚好单模包层模也足够丰富。要注意的是Rsoft中的折射率既可以写常数也可以挂材料库模型但LPFG仿真里不同波长的材料色散会影响谐振峰位置。你要是只关注相对变化趋势用常数折射率问题不大但要是为了和实验对比建议在材料定义里加入Sellmeier色散模型顺带把波长扫描范围放宽到1510到1590 nm这样峰位才能对得准。结构上我建议把包层外边界设为矩形计算域再留出一圈空气层。包层模的有效折射率受包层与空气界面的全反射条件约束空气层必须有否则模式求解结果和实际会有偏差。2.2 光栅折射率调制区域的实现这一步是最容易让人卡住的地方。LPFG要求的折射率调制不是只在某一小段加折射率而是在一整段长度上按周期变化[ n(z) n_1 \Delta n \cdot \mathrm{rect}\left(\frac{z \bmod \Lambda}{\Lambda}\right) ]也就是每周期内有一段区域折射率比纤芯高一点另一段保持原值。矩形调制是最常见的也可以用正弦调制或升余弦调制这会直接改变各阶谐波的耦合强度。Rsoft里实现这种周期折射率调制我试过两种方式用CAD Layout把光栅区拆成几百个交替的Segment。这种方法直观但周期数一多比如300个周期操作量巨大而且容易在边界处漏网格不推荐。用User Block写自定义折射率函数。Rsoft的User Block允许你在指定材料区域里用C代码实现任意 (n(x,y,z)) 分布编译成动态库后挂到材料上。这是最高效也最可靠的方式尤其是配合脚本参数扫描时能在每次运行前根据当前周期、深度、占空比实时生成折射率分布。我自己的做法是写一个User Block输入参数包括 (\Lambda)、(\Delta n)、占空比D和光栅长度L。函数体里判断当前坐标是否落在光栅区以及当前z坐标在周期内的位置决定返回 (n_1\Delta n) 还是 (n_1)。同时我会在光栅两端加一段过渡区让调制幅度渐变这样能明显压制旁瓣后面会专门讲。2.3 光源、监视器与边界条件设置光源输入端要发射纤芯基模LP01。最严谨的方式不是用高斯近似而是先用Rsoft的模式求解器算出光纤本征模场把LP01的横向场分布作为发射场。高斯近似在普通单模光纤上误差不算大但LPFG对注入模式纯度敏感发射场和本征基模不匹配的部分会直接变成背景损耗导致透射基线下降干扰谐振峰深度的判读。监视器方面我建议在输出端放两个Monitor总功率监视器统计整个计算域的输出光功率对应实验中的透射功率。模式分解监视器把输出场分解到LP01和各阶包层模上这样能直接看出能量从基模转移到了哪个包层模。这个对后面的模式耦合分析特别有用。边界条件也要留个心眼。BeamPROP默认有透明边界条件但LPFG结构横截面大包层外面还有空气如果用默认边界导致边界反射透射谱会出现高频振荡。我习惯在计算域外围直接加PML吸收层厚度设3到5 μm把辐射到包层外的残余能量吸收干净。这样得到的透射谱曲线干净得多。2.4 网格划分与数值参数的权衡网格设置直接决定仿真能否在可接受时间内跑完。LPFG横向结构跨度大直径125 μm纵向又很长厘米级全结构用均匀细网格是不现实的。我的经验是横向网格在纤芯和包层区域用0.1 μm到0.2 μm的步长如果机器内存紧张可以放宽到0.3 μm先跑通流程。横向计算域取 ±(包层半径 10 μm) 是底线。纵向网格BPM允许大步长但周期性折射率调制本身有突变纵向步长建议取 (\Lambda/20) 到 (\Lambda/10)。比如 (\Lambda300\ \mu m)z步长取15到30 μm。如果调制是矩形边缘处最好开变步长过渡否则容易在物理上引入数值伪振荡。横向网格点数和内存的关系要提前估算。假设计算域160 μm见方步长0.2 μm单层就是800×800 64万个点BPM推进几百上千步复数场存储在内存里一般16到32 GB内存能跑但如果你同时开参数扫描进程内存很容易爆。所以3D全尺寸模型跑之前我通常先做一个缩小版的验证把包层半径临时降到30 μm确认现象和趋势没问题再跑完整结构。3. 参数扫描与优化实施3.1 先用波长固定法锁定光栅周期LPFG的设计流程里第一步永远是确定周期因为周期直接决定谐振波长。这里我不建议一上来就做“全参数×全波长”的暴力扫描计算量太大没必要。我用的策略是固定波长在目标值扫描周期找透射率最低点。具体操作是这样的。先把光源波长固定在1550 nm(\Delta n) 取一个中等值比如 (3\times10^{-4})光栅长度取2 cm然后扫描 (\Lambda) 从250 μm到350 μm步长5 μm。在每一个周期下运行一次BeamPROP记录输出端LP01模式的透射功率。当周期扫过相位匹配条件时透射功率会出现明显的凹陷凹陷最深处的周期就是当前波长下的匹配周期。我之前用1.1节的粗算公式估计 (\Lambda) 在300 μm附近实际扫描结果往往落在290到320 μm这个区间因为包层模的有效折射率具体数值得靠模式求解器精确计算手算只是误差较大的估算。扫描曲线出来后如果最低点左侧和右侧都有上升趋势可以继续在最低点附近加密扫描步长到1 μm甚至0.5 μm把中心周期定准。3.2 折射率调制深度与光栅长度的配合周期确定之后就进入了“深度—长度”联合调节阶段。这两个参数共同决定谐振峰的深度但它们不是线性关系。耦合模理论给出的峰值耦合效率是[ \eta \sin^2(\kappa L) ]其中 (\kappa) 是耦合系数大致正比于 (\Delta n)。所以峰值损耗深度随 (\kappa L) 呈 (\sin^2) 振荡。这意味着增大调制深度和光栅长度并不总是加深损耗峰一旦 (\kappa L) 超过 (\pi/2)耦合效率反而下降这就是所谓的过耦合现象。我在仿真里见过不少这样的案例把光栅长度从2 cm加到4 cm谐振峰没有变深反而变浅甚至劈裂。这不是软件bug而是物理上确实进入了过耦合区。实操上我先固定L2 cm把 (\Delta n) 从 (0.5\times10^{-4}) 扫到 (1\times10^{-3})观察1550 nm处透射深度。通常 (\Delta n) 在 (1\times10^{-4}) 到 (5\times10^{-4}) 之间就能获得10到20 dB的消光比具体要看光栅周期数和模式阶次。找到合适的 (\Delta n) 后再单独变L从1 cm到4 cm确认深度处于单峰上升区间并观察带宽收窄情况。有一个细节值得提(\Delta n) 增大不仅加深峰也会展宽谐振峰还会让非目标包层模的耦合增强透射谱里出现不必要的侧峰。所以设计时不要贪大尽量选取刚好达到目标消光比的 (\Delta n)给后续制造留出一点容差。3.3 占空比与折射率调制形状的影响矩形调制的占空比D高折射率区占一个周期的比例也会影响耦合强度。直观想D从0变到1平均折射率会改变同时调制信号里的傅里叶分量也会变。相位匹配条件用的是基频分量幅度约为 (2\sin(\pi D)\Delta n/\pi)。当D接近0.5时基频分量最大耦合最强D偏离0.5基频分量减小透过率峰变浅同时可能强化二次谐波对应的耦合。如果建模时不设占空比Rsoft里默认的矩形调制通常就是0.5。我建议有必要的情况下做一次D从0.3到0.7的扫描配合制造工艺需求比如紫外写入时的曝光光栅占空比受掩模版限制选择合适的偏移方向。这个参数看似不起眼实际工程中经常是“实验测出来损耗深度总比设计少3 dB”的隐藏原因。另一种常见做法是改用正弦折射率调制只用傅里叶基频分量参与耦合整个透射谱更干净旁瓣也更小。代价是同样的峰值 (\Delta n) 下有效耦合比矩形D0.5低约 (2/\pi)需要适当增大 (\Delta n) 补偿。3.4 用Rsoft优化工具做多参数自动寻优手动扫描能找到不错的设计但如果你有明确的目标函数比如“在1550 nm处达到15 dB损耗深度且3 dB带宽小于5 nm”可以用Rsoft的优化模块做自动寻优。它的逻辑不复杂把 (\Lambda)、(\Delta n)、(L) 设为变量定义目标函数为仿真结果与目标值的偏差然后让优化器迭代寻找变量组合。我常用的目标函数长这样[ F w_1 |\lambda_{\mathrm{dip}} - \lambda_{\mathrm{target}}| w_2 |\mathrm{depth} - \mathrm{depth}{\mathrm{target}}| w_3 |\mathrm{BW}{3dB} - \mathrm{BW}_{\mathrm{target}}| ]权重 (w_1, w_2, w_3) 根据优先级设置。如果中心波长最重要就把 (w_1) 放大。不过要注意优化器需要多次调用BPM仿真每次仿真又需要扫几十个波长才能输出一个完整光谱整体计算耗时可能非常长。我的做法是先用手动扫描缩小变量范围给优化器一个接近目标的设计初值再让它在小范围内精细化。直接让优化器从大范围盲搜大概率是浪费时间。4. 模式耦合分析与结果解读4.1 透射谱中的多峰归属LPFG的透射谱不会只有一个损耗峰因为纤芯基模可以和多个不同阶次的包层模满足相位匹配条件。每一个峰对应某一个包层模阶次m峰位置由各自的有效折射率差决定。仿真跑出来后第一件事就是把每个峰都归属清楚。我通常的做法是先在BeamPROP里用模式求解器算出目标波长附近若干阶包层模的有效折射率 (n_{\mathrm{eff,clad},m})然后代回相位匹配公式算出每个模式对应的谐振波长再和透射谱里的峰一一对比。实践中经常发现最深的峰对应的是某个低阶包层模而旁边的小峰是更高阶模。这个对应关系确认之后设计的调整才有的放矢——比如要移动主要峰的波长就要重新选择周期要去掉某个多余的旁峰就要避免激发对应阶次。Rsoft的场监视器也能辅助模式识别把z方向某个截面的 (E_x) 或 (E_y) 场分布导出来数一数包层区域里沿径向的节点数节点数对应的就是模式阶次。这比只盯着透射谱猜要可靠得多特别是当两个峰离得很近时。4.2 用模式分解定量看耦合效率单纯看总输出功率会掩盖一个事实能量到底是耦合进了包层模还是因为数值误差“泄露”到环境中去了。要区分这两者必须用模式分解监视器。在Rsoft里模式分解的功能是把输出场投影到一组本征模式基上得到每个模式的功率占比。我在谐振波长处跑完BPM后会同时看LP01模功率和各主要包层模功率的分布。正常情况下你会看到LP01功率明显下降同时某个特定包层模的功率显著上升两者之和基本守恒。如果发现LP01功率下降但包层模功率没有明显上升那就要检查是不是计算域边界或网格设置导致光场被非物理地吸收掉了这个坑我踩过不止一次。通过模式分解还能直接提取耦合效率[ \eta_m \frac{P_{\mathrm{clad},m}}{P_{\mathrm{in}}} ]把这个值和理论值 (\sin^2(\kappa L)) 对比可以用来校准实际调制深度。因为User Block里的 (\Delta n) 是名义值网格离散和调制形状会让有效耦合强度略低于理论值模式分解结果能帮你看到真实的耦合强度。4.3 场分布与模式演变的可视化分析仿真调试阶段我会特别关注两个场图一个是非谐振波长下的z方向切面场分布另一个是谐振波长下的同一视角场分布。非谐振时光能量几乎全部被束缚在纤芯里整个光栅区看起来“风平浪静”谐振时能清楚看到纤芯里的能量逐渐向包层“漏”包层区域出现周期性亮暗相间的图案。这个可视化是验证物理图像最直观的手段。我第一次跑出这个现象时心里对“模式耦合”的理解就从公式变成了具体的画面能量不是在某个点突然跳出去的而是在传播过程中一点一点从纤芯转移到包层这就是前向耦合的特征。如果包层中的场图案出现杂乱的干涉条纹通常说明边界条件没有处理好PML吸收不充分有反射光重新进入了计算区域。这时候先去调边界条件而不是怀疑物理模型。4.4 与耦合模理论模型对比验证Rsoft的仿真结果再好我也习惯再写一个简单的耦合模方程CMT数值模型做交叉验证。耦合模方程是一组一阶常微分方程[ \frac{dA_{\mathrm{core}}}{dz} i\kappa B_m \exp(-2i\delta z) ] [ \frac{dB_m}{dz} i\kappa^* A_{\mathrm{core}} \exp(2i\delta z) ]其中失谐量 (\delta \pi\Delta n_{\mathrm{eff}}/\lambda - \pi/\Lambda)。在MATLAB或Python里用标准ODE求解器跑一遍几秒钟就能得到透射谱。把CMT的谐振波长、峰深度和Rsoft仿真结果放一起对比如果两者趋势一致且数值接近就对仿真模型更有信心如果差异明显往往说明Rsoft模型里的折射率调制实现方式或模式阶次判定出了问题。这个交叉验证习惯帮我在一次项目中抓住了一个大问题Rsoft里包层半径设小了20 μm导致包层模有效折射率整体漂移谐振峰偏移了好几个纳米。CMT用正确参数算出来的结果立刻暴露了这一点否则我可能还在傻傻地调光栅周期。5. 常见问题与排查技巧实录5.1 仿真发散或透射率超过1BeamPROP偶尔会出现透射率在某个位置莫名其妙超过1的情况或者场能量越传播越大。撇开物理上不可能不谈这通常和数值稳定性有关。常见原因有纵向步长过大导致慢变包络假设在折射率突变处失效横向网格太粗导致高阶包层模分辨率不足边界条件反射和透射场叠加出现驻波。我的排查顺序是第一步缩小纵向步长到原来的1/2如果现象改善说明是纵向精度问题第二步把横向步长从0.2 μm减到0.1 μm如果改善说明是横向分辨率问题第三步检查计算域边界是否离包层太近至少留10 μm以上空气层并确认PML开启。如果三步都做完还是发散我会干脆建一个简单的直波导无光栅模型跑一遍如果直波导都出问题那基本是基础设置的问题和LPFG无关先把模型基本功修好。5.2 谐振峰深度远低于预期这个现象最常见的解释是 (\kappa L) 没有达到 (\pi/2)或者虽然达到了但过耦合后又回到了低深度。先用CMT模型算一下当前的 (\kappa L) 大概是多少就知道是“还没足够”还是“已经过了”。如果是还没足够增大 (\Delta n) 或提升L如果是过耦合反而要减小两者之一。另一个隐藏原因是占空比偏离0.5太多基频傅里叶分量下降导致有效 (\kappa) 变小。如果你检查了深度和长度都没有问题不妨看看折射率调制波形是不是真的按预期生成了。Rsoft里User Block的坐标系和方向如果没写对可能会出现调制只在局部区域生效的情况这个我吃过亏后来养成了先小范围跑一截并在折射率分布切片里直接查看的习惯。5.3 谐振峰位置和理论计算对不上峰位偏移超过几个纳米时优先排查材料色散和有效折射率计算的一致性。如果你在模式求解器里用的是常折射率而BeamPROP传播时用的又是带色散的材料前后不一致必然导致相位失配。如果材料和模式计算一致峰位还是偏那就检查包层外是否有足够厚度的空气层。包层模有效折射率对包层与空气界面非常敏感如果计算域把包层截断得太靠里包层模会被“挤压”有效折射率偏高谐振波长就会偏移。我通常保证计算域至少包含整个包层半径再加5到10 μm空气。5.4 旁瓣过大或谱线不干净均匀光栅的透射谱天然带旁瓣这是傅里叶变换的必然结果。想要干净谱线就走切趾apodization路线。在User Block里给折射率调制幅度乘一个窗口函数比如高斯窗[ w(z) \exp\left(-\frac{(z-L/2)^2}{2\sigma^2}\right) ](\sigma) 取 (L/4) 到 (L/6) 比较合适。切趾之后主峰深度会略微下降但旁瓣能压掉10 dB以上。代价是主峰带宽稍微展宽需要根据自己的指标权衡。我这里想强调的是切趾函数和光栅区域边界要衔接平滑如果窗口函数在两端突然截断依然会产生额外旁瓣。5.5 计算时间过长与内存不足LPFG全尺寸3D仿真的计算量确实不小尤其是参数扫描要跑几百次BPM。我常用的降本手段有三个先用2D平板波导模型定趋势。光纤的圆对称性是三维的但薄膜波导上的周期光栅在物理上保留了模式耦合的基本特征算起来快一个数量级。先拿2D模型把周期、深度、长度的量级确定下来再回到3D精算能省很多时间。减少波长扫描点数。先粗扫每5 nm一个点找到峰的大致位置再局部加密到0.5 nm。不要从一开始就在1510到1590 nm全程按0.5 nm扫。复用相同横向网格的仿真结果。Rsoft允许在固定波长下扫周期每个周期点之间只改光栅折射率如果横向模式和网格不变许多中间量可以缓存。虽然这块要写脚本才能最大程度利用但手动操作时把扫描点组织好能减少重复计算。6. 再讲一点个人体会长周期光纤光栅仿真正经做起来和分析一个直波导或者弯曲波导的难度完全不同。它的难点不在单次仿真而在于你得同时理解周期结构的傅里叶谐波、包层模的色散、耦合系数对参数的敏感性以及数值方法本身的适用范围。Rsoft只是把这些物理现象“可计算化”的工具如果脑子里没有相位匹配和 (\sin^2(\kappa L)) 这两根主线很容易在参数旋钮里迷路。我从第一次跑通LPFG仿真到现在最大的感悟是永远先做小模型、粗扫描确定趋势之后再细化。直接上全尺寸、全精度的暴力搜索除了让电脑风扇狂转之外并不会让你的理解变得更深。把每一轮仿真都当成一次物理实验去分析而不是当成“出图工具”仿真里的那些异常现象反而会告诉你最多的东西。另一个小建议是保存好每一轮扫描的原始数据。Rsoft导出的透射率数据看着不起眼但当你回头想把某个峰的深度变化和某个参数关联起来时这些数据就是最宝贵的调试依据。我自己习惯在每个仿真项目里建一个CSV归档目录命名规则是“日期_参数_取值_结果”一是方便复盘二是写论文的时候直接就能拉数据画图省去重新跑仿真的痛苦。如果你正在被LPFG的某个仿真问题卡住不妨退一步先用耦合模理论把预期行为画出来再回到Rsoft里对号入座。理论和仿真互相印证这条路走通之后LPFG的相关设计就真的不那么神秘了。
返回列表