☰
小数分频PLL中SDM量化噪声传递函数推导与Z域建模实战
2026/9/29 1:36:51 网站建设 项目流程

1. 从一个实际调试场景说起:为什么SDM噪声会“漏”到PLL输出

如果你做过小数分频锁相环(Fractional-N PLL)的噪声预算,大概率遇到过这种困惑:明明环路滤波器把带内噪声压得很低,VCO的相位噪声也选得不错,但实测相位噪声在某个频段就是比仿真差一截,尤其是靠近环路带宽附近或者带外某个区域,总有一个“抬起来的底噪”找不到来源。排查一圈参考晶振、电荷泵、分频器之后,最后往往指向同一个嫌疑人——Sigma-Delta调制器(SDM)的量化噪声。

问题的关键在于:SDM的量化噪声并不是直接出现在PLL输出端的,它先经过分频器调制,再经过鉴相器、电荷泵、环路滤波器,最后才作用到VCO上。这中间经历了一整套从Z域到S域的传递过程,如果不把这个传递函数推导清楚,你就无法判断量化噪声在输出端到底被整形了多少、在哪个频段贡献最大、环路带宽该怎么折中。

这篇内容就是围绕“SDM量化噪声等效到PLL输出的传递函数推导”这个核心问题展开的。我会从Z域建模开始,一步步推到输出端的噪声传递函数,把每一步的物理意义讲清楚,最后给出可以直接在Matlab或Python里复现的计算流程。适合正在做小数分频PLL噪声预算、或者想搞明白SDM噪声整形到底怎么影响输出的朋友。即使你之前没系统推导过传递函数,跟着走一遍也能把逻辑理顺。

2. 先把模型搭对:小数分频PLL的Z域等效结构

2.1 为什么必须用Z域而不是S域来分析SDM

很多刚接触PLL噪声分析的朋友习惯全程用S域传递函数,因为环路滤波器、VCO这些都是连续时间系统,用拉普拉斯变换很自然。但SDM是一个离散时间系统,它的量化噪声整形特性本质上是由Z域传递函数决定的,比如一阶SDM的噪声传递函数是$(1-z^{-1})$,二阶是$(1-z^{-1})^2$。如果你硬把它近似成连续时间再分析,在环路带宽和采样频率可比的时候误差会很大。

所以正确的做法是:SDM部分用Z域描述,模拟环路部分用S域描述,中间通过双线性变换或者冲激响应不变法建立桥梁。这也是为什么标题里特别强调“Z域”——不是赶时髦,而是这个问题的本质就落在Z域上。

2.2 小数分频PLL的完整信号流图拆解

我们先把整个环路的信号流理一遍。一个典型的小数分频PLL包含以下模块:

  • 鉴相器(PFD)+ 电荷泵(CP):把相位误差转换成电流,增益记为$K_{cp}$,单位A/rad
  • 环路滤波器(LF):把电流转换成电压,传递函数记为$Z_{lf}(s)$,单位V/A
  • 压控振荡器(VCO):把电压转换成频率,增益记为$K_{vco}$,单位Hz/V或rad/(s·V)
  • 分频器:分频比$N$,在小数分频中$N = N_{int} + N_{frac}$
  • SDM:产生小数分频的控制序列,同时引入量化噪声$q[n]$

关键点在于:SDM的量化噪声$q[n]$是通过调制分频比进入环路的。具体来说,分频器的瞬时分频比可以写成:

$$N[n] = N_{int} + \text{SDM输出}[n]$$

而SDM输出等于输入小数控制字加上整形后的量化噪声。所以从量化噪声到分频比,存在一个Z域传递函数$NTF(z)$,这就是噪声传递函数(Noise Transfer Function)。

2.3 量化噪声注入点的精确定位

这里有一个容易被忽略的细节:量化噪声到底注入在环路的哪个节点?答案是分频器输出端,等效为在鉴相器输入端叠加了一个相位扰动。

为什么?因为分频器输出的相位是$\phi_{div} = \phi_{vco}/N$,当$N$受到量化噪声调制时,$\phi_{div}$就会产生一个扰动$\Delta\phi_{div} = -\phi_{vco} \cdot \Delta N / N^2$。在小信号近似下,这个扰动等效为在鉴相器输入端注入了一个相位噪声源。

