恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
E类和E/F类开关功率放大器波形推导与ADS仿真验证指南
首页
资讯中心
/
E类和E/F类开关功率放大器波形推导与ADS仿真验证指南
E类和E/F类开关功率放大器波形推导与ADS仿真验证指南
发布时间:2026/8/30 8:21:17
简介本资源面向射频功率放大器设计方向的研究生、工程师及高年级本科生聚焦Class-E与Class-EF/E/F类功放的波形解析与电路仿真建模问题。针对E类PA理论效率高但开关电压尖峰严重、EF类需协同谐波调谐等难点资源基于权威论文完成完整数学推导利用Matlab求解关键波形解析表达式并配套ADS高频电路仿真工程支持参数化扫描与效率/波形联合验证。压缩包共118个文件2.98MB含25个ADS工程配置文件.xml/.ds/.cfg、21个Matlab脚本.m与数据文件.mat/.csv、14个文本说明及3份核心PDF文献覆盖从公式推导、数值求解到ADS原理图搭建与仿真设置的全流程。已有393人学习下载提供可直接运行的Matlab绘图脚本、ADS仿真模板及谐波阻抗匹配调试参考显著降低高频PA波形分析与拓扑优化的学习门槛。 做射频功放设计免不了和E类、E/F类这种开关模式功放打交道。E类靠开关波形的“无缝衔接”实现理想的100%漏极效率E/F类则是在E类基础上引入谐波短路臂通过重新整形电流波形来改善晶体管利用率。这个工程的核心任务很明确先用Matlab把E类和E/F类的理想电压/电流波形推导出来再用ADS搭一个完全理想的电路验证理论两条链路互相印证。整个过程适合正在学PA理论的在校学生、准备做Doherty后级或高效PA的工程师也适合第一次想用ADS做开关类功放仿真却不知道怎么下手的人。本文就把这个工程从原理到实现完整拆开讲一遍。1. 项目全景E类与E/F类功放这个工程到底在做什么1.1 工程解决的核心问题这个项目看起来就是“画波形搭仿真”但实际要解决的是两个很具体的痛点。第一个痛点是“理论推导和电路仿真脱节”。很多教材讲E类功放时会直接给出归一化波形和最终效率公式但推导过程往往跳步学生照着看总觉得隔了一层。比如电流为什么是半正弦、电压为什么长成那样、最优电容C是怎么定出来的这些细节不亲手算一遍很难真正建立直觉。Matlab的价值就在这里把推导的每一步变成可执行的数值过程波形一画出来所有抽象条件都变得具体了。第二个痛点是“仿真结果没法验证理论”。很多人在ADS里放一颗真实的晶体管模型仿真出来的漏极波形乱七八糟效率也远低于理论值这时候你很难判断是理论本身的问题、偏置点没调对、还是负载网络算错了。这个工程先用“理想开关无源器件”搭一个理想电路排除了晶体管寄生和非线性因素让仿真结果尽可能贴近理论这样才能真正验证波形推导是否正确。等理想链路跑通了再换成真实模型才知道偏差来自哪里。1.2 为什么选Matlab加ADS这个组合熟悉射频仿真的人应该能感觉到Matlab和ADS是互补关系不是替代关系。Matlab强在数学建模和矩阵运算。E类和E/F类的波形推导本质上是解微分方程、做傅里叶分解、搜索最优电路参数这些东西用Matlab写脚本非常顺手。更重要的是Matlab里可以随意做归一化扫描比如固定Vdc和R扫电容C看电压波形怎么变化几行代码就能出一组对比曲线。这种“参数扫描理论验证”的效率是ADS替代不了的。ADS强在电路级仿真。它的谐波平衡HB仿真器对功率放大器几乎是事实标准各种无源器件、开关模型、传输线、封装寄生都有现成库。你不需要在ADS里写波形方程只需要把电路搭对仿真器会自动算稳态。问题在于ADS里做“理想电路”比很多人想的要麻烦因为根本不存在真正理想的开关你得想办法近似它。这一点后面我会单独展开。这个工程最终形成一个闭环Matlab负责把理论推导做扎实输出一组“期望波形”和“最优参数”ADS负责用理想电路验证这组参数输出一组“仿真波形”。两者一对比理论正确性、电路搭建正确性就都有了。1.3 工程预期成果和验收标准我习惯在项目开始前给自己列几个验收标准免得做着做着方向偏了。这个工程我认为至少要达成下面四项用Matlab画出一组满足ZVS/ZDS条件的E类理想波形并读出峰值电压、峰值电流、输出功率、效率用Matlab完成一个E/F类变体的波形推导比如经典的E/F3类看出它和纯E类在波形形状上的差异在ADS中搭建理想E类电路和E/F3类电路用HB仿真得到漏极电压/电流波形与Matlab结果对比误差在合理范围内用ADS的测量方程算出功率和效率确认效率接近100%这个理论值。能满足这四条这个工程就算闭环了。后面想加Doherty、加真实器件、加封装寄生都是在这个基础上做增量。2. 波形推导的思路拆解从E类到E/F类2.1 E类功放为什么能做到100%效率开关类功放的基本思想很简单让晶体管不再是线性放大器件而是一个开关。但“是开关”不等于“效率高”关键在于怎么处理开关切换瞬间的电压和电流关系。线性功放的效率瓶颈在于晶体管同时承受电压和电流有源区功耗很大。理想开关模式下开关导通时电流很大但电压为0开关断开时电压很高但电流为0v和i的乘积始终为0所以器件本身的功耗是0。这个理想状态对应两个必要条件一个是ZVS也就是开关断开到导通切换的瞬间开关两端电压已经回落到0一个是ZDS也就是开关导通到断开切换的瞬间流过开关的电流已经回落到0。如果开关切换瞬间电压不为0或者电流不为0哪怕只是一瞬间也会产生开关损耗。E类功放通过“并联电容基波串联谐振网络”来实现这两个条件。并联电容C负责在开关断开期间给电流积分形成合适的电压斜率和形状输出端的串联谐振L0-C0保证只有基波功率送到负载同时给开关节点提供一个近似正弦的基波电流参考。整个网络设计的目标只有一个让开关在切换瞬间满足ZVS和ZDS。这个原理讲起来简单但波形推导里面有几个很容易绕晕的点后面一节展开说。2.2 E类波形推导的关键流程和边界条件经典E类推导一般从等效电路入手。Vdc经过一个大电感射频扼流圈RFC接到开关节点开关节点对地并联一个电容C开关另一端接地。输出通过串联L0-C0接到负载R。这里有个重要假设RFC电感足够大所以流过RFC的电流近似是恒定的直流电流I_dc输出串联谐振网络只让基波分量有效地送到负载因此流过负载网络的电流近似是单一基波的正弦电流。这样一来开关节点上除了开关和电容之外的电流I_o就可以直接写成一个正弦表达式。设导通区间对应相位0到π截止区间对应π到2π。开关导通时开关节点电压v(θ)0开关断开时外部电流不再走开关而是全部灌入并联电容C给电容充电或放电。这个过程的方程很简单C * dv(θ)/dt I_dc - I_o * sin(θφ)其中φ是基波电流相对于开关驱动信号的相位。把时间换成相位θdt dθ/ω0方程变成ω0 * C * dv(θ)/dθ I_dc - I_o * sin(θφ)这个一阶微分方程从θπ积分到θ2π就能得到截止期的电压波形v(θ)。但这里有两个未知量基波电流幅度I_o和相位φ它们不是随便给的。要确定这两个值需要用到ZVS和ZDS条件。ZVS对应v(2π)0也就是开关重新导通瞬间电容上的电压已经放干净ZDS对应dv/dθ在2π处为0也就是电容电流在切换瞬间为0这样开关导通时流的电流不会有一个跳变冲激。为什么还要强加ZDS因为开关导通时如果电容电流不为0会瞬间把存储在电容里的能量以电流尖峰的形式泄放掉造成损耗和波形失真。这两个边界条件加上“一个周期内电容电压波形必须满足直流平均平衡”的关系就能联立解出I_o、φ的值。解出来之后电压波形就完全确定了再把v(θ)做傅里叶级数分解取出基波分量就能算出负载上获得的功率。整个推导过程没有用到任何复杂的器件模型纯粹是电路状态方程加边界条件Matlab里数值求解非常方便。经典结果值得记住理想E类在最优化条件下效率为100%漏极电压峰值约3.56Vdc漏极电流峰值约2.86Idc。这些数字在不同文献里会因为归一化方式略有出入但量级就是这样。2.3 E/F类是怎么扩展出来的“EF类”和“E/F类”这两个写法我经常看到初学者容易被绕晕。它们其实指的是同一族拓扑。严谨一点的叫法是Class-E/F family也就是E类/F类混合功放族。E类负责开关波形的整形F类负责谐波终端控制两者一结合就有了E/F_n类。E/F_n的核心改动是在开关节点额外并联一个n次谐波短路臂。这个短路臂是一个串联谐振电路谐振频率正好在n次谐波上对该次谐波呈现短路对其他频率呈现高阻。最常见的做法是E/F3也就是并联一个三谐波短路臂。为什么要这样做纯E类功放的开关电流是半正弦形状电流峰值比较高。在给定漏极电压和输出功率的要求下电流峰值太高意味着晶体管需要更大的电流能力也就是更大的管芯尺寸、更高的成本。E/F3的思路是既然三谐波电压被短路掉了那电流波形就可以利用这个自由度重新分配让导通期间的电流更接近方波而不是尖峰半正弦。方波电流的峰值比正弦半波低对晶体管更友好。从推导上看E/F3的方程比E类多一项三谐波电流项I_3*sin(3θψ)。外部电流不再只有直流和基波而是直流加基波加三谐波。这个三谐波电流流过开关和并联电容会改变截止期电压波形的形状。要确定I_3和ψ除了原有的ZVS、ZDS条件外还需要满足“三谐波短路臂上无三谐波电压”这个条件。联立方程之后解出来的电流波形就自然呈现第三次谐波叠加的特征。这部分用解析手算会非常痛苦用Matlab的fsolve做数值求解非常合适。我当时跑出来最大的感受是E/F3的电压峰值和E类接近但电流峰值确实明显降下来了而且效率理论上仍然是100%。这就是这个拓扑的核心价值。3. Matlab理论波形仿真工程实操3.1 归一化参数设计先用1V和1欧姆把问题简化做E类波形推导最容易犯的错误是一上来就用具体值算。比如Vdc28Vf01.8GHzR50欧姆结果一堆量纲混在一起算出来的C和L也不知道该信多少。我的习惯是先用归一化方式跑通理论。把所有电压归一化到Vdc也就是令Vdc1V把所有阻抗归一化到负载R也就是令R1欧姆频率就取f01GHz这样周期T1ns角频率ω02π*1e9。在这组归一化条件下只需要搜索一个最优的归一化电容值C让它满足ZVS和ZDS即可。有人会问归一化之后得到的C怎么转换到实际电路很简单。E类波形只取决于ω0CR这个无量纲乘积。你在归一化条件下解出C0实际电路的C就是C0除以ω0_actual*R_actual的缩放结果。用这种思路改频率、改电压、改负载都不需要重新推导公式只需要做单位换算。归一化的另一个好处是画图简洁。横轴用相位0到2π纵轴用Vdc的倍数出来的波形曲线可以直接和文献对比。做ADS验证时再把数值乘回去非常方便。3.2 Matlab核心代码E类波形求解下面这段代码是E类波形求解的核心部分。我故意没有去背任何现成公式而是直接按前面说的微分方程加边界条件来搜C。% classE_waveform_demo.m % 理想E类波形求解演示 clear; close all; % 归一化参数 Vdc 1; R 1; f0 1e9; w0 2*pi*f0; T 1/f0; % 扫描并联电容 C C_list linspace(1e-12, 200e-12, 2000); err_zvs zeros(size(C_list)); err_zds zeros(size(C_list)); Npts 4096; theta linspace(0, 2*pi, Npts); dtheta theta(2) - theta(1); for k 1:length(C_list) C C_list(k); % 假设外部电流i_ext Idc - I1*sin(thetaphi) % 这里随机给初值用优化搜索Idc/I1/phi % 更严谨的做法是用 fsolve 同时满足三个条件 % v(2pi)0, dv/dtheta(2pi)0, 平均电容电流平衡 % 下面用简化迭代演示v(2pi)随C的变化 % 先假设Idc1, I1通过平均电流关系估计 Idc 1; % 输出基波电流幅度需要和最终输出功率耦合这里先用常数占位 I1 1.5; phi 0.5; % 截止区间从pi到2pi对电容充电 v zeros(size(theta)); for n 2:Npts if theta(n) pi id Idc - I1*sin(theta(n)phi); v(n) v(n-1) (1/(w0*C)) * id * dtheta; else v(n) 0; end end err_zvs(k) abs(v(end)); % v(2pi) 应接近0 err_zds(k) abs(v(end) - v(end-1)); % dv/dtheta 应接近0 end % 找同时满足两个误差最小的C [~, idx] min(abs(err_zvs) abs(err_zds)); C_opt C_list(idx); fprintf(Optimal C %.4e F\n, C_opt);这段代码其实是一个演示骨架实际工程里我不会用固定I1和phi而是把I1、phi和C一起放到fsolve里求解。因为I1和phi不是独立的它们由ZVS、ZDS和功率约束共同决定。但上面的框架能帮你看清楚怎么把一个连续微分方程变成离散数值积分怎么用搜索的方式找最优C。用fsolve的完整写法大致是这样定义一个函数输入是x[Idc, I1, phi, C]这些待定参数输出是三个残差v_end、dv_end、以及基波功率与R*I1^2/2的误差。求解器会把这几个值同时逼近0。当fsolve收敛时你得到的x就是E类最佳工作点。3.3 E/F3波形求解用fsolve解未知系数E/F3的求解思路和E类本质一样区别在于外部电流多了一项三谐波项。% classEF3_waveform_solve.m % 理想E/F3类波形求解用fsolve clear; close all; Vdc 1; R 1; f0 1e9; w0 2*pi*f0; % 未知量 x [Idc, I1, phi, I3, psi, C] x0 [1, 1.5, 0.5, 0.3, 0.2, 20e-12]; options optimoptions(fsolve, Display, iter, MaxFunctionEvaluations, 1e5); x fsolve((x) ef3_residual(x, Vdc, R, w0), x0, options); % 解析最优参数 Idc x(1); I1 x(2); phi x(3); I3 x(4); psi x(5); C x(6); fprintf(Idc%.4f, I1%.4f, I3%.4f, C_opt%.4e\n, Idc, I1, I3, C); % 计算并绘制波形 [theta_plot, v_plot, i_plot] ef3_waveforms(x, Vdc, R, w0); figure; subplot(2,1,1); plot(theta_plot*180/pi, v_plot, b-); xlabel(Phase (deg)); ylabel(V_D (V)); grid on; title(E/F3 Ideal Voltage Waveform); subplot(2,1,2); plot(theta_plot*180/pi, i_plot, r-); xlabel(Phase (deg)); ylabel(I_D (A)); grid on; title(E/F3 Ideal Current Waveform); function F ef3_residual(x, Vdc, R, w0) Idc x(1); I1 x(2); phi x(3); I3 x(4); psi x(5); C x(6); Npts 2048; theta linspace(0, 2*pi, Npts); dtheta theta(2) - theta(1); v zeros(size(theta)); for n 2:Npts if theta(n) pi i_ext Idc - I1*sin(theta(n)phi) - I3*sin(3*theta(n)psi); v(n) v(n-1) (1/(w0*C)) * i_ext * dtheta; else v(n) 0; end end F(1) v(end); % ZVS F(2) v(end) - v(end-1); % ZDS % 基波电压幅度满足负载功率关系 V1 (2/Npts) * sum(v .* exp(1j*theta)); F(3) abs(V1)/sqrt(2) - I1*R/sqrt(2); % 简化约束 end这段代码同样是一个演示骨架核心思想是把所有的边界条件统一写成残差函数F然后用fsolve把未知量一起解出来。你不需要手动推导出解析解只要把微分方程离散化、把约束条件写对数值解会自动满足要求。实际工程里我会把E/F3解出来的C、I1、I3导出作为下一步ADS仿真的初值。这是Matlab和ADS联动的关键接口。3.4 从波形里提取功率、效率和峰值参数波形画出来以后不能只看个形状就完了。我从波形里通常会提取四个关键指标输出功率、直流功率、效率、峰值电压/电流。输出功率的提取方法对周期电压波形做FFT取出基波分量的幅度V1然后Pout 0.5V1^2/R。直流功率则直接算Vdcmean(Idc)其中Idc是一个周期内流过RFC的平均电流。效率就是两者相除。理想情况下效率应该非常接近100%如果代码里的边界条件没满足效率就会明显低于100%这时候第一件事是检查ZVS和ZDS残差是否真的收敛到了0。峰值电压和峰值电流直接max/min波形就能得到。对照经典值E类最优时约等于3.56Vdc和2.86Idc。E/F3类的电流峰值明显下降具体数值和所用归一化条件相关这一点在波形对比图上看得非常直观。4. ADS理想电路仿真工程实操4.1 原理图搭建从Matlab参数到ADS元件Matlab把理论参数算好之后进入ADS搭电路。这里的关键是“理想”二字怎么落地。新建一个工程建议在原理图的Variables控件里把参数都写成变量比如Vdc_actual 28 freq 1e9 R_load 50 C_par 18.6e-12 L0 10e-9 C0 2.533e-12 L3 3.333e-9 C3 0.845e-12这样后续改参数不需要改原理图只在VAR方程里改数字。具体C_par的值由Matlab按实际Vdc和R_load换算得到。电路连接顺序是这样的Vdc通过一个大电感L_RFC接到开关节点开关节点对地并联C_par接着经过串联的L0和C0接到负载R_load负载另一端接地。E/F3多出来的三谐波短路臂L3和C3串联一端接开关节点另一端接地。RFC电感的选择有讲究。理论上希望它无限大让直流电流恒定但实际上电感太大会导致仿真收敛慢太小又会让波形畸变。我一般取L_RFC 100 nH左右在1GHz下阻抗约628欧姆远大于负载R基本可以当作直流恒流源。还有一种更“理想”的做法是用理想电流源直接给直流偏置而不是用RFC但对RLC电路来说用大电感更接近实际结构。C_par、L0/C0的数值我的建议是直接从Matlab最优结果换算过来。ADS里如果波形和理论对不上不要急着调谐先回到Matlab确认数值换算有没有错。4.2 理想开关建模让HB收敛的关键选择ADS里做理想E类仿真最大的坑就是理想开关。很多人一上来就用真实晶体管比如GaN HEMT模型结果波形完全不对因为晶体管的输出电容、导通电阻、非线性寄生全部会影响E类工作条件。这个工程既然要做“理想电路仿真”就应该用理想开关模型。我试过两种可行方案。第一种是用Verilog-A写一个理想开关控制信号大于阈值时导通电阻Ron1m欧姆小于阈值时截止电容Coff0.1pF。这个模型比较灵活可以随时改Ron和Coff但需要写代码。第二种是直接用ADS库里的SPST开关元件配合一个方波电压源驱动。SPST也是理想模型但它的参数设置比较直接适合新手。无论哪种方案都要注意Ron不能设成0Coff也不能设成0。数值上完全为0很容易让HB求解器雅可比矩阵奇异导致不收敛。Ron取1m欧姆到1欧姆之间Coff取0.1pF到0.5pF之间对理想波形影响很小但收敛性会好很多。驱动信号用V_pulse或者V_tSquare都行。关键参数幅度1V直流偏置0.5V周期1ns占空比50%。上升沿和下降沿的时间要设得很短但不要为0我习惯设成1ps。太短的边沿在HB中会引发高次谐波分量激增延长仿真时间。4.3 HB仿真设置和测量方程ADS里做功率放大器仿真首选的是Harmonic Balance控件。在控件里设置Freq[1] 1 GHzOrder[1] 5 或更高建议至少到5因为E/F3类用到三次谐波高次谐波对波形精度有影响SweepPlan不做扫描直接做单点仿真先把单点调通再做参数扫描。HB仿真的收敛提示很关键。如果仿真报错优先检查开关的Ron是不是太小、Coff是不是太小、谐波阶数是不是不够。实在不收敛就把Ron先调大两到三倍跑通后再逐步调小。仿真跑完后在原理图里加三个测量方程用来算效率Pdc Vdc_actual * mean(I_RFC.i) Pout 0.5 * mag(Vout[1]) * mag(Vout[1]) / R_load Eff Pout / Pdc * 100这里I_RFC.i是流过RFC电感的电流用HB仿真结果里的直流分量。Vout[1]是负载节点电压的基波分量。ADS测量方程可以直接对谐波分量做运算非常方便。时域波形怎么看在ADS里用“Waveform palette”很难直接得到时域的V_D波形我习惯在测量方程里用“IDT”把频谱转成时域或者直接再跑一个瞬态仿真Transient。瞬态仿真里加一个TimeStop跑到几个周期后稳定下来再提取最后一个周期的数据。4.4 和Matlab波形的对比方法拿到ADS波形后怎么和Matlab波形对比我通常的做法是把两个软件的波形分别导出为CSV文件横轴统一转换成相位。Matlab的横轴本来就是0到2π相位ADS瞬态结果的时间轴乘以2π*f0就变成相位。纵轴方面把Matlab的Vdc设为实际值把ADS的电压直接叠加对比两条曲线应该基本重合。对比的时候重点看三个位置开关导通到截止切换的瞬间电压是否为0截止到导通切换瞬间电压是否为0以及电压峰值的高度是否一致。这三个位置完全对上了说明理论推导、Matlab代码、ADS电路三者都没有问题。E/F3类还有一个要检查的点三谐波短路臂上的电压。理想情况下它应该为0如果ADS中该支路还有明显的三谐波电压残留说明L3和C3的谐振频率设偏了或者器件的寄生Q值影响太大。5. 常见问题与排查技巧5.1 HB仿真不收敛先从开关模型下手这是做ADS理想E类仿真最常遇到的事情。HB求解器在强非线性开关场景下很容易发散。我的排查顺序是把开关导通电阻从1m欧姆调到0.1欧姆看是否能收敛把Coff从0.1pF调到0.5pF开关关断后的等效并联电纳变大通常能改善数值条件把HB阶数从3调高到7或更高有时候谐波阶数太低导致截断误差也会让求解器找不到稳态如果还不收敛检查RFC电感有没有设成变量但变量被扫成了极端值通常L_RFC扫到非常小的值时会出现毫无物理意义的振荡。收敛之后再把Ron逐步调回去确认波形变化不大。这样做既能保证效率也能保证收敛性。5.2 三谐波短路臂没起作用E/F3类电路搭好后如果发现波形和纯E类几乎一样说明三谐本文还有配套的精品资源点击获取