简介:面向射频与无线通信设计者的高级设计系统应用笔记,聚焦利用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_Meas | EVM测量 | 对解调符号做误差矢量幅度统计 |
| EDGE_4CH_ACP_Mod_Meas | ACPR测量 | 测邻道与交替道功率比,支持四通道 |
| EDGE_Pwr_Meas_Local | 平均载波功率测量 | 本地副本,减少时隙数,加快仿真 |
| VD_Bias / ID_Bias | PAE辅助测量 | 全局节点输出偏置电压,CCVS输出偏置电流对应电压 |
VD_Bias和ID_Bias这两个节点在第3章算PAE时是关键,先记住它们的位置。
2.2 子电路里的Envelope controller:Step必须设,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_DC,Start = Stop = 最后一个采样编号这份清单里,CCVS的转换系数值得再强调一遍:它不需要和某个物理量纲严格对应,因为VItoPower做完乘法和平均后会带着这个固定比例系数,你只需要一个与偏置电流成线性比例的电压信号。全局节点的命名规范也建议统一,VD_Bias、ID_Bias这种带下划线的短名字在顶层引用时更不容易写错。
另外注意:PAE的这条测量路径和调制制式无关。不管信号源是EDGE还是LTE,CCVS加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 power(dBm)是一个值得单独拿出来讲的参数。
特征化谐波平衡扫描时,功放被测到多大的输入功率,行为模型就只对到这个范围可信。顶层Pin扫描到16dBm,但调制信号是有峰均比的,瞬时输入包络会超过平均值16dBm。如果Max input power也设成16dBm,那么超过特征化上限的那些采样点,行为模型只能做外推,外推结果和真实电路响应之间可能差很多,ACPR、EVM曲线在功率高点会失真。
正确设置是让Max input power明显高于顶层扫描最大值加峰均比。示例里的EDGE信号峰均比大约在3dB量级,所以如果Pin最大是16dBm,Max input power至少设到20dBm左右,再留1到2dB余量。调制信号峰均比越高,这个差值就要留得越大。
外推不像报错那样会打断你,它只是给一条warning,扫一眼很容易忽略。我在第一次复现时就吃了这个亏:Pin扫到16dBm,Max 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_max=16, 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 model,NumericSink是不是收敛到单点。三个开关确认完才点火。这套习惯救过我不止一次,希望帮到你。
本文还有配套的精品资源,点击获取