ADS 中的包络仿真器

仿真器工作原理

仿真器是ENVELOPE,具体原理与 VPI 中保持一致,即慢变振幅近似下的等效基带变换。主要分析载波的时变振幅,因此得名包络仿真器。

包络示意图

包络仿真器的处理对象是时域调制信号,下面概述电路包络仿真过程的基本概念:

  • 输入信号变换:

    每个调制信号都可以表示为一个载波由一个包络调制而成,即 A(t)ejf(t)A(t)e^{jf(t)}。采样包络的幅值和相位用作谐波平衡分析的输入信号。

    经包络调制得到的的载波信号
  • 含时变包络的谐波平衡分析:

    在每个时间步都会进行谐波平衡分析,该分析既包含基本的谐波平衡方程,也考虑时变包络的影响。此过程会生成一系列频谱用以表征不同时间步下电路的响应。电路包络通过具有时变系数的傅里叶级数提供电路的完整非稳态解。

    谐波分析 谐波时域图

    这里需要详细说一下背后的原理

    什么是谐波分析,谐波分析 = 用傅里叶分析专门研究“谐波”这一类频率成分,如果基波频率是 f0f_02f02f_0 就是二次谐波,3f03f_0 就是三次谐波,特别关注这一类整数倍频的方法就叫谐波分析。谐波平衡,就是在谐波分析的基础上,让电路满足 KCL。谐波平衡方程 = 在每一个谐波频率上,电路满足 KCL(电流守恒)

    谐波平衡求解器的本质,就是求解谐波平衡方程:

    Y(ω)V+INL(V)=0\mathbf{Y}(\omega)\mathbf{V} + \mathbf{I}_{\text{NL}}(\mathbf{V}) = 0

    其中

    • V\mathbf{V}:所有谐波的电压向量
    • Y(ω)\mathbf{Y}(\omega):线性网络导纳矩阵(每个频点)
    • INL\mathbf{I}_{\text{NL}}:非线性器件产生的电流

    由于非线性电流 INLI_{\text{NL}} 在频域不好算,人们采取频域时域来回变换的方法

    Step 1:频域(谐波)

    V(ω)\mathbf{V}(\omega)

    Step 2:IFFT → 时域

    v(t)v(t)

    Step 3:非线性计算

    iNL(t)=f(v(t))i_{\text{NL}}(t) = f(v(t))

    Step 4:FFT → 回到频域

    INL(ω)\mathbf{I}_{\text{NL}}(\omega)

    然后带回:

    YV+INL=0\mathbf{Y}\mathbf{V} + \mathbf{I}_{\text{NL}} = 0

    结合以前学习的瞬态仿真器

    方法 数学本质 求解对象 是否有时间导数
    Transient(瞬态) 非线性微分方程(DAE) v(t),i(t)v(t), i(t)
    Harmonic Balance(HB) 非线性代数方程(NLE) VkV_k(谐波系数) 没有

    也就是说,HB 是把微分方程变成代数方程(通过傅里叶展开),一个在时间域上求解,一个在频域上求解,ddtjω\frac{d}{dt} → j\omega,时间导数被替换掉了!

    因此,HB 不能求解非周期和时序问题。

    上面两张图中,左图代表在不同的时间步下,对基波求解 HB 方程,得到不同时间步下各个谐波分量的变化。右图代表根据各个时间步下各个谐波的振幅/相位,提取该谐波的时域波形或相位变化图。

  • 从频域提取数据:

    通过对选取的时变谐波谱应用 FFT,可以分析:

    • 邻道功率比 Adjacent channel power ratio (ACPR) 邻道泄露
    • 噪声功率比 Noise power ratio (NPR)
    • 功率附加效率 Power added efficiency (PAE)
    • 锁相环中的参考频率馈通 Reference frequency feedthrough in PLL
    • 高阶互调模块 Higher order intermods (3rd, 5th, 7th, 9th) 组合频率 mf1±nf2mf1±nf2

    这里说白了就是非线性会将原本集中在基频的能量,重新分配到谐波和互调频率上。随之而来的上述指标可以根据能量分配情况进行分析。

    为了更具体地描述包络仿真的过程,可以想象,电路中的每个节点都由一个离散频谱表示,该频谱具有时变傅里叶系数。频谱的频率集合由用户所定义;每个频谱频率的幅值和相位可以随时间变化,因此表示谐波的信号不再像谐波平衡那样局限于一个常数。每个频谱频率都可以视为频谱的中心频率;每个频谱的宽度为 0.5/时间步长。

    包络仿真频谱分析

    上图对包络仿真进行了形象地说明,其中最小包络的带宽等于调制信号的带宽,位于 DC 处的频谱就是包络谱,载波的作用就是将包络谱搬频到适合传输的信道频谱范围里来。考虑到仿真采用的是离散数据,离散 FFT 必定会引入高次谐波分量,但又考虑到信道的低通属性,高频被滤除,模型是合理可行的。

  • 频域频谱:

    每个频谱内的带限信号可以包含周期性、瞬态或随机特征的单音。实际的时域波形表示为一组载波(包含谐波和互调产物)之和,其中每个包络线都可以随时间变化

    v(t)=[k=0NVk(t)ej2πfkt]v(t)=\Re[\sum^N_{k=0}V_k(t)e^{j2\pi f_kt}]

    其中 v(t)v(t),是电路中任何节点(包括输入端)的电压。傅里叶系数 Vk(t)V_k(t) 允许随时间变化,并可以表示每个载波的任意调制。由于每个随时间变化的频谱 Vk(t)V_k(t) 都可以被看作是一个中心频率为 fkf_k 的调制波形,因此它们通常被称为“包络”。该频谱可以表示具有连续谱的瞬态信号(例如射频载波上的数字调制包络),也可以表示具有离散谱线的周期信号(例如互调失真分析所需的两个射频单音)。

    下图展示了调制信号以及仿真产生的时变频谱。从仿真中获得的任何频谱分量都可以进行处理,并以幅度、相位、I(同相调制分量)或 Q(正交调制分量)的形式显示。通过对该频谱分量进行傅里叶变换,仿真器可以像频谱分析仪一样,呈现该分量周围的频谱分布。

    包络仿真器工作原理
  • 调制信号及其仿真的时变频谱:

    该仿真器不要求中心频率处必须存在频谱分量。在给定的包络仿真中,共有 N+1 个可能的频谱分量。位于直流(DC,也称为基带分量)的分量带宽限制在 0.5/步长(奈奎斯特频率)以内,且仅使用 VkV_k 的实部。其他 N 个频谱具有 1/步长(采样频率)的双边带宽,并且通常是复数。包络波形 Vk(t)V_k(t) 具有许多有用的特性。例如,要查找 tst_s 时刻 fkf_k 附近的信号瞬时幅度,只需计算复数 Vk(t)V_k(t) 的模即可。同理,瞬时调制的相位、实部和虚部值也可以通过简单地计算 Vk(ts)V_k(t_s) 的相位、实部和虚部来提取。

需要注意的是,这个过程仅提取 fkf_k 频率附近的调制幅度。它不会包含相邻频谱(如 fk1f_{k-1}fk+1f_{k+1})的任何成分,即使在物理上这些频谱实际上已经发生了重叠。但是,如果 fkf_k 频谱内部本身就包含多个单音,那么这种解调处理会把它们全部包含在内。

