ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于Matlab/Simulink的SAW谐振器COM模型仿真实践

基于Matlab/Simulink的SAW谐振器COM模型仿真实践 做了多年射频前端手头有SAW谐振器要评估性能时我很少直接开COMSOL去啃三维压电有限元。原因很简单结构还没定、工艺参数也未必准先把整颗谐振器的阻抗/导纳扫出来再把匹配网络、振荡器环路一起放进去看用Matlab的COM模型耦合模模型是性价比最高的路子。这篇就把我基于Matlab/Simulink搭SAW谐振器COM模型仿真的一整套思路、代码骨架和踩过的坑写出来适合正在做SAW滤波器设计、振荡器频综选型或者想从有限元转到快速行为级仿真的工程师也适合研究生想快速出响应曲线的场景。1. 为什么是MatlabCOM模型而不是一上来就有限元1.1 COM模型和COMSOL有限元的分工很多刚接触SAW器件的朋友容易陷入一个误区要仿真谐振器就恨不得把叉指换能器每一个电极都建出来、压电衬底的各向异性材料矩阵全部填进去然后跑一个透不过气的三维模型。COMSOL确实能干这事而且对于提取某个具体电极结构下的声波反射系数、相速度修正这些微观参数它几乎是必须的工具热搜词里也有不少人拿COMSOL算BAW谐振器。但放到整颗SAW谐振器、整个滤波器的频响设计上有限元的代价是几何级数增长的。COM模型的核心思路完全不同它把叉指换能器和反射栅当成一个连续的耦合传输线网络用一组慢变包络方程去描述两个相向传播的声波模式前向波R、后向波S和电学端之间的耦合。换句话说它不需要知道每个电极的应力分布长什么样只需要几个集总参数相速度、机电耦合系数、反射系数、传播损耗、静态电容。有了这几个参数Matlab里几百行代码就能把一个单端口谐振器的导纳曲线扫出来一条扫频曲线往往几秒钟就出结果这个速度对版图初调、参数提取、系统级联仿真来说是决定性的。还有个现实原因在器件级设计阶段很多关键参数本身就不确定。金属化比、膜厚、电极材料这几项直接决定COM参数而这些参数通常要靠量测校准或者局部有限元提取。与其把一个误差未知的几何模型放大到整颗器件不如先用COM模型搭好框架等量测数据回来再反推参数、迭代校准。这正是工程上最常用的路径。1.2 一个完整的仿真流程应该长什么样我自己的习惯是分成四步走参数准备根据工艺结构N掺、晶向、电极厚度/金属化比确定COM参数初值。来源可以是文献、量测或者局部COMSOL模型提取Matlab核心计算按COM方程构造P矩阵或等效状态转移矩阵做频域扫描得到谐振器的Y参数或S参数顺便做导纳/阻抗换算画出导纳圆图、阻抗曲线等效电路拟合从Y参数里提取BVD等效电路动态Lm、Cm、Rm加静态C0或者用有理函数拟合这一步是为了给系统级仿真和后续优化提供一个更友好的代理模型Simulink系统联仿把器件模型嵌入到振荡器环、匹配电路或者接收链路里看系统层面的响应。这套流程最大的好处是每一层都可以独立更换参数或替换模型调试成本低。下面我把关键环节逐个拆开细说。2. COM模型的基本方程与P矩阵的数值构造2.1 从耦合模方程说起三个方程、五组参数COM模型中的耦合模本质上描述的是这样一幅画面在一个声表面波谐振器里前向传播的声波会被换能器电极周期性地反射形成后向波与此同时压电效应让电场能够激励出声波声波也能反过来在电极上感应出电流。把这几个物理过程写下来就得到标准的COM方程符号约定我采用的是Abbott和Hashimoto体系的版本具体文献对照在后面章节展开dR(x)/dx -jδ·R(x) jκ·S(x) jα·V dS(x)/dx jκ·R(x) jδ·S(x) - jα·V dI(x)/dx -jα·R(x) - jα·S(x) jω·C·V其中R(x)、S(x)分别是前向波和后向波的复振幅包络δ是失谐量δ ω/v - π/P它表示激励频率与Brillouin边界之间的接近程度P是电极周期κ是反射系数单位是1/m它决定反射栅的阻带宽度和中心频率处的反射率α是换能系数单位是sqrt(S/m)量纲它耦合了声波和电学量C是叉指换能器单位长度的静态电容γ如果计入传播损耗可以在δ里加一个负虚部-jγ/2也可以直接在波数里摊进去。在实际器件里计算频率离同步频率不远所以δ很小反射系数κ的实部来自电极质量加载和边界反射虚部通常较小。失谐量δ、反射系数κ和器件长度L共同决定了谐振器阻带的形状这是理解COM仿真结果的最重要的直觉基础。2.2 用状态转移矩阵统一处理任意剖面COM方程是一组线性常微分方程所以对于每个均匀剖面段都能用指数矩阵直接写解析解。这一点是Matlab实现的核心便利不需要像时域有限差分法那样逐个网格去推进。我们把前两行方程整理成矩阵形式d/dx [R(x)] [ -jδ jκ ] [R(x)] [ jα ] V [S(x)] [ jκ jδ ] [S(x)] [ -jα ]记矩阵为A激励矢量为b。如果这一段长度是L那么解是[R(L)] [R(0)] [S(L)] exp(A·L) · [S(0)] A⁻¹·(exp(A·L) - I)·b·V右边第一项是只传播不激励的声波过渡关系第二项是外加电压在段内产生的声波源。这就是状态转移矩阵的用法。对一段IDT来说总过渡矩阵是各子段过渡矩阵按空间顺序的乘积对整个谐振器我们按照反射栅 IDT 反射栅的结构逐段乘下去再配合边界条件求解。用这个方法有个明显好处不需要背各种特定结构的显式P矩阵公式。无论你是均匀光栅、分裂指、加权重叠的换能器还是带汇流条电容的复杂结构只要把剖面按小段分割逐段求expm矩阵再乘起来就行。Matlab里expm函数对矩阵指数做得非常稳按频点扫几百上千次也不心疼。2.3 从状态转移矩阵到P矩阵对于工程仿真最终拿到手的一般是P矩阵。P矩阵是一个3x3矩阵把声学端两个口的入射波、出射波和电学端的电压、电流关系写在一起表示成一个线性方程组。上面用状态转移矩阵算出来的其实是内部的波幅关系组装P矩阵时只需要结合边界条件和段内电流积分。对一段均匀IDT电流增量满足第三个COM方程把R(x)、S(x)的表达式代进去从0积分到L就能得到I(V, R(0), S(0))的线性关系。再把声学端满足的末端边界条件例如左端R(0)已知但S(0)未知、右端S(L)已知但R(L)未知代入经过几步线性消元就得到P矩阵的全部元素。这个过程在Matlab里可以用符号推导确认一遍之后用数值例程直接实现每次频率迭代时只做矩阵乘法和线性求解。这里特别提醒一点P矩阵的相位参考面必须固定不能在不同段之间反复横跳。很多初学者以为P矩阵的元素是值直接在频点上拿来拿去结果算出来的群延时曲线惨不忍睹。我一般习惯把相位参考面统一放在IDT的几何中心所有段的声学端口坐标都换算到同一参考面再乘过渡矩阵这是避免后期相位类问题的最省心做法。3. Matlab代码实现与关键数值坑3.1 一个可直接扩展的代码骨架下面这段是我自己工程项目的核心骨架把参数用结构体封装好方便后续做参数扫描和拟合。代码里的COM参数都用了示意值真实器件的数值需要通过量测或局部有限元提取不要直接拿这个结果用在产品上。%% SAW谐振器COM模型频响计算骨架 % 结构短路反射栅(左) 换能器IDT 短路反射栅(右) % 参数封装 p.v 3480E3; % 相速度 (mm/s)注意单位与长度统一 p.Ks2 0.0065; % 机电耦合系数 K^2 p.kappa 12E-3; % 单位长度反射系数 (1/um)示例值 p.Cd 2.5E-15; % 单位长度静态电容 (F/um)示例值 p.gamma 2E-6; % 传播损耗 (1/um)示例值 p.Lg 100; % 反射栅长度 (um) p.Lt 200; % IDT长度 (um) p.P 4.0; % 电极周期 (um) p.Ng round(p.Lg / p.P); % 反射栅周期数实际按电极宽度细分 p.Nt round(p.Lt / p.P); % IDT周期数 f0 p.v / p.P / 1E3; % 同步频率 (GHz)用于设定扫描区间 f linspace(0.90*f0, 1.10*f0, 2001); % 频率扫描范围 w 2*pi*f; Y zeros(size(f)); % 导纳随频率变化 for idx 1:length(f) omega w(idx); delta omega/p.v - pi/p.P; % 失谐量 delta delta - 1j*p.gamma/2; % 计入传播损耗 % 每个周期的声学A矩阵 A [-1j*delta, 1j*p.kappa; ... 1j*p.kappa, 1j*delta]; T_period expm(A * p.P); % 指数矩阵 % 左反射栅短路光栅V0状态转移矩阵按周期连乘 % 右反射栅同理这里简化成直接连乘 T_left T_period^p.Ng; T_right T_period^p.Ng; % IDT段的激励项需要重算这里示意只做声学过渡矩阵 % 对完整P矩阵实现需要同时算b激励项、积分电流项 % 此处省略详细P矩阵元素组装聚焦流程骨架 % ... % 求Y通过边界条件消元后得到 Y I/V Y(idx) ...; % 调用内层P矩阵组装函数得到 end % 绘图 subplot(2,1,1); plot(f, 20*log10(abs(Y))); xlabel(频率 (GHz)); ylabel(|Y| (dB)); subplot(2,1,2); plot(real(Y)*1E3, imag(Y)*1E3); xlabel(电导 (mS)); ylabel(电纳 (mS)); title(导纳圆图); axis equal;实际工程中我不会把IDT段只用一个周期矩阵乘Nt次就完事因为IDT段内V≠0每个周期都会激励声波需要在状态转移的每一段把激励项b包进去并且把每个周期的电流增量积分出来。更精确的写法是把每个周期分成两个半周期分别处理正负叉指指条这样还能支持分裂指结构。但核心逻辑不变——状态转移矩阵连乘、边界消元、电流积分。3.2 符号约定与坐标参考面最容易翻车的两件事COM模型最大的坑在于符号约定。在公开文献里有的作者把δ定义为ω/v - π/P有的定义为π/P - ω/v有的把κ写成纯虚数有的写成纯实数α前面的正负号也五花八门。这直接导致同样的物理器件从两套代码算出来的谐振频率偏移方向可能完全相反。我的经验是从第一篇确定使用的文献开始就把它的坐标方向、相位参考面、符号定义做成一个备忘录放在代码文件头部并且用一个最简单结构比如一段短路光栅去自检。自检方法短路光栅两端都是自由边界R(0)0、S(L)0的反射条件算出来的阻带中心应该落在δ0处反射系数的相位要和理论值一致。如果你发现阻带位置偏了或者反射相位反了几乎一定是符号约定问题而不是数值问题。另一个隐蔽问题是长度单位。COM参数里κ的单位是1/mδ的单位是1/mα的单位是紧跟着V和功率归一化的。一旦把微米、毫米混进去指数矩阵expm(A·L)里的参数就会差好几个数量级矩阵指数直接爆炸或退化成零。建议全程统一用微米和GHz配对反正Matlab里数值是无量纲的只要一致性保持住就行。3.3 频率采样、插值与数值振荡频域扫描范围我一般取同步频率的±10%到±15%点数1000到2000就够画平滑曲线了。更多点数对提升精度没意义反而会让耗散项传播损耗的积累效应被截断误差干扰。如果后期要做优化迭代我会先用2000点扫一次然后把扫出来的Y参数插值到对数间隔的频率轴上再做后续处理。要注意的是SAW谐振器的Q值很高谐振峰附近的Y变化极快直接用interp1做线性插值会削峰必须用样条插值并且最好在峰附近加密采样点。我见过有人为了省时间降低频点数量结果阻抗曲线在反谐振点附近出现一条明显割线那就是采样点没到位。矩阵指数的计算上expm函数本身精度不错但每个频点都要算2000个频点叠加下来也会拖慢速度。优化的思路是对每个均匀段先对A矩阵做特征值分解用特征值和特征向量直接写出指数矩阵的解析式这样每个频点只需要算两个对角项的指数速度快一个量级。代码复杂一点但在做参数扫描时很值。4. 从导纳曲线到阻抗曲线别在复数换算上翻车4.1 频域复数换算的正确姿势这个看起来简单但热搜词里居然有不少人在问如何从导纳曲线经过公式换算绘制成阻抗曲线——说明实际操作中翻车的人不少。答案是Z(f) 1 ./ Y(f)注意是复数逐点除法不是对幅度取倒数。Matlab里如果Y是复数数组直接写Z 1 ./ Y;就行。然后实部就是电阻Rs、虚部就是电抗Xs可以画Rs(f)和Xs(f)两条曲线也可以画Smith圆图。容易出问题的地方有三个忘了点除和数组转置。1/Y和1./Y在Matlab里含义完全不同前者可能是矩阵求逆或者按矩阵运算规则广播结果完全乱套在导纳域做平滑、滤波或门控操作之后再去换算阻抗。凡是涉及去嵌、时域门控、平均平滑的操作必须在同一个域里做。比如你在时域门控中把包络截断了相当于对频域数据做了卷积这时候再转换到阻抗域相位信息其实已经被扰动了换算完之后把坐标轴搞反。导纳圆图和阻抗圆图的实轴、虚轴是互换的有人直接从plot(real(Y), imag(Y))改成plot(real(Z), imag(Z))就完事结果圆图旋向了。其实应该是共轭匹配关系画之前想清楚自己到底要看什么。4.2 用阻抗/导纳曲线看谐振器特性的方法对单端口SAW谐振器我最常用的可视化方式是一张图里同时画出|Y|幅频曲线和Smith导纳圆图。幅频曲线用来读两个关键频率串联谐振频率fs|Y|极大值处电导最大此时动态支路谐振阻抗接近纯阻Rm并联谐振频率fp|Y|极小值处电纳接近零点此时反谐振阻抗极大。而Smith圆图用来观察谐振器与线路阻抗的匹配关系。谐振器在Smith图上表现为一个从开路附近出发的大圆弧跨过fs时穿过近短路区到fp时回到近开路区。圆的大小和位置直接告诉你等效并联电容C0和动态支路的耦合强度。如果圆图扁扁的、没有明显穿过原点附近那多半是κ太小、反射栅太弱或者换能器周期数不够能很快帮定位设计问题。4.3 去嵌与并联寄生电容的影响实际工程中量测到的Y参数里还叠着焊盘电容、走线电感、衬底漏电这些寄生分量。在做COM仿真和量测对标时必须做去嵌。而这个去嵌过程本身也涉及域的转换先量测一个开路焊盘结构得到Y_open再用公式Y_dut Y_measured - Y_open做并联去嵌对于串联电感串扰则需要先转成Z域做减法。如果你把两条导纳曲线都画在复平面上直接相减原理上没问题但要注意相位参考面必须一致。否则去嵌完会在高频段引入一阶残余看起来像多了一个寄生串谐查半天查不出原因。5. 进入Simulink做系统级联仿真的扩展方案5.1 为什么要把COM模型搬进Simulink器件级的Y参数只是第一步很多实际设计场景需要把SAW谐振器放进一个更大的系统里看行为。比如设计一个SAW振荡器你得把谐振器、有源电路、反馈网络放在一起看起振条件和稳态频谱设计一个射频前端滤波器你得把SAW滤波器作为二端口网络放进系统链路里和前级LNA的S参数一起看带外抑制。Simulink适合干这个活但Simulink不擅长直接解COM偏微分方程。所以通常的做法是把Matlab算出来的行为级结果整理成Simulink能吃的模型。有三种方案按推荐程度排序。5.2 方法一频域查表最省事精度高如果仿真场景本身就是频域的比如扫频激励、正弦稳态分析那直接把Matlab算好的频率-导纳表导入Simulink的Lookup Table查找表就行。Simulink里的n-D Lookup Table支持对复数数据的插值前提是你在Matlab里先把复数拆成实部和虚部两个通道再给查找表配置断点数据。断点用线性刻度也可以在峰附近手动加密断点。这种做法的好处是完全保留COM模型的精度不存在等效电路拟合误差。坏处是它是频域表不能直接用于瞬态仿真因为你没有一个时域卷积器的显式状态空间模型。如果系统仿真需要看瞬态起振波形就得用方法二或三。5.3 方法二BVD等效电路拟合瞬态友好的标准路线BVD等效电路是SAW谐振器最经典的集总电路模型一个静态电容C0并联一个动态支路动态支路由Lm、Cm、Rm串联构成。要把它用于Simulink关键是提取这五个参数实际上对单谐振器是三个动态参数加一个C0有时再串一个Rs。提取方法是在Matlab里对COM模型算出的Y参数做复平面拟合。最常用的做法是从Y(f)的实部最大值确定Rm由fs和fp以及C0的关系确定Lm、Cm关系式为Cm ≈ C0·(fp²-fs²)/fs²Lm 1/(ωs²·Cm)用lsqcurvefit优化上述初值目标函数是复导纳的实部虚部加权误差。拟合好之后在Simulink里直接搭一个RLC串联支路并联电容的电路模型就能做瞬态仿真。这个方法网上资料多我就不贴具体电路图了只说两个重要经验C0的拟合值强烈依赖于频率范围和拟合权重我一般把权重放在fs和fp附近±1%的区间这样对谐振器最重要的特征频率区间精度最高Rm在谐振点附近不是一个常数它会随频率缓慢变化但BVD电路只有一个固定Rm所以拟合区间拉太宽会失真。如果你的系统仿真关心的是宽带噪声或者谐波建议把拟合区间收窄到工作频率附近。5.4 方法三S函数直接集成状态转移矩阵最灵活也最费劲如果实在不想丢掉COM模型的所有内部状态可以在Simulink里写一个S-Function把状态转移矩阵的计算直接嵌进去。这个思路在热搜词里也能看到比如simulink模型 c代码生成、simulink c function这类需求都很常出现。做法是用Level-2 S-Function以频率为输入以Y参数或S参数为输出每次仿真步进时调用Matlab COM计算函数。好处是模型参数结构尺寸、COM参数直接在S-Function函数里修改就能重新编译适合参数扫描和联合优化。坏处是仿真速度慢因为每个步进都要跑一遍矩阵指数而且对普通工程师来说S-Function的调试体验远不如纯Matlab脚本流畅。我的建议是除非你确实需要每个时刻都动态改变器件参数比如研究温漂过程中谐振器特性变化对环路的影响否则优先用查表或BVD拟合。6. 参数提取、调参顺序与实测对标经验6.1 从实测S参数反推COM参数的基本链路很多项目真正难的不是搭仿真而是让仿真和实测对上。我的对标流程是这样先用网络分析仪测单端口谐振器的S11转成阻抗或导纳从阻抗实部曲线读出串联谐振频率fs和反谐振频率fp粗略估算C0和动态参数以这些初值作为起点用fminsearch或lsqcurvefit做局部优化目标函数是复导纳在扫描频段内的差值加权范数优化参数量要控制住。COM参数里影响最大的是相速度v决定fs位置、K²决定fp-fs带宽、κ决定反射强度和带外响应深度、α决定换能效率、γ决定峰锐度。我一般一次只优化两个参数其他固定避免参数漂移到物理上不合理的区域。从实测数据提取COM参数这个方向我建议的思路是先用一个宽带测试结构的导纳实测值以频率偏移v和耦合强度K²为主做粗调再用两个不同长度的谐振器去联合提取κ和γ。单靠一个结构往往没法同时约束这么多参数。6.2 调参顺序的工程经验参数调优时最忌讳把所有参数丢给优化器一把梭。我的固定顺序是先定相速度v锁fs校准频率轴再调K²锁fp-fs的频率间隔这会确定动态谐振和反谐振的间距调κ锁阻带的锐度和带外衰减深度调γ锁谐振峰Q值也就是谐振峰3dB带宽最后微调C0锁fp附近导纳圆的位置和静态电纳。这个顺序从物理直觉上讲很顺每个参数对频率响应的某一个特征最敏感比盲调快得多。反过来如果从一开始就让所有参数自由浮动优化器很容易跑进一个局部最优算出来的响应曲线看着还行但参数值完全没有物理意义换一个结构就崩。6.3 两个容易被忽视的实测细节第一测试架校准方式对高频段影响极大。SAW谐振器的fs通常在几百MHz到GHz以上SOLT校准如果参考面没对准焊盘等效串联电感会在阻抗曲线上叠加一条随频率上升的正斜率看上去像多了一个寄生谐振。解决办法是在校准之后做一次焊盘短路件测试确认残余电感量级。第二环境温度对相速度的影响是大约几十ppm/°C这个偏移会让fs移动。如果你在25°C下提取的参数拿到85°C的实测数据去验证仿真freq shift肯定对不上。我的做法是在相同温度条件之下做参数提取或者单独把温度系数也建模进去在COM方程里给v加一个线性温度项。7. 结语前的一点实战体会这套COM模型Matlab/Simulink的流程我在两个项目里实际验证过一个是某射频前端滤波器的初步选型用COM模型快速扫了十几个结构参数组合筛出两个候选版图再去做有限元验证另一个是SAW振荡器的环路设计把谐振器BVD参数提取后丢进Simulink和环路一起看起振裕度。两个项目最终都和实测对上了误差主要来自量测寄生和温度漂移核心谐振特征能对上1%以内。如果你是刚接触这块的新人我的建议是不要一上来就追求完美匹配。先把COM模型最短的路径走通——用文献里的参数跑出合理的谐振曲线然后换你自己的工艺数据最后再逐步引入优化和等效电路拟合。不要在符号约定上死磕太久选一个体系用到底出现方向性问题再回头检查。仿真工具的价值从来不是精确代替量测而是让你在动手流片之前能用几分钟时间把设计空间踏踏实实地走一遍。
返回列表