阵列波导光栅AWG原理与Matlab仿真:从光栅方程到传输谱分析 简介阵列波导光栅AWG是密集波分复用系统的核心器件该仿真代码在MATLAB中实现了完整的AWG建模与分析流程面向通信工程、光电信息、电子信息等专业的在校学生与教师尤其适合毕业设计、课程设计或项目初期立项演示。包内共22个文件核心为17个m脚本覆盖AWG光谱分析、模式计算、材料折射率设置等功能同时包含mlx交互式示例、mlapp可视化仿真器以及README说明文档压缩包仅1.07MB目录结构清晰便于直接运行和二次开发。目前已有175人学习下载代码均经过测试并成功运行可作为课设、毕设的完整实现方案。资源不仅提供AWG仿真主程序还配套Si、SiO2、Si3N4等材料参数模块以及slab_mode、eim_mode等模式求解函数使用者可以循序渐进地理解从波导结构、材料选择到光谱响应的整个仿真流程也能根据自身需求修改几何参数或材料参数进一步拓展功能适合基础较好或有志深入学习的读者。1. 阵列波导光栅毕业设计选它做Matlab仿真到底在仿真什么光通信WDM系统里阵列波导光栅Arrayed Waveguide Grating, AWG负责把一束多波长光按波长拆到不同输出端口。它没有移动部件、一个芯片完成分波所以从课程设计到企业级ROADM都是绕不开的经典。用Matlab做AWG仿真不是画一条透过率曲线就交差要把输入光场、阵列波导相位延迟、两次自由传播区的聚焦散射一步步在数值上搭出来最后得到每个通道的传输谱、插损和串扰。我按毕业设计和课设最常见的做法把AWG模型拆开讲清给出一套能直接跑通的最小Matlab实现以及调参时最常踩的坑。适合手头有课题任务、想快速理解原理并动手复现的同学也适合做光无源器件仿真、想补AWG细节的工程师。2. AWG的工作原理三个分区、光栅方程与自由谱范围2.1 三个分区串起来的光路先别急着写代码把分区看明白AWG结构上分三个区域输入自由传播区FPR1输入罗兰圆、中间阵列波导区、输出自由传播区FPR2输出罗兰圆。光从输入波导出来后在FPR1里衍射展开成一个宽光场耦合进N条长度递增的阵列波导每条波导引入不同的相位延迟在FPR2里各波导出射的光场重新叠加同一波长的光在输出面某个位置同相增强不同波长因为相位差不同聚焦到不同位置。这就是AWG做波分解复用demux的全部物理过程。这里有个关键认知AWG严格说不是靠“刻线”衍射分光而是靠“相位差 聚焦干涉”分光。阵列波导的长度差ΔL是设计核心。一个波长λ在相邻波导之间经历的相位差是2π·n_eff·ΔL/λ不同波长的相位差不同等效于波前产生了随波长变化的倾斜角。第二个FPR把这种倾斜角转成输出面上的空间位移于是“波长不同→聚焦点不同”。我第一次做这个仿真时把全部注意力放在公式上忽略了分区结构结果代码写成了“均匀介质里直接叠加”完全没体现FPR的衍射展宽仿真出来的通道串扰全是错的。所以动手前先把三个区域在坐标图上标出来输入端在FPR1左边缘阵列波导入口在FPR1右边缘罗兰圆上阵列波导出口在FPR2左边缘输出波导在FPR2右边缘。仿真的每一步都要问自己“光场现在在哪个区域、这个区域能不能用近轴近似”。2.2 光栅方程与中心波长量纲统一是第一道坎AWG的基本设计方程把输入/输出耦合角和阵列波导长度差写进同一个公式n_s·d·sinθ_in n_s·d·sinθ_out n_c·ΔL m·λ其中n_s是自由传播区折射率n_c是阵列波导有效折射率d是相邻波导间距θ_in/θ_out是输入输出衍射角m是衍射级次。输入输出都正对中心位置时两侧正弦项为零方程简化为m·λ_c n_c·ΔL这就是中心波长和长度差的直接绑定关系确定了衍射级次m确定中心波长λ_cΔL就被唯一决定了。仿真时若自己设定ΔL务必先用这个式子验算中心波长是否落在目标窗口否则后面扫出来谱线偏到天边去也不知道为什么。这里最坑的不是物理是单位。很多人的第一个AWG仿真翻车不是原理错是ΔL用微米、λ_c用纳米算出来的级次m差三个数量级。我的习惯是脚本里所有物理量统一用米SI折射率无量纲频率用赫兹。只在最后画图时把波长换算成纳米频率换算成GHz。这个习惯能省下至少两个小时的调试时间。表AWG设计基本参数与典型取值参数符号典型取值范围仿真里的角色中心波长λ_c1550 nm定义工作窗口衍射级次m60120决定ΔL与FSR相邻波导长度差ΔL30120 μm相位递推核心量阵列波导数N32128决定串扰与插损均匀性波导间距d1015 μm角色散“光栅常数”自由传播区长度L_f300800 μm决定聚焦焦距与通道间距2.3 FSR与衍射级次先算清楚能放几个通道自由谱范围FSR是AWG仿真里最先要算的边界条件它决定你这一组通道能铺多宽。频率域的FSR是FSR_f c / (n_g·ΔL)换算到波长域约等于FSR_λ ≈ λ_c² / (n_g·ΔL)注意这里必须用群折射率n_g不是相折射率n_eff。这个坑我在课设里踩得很痛用n_eff算FSR8个通道的谱一扫描出来边缘通道间隔明显变宽怎么看都不均匀。原因是FSR本质上描述的是“光在波导里跑一个ΔL的群延迟差”群延迟归群折射率管不归相折射率管。硅波导里n_eff和n_g能差0.05到0.1FSR误差直接好几个nm。通道数和FSR的配合关系也需要注意。假设每个通道间隔是Δf_ch工作通道数K那么FSR至少要大于K·Δf_ch否则相邻衍射级次的光谱会叠进通道里。设计时一般取FSR≈1.2~1.5倍占用带宽。仿真时如果发现最外侧通道插损明显偏高往往不是代码问题而是FSR/通道数配比不够边缘通道已经落在FSR边界附近了。2.4 为什么自建Matlab模型而不是直接上商用器件软件我知道有人会问Lumerical、Rsoft、CST这些软件都能做AWG为什么还要在Matlab里手搓答案分两层。第一毕设和课设考察的是“你懂不懂原理”商用软件给的是黑匣子结果答辩时老师说“解释一下这条纹是怎么来的”黑匣子答不上来Matlab模型每一行代码对应一个物理过程解释起来理直气壮。第二AWG的标量近轴模型在Matlab里也就一百多行核心代码不用装额外工具箱跑一遍只要几秒调参迭代速度远超大型光学仿真软件。商用软件适合你工作后做流片前的精细验证但课程阶段自建模型学到的东西更多改起参数来也更顺手。3. 在Matlab里搭出AWG模型最小可运行代码与逐段拆解3.1 初始化参数SI单位一次到位先建一个脚本awg_design.m把物理参数集中放到文件头部。所有长度用米频率用Hz波长用米。注释里写清楚每个参数的物理含义和典型值这个习惯对后期调参非常重要。% awg_design.m — 阵列波导光栅最小标量模型 clear; clc; close all; % 基础参数全部 SI 单位 lambda_c 1550e-9; % 中心波长 1550 nm n_eff 1.45; % 阵列波导有效折射率 n_g 1.47; % 群折射率FSR 计算用 m 80; % 衍射级次 N_wg 64; % 阵列波导数 d_wg 12e-6; % 阵列波导间距 12 um L_f 500e-6; % 自由传播区半径 500 um w0 6e-6; % 输入高斯场模场半径 L0 50e-6; % 最短阵列波导长度 % 由中心波长和级次反推相邻波导长度差 delta_L m * lambda_c / n_eff; % ΔL m*λ_c / n_eff % 阵列波导空间坐标按中心对称排列 idx (1:N_wg) - (N_wg 1)/2; % -31.5, -30.5, ..., 31.5 x_arr idx * d_wg; % 阵列波导入口横向坐标逻辑说明delta_L不是随便给的它由中心波长、衍射级次和有效折射率唯一确定。如果改了n_eff或者mdelta_L必须跟着变否则中心波长会漂移。idx向量是中心对称的保证阵列波导的出射场相对输出面的中心位置也是对称的。坐标原点放在器件对称轴上后面算聚焦相位时能省很多麻烦。3.2 输入高斯场与第一次自由传播区传播输入波导出来的光场近似为高斯分布横向电场写成exp(-x²/w0²)。FPR1里的衍射传播在近轴条件下可以近似为菲涅尔积分。因为我们的输出采样点刚好在罗兰圆上相位因子正好是二次型可以直接用解析式乘上去不需要做完整衍射积分这能省大量计算。% 波长扫描范围围绕中心波长 ±4 nm lambda_list linspace(lambda_c - 4e-9, lambda_c 4e-9, 801); % 输出通道数及输出波导横向位置 num_ch 8; delta_x L_f * lambda_c / (n_eff * d_wg); % 相邻通道在输出面的间距 x_out (-(num_ch-1)/2 : (num_ch-1)/2) * delta_x; % 计算每个波长的输出耦合效率 T zeros(num_ch, length(lambda_list)); for s 1:length(lambda_list) lam lambda_list(s); k0 2*pi/lam; % 输入高斯场在阵列波导入口的振幅分布 E_in exp(-x_arr.^2 / w0^2); % FPR1 传播相位近轴菲涅尔近似 phi_fpr1 k0 * x_arr.^2 / (2*L_f); E_arr E_in .* exp(-1j * phi_fpr1); % 阵列波导长度及传播相位 L_i L0 (0:N_wg-1) * delta_L; phi_wg k0 * n_eff * L_i; E_arr E_arr .* exp(-1j * phi_wg); % FPR2 输出面聚焦叠加所有阵列波导贡献 for ch 1:num_ch phi_fpr2 k0 * (x_out(ch) - x_arr).^2 / (2*L_f); E_sum sum(E_arr .* exp(-1j * phi_fpr2)); T(ch, s) abs(E_sum).^2 / N_wg^2; end end逻辑说明这个循环做了四件事。第一生成输入高斯场第二乘上FPR1的二次相位模拟光从输入波导衍射展开到阵列波导入口的波前弯曲第三逐条波导乘上传播相位这是AWG最核心的一步——长度差ΔL带来的相位阶梯第四在FPR2里把每条阵列波导当成一个点源用二次相位近似模拟透镜聚焦效果再对N条波导的贡献求和。最后的归一化用N_wg²让峰值传输接近1方便读插损。参数说明w0影响耦合进阵列波导的光场宽度太小会导致高阶衍射损耗太大会让阵列波导边缘接收到的能量过低。d_wg和L_f一起决定delta_x即输出通道的物理间距。如果delta_x算出来和预期通道间隔对应不上优先检查这两个值。3.3 把传输谱画出来先看形状再看数值扫描完波长后把8个通道的传输谱画在同一张图上。% 画图波长域传输谱 figure; plot((lambda_list - lambda_c)*1e9, 10*log10(T), LineWidth, 1.2); xlabel(波长偏移 (nm)); ylabel(传输损耗 (dB)); ylim([-50 0]); grid on; title(AWG 8通道传输谱未含偏振与弯曲损耗);画图这一步有几个细节损耗用dB显示纵轴范围压到-50dB以上这样能看到串扰底横轴用相对中心波长的偏移方便直接读通道间隔。如果曲线出现“峰值不在0nm处”回查n_eff和delta_L是否匹配如果几条通道的峰值高低差超过3dB多半是输出波导位置没有按delta_x等间隔放。此时可以打印delta_x和x_out检查。3.4 粗扫加细扫两遍扫描法省时间上面代码逻辑正确但最外层遍历了801个波长内层还要遍历8个通道Matlab跑起来大概一两秒调参体验勉强能接受。如果想追求效率把扫描改成两遍第一遍粗扫201个点定位每个通道的真实峰值波长第二遍只在峰值附近细扫50个点用于精确读插损和串扰。这样总扫描点数从801降到大约600而且细扫只围绕峰值曲线更平滑。毕设答辩时老师问“你怎么确定通道间隔准不准”你可以直接拿细扫后的峰值波长列表给他看。4. AWG仿真参数怎么设阵列数、级次、通道间隔的取舍4.1 阵列波导数N先定串扰底线再定仿真速度阵列波导数N是AWG性能和仿真成本之间最直接的旋钮。N增大时输出面叠加的相干项变多聚焦光斑更尖锐旁瓣更低串扰指标更好但N增大意味着每轮波长扫描都要多做N次复数乘法仿真时间线性上升。以我的经验8通道AWG做课设N取64就够了40通道或要求串扰低于-30dBN取128甚至256也不过分。N低于32时传输谱的旁瓣会明显抬升串扰大概率停在-20dB附近上不去这是数组个数太少导致的衍射展宽不是算法错。4.2 衍射级次m和ΔLFSR与通道数必须匹配m越大ΔL越大FSR越小能放的通道越少。设计顺序是先决定通道间隔Δf_ch和通道数K算出需要的FSR再由FSR反推ΔL和m。例如100GHz间隔约0.8nm1550nm、8通道占用带宽约800GHzFSR取1200GHz比较稳对应的ΔL约等于c/(n_g·FSR_f)代进去算。先定级次再定通道数的顺序是反的容易把FSR做小了外侧通道直接没法用。4.3 通道间隔Δf和输出波导间距delta_x的关系通道在频率上是均匀分布的反映到输出面就是等间隔的聚焦位置。这个间隔delta_x由角色散决定可以用L_f、d_wg、n_eff算出来。调参时如果发现通道光谱间隔不均匀除了查FSR还要检查delta_x是否被固定成了常数。因为严格说角色散有轻微非线性通道远离中心时位置会略微偏离等间隔商业化AWG会做相位补偿课设模型里通常忽略但要在论文里写明这个近似答辩时能加分。4.4 一组可以直接抄的参数表下面这组参数用于8通道、100GHz间隔、1550nm窗口的课设仿真亲测能直接跑出干净谱线。参数数值备注λ_c1550 nm中心波长Δf_ch100 GHz通道间隔K8通道数m80衍射级次n_eff1.45相折射率n_g1.47群折射率N_wg64阵列波导数d_wg12 μm波导间距L_f500 μm自由传播区长度L050 μm最短波导长度w06 μm输入光斑半径注意这组参数对应的是独立波导模型没有包含弯曲损耗、偏振相关损耗和材料吸收所以仿真插损会比实际器件低几dB。写报告时要把“理想模型未计入哪些损耗”列清楚这比把仿真曲线调得漂亮更重要。5. AWG仿真避坑五个我实际翻车过的问题和排查方法5.1 现象中心波长偏了半个通道怎么调都不回到1550nm原因n_eff取了常数没有考虑材料色散。硅和二氧化硅的折射率随波长变化尤其硅波导在1550nm附近色散不小。相位递推里用了同一个n_eff算所有波长等效于把材料色散忽略了中心波长自然被“锁”在预设值附近但又对不上。解决用Sellmeier公式给n_eff加一个随波长微调的量或者在论文里明确“本模型采用固定折射率近似偏差约xx nm”。课设层面后者完全够用但要把偏差量化出来别留着隐患。5.2 现象传输谱毛刺很多曲线不光滑像被狗啃过原因波长扫描点数太少或阵列波导数N太小导致数值干涉旁瓣过高。801个点通常够如果只有101个点峰顶和峰谷会被漏采画出来就是锯齿状。解决把扫描点数提到801以上同时检查E_in的高斯分布有没有被截断——如果x_arr范围太宽而w0太小高斯尾巴在边缘处被硬切断会在频谱里引入振荡旁瓣表现为毛刺。此时适当扩大w0或者增加阵列波导数N。5.3 现象串扰停在-20dB怎么压都压不下去原因最常见的是输出端只采集了离散点没有对聚焦光斑做积分。AWG输出波导有有限宽度应该对光斑在输出波导口径上做重叠积分而不是只取中心点的强度。只取中心点旁瓣能量被忽略串扰被低估但因为你同时忽略了很多数值细节结果串扰反而“压不下去”。解决在输出波导位置对邻近几微米范围做高斯加权积分等价于给输出波导加一个模场匹配因子。这一步能明显改善串扰曲线的平滑度。5.4 现象运行结果全NaN或者相位递推发散原因绝大多数是单位混用。k02π/λ如果λ用了纳米而L用了微米相位项变成巨大数cos和sin振荡剧烈数值上直接NaN。解决写一个check_unit()函数把所有参数打印出来标注单位跑运算前人工确认一遍数值量级。另一个常见原因是指数项里1j乘出来的复数相位没有用unwrap处理导致相位跳变——但在AWG这种周期结构里相位跳变本身是物理现象不需要unwrap只需要保证最后的叠加是复数求和而不是取相位再叠加。5.5 现象调一次参数跑几十秒完全没法做参数扫描原因三重循环——外层波长扫描、中层通道扫描、内层波导叠加。复杂度O(波长数×通道数×N)。解决把内层波导叠加改成矩阵乘法。把所有阵列波导的复振幅排成行向量所有输出通道的聚焦相位排成矩阵一次矩阵乘法完成全部通道叠加。优化后跑800个波长×8通道在普通笔记本上从十几秒降到一两秒。代码写完之后顺手用tic/toc测一下耗时这个数据写进论文的“算法效率”小节很加分。6. 让仿真结果更可信三个进阶验证技巧和我的习惯6.1 用解析解做基准先验证单波长聚焦场整个仿真跑通后先别急着扫波长。固定中心波长只算一个波长的输出面光场分布把光场画出来和理论焦点的位置、光斑尺寸对比。AWG在单波长下相当于一个聚焦透镜阵列理论上聚焦光斑尺寸大约由衍射极限决定w_spot ≈ λ·L_f/(π·w0)。如果仿真光斑宽度和理论值差超过50%说明FPR相位近似或采样密度有问题。这一步能在一分钟之内抓住低级错误比直接看传输谱快速得多。6.2 群延迟验证光通信仿真不能只看幅度AWG做滤波时群延迟的平坦度直接影响信号质量。在Matlab里群延迟可以从传输系数的相位谱数值微分得到τ_group -dφ/dω。验证方法是看每个通道通带内的群延迟波动理想AWG在通带内波动应该在几ps以内。如果波动大多半是阵列波导相位递推里n_g和n_eff混用了。很多课设作品只画幅度谱画了群延迟的答辩老师会另眼相看。6.3 峰值插值与自动找通道用interp1提高调参效率手动从图里读数太慢我习惯在扫描完粗谱后找每条通道的最大值位置再做抛物线插值精确定位峰值波长。粗扫201点step约0.04nm插值后能把通道间隔误差读到0.01nm级别足够验证100GHz间隔设计。这个环节不用额外工具箱核心就三行代码先max找峰值索引再用峰值前后各两个点做抛物线拟合。做完后把实测通道间隔和设计值打在一张表里偏差小于0.5%就可以收工。最后说一个我自己的习惯每改一次参数把对应的传输谱截图存进项目文件夹命名带日期和关键参数。AWG仿真的调参空间很大N、m、d、L_f四个量之间互相牵连改一个量经常连带其他量也要改。不存档调了两天后可能已经忘了最初那组“跑出漂亮谱线”的参数是怎么组合出来的。这个习惯帮我在写毕设论文时省了大量重跑时间。希望帮到你。本文还有配套的精品资源点击获取