这种简单的方法(指直接取 VkV_k 的模值)无法实现在 fkf_k 频谱内部仅解调其中一个单音而排除其他单音。若要仅解调某一个单音,必须先在仿真电路中使用合适的滤波器来选中目标单音。这里的意思是,如果你在 fkf_k 这个频段内塞了好几个信号

  • 电路包络与频域定义器件(FDD):

    随着无线通信应用的持续增长,标准、预配置的模型已无法满足所有的建模需求。用户需要能够自行定义时域或频域中的非线性模型。频域定义器件的开发,旨在允许用户通过其他电压和电流频谱值的代数关系,直接描述电流和电压的频谱值。

    数字通信系统的另一个趋势是定时(Timing)问题,因为表现出非时不变特性的子系统正变得日益普遍。时钟系统、采样系统、TDMA 脉冲系统以及数字控制系统,即便在射频(RF)和微波领域也越来越常见,因此行为级模型必须能够包含这些效应。所以,除了频域建模特性外,FDD 还允许建模者定义触发事件,在触发时刻对电压和电流进行采样,并生成输出(这些输出可以是触发时间或触发时刻复数频谱电压/电流值的任意函数)。

  • 电路包络与组件:

    通常情况下,Advanced Design System (ADS) 中提供的任何组件都可以用于执行包络仿真的电路中。某些组件特别适合此类电路设计,例如 n 进制调制器/解调器或频谱波形源。


仿真器工作参数

仿真器环境设置

