ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

小数分频PLL中SDM量化噪声传递函数推导与Z域建模实战

小数分频PLL中SDM量化噪声传递函数推导与Z域建模实战 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*(C2C3)*(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}$$N100$$f_p1\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)$。对于$N100$这就是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 量化噪声鼓包太大怎么办如果仿真发现量化噪声鼓包超过预算按以下顺序尝试降低环路带宽把鼓包推到带外但会影响锁定时间提高SDM阶数从二阶升到三阶低频噪声压得更低但要注意稳定性优化NTF零点用CRFF或MASH结构把零点放在环路带宽附近提高参考频率$f_s$越高量化噪声底越低增大分频比N$1/N^2$因子直接降低噪声6.3 推导过程中量纲对不上的排查传递函数推导最容易在量纲上出错。记住几个关键量纲相位rad频率Hz或rad/s电荷泵增益$K_{cp}$A/radVCO增益$K_{vco}$Hz/V或rad/(s·V)环路滤波器阻抗$Z_{lf}$V/A如果最后算出来的噪声PSD量纲不是$\text{rad}^2/\text{Hz}$那一定是中间某一步搞错了。6.4 用Python复现的注意事项如果你习惯用Python而不是Matlabcontrol库和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*(C2C3)*(1 s*R3*C3)) # 开环 G Kcp * Zlf * Kvco / (N * s) # 闭环 H ct.feedback(G, 1) # 噪声传递函数 T_noise NTF_s * H / N7. 从推导到设计这个传递函数怎么指导实际选型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 实际芯片设计中的验证流程在流片前我一般会做三层验证行为级仿真用Matlab/Simulink搭完整环路注入量化噪声看输出谱晶体管级仿真用Cadence做PLL的PSS/PNOISE分析确认电路非理想因素混合仿真数字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以内足够做初步设计决策了。
返回列表