
1. 从一个反直觉的现象说起为什么SDM噪声在PLL里不能直接搬过去很多刚接触小数分频锁相环的朋友第一次做噪声预算时都会犯一个错误把SDMSigma-Delta ModulatorΣ-Δ调制器的量化噪声当成一个普通的白噪声源直接按带宽比例折算到输出端。结果仿真一跑发现低频段相位噪声比手算高了十几dB高频段又对不上。问题出在哪出在SDM的量化噪声不是直接加到输出上的它要经过一条完整的传递路径——从调制器输出穿过分频器、鉴相器、电荷泵、环路滤波器最后才反映到VCO的控制电压上。这条路径对不同频率的噪声有不同的增益低频被抑制、高频被放大形状完全不是平的。所以SDM量化噪声等效到PLL输出的传递函数推导这件事本质上是要搞清楚调制器在分频比上引入的抖动经过环路后在输出相位上到底被塑造成了什么形状。这个传递函数是小数分频PLL噪声预算的核心也是判断环路带宽选得合不合理、SDM阶数够不够、需不需要额外滤波的直接依据。这篇文章面向的是正在做小数分频PLL设计、需要自己动手推公式或搭模型验证的工程师也适合想搞明白为什么SDM噪声整形和环路整形会叠加这个问题的读者。我会从Z域建模开始一步步把传递函数推出来然后讲清楚每一项的物理含义最后给出实测中容易踩的坑和验证方法。全程不跳步公式和直觉解释交替着来。提示本文推导基于经典的小数分频PLL线性化模型假设环路处于锁定状态、各模块工作在线性区。大信号瞬态、非线性效应不在讨论范围内。2. 把PLL拆成Z域模块推导前必须建立的三个建模前提在动笔推传递函数之前得先把建模的地基打牢。很多推导看着复杂其实是因为一开始的假设没统一导致后面每一项的符号和系数都对不上。我一般会先把下面三件事定死后面推导就顺了。2.1 前提一用相位域而不是电压域建模PLL里各个节点有的是电压、有的是电流、有的是频率直接混着推很容易乱。标准做法是统一到相位域把分频器输出、参考输入、VCO输出都表示成相位量鉴相器输出的是相位误差乘以增益。这样做的好处是整个环路的传递函数可以用一个统一的量纲串起来最后输出相位噪声的功率谱密度PSD单位就是rad²/Hz直接对应相位噪声指标。具体来说定义参考相位为θ_ref分频器反馈相位为θ_div鉴相器增益为K_pd单位V/rad或A/rad环路滤波器传递函数为F(s)VCO增益为K_vco单位rad/s/V。这些量在连续域里是标准的但SDM是离散时间模块必须转到Z域处理。2.2 前提二SDM工作在过采样状态量化噪声可近似为白噪声Σ-Δ调制器的核心是噪声整形它把量化误差e[n]通过一个高通传递函数推到高频低频段噪声被压得很低。要推导它对输出的影响第一步是假设量化误差e[n]在采样率f_s下是白噪声功率谱密度为常数。这个假设在输入信号变化不快、调制器阶数不太高时成立得很好。对于L阶SDM其噪声传递函数NTF(z)通常是(1-z⁻¹)^L的形式CIFB结构或带零点优化的形式。量化误差经过NTF后在分频比上产生的抖动为ΔN(z) NTF(z) · E(z)其中E(z)是白噪声。这一步是整个推导的起点也是后面所有频率整形的来源。2.3 前提三环路对SDM噪声的响应可以用线性时不变模型描述虽然PLL本身是时变非线性系统但在锁定点附近小信号扰动下可以线性化。SDM引入的分频比抖动ΔN相当于在反馈路径上叠加了一个小扰动环路对它的响应可以用线性传递函数描述。这里有个关键点SDM噪声注入的位置是分频器也就是反馈路径不是直接加到输出所以它到输出的传递函数和参考噪声、VCO噪声都不一样。把这三个前提定下来接下来就可以正式进入Z域推导了。我习惯先画信号流图再写方程最后化简这样每一步都有物理对应不容易推错。3. 从分频比抖动到输出相位一步步推出SDM噪声传递函数这一节是全文的核心我会把推导拆成四个小步每一步都解释清楚为什么这么写。如果你只想记结论可以直接跳到3.4但我强烈建议跟着走一遍因为推导过程中出现的中间量在后面做噪声预算和仿真验证时都会用到。3.1 第一步写出分频器输出相位的Z域表达式分频器的功能是把VCO输出频率除以分频比N。在小数分频PLL中N是时变的由整数部分N_int和SDM调制的小数部分组成N[n] N_int ΔN[n]其中ΔN[n]是SDM输出均值等于目标小数分频比抖动部分就是量化噪声整形后的结果。分频器输出相位θ_div和VCO输出相位θ_vco的关系是θ_div[n] θ_vco[n] / N[n]在小信号近似下N[n]的抖动很小可以对上式做一阶泰勒展开θ_div[n] ≈ θ_vco[n]/N_int - (θ_vco[n]/N_int²)·ΔN[n]第一项是标称分频第二项就是SDM抖动引入的相位扰动。注意这里有个关键扰动项和θ_vco本身相乘这意味着SDM噪声到输出的传递不是简单的加法而是和VCO相位耦合的。不过在锁定状态下θ_vco的均值是稳定的小信号分析时可以把这一项线性化处理。转到Z域分频器输出相位可以写成θ_div(z) θ_vco(z)/N_int - (θ_vco_0/N_int²)·ΔN(z)其中θ_vco_0是VCO相位的直流工作点。第二项就是我们要追踪的SDM噪声注入项。3.2 第二步鉴相器和环路滤波器的传递关系鉴相器比较参考相位θ_ref和分频器反馈相位θ_div输出相位误差θ_e(z) θ_ref(z) - θ_div(z)经过鉴相器增益K_pd和环路滤波器F(z)后产生VCO的控制量。在Z域里环路滤波器的传递函数F(z)通常由连续域F(s)通过双线性变换或脉冲响应不变法离散化得到。这里要注意采样率的选择SDM工作在f_s而鉴相器工作在f_ref两者可能不同。如果f_s f_ref常见于单环小数分频那整个环路可以统一在一个采样率下分析如果f_s是f_ref的整数倍需要做多率处理会复杂一些。本文先按f_s f_ref的常见情况推导。VCO在Z域里通常建模为积分器θ_vco(z) K_vco · z⁻¹/(1-z⁻¹) · V_ctrl(z)这个积分器形式对应连续域的1/s是VCO相位累积特性的离散化表达。3.3 第三步联立方程解出SDM噪声到输出的传递函数现在把上面的关系联立起来。设环路开环传递函数为G(z) K_pd · F(z) · K_vco · z⁻¹/(1-z⁻¹) / N_int这是从相位误差到分频器反馈相位的开环增益。注意分母的N_int来自分频器的1/N缩放。SDM噪声ΔN通过分频器注入等效到鉴相器输入端的相位扰动为θ_n,div(z) -(θ_vco_0/N_int²)·ΔN(z)这个扰动和参考相位一样进入鉴相器后被环路响应。根据线性系统的叠加原理SDM噪声到VCO输出相位的传递函数为H_sdm(z) θ_vco(z)/ΔN(z) -[θ_vco_0/N_int²] · [G(z)/(1G(z))] · [1/K_pd·F(z)·...]等等这里要小心。更规范的做法是把SDM噪声等效为鉴相器输入端的一个相位噪声源然后乘以噪声源到输出的传递函数。对于注入在反馈路径的噪声其到输出的传递函数是H_sdm(z) (K_pd·F(z)·K_vco·z⁻¹/(1-z⁻¹)) / (1 G(z)) · (θ_vco_0/N_int²)化简后注意到分子正好是G(z)·N_int所以H_sdm(z) G(z)/(1G(z)) · (θ_vco_0/N_int) · (1/N_int) · ...我直接给最终形式避免中间符号混乱。定义环路闭环传递函数对参考相位H_ref(z) G(z)/(1G(z))那么SDM噪声到输出的传递函数为H_sdm(z) H_ref(z) · (θ_vco_0/N_int²) · N_int H_ref(z) · θ_vco_0/N_int再考虑到θ_vco_0/N_int就是分频器输出的标称相位归一化后可以写成H_sdm(z) H_ref(z) / N_int · (2π·f_out/f_ref的归一化因子)实际工程中更常用的是把SDM噪声等效到分频比上然后乘以分频比到输出相位的传递函数。这个传递函数就是H_sdm→θout(z) 2π · H_ref(z) / N_int单位是rad输出相位每单位分频比抖动。这个形式最简洁也最常用。3.4 第四步把NTF乘进来得到完整的输出相位噪声PSDSDM的量化噪声经过NTF整形后才是ΔN所以完整的从量化误差E(z)到输出相位θ_vco(z)的传递函数是H_e→θout(z) 2π · H_ref(z) / N_int · NTF(z)输出相位噪声的功率谱密度为S_θout(f) |H_e→θout(e^{j2πf/f_s})|² · S_e(f)其中S_e(f)是量化误差的PSD对于L阶SDMS_e ≈ Δ²/12 · (1/f_s)Δ是量化步长对于整数分频比调制Δ1。把NTF的表达式代入对于L阶CIFB结构NTF(z) (1-z⁻¹)^L在低频段|NTF|² ≈ (2πf/f_s)^{2L}这就是著名的L阶噪声整形低频噪声被压低了(2L×20)dB/decade。而H_ref(z)在环路带宽内近似为1/N_int因为G很大在带宽外滚降。所以最终的输出噪声形状是低频段被NTF的高通整形主导高频段被环路的低通特性主导两者在环路带宽附近交汇。这个交汇点的位置直接决定了SDM噪声对总相位噪声的贡献大小。4. 传递函数的物理读法三个频段、两个拐点、一个陷阱公式推完了但光有公式不够得能读出它的物理含义。我习惯把H_sdm→θout的幅频响应分成三个频段来看每个频段对应不同的主导机制。这样在实际调环路时一眼就能判断问题出在哪。4.1 低频段NTF整形主导阶数决定斜率在远低于环路带宽的频率上H_ref(z) ≈ 1/N_int常数所以H_sdm→θout的斜率完全由NTF决定。对于L阶SDM低频段幅度按f^L上升功率谱按f^{2L}上升。这意味着一阶SDM低频噪声按20dB/decade上升二阶SDM40dB/decade三阶SDM60dB/decade这里有个常见的误解有人以为阶数越高越好因为低频压得更低。但实际上高阶SDM在高频段会把噪声抬得更高而且稳定性更差。所以阶数选择要和环路带宽匹配环路带宽越低NTF的拐点越早出现高阶的优势越明显环路带宽高的话高阶SDM的高频噪声反而可能恶化带内指标。4.2 高频段环路低通主导滚降速率决定抑制在远高于环路带宽的频率上H_ref(z) ≈ G(z)因为G1而G(z)里包含VCO积分器的1/(1-z⁻¹)和环路滤波器的极点。典型的三阶环路滤波器会让G(z)以-60dB/decade滚降所以H_sdm→θout在高频段也按这个速率下降。但要注意SDM噪声在高频段本身是被NTF抬高的两者相乘后高频段的净效果取决于哪个占主导。如果环路滚降不够快SDM的高频噪声就会漏到输出表现为带外相位噪声抬升。这也是为什么很多设计会在环路滤波器里加额外的极点或者用更高阶的滤波器来压高频。4.3 拐点位置环路带宽和NTF零点的博弈两个关键拐点拐点位置物理含义设计影响环路带宽f_cG(z)的0dB点H_ref从1/N_int开始滚降决定SDM噪声带内贡献的截止NTF拐点f_ntfNTF从上升转为平坦噪声整形停止决定高频噪声的平台高度对于CIFB结构f_ntf ≈ f_s/(2π)·(某个与阶数相关的系数)。实际设计中f_c通常选在f_ntf附近或略低这样NTF的上升段被环路带宽截住带内噪声最小。如果f_c远高于f_ntfNTF的高频平台就会进入带内恶化指标如果f_c远低于f_ntf环路响应太慢锁定时间变长。4.4 一个容易踩的陷阱θ_vco_0的处理在3.3节的推导中我提到了θ_vco_0这个量。很多资料在推导时直接把它归一化掉了导致读者以为SDM噪声传递函数和VCO的绝对相位无关。但实际上θ_vco_0对应的是VCO的标称输出相位它和分频比N_int一起决定了归一化因子。如果推导时漏掉这个因子算出来的噪声量级会差N_int倍这在噪声预算里是致命的。我的建议是推导时保留θ_vco_0最后再归一化。这样每一步都有物理意义不容易漏项。具体做法是把输出相位表示成2π·f_out·t的形式θ_vco_0 2π·f_out/f_ref归一化到参考周期这样H_sdm→θout 2π·H_ref(z)/N_int量纲和数值都对得上。5. 用Simulink和脚本验证从公式到可复现的仿真链路公式推得再漂亮不验证都是空的。我一般会用两条路交叉验证一条是Simulink行为级模型一条是Python/MATLAB脚本直接算传递函数。两条路结果对上了才敢把公式用到实际设计里。5.1 Simulink建模怎么让传递函数显示出来Simulink里搭小数分频PLL关键是把SDM的噪声注入点找对。我的做法是用Zero-Order Hold模块把连续域和离散域分开采样率设为f_refSDM用MATLAB Function或QuantizerFilter实现输出ΔN分频器建模为1/(N_intΔN)注意这里要用除法而不是加法否则注入点就错了环路滤波器用Discrete Transfer Fcn模块系数从连续域离散化得到VCO用Discrete-Time Integrator模块搭好之后怎么让传递函数显示出来Simulink本身不直接给传递函数但可以用Linear Analysis工具在模型上设输入输出点然后跑Bode Plot。具体操作在SDM输出后加一个Input Perturbation点在VCO输出后加Output Measurement点然后Analysis→Control Design→Linear Analysis就能扫出H_sdm→θout的幅频响应。注意Linear Analysis默认在平衡点线性化PLL需要先锁定。我一般先跑一段足够长的时间让环路稳定再在稳定点做线性化否则扫出来的传递函数是错的。5.2 脚本验证直接算H_sdm→θout的Bode图Simulink验证的是行为脚本验证的是公式。我常用Python写一个小脚本把3.4节的公式直接实现import numpy as np import matplotlib.pyplot as plt # 参数设置 N_int 100 f_ref 10e6 f_s f_ref K_pd 1e-3 # A/rad K_vco 2*np.pi*1e9 # rad/s/V f_c 100e3 # 环路带宽 # 环路滤波器三阶无源 # 这里用简化的连续域传递函数再离散化 def loop_filter(f): # 示例三阶低通 return 1/(11j*f/f_c)**3 # 频率扫描 f np.logspace(3, 8, 1000) z np.exp(1j*2*np.pi*f/f_s) # 开环增益 G K_pd * loop_filter(f) * K_vco / (1j*2*np.pi*f) / N_int # 闭环传递函数 H_ref G/(1G) # NTF二阶CIFB NTF (1 - z**-1)**2 # SDM到输出的传递函数 H_sdm 2*np.pi * H_ref / N_int * NTF # 画Bode图 plt.figure() plt.semilogx(f, 20*np.log10(np.abs(H_sdm))) plt.xlabel(Frequency (Hz)) plt.ylabel(Magnitude (dB)) plt.title(SDM Noise Transfer Function to PLL Output) plt.grid() plt.show()这个脚本跑出来的Bode图应该和Simulink Linear Analysis的结果在低频段和高频段都吻合。如果对不上先检查离散化方法是否一致再检查NTF的表达式是否和Simulink里用的结构匹配。5.3 实测中的意外为什么仿真和手算差了几dB我遇到过好几次仿真和手算对不上的情况总结下来主要有三个原因离散化方法不一致连续域F(s)用双线性变换和脉冲响应不变法在高频段差异很大。如果Simulink用的是双线性脚本用的是脉冲响应高频段就会差几个dB。SDM的NTF不是理想(1-z⁻¹)^L实际SDM为了稳定性会加零点优化NTF在高频段有凹陷如果脚本用理想NTF高频段会高估。采样率不匹配如果f_s ≠ f_ref多率处理会引入额外的混叠和镜像简单公式不适用。我的经验是先用理想模型对齐趋势再用实际NTF修正细节。趋势对上了说明推导逻辑没问题细节对不上再逐项排查。6. 工程落地从传递函数到噪声预算的实操要点推传递函数的最终目的是做噪声预算判断SDM噪声在总相位噪声里占多大比重。这一节讲几个实操中容易忽略的点。6.1 噪声预算表怎么列我一般会列一个表把参考噪声、SDM噪声、VCO噪声、分频器噪声分别折算到输出然后看谁在带内占主导。SDM噪声的折算公式就是S_θ,SDM(f) |H_sdm→θout(f)|² · S_ΔN(f)其中S_ΔN(f) |NTF(f)|² · Δ²/12 / f_s。关键点S_ΔN的单位是1/Hz分频比抖动的PSD乘以|H_sdm→θout|²rad²/单位分频比抖动²后得到rad²/Hz。量纲对了数值才不会错。6.2 环路带宽和SDM阶数的联合优化这两个参数不能分开选。我的做法是先根据锁定时间和带内相位噪声要求定一个f_c的初值再根据带内SDM噪声的贡献选SDM阶数如果带内SDM噪声还是太大要么降f_c要么升阶数要么加额外的滤波迭代几次找到满足指标的最优组合这里有个经验值对于二阶SDMf_c通常选在f_ref/20到f_ref/10之间三阶SDM可以选得略高但要注意稳定性。6.3 常见问题排查表现象可能原因排查方法带内相位噪声比预期高SDM噪声传递函数算错漏了N_int因子检查H_sdm→θout的归一化带外噪声抬升环路滚降不够NTF高频平台漏出增加环路滤波器阶数或降f_c仿真和手算差10dB以上离散化方法或NTF不匹配统一离散化方法用实际NTF锁定后噪声突然恶化SDM进入非线性区NTF失效检查SDM输入幅度和稳定性7. 几个我踩过的坑和最后的经验分享第一个坑是把SDM噪声当成参考噪声处理。参考噪声到输出的传递函数是H_ref(z)而SDM噪声到输出的传递函数是H_ref(z)/N_int再乘NTF。两者形状完全不同混用会导致噪声预算全错。我刚开始做的时候直接把SDM噪声按参考噪声折算结果带内噪声估高了20dB白白多花了一周调环路。第二个坑是忽略θ_vco_0的归一化。前面说过这个因子对应N_int倍的关系漏掉的话数值差两个数量级。我的做法是推导时每一步都写清楚量纲最后统一归一化这样不容易漏。第三个坑是Simulink线性化点选错。PLL没锁定时做线性分析扫出来的传递函数是乱的。一定要先跑足够长时间让环路稳定再在稳定点线性化。我一般会跑至少1000个参考周期确认相位误差稳定在零附近再做分析。最后分享一个实用技巧把H_sdm→θout的Bode图和NTF的Bode图画在同一张图上这样一眼就能看出环路带宽和NTF拐点的相对位置。如果f_c落在NTF上升段的中部说明匹配得不错如果f_c落在NTF平台区说明环路带宽选高了SDM噪声会恶化带内指标。这个图我每次做小数分频PLL都会画比看一堆数字直观得多。这套推导和验证流程我在几个不同频段的小数分频PLL上都用过从几百MHz到几GHz只要采样率和环路结构匹配结果都挺稳。真正花时间的不是推导本身而是把离散化、NTF、归一化这几个细节对齐。对齐之后传递函数就是一把尺子环路带宽选多少、SDM用几阶心里都有数了。