仿真器环境设置
选项栏 说明
Times 时间参数,这里的仿真截止时间和时间步是通过外面的 VarEqn 变量来控制的。注意:参数 Time step(时间步长)定义了调制包络允许的最大带宽(±0.5 / Time step)。由于时域积分算法的特性,为了在最高调制频率下获得精确的仿真结果,分析带宽(1 / Time step)应至少是调制信号带宽的两倍。Stop time(截止时间)定义了扫频时间仿真的最大持续时长。分析从 time = 0 开始,因此存储的仿真时间点总数等于 1 + (Stop time / Time step)。在每一个时间点上,包括直流(DC)在内的所有分析频率的包络值都会被保存下来。
Use automatic time step control 使用自动控制时间步长,由局部截断误差 LTE 来控制。当不勾选该选项时,步长保持为 Step 参数中设定的固定值。不过,如果求解器在某些时间采样点遇到收敛性问题,步长偶尔也会自动减小。当勾选该选项时,电路包络仿真会检查感兴趣谐波的 LTE(局部截断误差),从而根据波形的动态特性动态调整步长。开启此选项可以更好地对频率相关元件进行积分计算,从而提供更高的精度。由于可能会计算更多的时间采样点,其仿真速度可能比固定步长慢。此外,即使计算了更多的采样点,最终也只有原始网格上的时间采样点(t=kstept=k\cdot \text{step})会被保存下来。
勾选:相当于“自动挡”。波形剧烈变化时,仿真器会自动跑细一点,保证精度,适合处理电容、电感这类对时间变化敏感的元件,但耗时更长。
局部截断误差,即将当前值通过积分法计算出来的斜率,去外推预测下一个时间点的值,再与MNA求解出来的真值进行比较,得出的误差作为衡量时间步选取的指标。
Enable Compact Test Signal 启用紧凑测试信号,启用此选项后,可以使用“紧凑测试信号”功能。目前,紧凑测试信号仅能针对单一信号源生成。紧凑测试信号的长度更短。它的生成方式确保了其能够代表完整的原始调制波形,并保留了重要的特征。对于特性仿真(例如失真、EVM 等),紧凑测试信号可以大幅缩短电路包络仿真的时间。这是仿真软件的一种“加速补丁”,用代表性的短信号代替冗长的长信号,牺牲极小部分的随机性来换取极大的仿真速度提升。
Compact Test Signal Length 为紧凑测试信号设置长度,该长度应该小于包络仿真的时间。该长度会成为包络仿真的新的截止时间。
Fundamental Frequencies 基频设置,这里的 flambda 通过外面的 VarEqn 变量控制,确定了载波的基频 f0f_0,Order 代表谐波级次,这里选择一次谐波,因为这里只考虑原始载波。
Maximum mixing order 最大混频阶数是指仿真中互调产物的最大阶数。组合阶数是指构成频率列表中各个频率项时,各分量频率阶数相加或相减后的总和。例如,假设有两个基频,且阶数设为 3。如果“最大混频阶数”设为 0 或 1,则不会仿真任何混频产物,频率列表仅由每个信号源的基波以及一、二、三阶谐波组成。如果设为 2,则和频与差频会被添加到列表中。如果设为 3,则一个信号源的二阶谐波可以与另一个信号源的基波进行混频,依此类推。
1. 谐波 (Harmonics) vs 混频 (Mixing):
- 谐波是自己跟自己玩(2f1,3f12f_1,3f_1
- 混频是两个频率打架(f1±f2,2f1±f2f_1\pm f_2,2f_1\pm f_2
2. 阶数计算:
- f1+f2f_1+f_2 是 2 阶(1+1)
- 2f1f22f_1-f_2 是 3 阶(2+1)
3. 为什么要设置限制?
如果这个值设得很大,仿真器会计算成千上万个混频点(比如 5f14f25f_1-4f_2),这会显著拖慢速度。通常为了看 IM3(三阶互调),这个值至少要设为 3。
Enable Fast Envelope 启用快速包络。快速包络过程通过宏模型(macro-models)计算取代了传统的电路包络积分。启用后,仿真分两个阶段进行:第一步通过内部谐波平衡(HB)仿真来表征电路特性,生成构建模型方程所需的数据;第二步利用这些宏模型来计算电路对调制信号的响应。
Reuse FCE cache file 复用 FCE 缓存文件,当启用此选项时,仿真器会在缓存中查找之前提取的 FCE 数据(宏模型参数),如果当前的仿真场景可以复用这些数据,则能显著加快仿真速度。但如果修改了器件参数,就不能复用该宏模型了。
Status Level 在消息窗口的“状态/摘要(Status/Summary)”部分打印仿真信息。
- 值为 0:根据仿真引擎的不同,仅报告极少信息甚至不报告信息
- 值越高:打印的细节越丰富
- 打印信息的类型:可能包括每个电路节点的电流误差之和、是否达到收敛、资源占用情况以及数据集的保存路径
- 信息的数量与类型:取决于“状态等级”的具体数值以及仿真的类型

针对 Enable Fast Envelope 里的宏模型,要介绍一个很关键的概念,叫做 Volterra 级数

Volterra 级数就是带记忆的泰勒级数,是卷积里的泰勒级数。

  • 泰勒级数(无记忆):它认为输出只取决于当前时刻的输入。

  • 公式:y(t)=ax(t)+bx2(t)+cx3(t)...y(t)=a\cdot x(t)+b\cdot x^2(t)+c\cdot x^3(t)...

  • 对应 Modeling type 里的 Level 1

  • Volterra 级数(有记忆):它认为输出不仅取决于现在,还取决于过去一段时间的输入。

  • 它引入了时延:y(t)=h1(τ)x(tτ)dτ+h2(τ1,τ2)x(tτ1)x(tτ2)dτ1dτ2+h3(τ1,τ2,τ3)x(tτ1)x(tτ2)x(tτ3)dτ1dτ2dτ3+...y(t)=\int h_1(\tau)x(t-\tau)d\tau+\int\int h_2(\tau_1,\tau_2)\cdot x(t-\tau_1)x(t-\tau_2)d\tau_1d\tau_2+\int\int\int h_3(\tau_1,\tau_2,\tau_3)\cdot x(t-\tau_1)x(t-\tau_2)x(t-\tau_3)d\tau_1d\tau_2d\tau_3+...

  • 描述了一个时刻信号,两个时刻信号,三个时刻信号如何共同影响当前输出

  • 第一项线性项代表现在的输出受过去输入的影响(线性滤波),高阶项(第二、第三…)代表输出受过去多个输入相互作用(相乘)的影响,即非线性失真

  • 由于 Volterra 阶数上去,积分号也在增加,计算量呈指数型增长。因此,Fast Envelope 使用的是简化形式,记忆多项式

y(t)=k=1Kq=0Qakqx(tq)x(tq)k1y(t)=\sum^K_{k=1}\sum^Q_{q=0}a_{kq}\cdot x(t-q)|x(t-q)|^{k-1}

  • 当 level=1 时,k=1,3,5…,q=0(无记忆),Vout(t)=A(Vin(t))Vin(t)ejϕ(Vin(t))V_\text{out}(t)=A(|V_\text{in}(t)|)\cdot V_\text{in}(t)e^{j\phi(|V_\text{in}(t)|)},其中 A(Vin(t))A(|V_\text{in}(t)|)ϕ(Vin(t))\phi(|V_\text{in}(t)|) 根据宏模型映射表查询,相当于当前输出的增益和相移受当前输入幅值的影响

  • 之所以不存在 level=2,4,6 的情况,是因为这些偶阶项产生的频率分量通常分布在 DC 或 2fc2f_c 附近,这些分量距离有用的信号(载波 fcf_c)非常远,会被电路中带通滤波轻松滤除

  • 当 level=3 时,k 依然保留所有奇数阶,但仅有1和3引入了记忆,q 为记忆范围,相当于当前输出不仅考虑当前非线性的影响,还考虑了过去非线性对当前的输出的影响

  • 可以通过 HB 分析求解各级 Volterra 级数,构建非线性宏模型,加速包络仿真

  • HB 仿真器通过对电路在载波频带内,各单音求解非线性谐波平衡方程,得到不同幅度下谐波分量的解,由此构建出一个(输入幅度/频率)->(输出幅度/相移)的映射关系模型

  • 在 level 3 或更高等级中,这个映射关系不再是一条线,而是一个多维空间:

  • 维度 A:输入幅度(决定非线性的剧烈程度)。

  • 维度 B:频率偏移(决定了线性频率响应,即 k=1 的记忆)

  • 维度 C:双音间距或包络变化率(决定了互调产物的记忆,即 k=3 的记忆)

HB 仿真器通过在这些维度上进行“网格化扫描”,把电路的所有“脾气”都记录在这个多维映射表里

  • 仿真器通过曲线拟合算法,让 Volterra 多项式的系数(核)去完美贴合 HB 扫出来的那些散点数据

  • 传统 Envelope:每走一步都要重新去推导、求解复杂的非线性矩阵方程。

Fast Envelope:由于有了 Volterra 核构成的映射模型,它只需要执行“查表 + 插值计算”。这把原本属于“电路仿真”的问题,变成了一个高效的“数字信号处理(DSP)”问题

仿真器参数设置

仿真器参数设置
选项栏 说明
Integration 积分法,我们在 THE DESIGNER’S GUIDE TO SPICE AND SPECTRE 中讲过,这里默认用的二阶后向差分 Gear2,将导数用特定多项式插值表示。
Sweep offset 扫描偏移,该参数会将输出的扫描数据延迟到达到 SweepOffset 设定值后才开始记录。同时,它会将该起始点的值重置为 0。例如,如果仿真总时长为 1 毫秒,而 SweepOffset 设为 0.6 毫秒,那么最终输出数据的时刻表将从 0 开始,一直到 0.4 毫秒结束。这也是为什么该参数不叫“起始时间 (TimeStart)”的原因(如在瞬态仿真中那样)。SweepOffset 的值并不会改变瞬态仿真的启动时间,无论如何设置,瞬态仿真始终从 time = 0 开始运行。作用就是跳过仿真刚开始的一些不稳定暂态过程
Turn on all noise 开启全部噪声。在仿真中包含电阻、有损传输线、二极管、晶体管等器件的噪声。这会在所有的包络频率上添加独立的高斯白噪声。显式噪声源(如 V_Noise、I_NoiseBD、带相噪的放大器模型等)也会贡献其噪声。全非线性电路方程会应用于合成后的信号,因此无需对噪声的相对大小做任何小信号假设,噪声电压将直接加入仿真。对于非基带的包络频率,噪声将是复数形式,同时产生等效的幅度噪声和相位噪声。噪声由随机数生成器产生,每次运行仿真都会生成不同的随机序列。如果需要可重复的序列,可以通过在原理图公式中将仿真器变量 _randseed_ 设置为一个整数值来实现。例如:__randseed=12345(注意 randseed 前有两个下划线)。
对于非线性噪声处理:由于仿真不使用“小信号假设”,噪声不仅仅是简单地叠加在输出端,而是会随着信号一起经过那个“黑盒”。这意味着,大信号引起的噪声调制(比如噪声随功率增加而改变)也能被模拟出来
调试 __randseed:保证每次噪声完全一致
Device Fitting 器件拟合。该选项框包括一系列勾选栏和设置栏,主要针对器件拟合的细节进行设置。考虑到数据集器件或通用线性器件无法表示成 esTP(s)Q(s)e^{-sT}\cdot\frac{P(s)}{Q(s)} 的形式,这里支持以下建模方法:
- 卷积:该方法类似于瞬态仿真中的卷积。相比有理函数拟合,该方法能提供更可靠的结果,但仿真时间更长,内存消耗也更多。
- 有理函数拟合:这是默认选项。像是在做“曲线拟合”。它把 S 参数这种离散点拟合成一个数学公式(零极点)。优点是算起来极快,但如果 S 参数曲线太抖(比如高 Q 值滤波器),拟合可能会失真。
Enforce passivity 强制无源性。检查并强制拟合模型满足无源性(通过检查 SSS\cdot S^* 矩阵的特征值),仅在仿真出现不稳定(如电压异常飙升,可通过 Status Level 4 查看)时开启。这可能会牺牲一定的拟合精度。
Check fit accuracy 在仿真前进行两次稳态分析,对比“原始插值”与“拟合转换”后的响应。如果误差超标,会生成文件记录节点电压偏差。用户可据此判断拟合误差是否可接受。若误差过大,需调整带宽比例或开启卷积。
Use convolution 针对某些频率相关器件(如 MoM 组件和 S 参数模块),开启卷积运算以替代多项式拟合。
Warn when poor fit 当包络拟合效果不佳时,弹出警告信息。
Skip fit at baseband 指示仿真器在直流(DC)基带处不使用零极点拟合或卷积。若外部 S 参数数据在低频段不准确,拟合会失败。此时可开启此项,或配合“拟合较差时警告/使用”参数来平衡稳定性。
Use fit when poor 指示仿真器即便拟合质量差,也使用该拟合模型而非固定常数值。
Skip fit at harmonics 在最高阶谐波处改用常数拟合。这能显著减轻大型 S 参数(SnP)或电磁模型(EmModel)块的仿真负担,且对精度影响极小。
Dump fitting data 转储拟合数据。将拟合数据保存至数据集。你可以绘制每个频率相关器件(特别是 n 端口器件)在各次谐波下的 S 参数原始数据与拟合曲线的对比图。限制:为防止数据集过大,超过 5 端口的器件数据不会被保存。
Bandwidth fraction 决定用于拟合的包络带宽比例。默认值为 1.0,即仅使用每个载波周围 ±0.5×BandwidthFraction/Timestep\pm 0.5\times \text{BandwidthFraction/Timestep} 范围内的频率值。若需提高带宽边缘的精度,可增加此值,但这会增加拟合阶数并延长仿真时间。设为 0.0 将禁用零极点拟合,仅使用常数值。这速度最快,但会丢失所有瞬态效应。所谓禁用零极点拟合,代表仿真器会读取 S 参数在中心频率哪一个点的值,然后认为在整个仿真带宽内,该器件特性永远保持不变,S 参数为一条平行线。
Relative/Absolute tolerance 设置包络拟合的截断因子,用于控制拟合的精度。RT 通常在 1e-3 到 1e-4,AT 取决于电流/电压的量级,通常极小。留白什么都不填,仿真器会根据你电路中的信号强度和 Step 步长,自动寻找一个平衡点。如果你发现仿真日志里出现了 “Poor fit detected” 或者 “Fitting accuracy is low”,你才需要考虑动这两个值。

针对器件拟合这一块,需要对两种建模方式:

  • 卷积建模

  • 有理函数拟合建模

分别进行说明

卷积建模:

  1. 将器件频域 S 参数原数据通过 IFFT 直接变成时域一段波形,即冲激响应 h(t)h(t)
  2. 仿真器存储该段波形作为特征,保存在内存中时刻准备被调用
  3. 当输入信号 x(t)x(t) 进来时,仿真器直接调用 h(t)h(t) 做积分运算
  4. 卷积建模不拟合公式,直接用原始数据变换后的结果做电路计算

有理函数拟合:

  1. 根据 S 参数曲线,猜一个代数方程,比如 H(s)=P(s)Q(s)H(s)=\frac{P(s)}{Q(s)},确定拟合阶数,N 阶就是 H(s)=(sz1)(sz2)...(szN)(sp1)(sp2)...(spN)H(s)=\frac{(s-z_1)(s-z_2)...(s-z_N)}{(s-p_1)(s-p_2)...(s-p_N)}
  2. 本质就是找到一组最合适的零极点 z 和 p,用一个简单公式替代原始数据点。

设置初始值

该功能可启用自动化的瞬态辅助谐波平衡(TAHB)以及谐波平衡辅助谐波平衡(HBAHB)。在电路包络(Circuit Envelope)仿真的第一个时间点,TAHB 会为底层的谐波平衡仿真提供一个基于瞬态仿真的初始值。这个初始值就是求解非线性 MNA 的那个初始值。之前已经知道,电路包络仿真在每个时间点都要跑一遍 HB(谐波平衡)。HB 的核心算法是牛顿迭代法,而牛顿法能否跑通,取决于你给它的起始搜索点(初始值)离真相近不近。

  • TAHB:
    • 痛点:对于高度非线性的电路(比如带强反馈的振荡器或深度饱和的功放),HB 有时会因为初始值不好而“找不到解”(不收敛)。
    • 原理:在仿真的第一步,它先悄悄跑一小段简单的瞬态仿真。瞬态仿真虽然慢,但它几乎总能收敛。
    • 接力:把瞬态仿真算出来的那个“靠谱”的结果作为 HB 的起点,HB 就能瞬间锁定目标。
  • HBAHB:
    • 通常是用一个参数更简单的 HB 结果(比如功率较低时)去辅助一个更复杂的 HB 仿真。

这是为了防止你的包络仿真在第一个时间点就报错崩溃。如果你的电路非常复杂,开启 TAHB 可以显著提高仿真的收敛稳定性

由于这里涉及到初值搜寻,建议去 THE DESIGNER’S GUIDE TO SPICE AND SPECTRE 中回顾相关的知识点。这里的选项是计算、加载和输出初值的相关功能。

振荡分析

这个选项卡是针对电路中包含振荡器情况的分析,启用此选项后,在执行第一个时间步仿真之前,仿真器会先进行一次常规的谐波平衡仿真。这用于确定电路的稳态振荡频率,并将其设置为分析频率。如果电路中包含振荡器,请务必选择此项。

选项栏 说明
Use Oscport 使用 Oscport。如果电路中包含 OscPortOscPort2 控件,请选择此方法。OscPort 用于单端振荡器,通常插入在反馈环路中,它会断开环路进行大信号注入分析,再闭合环路寻找平衡。OscPort2 用于差分(平衡)振荡器。它有一对输入输出,专门处理那些具有对称结构的振荡器(比如 LC 交叉耦合对振荡器)。它们会在电路中插入一个虚拟的电压源,不断调整这个电压源的频率和幅度。直到它发现:在该频率和幅度下,电路反馈回来的电流刚好等于这个源输出的电流。此时,即便把这个 OscPort 拿掉,电路也能靠自己维持这个状态。这就是找到了稳态振荡点。
Specify Nodes 指定节点,即 OscProbe。如果电路是振荡器但没有 OscPortOscPort2,则应选择此方法。选定此方法后,下方的选项卡才都会打开。
Node Plus 正极节点。振荡器中某个已命名节点的名称(必填)。建议选择有源器件的输入/输出端或谐振器中的节点。支持层级命名。
Node Minus 负极节点。仅在分析差分(平衡)振荡器时才需指定第二个节点。单端振荡器请留空。正负节点应对称选择。
Fundamental Index 基频索引。指定哪个基频作为仿真器待求解的“未知振荡频率”。默认值 1 表示将 Freq[1] 视为未知量。这里的基频就是前面 EnvSetup 里设置的基频,一般指的是载波。如果跑混频器的包络仿真,Freq[1] 设为射频(RF),Freq[2] 设为本振(LO),这样就能观察到 f1±f2f_1\pm f_2 等各种组合出来的频谱包络了。
Harmonic Number 谐波次数。指定用于振荡器的谐波次数。通常保持默认值 1。如果要分析接有分频器的振荡器,该参数应设为分频比。
Octaves to Search 搜索倍频程。用于振荡器分析时的初始频率搜索。仿真器会以“Freq”选项卡中设定的频率为中心,搜索指定数量的倍频程。若想跳过初始搜索,请在“Freq”选项卡提供一个精确的频率预测值,并将此参数设为 0。
Steps per Octave 每倍频程步数,初始频率搜索时每倍频程的步进数。高 Q 值振荡器可能需要很大的值(如 1000),以便搜索算法能捕捉到谐振点的相位偏移。
Calculate oscillator startup transient 计算振荡器起振瞬态。
- 勾选:将振荡器电压初值重置为零,以便模拟从开机到振荡建立的整个起振过程。
- 不勾选(默认):时域解将直接从稳态解开始,跳过起振建立时间,让振荡器立即开始响应外部调制。

注意: OscPort(如果存在)仅用于初始的稳态寻找仿真。一旦实际的包络仿真开始,它就会被禁用。

定义谐波平衡仿真参数

该选项卡定义 HB 仿真参数 Params 主要包含以下核心部分:

  • 指定要保存的器件工作点信息的数量
  • 指定 FFT 过采样率
选项栏 说明
Device operating point level 器件工作点等级。允许将所有器件工作点信息保存到数据集。如果本次仿真执行了多次包络分析(来自多个 Env 控制器),则所有分析的工作点数据都会被保存,而不只是最后一次。默认设置为 None。
None 不保存任何信息。
Brief 保存器件电流、功率以及一些线性化器件参数。
Detailed 保存完整的工作点数值,包括器件的电流、功率、电压以及线性化器件参数。
Fundamental Oversample 基频过采样。设置 FFT 过采样率。较高的数值通过减少 FFT 混叠误差并改善收敛性来提高解的精度。使用“直接谐波平衡法”时,内存和速度受到的影响比使用“Krylov”选项时要小。
More… 显示一个小对话框。若要提高仿真精度,请在字段中输入一个整数,代表仿真器对每个基频进行过采样的比例。

在传统的 DC 仿真中,工作点是一个固定的电压/电流值。但在包络仿真里:

  • 随时间变化:当你输入调制信号时,晶体管的偏置状态会随着信号包络的起伏而实时摆动。

  • 包络数据点:如果你开启了 Detailed,仿真器会记录下在每一个 Time step 时刻,器件内部真实的、处于大信号工作状态下的参数。

  • None:只看最终的端口电压电流,不看器件内部“身体状况”。(仿真最快,占内存最小)。

  • Brief:相当于“抽血检查”,只给你看电流、功率等核心指标。

  • Detailed:相当于“全身体检”,把所有非线性公式里用到的中间参数(电压、线性化参数、电荷量等)全部存下来。

什么时候需要开到 Detailed?

  • 调试收敛性:当仿真报错说某个点不收敛时,查看详细工作点可以发现是否有电压超出了模型的有效范围(例如电压飞到了几千伏)。
  • 分析非线性根源:比如你想知道为什么激光器的二阶失真这么大,你可以去查晶体管的 CgdC_{gd} 随时间摆动的曲线。

这里的器件工作点记录的是在大信号驱动下,器件内部每一时刻的“动态”工作点,而不仅仅是开机时的 DC 状态。

求解器设置

这里的求解器依然是谐波平衡仿真器的求解器,因此选项卡内的情况与 HB 的一样。

求解器设置

收敛模式 (Convergence Mode)

用于求解非线性方程组的外部求解器

名称 描述
自动 (Auto) 默认且推荐。结合了基本和高级模式的优点,兼顾速度与稳健性。若无法达到默认精度,它会自动放宽容差以求收敛,并在窗口给出警告及最终达到的精度等级。
高级 (Advanced) 强力模式。确保每次迭代都能最大限度减小 KCL(电流)残差。虽然速度略慢,但非常适合处理强非线性电路(如极高功率电平)。建议配合 Robust 迭代次数设置。
基本 (Basic) 快速模式。适用于大多数普通电路。但在强非线性情况下可能难以收敛,此时应切换到高级模式。
  • 最大迭代次数 (Max. iterations):设置牛顿法尝试求解的最大次数。
    • Robust:默认且推荐,次数较多。
    • Fast:次数较少。
    • Custom:手动输入(建议 50-100)。

高级弧长连续法参数 (Advanced Continuation Parameters)。弧长连续法(Arc-length continuation)是一种极其稳健的算法。如果它都失败了,请先尝试其他收敛补救措施,最后再考虑调整这些参数。

名称 描述
弧长最大步长 限制弧长步长的上限。默认为 0(不限制),步长由系统自动计算。
层级最大步长 限制源级(source-level)连续法的最大弧长步长。
弧长最小值 设定连续参数 p 的下限。如果 p 在追踪复杂流形过程中小于此值,则视为收敛失败。
弧长最大值 设定连续参数 p 的上限。如果 p 大于此值,则视为收敛失败。
最大步数比 控制连续法执行的最大总步数(默认 100)。
最大收缩比 控制弧长步长的最小值(默认 1e-5),防止步长无限缩小。
  1. 收敛模式怎么选?
    • 平时用 Auto。如果状态窗口报一堆“电流残差(Current Residual)”错误,或者曲线在功率高的时候断掉了,再改用 Advanced (Robust)。
  2. 什么是“弧长连续法”?
    • 你可以把它想象成在爬崎岖的山路。普通的牛顿法容易在陡坡上摔倒(不收敛),而弧长法会沿着山路的轮廓一点点挪动(追踪解的轨迹),即使路径弯弯曲曲(非单调变化)也能找过去。
  3. 为什么需要 ArcMinValue/MaxValue?
    • 在一些具有负阻特性(如隧道二极管)或迟滞效应的电路中,电压/电流的变化不是线性的,可能会往回转圈。设置上下限是为了防止算法在追踪这些奇怪波形时跑得太远。

这里介绍一下弧长连续法,辅助牛顿法收敛的数学算法

之前的博客文章电路仿真器是如何工作的介绍过了 Spectre 和 HSPICE 中直接进行牛顿迭代往往因为初始猜想值偏离实际解太远而导致不收敛。为了解决这个问题,其中一个重要策略是连续法 / 步进法 (Continuation / Stepping Methods)。

  • 源步进 (Source Stepping): 将电路中所有的独立源(电压源、电流源)从 0 开始逐渐增加到设定值。在每个步进点,使用前一个点的解作为牛顿迭代的初始值。
  • Gmin 步进 (Gmin Stepping): 在电路的每个非线性节点(如二极管、晶体管的 PN 结)并联一个非常大的电导(Gmin)。初始时 Gmin 较大,使矩阵变得“容易收敛”,随后逐渐减小 Gmin 直至其对电路影响消失,每一步都利用上一步的结果作为初值。

利用上面的思想,现在解的是更一般的非线性方程组:

F(x,λ)=0F(x,\lambda)=0

这里:

  • xx:MNA 未知量,比如节点电压、支路电流

  • λ\lambda:一个连续化参数,常见做法是把源乘一个标量,比如

bλb,λ[0,1]b \to \lambda b,\quad \lambda\in[0,1]

也就是把电源、激励、电流源或某个器件参数从小到大“扫”上去

这时候,牛顿法不是单纯“沿 xx 轴找根”了,而是在固定 λ\lambda 下,对 F(x,λ)=0F(x,\lambda)=0 做牛顿迭代。真正的解是一条在 (x,λ)(x,\lambda) 空间里的平衡路径。伪弧长 continuation 的几何图像,就是沿这条路径继续走,即使它在某处“折回”也能过去。几何上,相当于在 (x,λ)(x,\lambda) 图上,每次都在固定参数切片上找解。如果只画一维状态 xx 和一维参数 λ\lambda,平衡解会是一条曲线。普通参数扫描只能在“固定 λ\lambda”的方向找交点。到了折回点,同一个 λ\lambda 可能没有解、或有多个解,于是牛顿会跳支、发散,或者直接卡住。伪弧长 continuation 正是为了解决这个问题,将牛顿法拓维到更高的维度循迹找平衡解。

连续弧长法

稍微记录一下具体实现:
预测与纠正向量

当前电路的演化路径为图中 F(x,λ)=0F(x,\lambda)=0 的曲线,曲线上的每个点都是电路在某个确定连续化参数 λ\lambda 下的解。假定最下面的点是上一次求解的位置,传统牛顿法是在求解

JΔx=F(x)JΔx+F(x)=0J\Delta x=-F(x)\Leftrightarrow J\Delta x+F(x)=0

但这里升维了,求解的是

JΔx+F(x,λ)Δλ=0J\Delta x+F(x,\lambda)\Delta\lambda=0

可以认为牛顿法从一元迭代升维到二元路径迭代。弧长连续法设定的弧长步进区间,相当于给搜寻路径加了一个约束范围,也就是图中圆的轮廓。

Predictor 是该二元曲线在求解位置点处沿切线向量延长圆半径长度后的点(tkt_k 是单位切向量,Δs\Delta s 是步进弧长)

(xp,λp)=(xk,λk)+Δstk(x_p,\lambda_p)=(x_k,\lambda_k)+\Delta s\, t_k

Corrector 是从 Predictor (xp,λp)(x_p,\lambda_p) 出发,沿着与切线方向垂直的方向找到的与解曲线的交点,从 (xp,λp)(x_p,\lambda_p) 出发,解扩展方程(tkt_k^\top 是单位切向量垂向量)

{F(x,λ)=0tk([x;λ][xp;λp])=0\begin{cases} F(x,\lambda)=0\\ t_k^\top\big([x;\lambda]-[x_p;\lambda_p]\big)=0 \end{cases}

收敛后得到 (xk+1,λk+1)(x_{k+1},\lambda_{k+1}),再更新切向量,继续走下一步。如此一来,F(x,λ)=0F(x,\lambda)=0 便能循着轨迹收敛而不会卡在某个“折回”的区间。

矩阵求解器部分 (Matrix Solver Section)

用于设置电路方程组矩阵的求解配置。这里需要选择求解器类型,选择仿真过程中使用的线性方程组求解器。

  1. 自动选择 (Auto Select)——默认且推荐

    仿真器根据电路复杂度、频谱复杂度及可用内存自动平衡。它会估算所需的 RAM,并决定使用 Direct(直接法) 还是 Krylov(迭代法)。如果自动选择了 Krylov,相关参数也会自动优化。

  2. 直接求解器 (Direct Solver)

    • 原理:使用高斯消元法等直接矩阵分解技术。

    • 适用场景:小型电路(器件少、非线性弱、谐波少)。

    • 局限性:在大规模电路下效率极低。计算量随规模立方倍增加(O(N3)O(N^3)),内存随平方倍增加(O(N2)O(N^2)

    • 提示:默认会进行“带宽截断(GuardThresh)”以加速,若遇到收敛问题,可设为 0(全带宽)以提高精度。

  3. Krylov 求解器 (Krylov Solver)

    • 原理:一种迭代线性求解器,不需要显式存储巨大的雅可比矩阵(Jacobian)。内存随谐波数量线性增长(O(N)O(N)

    • 适用场景:超大型电路(RFIC、大型射频系统)、谐波数量极多、内存占用超过物理内存的情况。

    • 精度与收敛:

      • 收敛标准 (Tight Tolerance):残差小于 Tight Tolerance(精细容差,默认 0.001) 视为完全收敛。
      • 松弛策略 (Loose Iterations):如果迭代 50 次(Loose Iters)仍未收敛,会尝试使用 Loose Tolerance(松弛容差,默认 0.1) 达到部分收敛。
      • 迭代限制 (Max Iterations):默认 150 次。若经常达到上限,需手动调大。
      • 噪声容限 (Krylov Noise Tolerance):专门用于小信号 HB 或非线性噪声分析,默认 1e-6。由于噪声分析对精度极度敏感,它必须设得非常严苛。如果调大此值,得出的噪声底限可能就不准。

核心参数定义:

  • 矩阵复用 (Matrix Re-use):仅限直接求解器。控制雅可比矩阵的重新生成频率。
    • Fast:频繁复用(快但不够稳)。
    • Robust:频繁重新计算(慢但非常稳)。
  • Krylov 重启长度 (Krylov Restart Length):设置 GMRES 算法重启前的迭代次数。值越大越稳健,但更费内存和 CPU。
  • 矩阵压缩 (Matrix Packing):一种频谱压缩技术,可减少 60-80% 的内存占用。建议仅在内存报红时开启,因为它会增加计算时间。
  • 预处理器 (Preconditioner):Krylov 求解器的“助推器”。
    • DCP - 直流预处理器 (DC Preconditioner) —— 默认项:在大多数情况下非常有效,但在处理某些强非线性电路时会失效。
      • 原理:它对整个电路进行直流(DC)近似。
      • 优点:由于其**块对角线(Block-diagonal)**的特性,它只需进行一次矩阵分解,就可以在后续每个线性求解步骤中以极低的成本复用。
      • 实现:它通过忽略除 DC 傅里叶系数以外的所有内容来近似雅可比矩阵(仅保留雅可比矩阵的对角块)。
    • BSP - 分块选择预处理器 (Block Select Preconditioner):当使用 DCP 选项导致 Krylov HB 仿真无法收敛时,推荐使用此选项。
      • 特点:对于高度非线性电路,BSP 比 DCP 更稳健。
      • 开销:如果电路本身用 DCP 就能收敛,切换到 BSP 带来的额外开销很小;但对于 DCP 失败的电路,BSP 通常能以增加内存占用为代价实现收敛。
    • SCP - 舒尔补预处理器 (Schur-Complement Preconditioner):同样旨在解决 DCP 无法收敛的情况。
      • 特点:高度非线性电路的稳健选择。
      • 原理:与 DCP 类似,它对电路的大部分使用 DC 近似,但会剔除电路中最具非线性的部分,转而使用专门的 Krylov 求解器进行处理。
      • 开销:由于需要构建“知识库”以提高仿真后期的效率,SCP 会带来额外的内存开销。

这里简单介绍一下直接求解器算法和 Krylov 求解器算法。两者分别代表了"硬碰硬"和"巧干"两条路线。

1. 直接求解器 (Direct Solvers) — 所谓的直接求解器,就是数学核心为高斯消元与 LU 分解的求解器,走的是硬碰硬的路子:

  • 操作: 通过行变换将复杂的雅可比矩阵变成上三角矩阵(或者是通过 LU 分解变成一个下三角 LL 和一个上三角 UU 的乘积)。
  • 求解: 一旦变成了三角阵,就可以通过"回代"(从最后一个变量往前推)轻松算出结果。
  • 代价(内存炸弹): 为了做这个变换,必须在内存里开辟一块巨大的空间,把矩阵里成千上万个元素全部存下来(O(H2)O(H^2))。
  • 缺点: 当谐波 HH 很多时,矩阵会变得极其庞大,电脑内存会瞬间被填满。

2. Krylov 求解器 (Krylov Solvers) — 所谓 Krylov 求解器,就是不停迭代试探,在 Krylov 子空间将解给搜出来。Krylov 求解器(如 GMRES)走的是一条"聪明"的路,它根本不存完整的矩阵:

  • 核心逻辑: 它把线性方程 Jx=bJ \cdot x = b 看成一个黑盒运算,不需要知道 JJ 矩阵里每个坑填的是什么,只需要知道:如果随便给一个向量 VV,矩阵 JVJ \cdot V 的结果是多少?
  • 搜索过程(子空间迭代):
    1. 先随便猜一个解 x0x_0
    2. 计算残差,并利用矩阵-向量乘法产生的向量构建一个"Krylov 子空间"(可以想象成在一块特定的区域内寻找答案)。
    3. 在每一轮迭代中,通过不断修正方向,让结果越来越接近真实的解。
  • 优点: 因为它只记向量(一串数),不记矩阵(一大片数),所以内存占用极低(O(H)O(H) 线性增长)。
  • 缺点: 它是"试"出来的。如果电路太复杂,可能试了 150 次(MaxIters)都试不出正确答案。

3. Krylov 与梯度下降的类比 — 可以看到,Krylov 这种求解线性方程组的线性迭代法很像机器学习中的梯度下降法,但它们存在本质区别:

  • 梯度下降法(最基础的"试探"): 每一步都沿着当前最陡的坡度(负梯度)往下走。缺点是它很"短视"——如果地形是一个狭长的山谷,它会在两边的山坡上来回振荡(锯齿现象),走很多冤枉路才能挪到谷底。在电路仿真中,如果用简单的梯度下降去解复杂的矩阵方程,收敛速度会慢到让人无法接受。
  • Krylov 子空间法(更聪明的"导航"): Krylov 方法(如 GMRES 或共轭梯度法 CG)是对梯度下降法的暴力升级——它不仅仅看当前步,而是记住之前走过的所有方向;在寻找下一个修正方向时,会要求新方向与之前走过的所有方向"垂直"。形象地说:在 N 维空间里,它保证每走一步就彻底解决一个维度的误差,这样就不会在同一个坑里反复振荡。
  • 搜索空间的扩大: 所谓的"Krylov 子空间",其实就是由 {残差,J残差,J2残差,...}\{残差, J \cdot 残差, J^2 \cdot 残差, ...\} 构成的一个搜索区域。它在这个不断扩大的空间里寻找最优投影解。在谐波平衡(HB)仿真中,雅可比矩阵 JJ 通常是高度非对称且条件数很差——如果用梯度下降,仿真会因为节点间的巨大差异而永远无法收敛(卡在敏感点上跳不动)。Krylov 则是通过高效空间搜索,不断迭代找到成千上万变量的线性方程组的解。

4. 牛顿法 + Krylov:完整的嵌套架构 — Krylov 属于线性迭代,前面提到的求解非线性 MNA 方程的牛顿法属于非线性迭代,它们之间存在一个严密的层级关系:

  1. 外层循环——非线性泰勒展开(牛顿法)
    • 动作:面对复杂的非线性方程 F(x)=0F(x) = 0,牛顿法在当前点进行一阶泰勒展开,丢掉高阶项,将原本"弯曲"的非线性问题变成"笔直"的线性方程 JΔx=F(x)J \cdot \Delta x = -F(x)
  2. 内层计算——线性方程组求解(Krylov 迭代)
    • 动作:面对这个巨大的线性方程组,如果电路很大,不用"暴力"的高斯消元,而是用 Krylov 子空间迭代(如 GMRES)。
    • 结果:它不存完整的 JJ 矩阵,而是通过不断的"向量乘法"试探,快速求出 Δx\Delta x
  3. 约束导向——弧长法加持(弧长约束)
    • 动作:如果电路处于极端非线性区(比如增益压缩的拐点),直接按牛顿法的 Δx\Delta x 跳过去可能会"脱轨"。此时弧长法介入,在方程组里额外加了一个距离约束 (Δx)2+(Δ(λb))2=(Δs)2(\Delta x)^2 + (\Delta(\lambda b))^2 = (\Delta s)^2,强迫每一次迭代都必须落在以旧解为圆心、弧长为半径的"圆弧"上。
  4. 最终归位——拉回解曲线
    • 动作:通过 Krylov 算出的 Δx\Delta x 虽然是在圆弧上的,但不一定在真实的物理解曲线上。牛顿法继续迭代,利用残差 F(x)F(x) 不断修正,最终将这个点垂直(或按约束方向)拉回到物理曲线上,找到真正的平衡解。

内存管理部分 (Memory Management)

这部分主要优化 谐波平衡 (Harmonic Balance) 仿真过程中的计算资源分配。

  • 矩阵带宽 (Matrix Bandwidth / GuardThresh)
    • 核心原理:控制 Newton 求解器中 Jacobian 矩阵块的截断阈值。
    • Fast (默认):通过截断带宽来加速计算并节省内存,但若 Newton 方向计算不准,可能导致不收敛。
    • Robust:不截断,使用全带宽,收敛性最好但消耗资源更多。
    • Custom:手动设定 GuardThresh 的具体数值。
  • FFT 选项 (FFT Options / PackFFT)
    • 核心原理:控制多音 (Multitone) 仿真中的频率图打包方式。
    • Minimize memory & runtime (PackFFT=yes):默认开启。通过减少时间采样点来提速和省内存,但可能因混叠 (Aliasing) 导致动态范围和精度下降。
    • Minimize aliasing (PackFFT=no):禁用打包,追求最高精度,防止混叠干扰。

波形内存缩减部分 (Waveform Memory Reduction)

这部分旨在减少仿真结果(波形数据)占用的存储空间,特别适用于大型电路。

  • 动态波形重新计算 (RecalculateWaveForms)
    • 效果:不再预先存储所有波形,而是在需要时动态重算。
    • 代价:对于小型电路,仿真速度可能会略微变慢,但能显著降低内存峰值占用。
  • 紧凑频率图 (UseCompactFreqMap)
    • 效果:通过频谱压缩技术减少单个波形数据的存储需求。

噪声设置

NoiseCons 控制器

噪声控制器实例

NoiseCon 是专门的噪声仿真控制器,允许定义更复杂的噪声分析(如相位噪声、混频噪声等)。

  • 启用开关 (NoiseConMode):勾选后才会执行列出的 NoiseCon 仿真。这可以让你在不删除具体设置的情况下快速关闭噪声计算。
  • 管理列表 (Select NoiseCons):用户可以手动 Add (添加) 或 Delete (删除) 多个不同的 NoiseCon 实例。这意味着一次 HB 仿真可以同时运行多个不同的噪声分析任务。

需要添加噪声控制器控件,仿真器中的噪声选项卡才会显示出你想要加入计算的噪声实例。

添加噪声实例

非线性噪声设置 (Nonlinear Noise)

这是直接集成在谐波平衡分析面板中的噪声选项,通常用于较简单的噪声评估。

  • NLNoiseMode:总开关,必须勾选才能启动非线性噪声分析。
  • Noise (1):在 HB 收敛得到大信号工作点后,紧接着进行一次基础的噪声分析。
  • Noise (2):提供更详细的参数化配置,包括:
    • 指定节点:选择哪些电路节点用于计算噪声参数。
    • 噪声贡献者 (Contributors):查看哪些元件是主要的噪声源,并设置阈值以忽略细微噪声。
    • 带宽设置:定义噪声仿真的频率范围。

Noise (1):专注于“频率扫描”和“噪声系数”

Noise (1) 主要解决:在什么频率下算噪声?以及从哪算到哪?

  • 扫描类型 (Sweep Type):
    • Single point:只看某一个频率点的噪声(比如 10GHz)。
    • Log (对数扫描):看相位噪声或低频闪烁噪声(1/f 噪声)时必须用这个,因为噪声在近端变化剧烈。
  • 输入/输出端口 (Port 1 & 2):
    • 你要告诉仿真器,哪个是信号进入的口(通常是 RF 口),哪个是接仪表的口(通常是 IF 中频或 Out 口)。如果不设置,它就算不出 NF (噪声系数)。通常在端接的 Num:Port Number 设置。
  • Input Frequency (针对混频器/调制器):
    • 对于混频器,噪声会从镜像频率混叠进来。在这里设置 InputFreq 表达式(如 LOfreq + noisefreq),ADS 才能准确计算 SSB NF (单边带噪声系数)。这里的镜像频率指的是混频后相对 LO 对称的另一侧频率。

Noise (2):专注于“观察点”

Noise (2) 本质上是简化版的 Nodes 设置:

  • 在这里填入你想观察的节点名称。
  • 噪声贡献者清单 (Noise Contributors),这是用来定位噪声源的。如果你发现某个节点的总噪声太高,可以用它来抓主要矛盾。
    • Mode (模式):
      • Sort by value:最实用。按噪声大小排序,把最“吵”的元器件排在前面。
      • With no device details:如果你不想看到晶体管内部细碎的电阻噪声(比如 Rb, Rc),选这个可以只看器件整体的噪声贡献,报表更干净。
    • Dynamic range to display (显示动态范围):
      • 这是一个过滤阈值。比如设为 40 dB,系统就只报告那些贡献量在总噪声下 40dB 以内的器件。如果设为 0(默认),则会列出所有有贡献的器件。
  • Include port noise:
    • 勾选它,结果里会包含输入端 Term 带来的 50 欧姆(或其他阻抗)的热噪声。如果你只想看电路本身增加了多少噪声,有时会取消勾选。
  • Calculate noisy two-port parameters (计算双口噪声参数):
    • 勾选后会进行类 S 参数的仿真,给出 NFmin(最低噪声系数)和 Sopt(最佳源匹配阻抗)。这对于设计前端匹配电路至关重要。
  • Use all small-signal frequencies (使用所有小信号频率):
    • 这是精度与内存的博弈。选 Yes(默认)最准,因为它考虑了所有混频边带的噪声折返;如果你的电脑内存(RAM)爆了,才考虑选 No
    • 噪声折返,指的是在非线性电路中,除了你关注的目标频率(比如 IF)本身的噪声外,所有镜像频率以及谐波边带上的噪声,都会通过本振 LO 及其谐波的“搬运”,叠加到目标频率上。
    • 这里说的边带,指的是以 LO 及其所有谐波为中心的所有频率窗口。
    • 边带信号会通过信号产生两部分噪声:
      • 背景噪声 (Additive Noise):即使没有信号,器件本身(电阻、晶体管)在那些边带频率上产生的热噪声、散粒噪声。
      • 信号带来的噪声转换:边带上的信号(或大信号本身)在通过非线性器件时,会与器件内部的噪声源发生相互作用(调制)。
    • Yes 时,仿真器实际上是在做一个全频谱的噪声矩阵运算:
      • 先算出每一个边带频率点上的原始噪声。
      • 再计算每一个边带到目标频率的转换增益(Conversion Gain)。
      • 最后把这些边带噪声经过器件时被“放大”或“转换”后的结果,全部叠加到最终节点。
    • 举个例子,假设在测一个 MZM 调制器:
      • 光载波在 193 THz,电信号在 10 GHz。
      • Yes 时,仿真器不仅看 10 GHz 附近的电噪,还会看载波谐波附近的噪声是如何通过 MZM 的非线性效应,最终转变成 10 GHz 处的干扰。
  • 带宽 (Bandwidth)
    • 默认 1.0 Hz,指的是每个计算点的“观察窗口宽度”或“Bin 宽度”。
      • 物理意义:功率谱密度 PSD。在噪声仿真中,噪声是分布在整个频域的。我们无法讨论“某一个绝对频率点”的噪声功率(因为单点的带宽为 0,功率也就为 0),我们只能讨论单位带宽内的噪声。当你设置 Bandwidth = 1 Hz 时,仿真器计算出的结果就是 V2/HzV^2/Hz(功率谱密度)或 V/HzV/\sqrt{Hz}(电压谱密度)。
    • 改这个值并不会改变计算出的“噪声功率谱密度”(V/HzV/\sqrt{Hz}),它只是定义了计算时的单位参考带宽。通常保持 1Hz 即可,方便后续在 DDS 中进行单位换算。

小信号设置

这一部分是小信号 (Small-Sig) 仿真模式。它通常被称为 HBSS(Harmonic Balance Small Signal),是谐波平衡仿真中一个非常聪明的偷懒技巧。

核心理念:大信号和小信号“分工”

如果你的电路中有两个信号,一个是强信号(比如本振 LO 或 激光载波),另一个是弱信号(比如射频 RF 或 噪声):

  • 如果不开启 Small-Sig:HB 仿真器必须把这两个信号都当成“大信号”处理,计算量会随着谐波阶数成倍增加,非常吃内存。
  • 如果开启 Small-Sig:仿真器先只算大信号对电路的影响(确定工作点),然后把电路看作是一个随时间周期性变化的“线性系统”,最后用线性代数的方法快速算出小信号的响应。
  • 结果:仿真速度极快,内存占用极低。

这里的 Small-signal frequencies 指的是相对于载波的偏移量。如果载波是 193 THz,想看载波旁边 10 GHz 处的信号,就在这里设置扫描类型和频率点。

  • Use all small-signal frequencies:
    • 和之前噪声部分的逻辑一样。开启它(Yes)会考虑所有的频率边带,保证混频计算的精度。
  • Merge small- and large-signal frequencies:
    • 不选(默认):结果里只显示小信号产生的侧带频率。
    • 选中:它会把大信号(载波及其谐波)和这些小信号的结果合并在一起按顺序排好。这在你需要观察完整的频谱图(既有主峰又有侧峰)时非常有用。
  • 稳定性分析 (Perform stability analysis)
    • 如果在电路中放了 WSProbe(稳定性探针),勾选这个可以检测电路在当前大信号驱动下是否稳定(有没有发生寄生振荡)。

输出设置

输出可以按照两种模式进行存储:

  • 按照层级进行存储

    • Depth = 1:只保存顶层原理图的数据。
    • Depth = 2:保存顶层原理图 + 下一层子电路(Subcircuit)内部的数据。
    • 如果 Node Voltages 设为 2,那么子电路内部的节点电压你能看到,但子电路里的子电路(孙子层)就看不到了。
    • 引脚电流:芯片各个引脚的电流,与支路电流存在区别。对于一个多引脚器件,不能像 R1.i 这样的方式来处理,只能先给定引脚,例如 Q1.B.i,指三极管模型基极电流。
  • 按照命名存储

    可以打开一个输出选定框,针对所需的节点公式和引脚电流进行输出

    根据命名存储