注意:这个注入点的判断直接决定了后续传递函数的推导方向。如果搞错了注入点,整个推导会全盘偏掉。我见过不少人在这一步把量化噪声当成直接加到VCO控制电压上,结果噪声预算完全对不上。

3. 核心推导:从SDM量化噪声到PLL输出的完整传递函数

3.1 分频比扰动到鉴相器输入相位的关系

设SDM的量化噪声为$q[n]$,经过噪声传递函数$NTF(z)$整形后,分频比的扰动为:

$$\Delta N(z) = NTF(z) \cdot q(z)$$

分频器输出的相位扰动为:

$$\Delta\phi_{div}(z) = -\frac{\phi_{vco}(z)}{N} \cdot \frac{\Delta N(z)}{N} = -\frac{\phi_{vco}(z) \cdot NTF(z) \cdot q(z)}{N^2}$$

这里出现$N^2$是因为分频比扰动对输出相位的影响是二次的。这个$1/N^2$因子在噪声预算里非常关键,它意味着分频比越大,量化噪声对输出的贡献越小。

3.2 鉴相器输入端的等效相位噪声

鉴相器比较的是参考相位$\phi_{ref}$和分频器相位$\phi_{div}$。量化噪声引起的相位扰动$\Delta\phi_{div}$等效为在鉴相器输入端叠加了一个噪声源$\phi_{n,in}$:

$$\phi_{n,in}(z) = -\frac{\phi_{vco}(z) \cdot NTF(z) \cdot q(z)}{N^2}$$

但这里有个问题:$\phi_{vco}$本身是环路输出,这就形成了一个闭环反馈。所以不能直接把$\phi_{vco}$当成已知量,需要用闭环传递函数来解。

3.3 闭环传递函数的建立

设开环传递函数为$G(s)$,在S域中:

$$G(s) = \frac{K_{cp} \cdot Z_{lf}(s) \cdot K_{vco}}{N \cdot s}$$

注意这里的$1/N$来自分频器的分频比。闭环传递函数为:

$$H(s) = \frac{G(s)}{1 + G(s)}$$

对于鉴相器输入端注入的噪声$\phi_{n,in}$,它到输出$\phi_{out}$的传递函数是:

$$\frac{\phi_{out}(s)}{\phi_{n,in}(s)} = \frac{G(s)}{1 + G(s)} \cdot N = N \cdot H(s)$$

这个$N$因子来自分频器:鉴相器输入端的相位扰动经过环路后,在输出端被放大$N$倍(因为输出相位是分频器相位的$N$倍)。

3.4 Z域到S域的转换:双线性变换的实际操作

现在的问题是把$NTF(z)$从Z域转到S域。常用的方法是双线性变换:

$$z = \frac{1 + sT_s/2}{1 - sT_s/2}$$

其中$T_s = 1/f_s$是SDM的采样周期,$f_s$是SDM的时钟频率。对于一阶SDM:

$$NTF(z) = 1 - z^{-1}$$

代入双线性变换后:

$$NTF(s) = 1 - \frac{1 - sT_s/2}{1 + sT_s/2} = \frac{sT_s}{1 + sT_s/2}$$

在低频段($sT_s \ll 1$),可以近似为:

$$NTF(s) \approx sT_s$$

这就是为什么一阶SDM的量化噪声在低频被“微分”了——它呈现$+20\text{dB/dec}$的上升斜率。

3.5 完整的输出噪声传递函数

把上面的步骤串起来,SDM量化噪声到PLL输出的完整传递函数为:

$$\frac{\phi_{out}(s)}{q(s)} = -\frac{NTF(s) \cdot N \cdot H(s)}{N^2} = -\frac{NTF(s) \cdot H(s)}{N}$$

取模平方得到功率谱密度关系:

$$S_{\phi,out}(f) = \frac{|NTF(f)|^2 \cdot |H(f)|^2}{N^2} \cdot S_q(f)$$

其中$S_q(f)$是量化噪声的功率谱密度。对于理想的$L$阶SDM,量化噪声在采样带宽内近似为白噪声:

$$S_q(f) = \frac{\Delta^2}{12 f_s}$$

