赞
踩
目录
DPLL(Digital PLL)的目的是使得NCO(Numerically Controlled Oscillator, 数值控制振荡器)的输出相位锁定跟踪某个参考相位信号。如下图所示为DPLL的基本模型。环路包括一个相位误差检测器、一个环路滤波器以及一个NCO。DPLL的行为特性(dynamic characteristics)主要由环路滤波器特性决定。环路滤波器的输出控制NCO的频率和相位,在环路收敛锁定后,NCO输出相位与参考信号的相位之间的误差均值趋近于零。
图 1 DPLL基本模型
常用的环路滤波器为二阶环路滤波器,可以跟踪相位(由于对相位求导会得到频率,锁定了相位自然也就消除了频率误差)。在某些特定应用中根据系统要求,也可能只使用一阶环路滤波器的话,或甚至三阶或以上的环路滤波器,但是并不常见。
在这个基本仿真模型中,输入信号直接就是相位信号,NCO也只生成相位信号,相位误差就是求两者的差而得。这样做是因为相位检测本身并不是DPLL内在的处理,相位误差检测在不同的应用中有不同的实现方法。这里我们只考虑DPLL本身的行为仿真,所以可以暂时撇开所有非本质的东西。
以下说明中,符号“D”表示一个时钟节拍的延迟。
如上所示,本模型直接以相位信号作为输入,因此相位误差检测单纯地就是NCO生成的相位信号与输入相位信号的差,如下所示:
- pe= ref_phase(n-1) - u(n-1); % phase error
- pe = 2*(mod(pe+0.5,1) - 0.5);
第2条语句表示对相位进行卷绕(wrap-around)处理,将相位值限制到[-1,1]的范围以内(参考后面NCO中的说明)。这里的乘数因子2其实没有必然性,可以与别的环路参数融合。
二阶环路滤波器包含两条支路,一条是积分支路,用于跟踪频率,另一条是比例支路,用于跟踪残留相位偏差。两条支路的增益系数分别记为KI和KP(I代表Integrator, P代表Proportional),这两个参数决定了DPLL的自然频率(natural frequency)以及阻尼系数(damping factor),关于如何确定这两个参数将在后续篇章进行介绍。这种环路滤波器也被称为Proportional + Integral or Lead-Lag filter. 它所对应的差分方程如下所示:
- % Loop Filter, ‘pe’ represents phase error, coming from phase error detector
- int(n) = KI*pe + int(n-1); % integrator
- vtune(n) = int(n) + KL*pe; % loop filter output
图 2 环路滤波器
NCO(数值控制振荡器:Numerically Controlled Oscillator)用于生成正弦波输出,或者单纯地输出相位信息,如下图所示。在本仿真中,只需要输出归一化相位。
如图所示,NCO其实就是一个相位积分器(在离散系统中也称为累加器:accumulator)。积分器的输入包含两部分信息:
“Phase wrap-around”,顾名思义,相位卷绕处理。因为相位(或者说正弦波)的周期为2*pi,所以需要把相位卷绕到长度为2*pi的区间内,可以是[0,2*pi],也可以是[-pi, pi],视实现方便而定。在本模型中,进一步可以归一化到[0,1],也可以是[-1/2, 1/2],这个也仅仅是为了实现方便而已,没有必然性。
图 3 NCO model
以上NCO模型可以用时域差分方程表示如下:
- x = fnco*Ts + u(n-1) + vtune(n-1)*Knco; % cycles NCO phase
- u(n) = mod(x,1); % cycles NCO phase mod 1
- y(n) = sin(2*pi*u(n-1)); % NCO sine output
将相位误差检测、环路滤波器和NCO组装到一起即得到了我们的基本仿真模型,如下图所示:
图 4 DPLL时域仿真模型模块框图
在以下仿真中,我们给定的输入信号是一个采样率25MHz、频率为3.75MHz的正弦波的相位。考虑NCO的初始振荡频率Fnco相比以上频率有100ppm的偏差:
fnco = fref*(1 + 100*1e-6);
仿真的目的是要看经过DPLL的调节后最终NCO输出的正弦波信号的频率是不是与输入信号的频率相一致,进一步,其瞬时相位与输入相位是否“一致”,毕竟DPLL的目的是相位锁定,而不仅仅是频率锁定。
- clc; clear; close all;
- format long;
- format compact;
-
- N = 20000; % number of samples
- fref = 3.75e6; % Hz freq of ref signal
- fs = 25e6; % Hz sample rate
- Ts = 1/fs; % s sample time
-
- n = 0:N-1; % time index
- t = n*Ts*1000; % ms
-
- ref_phase = fref*n*Ts + 0.7; % cycles phase of reference signal with random initial phase
- ref_phase = mod(ref_phase,1); % cycles phase mod 1, normalized radian
- ref_signal = sin(2*pi*ref_phase);
-
- Knco = 1/4096; % NCO gain constant
- KI = 0.0032; % looop filter integrator gain
- KL = 5.1; % loop filter linear (proportional) gain
-
- fnco = fref*(1 + 100*1e-6); % Hz NCO initial frequency, with 100-ppm initial frequency error
- u = zeros(1,N);
- int = zeros(1,N);
- perr_buf = zeros(1,N);
- vtune = zeros(1,N);
-
- % compute difference equations in an explicit loop
- for n= 2:N
- if mod(n,round(N/10)) == 0
- fprintf(1,'n = %d\n', n);
- end
- % NCO
- x = fnco*Ts + u(n-1) + vtune(n-1)*Knco; % cycles NCO phase
- u(n) = mod(x,1); % cycles NCO phase mod 1
- y(n) = sin(2*pi*u(n-1)); % NCO sine output
-
- % Phase Detector
- if(1)
- pe= ref_phase(n-1) - u(n-1); % phase error
- else % Seems that this one matches with Figure9. But maybe it doesn't matter(?)
- pe= ref_phase(n) - u(n); % phase error
- end
- pe = 2*(mod(pe+0.5,1) - 0.5); % wrap if phase crosses +/- 1/2 cycle
- perr_buf(n) = pe;
- % Loop Filter
- int(n) = KI*pe + int(n-1); % integrator
- vtune(n) = int(n) + KL*pe; % loop filter output
- end
- figure;
- subplot(2,1,1); plot(t,perr_buf),grid,axis([0 0.5 -1 1]);
- xlabel('t (ms)'),ylabel('phase error'); title('phase error');
- subplot(2,1,2); plot(t,vtune),grid,axis([0 0.5 -3.5 1]);
- xlabel('t (ms)'),ylabel('vtune');
- title('vtune: loop filter output');
- % figure; plot(u(:)); title('NCO output');
- figure;
- pwelch(y(10000:end),2048,512,2048,fs); hold on; % Take the stable output for frequency analysis
- pwelch(ref_signal,2048,512,2048,fs);
- legend('spectrum of the generate sin wave', 'spectrum of the reference input');

图 5 相位跟踪结果示意图
图 6 输入输出频谱对比
如以上两图所示,相位误差检测器的输出最终收敛于0,表明NCO输出相位很好地跟住了输入相位,实现了相位锁定。自然地,输出信号频率也与输入信号会保持一致,这一点输入输出信号频谱对比图中也可以看出来。
以上是一个最基本的DPLL的仿真。
进一步,将结合分析或仿真来探讨DPLL的参数设计,针对不同的应用需求如何设计参数能够获得最佳性能。
此外,以上模型只是让NCO生成了输入正弦波信号的一个复制品(replica)。如果只能做这个的话,就没有什么意思了,直接使用输入信号就好了。当然不是这样的。接下来将讨论DPLL的几种不同的实际应用,它们的核心与本文所介绍的模型相一致,只不过为了迎合不同的应用需求要在基本模型的基础上加一些“调味品”。
参考文献:
[1] Digital PLL's -- Part 1 - Neil Robertson (dsprelated.com)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。