简介面向射频与无线通信设计者的高级设计系统应用笔记聚焦利用Ptolemy协同仿真计算邻道功率比ACPR、误差矢量幅度EVM与功率附加效率PAE解决功率放大器设计中频谱泄漏、调制精度与效率评估的工程问题。文档以增强型数据速率GSM演进EDGE信号源为例逐步搭建功放测试原理图使用规范兼容的接收器测量相邻与交替频道功率比并结合偏置电压电流计算平均直流功耗与效率适合需要掌握射频仿真验证方法的工程师与研究生。自动验证建模技术通过谐波平衡仿真预表征子电路显著提升协同仿真速度同时支持功率扫描与蒙特卡洛分析可观察器件尺寸、负载阻抗、偏置条件等参数变化对三项指标的影响为优化设计提供依据。整份资料为单个PDF文档约1.8MB已有2759人学习/下载适合作为功率放大器线性化与效率设计的实用参考。1. ADS仿真ACPR、EVM、PAE一份Ptolemy协同仿真例子能解决什么功放设计的收官阶段最烦的不是调匹配而是ACPR、EVM、PAE三个指标要分开测、分开仿ACPR要盯频谱泄露EVM要摆矢量误差PAE要算直流功耗三套仿真逻辑各搞一套数据还常常对不齐。ADS里的Ptolemy协同仿真把这三件事收进同一条链路一个符合协议要求的EDGE信号源把调制信号喂给待测功放子电路输出端挂上针对ACPR、EVM和平均发射载波功率的测量组件输入功率扫一遍三条曲线连同增益、增益压缩一起出来。更值钱的是这套测试台不是只能跑单点它可以叠加参数扫描和蒙特卡洛统计直接回答“哪个参数对指标影响大、把它改成多少能改善性能”这种设计问题。示例工程本身就带了三个版本基础功率扫描、功放子电路内参数扫描、带统计变量的蒙特卡洛。适合正在做射频功放、要出仿真报告又不想在几种仿真器之间来回倒腾的工程师。我第一次看到这套例子时以为要先过一遍随机过程才能动实际跑下来发现真正决定成败的就是时间步长对齐、AVM特征化范围和数据保存三个开关。下文按这个顺序把测试台拆开讲。2. 搭建Ptolemy协同仿真链路信号源、测量组件与包络控制器的三层配合2.1 顶层测试台一组测量组件各管一件事基础版示例工程里顶层测试台叫Swept_Power_TB。从左往右看信号通路很干净EDGE_Signal_Source生成符合规范的EDGE调制信号输入功率由变量Pin控制扫参范围在示例里是-20dBm到16dBm信号经过Power_Amp_Subcircuit待测功放后分三路送给测量组件。为什么示例选EDGE而不是其他制式因为EDGE是8PSK线性调制的经典代表有一定峰均比功放非线性会同时体现在ACPR和EVM上用来验证“线性度与效率之间怎么取舍”特别合适。它又不像OFDM那样峰值过高导致仿真时间失控所以作为协同仿真教学案例EDGE的测量组件在ADS里是最成熟的一组EVM和ACPR算法都经过验证。你以后把信号源换成LTE或WiFi链路结构不用动只是测量组件换一套。三个测量组件各管一件事。EDGE_EVM_Meas负责误差矢量幅度反映调制精度EDGE_4CH_ACP_Mod_Meas负责邻道和交替道功率比也就是ACPR/ACLR它是从标准的EDGE_TxORFS_Modulation_Meas改过来的扩展成四通道测量EDGE_Pwr_Meas_Local负责平均发射射频载波功率这个名字带Local的组件是标准功率测量组件的本地副本主要改动是减少了测量时隙数仿真速度能快一截。这三个组件都是“规格兼容”的接收端含义是它们内部已经封装好了协议规定的滤波、时隙选择和平均算法你不需要自己写EVM的归一化过程也不用手工算邻道功率积分。对做PA的人而言这就像把一台信号分析仪放进了原理图。我把各组件在测试台里的角色整理成一张表方便你在自己的工程里对照组件名角色关键动作EDGE_Signal_Source调制信号源按EDGE规范生成信号输出功率由Pin变量控制Power_Amp_Subcircuit待测功放运行Envelope/Transient仿真内部含偏置网络和匹配网络EDGE_EVM_MeasEVM测量对解调符号做误差矢量幅度统计EDGE_4CH_ACP_Mod_MeasACPR测量测邻道与交替道功率比支持四通道EDGE_Pwr_Meas_Local平均载波功率测量本地副本减少时隙数加快仿真VD_Bias / ID_BiasPAE辅助测量全局节点输出偏置电压CCVS输出偏置电流对应电压VD_Bias和ID_Bias这两个节点在第3章算PAE时是关键先记住它们的位置。2.2 子电路里的Envelope controllerStep必须设Stop别管功放子电路内部必须放一个Envelope控制器或Transient控制器这是Ptolemy协同仿真的前提少了它ADS直接报错。很多人第一次搭的时候把它当成普通瞬态仿真控制器来填Stop设一个很大的时间Step设得很小结果仿真时间长得离谱。原因在于协同仿真里控制器的Stop参数是被忽略的。仿真什么时候停由顶层测量组件的需求决定顶层sink要求多长时间的数据Ptolemy引擎就驱动底层仿真的时间窗口跑到什么时候。你在子电路里写Stop等于几十微秒它不会真按这个数停下来。真正要改的是Step也就是包络仿真的时间步长它决定基带信号在包络域的更新间隔。为什么包络仿真而不是瞬态功放工作在GHz载波时瞬态仿真为了分辨载波周期时步必须压到皮秒级仿真量完全不可接受。Envelope仿真把载波当作已知条件只求解包络变化窄带调制场景下效率和精度兼顾。原例子用Circuit Envelope控制器本质就是用这个特性换速度。这里有个习惯值得养成打开子电路先看Envelope控制器的Step参数是硬编码数字还是引用VAR变量。如果发现是数字就把它改成引用变量变量定义与顶层信号源保持一致。这样以后换信号源制式只改一处。注意协同仿真模式下Envelope控制器的Stop参数不参与计时控制不要在这里设置仿真停止时间。2.3 时间步长对齐把信号源的方程复制进子电路示例工程的做法很直接打开EDGE_Signal_Source找到定义时间步长的方程组把这组方程原样复制到功放子电路的VAR块让Envelope控制器的Step指向同一个变量。以文本形式看大致是下面这种结构; 顶层EDGE源内部的时间步长方程示意写法具体数值以你的源配置为准 sym_rate 270.833e3 ; EDGE符号率单位Hz oversample 16 ; 过采样倍数 Step 1 / (sym_rate * oversample) ; 将以上方程复制到Power_Amp_Subcircuit的VAR块 ; Envelope控制器的Step参数直接填写变量名 Step ; 协同仿真中Stop参数不参与控制保持默认即可这里有几个点要说明。第一sym_rate和oversample是根本变量Step是它们的派生量所以复制时要连原始定义一起复制不能只抄Step那一行否则变量引用会断。第二oversample决定包络域对调制信号的采样密度16是常见保守选择过小会让基带波形失真过大会拖慢仿真没有特殊理由不建议动它。第三如果顶层源不是EDGE而是其他制式时间步长的定义式会变但“复制源端方程到子电路”这个套路不变。如果两处时间步长对不齐会怎样Ptolemy数据流域按源的步长采样包络仿真按控制器的步长更新两个网格错位后信号在源端和功放端之间被重新采样插值误差一路累积进EVM和ACPR统计里。这类误差很难发现它不报错只是让结果偏大或偏小反复检查测量设置都找不到原因最后发现是时间网格差了一个比例。做这一步时我一般会顺手做一个验证先在顶层把Pin固定到扫描范围的中间值跑一次短仿真然后打开EDGE源和子电路VAR块对比Step变量计算出的数值是否完全一致。如果一致再去跑完整扫描基本不会因为时间网格出问题。3. 算PAE的取巧路径用CCVS把偏置电流搬进顶层测试台3.1 为什么协同仿真里取不到支路电流PAE的定义是输出RF功率减去输入RF功率再除以平均直流功耗。分子容易拿前面三个测量组件已经把输出功率和输入功率都测出来了难的是分母里那个平均直流功耗。在纯Analog/RF原理图里这个值很好算对偏置电压和偏置电流的乘积做平均就行基带包络的区间就是从0Hz到0.5除以仿真时间步长。但一进Ptolemy协同仿真规则变了支路电流不能直接往外引普通节点电压也不能直接被顶层读取这是协同仿真引擎的接口限制不是你没找对地方。示例工程给的解法很巧妙。先用电流控制电压源CCVS做一次单位转换把偏置电流映射成一个节点电压再把偏置电压节点和这个电流对应的电压节点都设成全局节点global node让它们从子电路冒到顶层。顶层拿到电压信号后和偏置电压信号做乘法求平均就还原出了平均直流功耗。整个过程像搭了一条临时的模拟测量总线。这个方案的高明之处在于CCVS的转换系数只需要保持线性恒定不需要和物理量纲严格绑定因为VItoPower做完乘法和平均后结果里会带着这个固定比例系数。只要比例是常数PAE曲线形状就不受影响。3.2 偏置节点的三段搬运全局节点、EnvOutSelector、VItoPower具体链路分三步。第一步在功放子电路里把偏置电压节点设为全局节点例如VD_Bias再用CCVS去感知偏置支路电流输出一个线性对应的电压节点ID_Bias。这样模拟域里原先不对外暴露的电流信息就被转换成顶层可见的电压信息。第二步在顶层的每个全局节点上接EnvOutSelector把OutFreq设为Lowpass。这一步的作用是滤波只让基带分量通过。为什么一定要低通因为PAE关心的是偏置电压和电流的平均值高频包络分量对平均功耗没有贡献反而会让后续求平均值时引入数值毛刺。反过来如果设成Highpass你看到的会是交调分量的波动那不是平均功耗需要的信号。第三步把VD_Bias和ID_Bias两路信号同时送进VItoPower组件这个组件内部做两件事把两个输入相乘再在测量窗口上求平均输出的就是平均直流功耗P_DC。数学含义很直白平均直流功耗等于偏置电压和偏置电流乘积的时间平均。在包络域里这两个信号都是基带量所以这个平均就是统计意义上的时间平均。下面这个文本块是我整理出的链路清单照着在工程里把组件拖出来连一遍即可; PAE测量链路配置对应Swept_Power_TB顶层的P_DC测量路径 功放子电路内部: VD_Bias_Node - 设为全局节点命名 VD_Bias CCVS - 输入端接偏置电流支路输出端命名 ID_Bias 电流到电压的转换增益系数按1设计 顶层测试台: EnvOutSelector(x2) - 输入分别接全局节点 VD_Bias / ID_Bias OutFreq Lowpass 只取基带分量 VItoPower - 输入1 低通后的VD_Bias 输入2 低通后的ID_Bias 输出 平均直流功耗 P_DC NumericSink - 送P_DCStart Stop 最后一个采样编号这份清单里CCVS的转换系数值得再强调一遍它不需要和某个物理量纲严格对应因为VItoPower做完乘法和平均后会带着这个固定比例系数你只需要一个与偏置电流成线性比例的电压信号。全局节点的命名规范也建议统一VD_Bias、ID_Bias这种带下划线的短名字在顶层引用时更不容易写错。另外注意PAE的这条测量路径和调制制式无关。不管信号源是EDGE还是LTECCVS加VItoPower的套路完全一样因为你测的是偏置侧的直流功耗和信号侧用什么调制没有耦合。这也是这套例子值得留存的原因——换个项目链路大部分能直接复用。3.3 NumericSink的Start/Stop设置顺手缩小数据集PAE链路最后一级是NumericSink用来保存P_DC。示例工程特意把Start和Stop设置为同一个值也就是最后一个采样编号让NumericSink只输出一个标量而不是整条波形。这个动作看起来不起眼实际作用很大。协同仿真产生的中间波形数量本来就多如果每个NumericSink都保存整个时间序列数据集会迅速膨胀仿真结束后打开数据显示都会卡顿。把Start和Stop设成同一个点后数据集里只有最终标量文件体积和内存占用都降下来。同理适用于其他测量组件。你不需要在工程里看的中间量尽量让sink收敛到一个点需要看波形的关键信号再单独保留。这是我在跑完第一版示例后最想改掉的毛病——一开始我把所有sink都留着完整波形结果一次扫描跑出几个GB的数据得不偿失。那什么情况下需要保留完整波形比如你想观察偏置电压随调制包络的瞬态波动看电源退耦是否足够这时候完整波形是有价值的。但大多数ACPR、EVM、PAE的规格验收场景你只需要最终标量Start等于Stop就是正确的打开方式。4. 自动验证建模加速Build model与Max input power怎么配合4.1 AVM的原理先用谐波平衡做特征化再用行为模型跑全程协同仿真最大的痛点是速度。Ptolemy数据流域每个时间点都要问一次“功放现在输出是什么”如果每次都去跑模拟电路仿真一次功率扫描要跑几个小时。自动验证建模Automatic Verification Modeling界面里也叫Fast Cosim就是为了解决这个痛点。原理是在Ptolemy仿真正式开始之前用谐波平衡仿真器对功放子电路做一组特征化把输入功率从低到高扫一遍记录功放在不同工作点下的增益、相位、非线性产物等响应。仿真启动时ADS用这批数据构建功放的行为模型。之后Ptolemy仿真全程功放的响应都从行为模型插值得到不再每个点触发一次完整电路仿真。这个思路和X参数模型、负载牵引查表模型一脉相承把高保真的电路仿真结果浓缩成一张特性表用查表插值换速度。代价是特征化本身要花一小段时间但相比整个Ptolemy仿真这笔开销非常值。一个值得注意的点是AVM在ADS手册里对应Circuit Envelope仿真和模拟RF系统协同仿真的理论章节。它只做了输入功率这个维度的特征化所以行为模型是输入功率的函数。如果你的功放工作点还依赖温度或偏置AVM也可以扩展扫描维度但特征化时间会成倍增加通常只在必须的时候才这么做。4.2 Build model与Use previous data的取舍Envelope控制器上有Fast Cosim选项卡里面有两个核心选项Build model和Use previous data。Build model的意思是每次Ptolemy仿真开始前重新执行特征化。如果这次仿真里功放子电路的参数有变化——比如扫描传输线长度、扫描偏置电压或者蒙特卡洛里某个统计变量在变动——那么模型必须重建否则行为模型还停留在旧参数上仿真结果等于没变。Use previous data则是在功放内部参数不变的前提下直接复用上一次仿真构建的特征化数据跳过重新特征化这一步。什么时候可以放心用单纯扫输入功率、或者只是换一个调制信号重新测指标时功放本身没变特征化结果也有效用Use previous data可以省一次谐波平衡的时间。这里有个容易踩的边界你改了子电路里的任何参数哪怕是某个电阻值从1000欧改成990欧只要这个参数不在特征化扫描变量里就必须回到Build model。ADS并不会每次自动判断模型是否过期它是按你的选择执行。所以在参数扫描和蒙特卡洛场景下把Build model当作默认项Use previous data当作性能优化项。提示Build model是更安全的选择Use previous data只应在你明确知道子电路参数未变化时使用。4.3 Max input power与外推警告Fast Cosim参数里Set Characterization Parameters下面的Max input powerdBm是一个值得单独拿出来讲的参数。特征化谐波平衡扫描时功放被测到多大的输入功率行为模型就只对到这个范围可信。顶层Pin扫描到16dBm但调制信号是有峰均比的瞬时输入包络会超过平均值16dBm。如果Max input power也设成16dBm那么超过特征化上限的那些采样点行为模型只能做外推外推结果和真实电路响应之间可能差很多ACPR、EVM曲线在功率高点会失真。正确设置是让Max input power明显高于顶层扫描最大值加峰均比。示例里的EDGE信号峰均比大约在3dB量级所以如果Pin最大是16dBmMax input power至少设到20dBm左右再留1到2dB余量。调制信号峰均比越高这个差值就要留得越大。外推不像报错那样会打断你它只是给一条warning扫一眼很容易忽略。我在第一次复现时就吃了这个亏Pin扫到16dBmMax input power设的16仿真顺利跑完数据看起来也顺眼后来把Pin固定到17dBm单点跑了一次warning跳出来才意识到前面扫描尾部几个dB的结果一直在外推。下面这段是Fast Cosim参数的检查清单我每次创建新测试台都会对照一遍; Fast Cosim参数检查清单Envelope控制器 - Fast Cosim选项卡 Characterization Build model ; 参数扫描/蒙特卡洛时必须 ; Use previous data ; 仅当子电路参数不变时可复用 Max input power dBm Pin_max PAPR 2 ; 例: Pin_max16, PAPR约3 - 设20 ; 验证方法关掉顶层扫描把Pin固定到扫描最大值运行后确认无extrapolation warningMax input power这个变量名在不同ADS版本里显示可能略有差异但含义一致。另外如果你想更严谨地确认特征化数据覆盖了调制峰值可以把调制信号的包络最大值拉出来和Max input power对比或者看输入功率的分布直方图数一数超过特征化上限的采样点占比。5. 常见问题与避坑四个最容易翻车的设置与对策以下四条都是我在复现这套示例工程时实际遇到的问题按现象、原因、解决的顺序展开希望对你有用。5.1 时间步长不一致EVM和ACPR悄悄变差现象单独跑EDGE源仿真正常一接上功放子电路做协同仿真EVM数值明显偏大ACPR曲线在某个功率区间出现周期性小突起而且把Pin重复扫描两次结果不完全一致。原因子电路Envelope控制器的Step参数和EDGE源的时间步长不是同一个值。Ptolemy数据流域按源的步长采样包络仿真按控制器的步长更新两个网格错位后功放输出信号在源端和接收端之间被重新采样插值误差累积进EVM和ACPR统计里。这类误差不是失真量级更像叠加了一层噪声所以结果“也能用但就是不对”。解决把EDGE源里的时间步长方程整组复制到子电路VAR块Envelope控制器的Step引用同一个变量名。用2.3里的验证方法固定Pin跑一次短仿真确认两处计算的Step数值完全一致后再跑完整扫描。5.2 外推警告Max input power设低了现象仿真跑完没有报错只有几条warning悬在消息栏里内容是输入功率超出了特征化范围之类扫出来的ACPR曲线在高功率端突然变平滑或斜率异常PAE曲线尾部偏离预期。原因Max input power没给调制信号的峰均比留余量。顶层Pin最大16dBm特征化也只测到16dBm调制包络的峰值超过上限后行为模型开始外推。外推没有计算代价但结果可信度骤降。解决先关掉顶层扫描把Pin固定为扫描最大值运行后检查warning是否出现。如果有把Max input power往上提一般取“Pin最大值加信号峰均比再加2dB左右”的余量再重复验证直到无警告。之后跑完整扫描对比尾部曲线会发现外推那一段和修正后差异明显。5.3 数据集膨胀NumericSink没收敛到单点现象协同仿真本身几分钟就跑完了但仿真结束后写盘等了很久工程目录里数据集占了好几个GB打开数据显示窗口时也卡顿明显。原因NumericSink默认保存整个时间序列Ptolemy仿真里波形很长每个测量组件都存一份完整波形数据量成倍增长。PAE链路里的NumericSink尤其容易被忽略它只是要一个标量平均功耗却把整条功率波形都留下了。解决把不需要看波形的NumericSink的Start和Stop设为同一个值推荐用最后一个采样编号这样sink只保存最终的标量结果。需要保留中间波形的信号单独挑出来别让所有测量组件都存全波形。5.4 蒙特卡洛结果不变模型没重建现象在子电路里给介电常数加了±10%的高斯分布、给偏置电压加了高斯分布跑完蒙特卡洛直方图几乎是一条线所有样本的结果差异小于1%和单次仿真没两样。原因Fast Cosim选了Use previous data。蒙特卡洛每次迭代改变了子电路参数但行为模型还是最初那次特征化构建的参数变化完全没进入模型仿真器输出的当然是重复结果。这是协同仿真里最容易忽略也最难发现的问题因为程序不报错数据看起来“正常”。解决参数扫描和蒙特卡洛场景下强制选择Build model让每次迭代都重新特征化。验证方法随便把某个偏置电压改1%到5%看ACPR或PAE是否有肉眼可见响应如果完全不变基本可以断定模型没有重建。6. 进阶用interpolate_swept_data把扫描曲线变成目标功率的分布扫描曲线能告诉你“输出功率越大ACPR越差”但规格书通常问的是另一句话在输出功率等于28dBm时ACPR和EVM是否达标样本间怎么分布这时候要把每次扫描、每次蒙特卡洛迭代的结果定位到同一个目标输出功率上再做统计。interpolate_swept_data就是为这个场景准备的它在ADS 2011及之后的版本里加入可以把Y随X变化的曲线插值到目标X且不做外推。6.1 把指标插值到目标输出功率在数据展示里用类似下面的方式调用具体函数签名以你当前ADS版本为准; 数据展示方程示意在desired_Pout_dBm处提取各指标 desired_Pout_dBm 28.0 ACPR_at_target interpolate_swept_data(ACPR_swept, Pout_swept, desired_Pout_dBm, 0.1, linear) EVM_at_target interpolate_swept_data(EVM_swept, Pout_swept, desired_Pout_dBm, 0.1, linear)前两个参数是原始Y数组和对应的X数组第三个参数是目标X值后两个是插值步长和插值类型。函数不做外推目标X超出原始范围时返回的是最靠近边界的点对应的Y值而不是外推值。这个特性平时是保护但也会带来误解——如果你的desired_Pout_dBm设到了数据范围之外直方图依然会输出只是那个值实际上是边界值不是真正的目标功率点。所以看到结果前先确认目标功率落在扫描范围内。6.2 用散点图看参数相关性配合蒙特卡洛数据把每个统计变量比如偏置电压、传输线宽度、介电常数偏差和插值后的指标画成散点图比直方图多一层信息它告诉你哪个变量在推动哪个指标。示例工程里能看到两个典型结论低偏置电压和PAE存在明显相关方向是“偏置越低PAE越好”而且这个偏置电压对ACPR影响很小高电源电压与ACLR之间有较强的负相关。ACLR和ACPR在这里是同族指标只是通道位置不同。这种相关性方向在不同拓扑里可能反转不能当作公式套用但用来排查关键参数非常高效。从那以后我每次跑蒙特卡洛之前都会强制自己按顺序检查三件事Envelope控制器的Step是否引用顶层源方程Fast Cosim选的是不是Build modelNumericSink是不是收敛到单点。三个开关确认完才点火。这套习惯救过我不止一次希望帮到你。本文还有配套的精品资源点击获取