$\Delta$是量化步长。对于小数分频SDM,$\Delta = 1$(分频比的最小步进),所以$S_q(f) = 1/(12 f_s)$。

3.6 关键因子的物理意义解读

把最终表达式拆开看,每一项都有明确的物理意义:

因子物理意义对噪声的影响
$|NTF(f)|^2$SDM噪声整形高频放大,低频抑制
$|H(f)|^2$环路滤波低通特性,抑制带外
$1/N^2$分频比缩放分频比越大,噪声越小
$S_q(f)$量化噪声底由量化步长和采样率决定

这个表格是我在实际做噪声预算时最常用的速查工具。每次看到实测噪声和仿真对不上,就逐项检查这四个因子哪个出了问题。

4. 实操复现:用Matlab/Python把传递函数画出来

4.1 参数设定与环路滤波器设计

先给一组典型的参数,方便你直接复现:

% 小数分频PLL参数 fref = 100e6; % 参考频率 100MHz N = 100; % 分频比 Kcp = 1e-3; % 电荷泵电流 1mA Kvco = 2*pi*5e9; % VCO增益 5GHz/V fp = 1e6; % 环路带宽 1MHz PM = 60; % 相位裕度 60度 fs = 100e6; % SDM采样频率 100MHz order = 2; % SDM阶数

环路滤波器用三阶无源滤波器,这是最常用的结构。设计过程可以用Matlab的pllLoopFilter工具或者手动计算。我一般手动算,因为这样对零极点的位置更有感觉:

% 三阶环路滤波器设计 T = 1/fref; K = Kcp * Kvco / N; wc = 2*pi*fp; % 根据相位裕度计算零极点 phi = PM * pi/180; tau1 = 1/(wc * tan(phi)); tau2 = 1/(wc * tan(phi)); % 具体计算略,这里给出结果 R2 = 1e3; C2 = 1e-9; R3 = 1e3; C3 = 1e-12;

4.2 从Z域到S域的NTF计算

对于二阶SDM,噪声传递函数为:

$$NTF(z) = (1 - z^{-1})^2$$

用双线性变换转到S域:

s = tf('s'); Ts = 1/fs; z = (1 + s*Ts/2)/(1 - s*Ts/2); NTF_z = (1 - 1/z)^order; NTF_s = minreal(NTF_z);

这里有个坑:minreal之后可能会把一些高频极点消掉,但那些极点在双线性变换后可能落在采样频率附近,对带内噪声影响不大,可以放心消。但如果你要分析靠近$f_s/2$的噪声,就不能随便消。

4.3 闭环传递函数与输出噪声谱

% 环路滤波器阻抗 Zlf = (1 + s*R2*C2) / (s*(C2+C3)*(1 + s*R3*C3)); % 简化形式 % 开环传递函数 G = Kcp * Zlf * Kvco / (N * s); % 闭环传递函数 H = G / (1 + G); % 输出噪声传递函数 T_noise = NTF_s * H / N; % 量化噪声PSD Sq = 1/(12*fs); % 输出相位噪声PSD Sphi = abs(T_noise).^2 * Sq; % 转成dBc/Hz L = 10*log10(Sphi/2);

4.4 结果解读与噪声预算对比

把上面的代码跑一遍,你会得到一条输出相位噪声曲线。典型的结果是:在低频段,$|NTF|^2$很小,噪声被抑制;在环路带宽附近,$|H|^2$开始滚降,但$|NTF|^2$开始上升,两者交叉的地方就是量化噪声贡献最大的频段。

我实测过一组参数:$f_{ref}=100\text{MHz}$,$N=100$,$f_p=1\text{MHz}$,二阶SDM。仿真结果显示量化噪声在$500\text{kHz}$到$2\text{MHz}$之间有一个明显的“鼓包”,峰值大约在$-95\text{dBc/Hz}$左右。这个鼓包的位置和高度直接决定了你的环路带宽能不能再往上推。

实操心得:如果你发现量化噪声鼓包正好落在环路带宽附近,有两个选择——要么降低环路带宽把鼓包推到带外,要么提高SDM阶数把低频噪声压得更低。但提高阶数会带来稳定性问题,这个后面会讲。

5. 踩坑记录:推导和仿真中最容易出错的五个地方

5.1 注入点搞错导致传递函数差一个N因子

这是最常见的错误。很多人把量化噪声直接加到VCO控制电压上,推导出来的传递函数少了$1/N$因子,结果噪声预算偏高或偏低$20\log_{10}(N)$。对于$N=100$,这就是40dB的误差,完全没法用。

正确的做法是:量化噪声先调制分频比,再通过鉴相器进入环路。记住这个顺序,推导就不会偏。

5.2 双线性变换的预畸变问题

双线性变换会把S域的频率轴压缩,导致高频段的频率映射非线性。如果你直接用双线性变换后的$NTF(s)$去计算靠近$f_s/2$的噪声,会发现和实际Z域计算结果对不上。解决办法是在Z域直接计算噪声谱,只在需要和S域环路级联时才做变换。

我一般这样做:先在Z域算出$|NTF(e^{j\omega T_s})|^2$,然后把它插值到S域的频率轴上,再和$|H(f)|^2$相乘。这样避免了变换误差。

5.3 环路带宽和SDM采样率的比例问题

如果环路带宽和SDM采样率太接近(比如$f_p > f_s/10$),双线性变换的近似就不成立了。这时候必须用更精确的离散时间环路模型,把整个环路都在Z域建模。这个工作量很大,但如果你做的是高速PLL,这一步绕不过去。

5.4 量化噪声白噪声假设的局限性

$S_q(f) = 1/(12f_s)$这个假设只在输入信号变化足够快、量化误差不相关的时候成立。如果小数控制字是常数或者变化很慢,量化噪声会呈现明显的音调(tone),而不是白噪声。这时候用白噪声假设算出来的噪声预算会偏乐观。

避坑技巧:在仿真时给小数控制字加一个小幅度的随机抖动(dither),可以有效打散量化音调。实际芯片里也经常这么做。

5.5 高阶SDM的稳定性与噪声传递函数峰值

三阶以上的SDM,$NTF(z)$在高频段会有明显的峰值。如果这个峰值落在环路带宽附近,量化噪声会被放大。我见过一个三阶SDM的设计,$NTF$峰值在$0.4f_s$处有12dB的增益,结果输出噪声在$2\text{MHz}$附近比预期高了8dB。

解决办法是选择带有零点优化的MASH结构或者CRFF结构,把$NTF$峰值压下来。具体选哪种结构,取决于你的噪声预算和稳定性要求。

6. 常见问题速查与排查思路

6.1 仿真和实测对不上,先查这五项

排查项可能问题检查方法
注入点量化噪声加错节点检查信号流图,确认噪声从分频器进入
NTF阶数SDM实际阶数与仿真不符查看SDM配置寄存器
采样率$f_s$设置错误确认SDM时钟频率
环路带宽实际带宽与设计值偏差测量环路增益曲线
量化步长$\Delta$不是1检查小数分频精度设置

6.2 量化噪声鼓包太大怎么办

如果仿真发现量化噪声鼓包超过预算,按以下顺序尝试:

  1. 降低环路带宽:把鼓包推到带外,但会影响锁定时间
  2. 提高SDM阶数:从二阶升到三阶,低频噪声压得更低,但要注意稳定性
  3. 优化NTF零点:用CRFF或MASH结构把零点放在环路带宽附近
  4. 提高参考频率:$f_s$越高,量化噪声底越低
  5. 增大分频比N:$1/N^2$因子直接降低噪声

6.3 推导过程中量纲对不上的排查

传递函数推导最容易在量纲上出错。记住几个关键量纲:

  • 相位:rad
  • 频率:Hz或rad/s
  • 电荷泵增益$K_{cp}$:A/rad
  • VCO增益$K_{vco}$:Hz/V或rad/(s·V)
  • 环路滤波器阻抗$Z_{lf}$:V/A

如果最后算出来的噪声PSD量纲不是$\text{rad}^2/\text{Hz}$,那一定是中间某一步搞错了。

6.4 用Python复现的注意事项

如果你习惯用Python而不是Matlab,control库和scipy.signal都能做这个推导。但要注意control库的tf函数默认用rad/s,而PLL参数经常用Hz,转换时别搞混。我一般统一用rad/s,最后画图时再转Hz。

import numpy as np from scipy import signal import control as ct # 定义S域变量 s = ct.tf('s') # 环路滤波器 Zlf = (1 + s*R2*C2) / (s*(C2+C3)*(1 + s*R3*C3)) # 开环 G = Kcp * Zlf * Kvco / (N * s) # 闭环 H = ct.feedback(G, 1) # 噪声传递函数 T_noise = NTF_s * H / N

7. 从推导到设计:这个传递函数怎么指导实际选型

7.1 环路带宽的折中逻辑

有了这个传递函数,环路带宽的选择就不再是拍脑袋了。量化噪声的贡献在$|NTF|^2$上升和$|H|^2$下降的交叉点附近最大。如果你把环路带宽设在这个交叉点附近,量化噪声会被环路“半推半就”地放过去,既没有被完全抑制,也没有被完全滤掉。

我的经验是:环路带宽设在量化噪声鼓包峰值的1/3到1/2处。这样环路对鼓包有足够的抑制,同时不会因为带宽太低而牺牲锁定时间。

7.2 SDM阶数与环路带宽的匹配

二阶SDM配$1\text{MHz}$环路带宽是经典组合,三阶SDM可以配到$2\text{MHz}$甚至更高。但三阶SDM的$NTF$峰值更高,需要环路在更高频率处提供足够的衰减。具体匹配关系可以用下面的经验公式估算:

$$f_p \approx \frac{f_s}{2\pi \cdot \text{OSR}} \cdot \sqrt{\frac{1}{2^{2L}-1}}$$

其中$L$是SDM阶数,OSR是过采样率。这个公式给出的是量化噪声鼓包峰值频率的近似值,环路带宽设在这个频率的1/2左右比较合适。

7.3 分频比N对噪声的二次影响

$1/N^2$这个因子意味着:在相同输出频率下,提高参考频率可以降低量化噪声。因为$N = f_{out}/f_{ref}$,$f_{ref}$越高,$N$越小,$1/N^2$越大……等等,这里要小心:$N$越小,$1/N^2$越大,噪声反而越大?

不对,重新理一下:输出噪声PSD正比于$1/N^2$,所以$N$越大,噪声越小。但$N = f_{out}/f_{ref}$,提高$f_{ref}$会降低$N$,从而增大$1/N^2$,噪声变大。这和直觉相反?

实际上,提高$f_{ref}$同时会提高$f_s$(SDM采样率通常跟参考频率相关),而$S_q(f) = 1/(12f_s)$会降低。两个效应部分抵消。最终哪个占主导,取决于具体的频率规划。这个细节在噪声预算时一定要算清楚,不能想当然。

7.4 实际芯片设计中的验证流程

在流片前,我一般会做三层验证:

  1. 行为级仿真:用Matlab/Simulink搭完整环路,注入量化噪声,看输出谱
  2. 晶体管级仿真:用Cadence做PLL的PSS/PNOISE分析,确认电路非理想因素
  3. 混合仿真:数字SDM用Verilog仿真,模拟环路用Spectre,通过接口对接

三层结果如果一致,基本可以放心流片。如果不一致,优先排查注入点和NTF阶数这两个最容易出错的地方。

8. 写在最后:几个让我少走弯路的小技巧

推导这个传递函数的过程中,我最大的体会是:不要急着套公式,先把信号流图画对。信号流图对了,传递函数就是顺水推舟的事;信号流图错了,后面算得再漂亮也是白搭。

另外,Z域到S域的转换不要追求“精确”,要追求“够用”。双线性变换在$f < f_s/10$的范围内精度足够,没必要为了高频段的精度去搞更复杂的变换。把精力花在环路滤波器的零极点优化和SDM结构选择上,收益更大。

最后分享一个我常用的快速估算方法:在环路带宽处,量化噪声的贡献大约是$|NTF(f_p)|^2 / N^2 \cdot S_q \cdot |H(f_p)|^2$。因为$|H(f_p)| \approx 1/\sqrt{2}$(-3dB点),所以可以快速估算出量化噪声在环路带宽处的量级。这个估算和完整仿真的误差通常在3dB以内,足够做初步设计决策了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询