目录

1. DPLL简介

2. DPLL基本仿真模型

2.1 相位误差检测

2.2 环路滤波器

2.3 NCO

 2.4 完整的模型

3. 代码及仿真结果

4. 小结


1. DPLL简介

        DPLL(Digital PLL)的目的是使得NCO(Numerically Controlled Oscillator, 数值控制振荡器)的输出相位锁定跟踪某个参考相位信号。如下图所示为DPLL的基本模型。环路包括一个相位误差检测器、一个环路滤波器以及一个NCO。DPLL的行为特性(dynamic characteristics)主要由环路滤波器特性决定。环路滤波器的输出控制NCO的频率和相位,在环路收敛锁定后,NCO输出相位与参考信号的相位之间的误差均值趋近于零。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yo54mb5oWi6ICV,size_20,color_FFFFFF,t_70,g_se,x_16

图 1 DPLL基本模型

 

        常用的环路滤波器为二阶环路滤波器,可以跟踪相位(由于对相位求导会得到频率,锁定了相位自然也就消除了频率误差)。在某些特定应用中根据系统要求,也可能只使用一阶环路滤波器的话,或甚至三阶或以上的环路滤波器,但是并不常见。

2. DPLL基本仿真模型

        在这个基本仿真模型中,输入信号直接就是相位信号,NCO也只生成相位信号,相位误差就是求两者的差而得。这样做是因为相位检测本身并不是DPLL内在的处理,相位误差检测在不同的应用中有不同的实现方法。这里我们只考虑DPLL本身的行为仿真,所以可以暂时撇开所有非本质的东西。

        以下说明中,符号“D”表示一个时钟节拍的延迟。

2.1 相位误差检测

        如上所示,本模型直接以相位信号作为输入,因此相位误差检测单纯地就是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其实没有必然性,可以与别的环路参数融合。

2.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

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yo54mb5oWi6ICV,size_20,color_FFFFFF,t_70,g_se,x_16

 

图 2 环路滤波器

2.3 NCO

        NCO(数值控制振荡器:Numerically Controlled Oscillator)用于生成正弦波输出,或者单纯地输出相位信息,如下图所示。在本仿真中,只需要输出归一化相位。

        如图所示,NCO其实就是一个相位积分器(在离散系统中也称为累加器:accumulator)。积分器的输入包含两部分信息:

  1. “Fnco*Ts”表示NCO的基本振荡频率。
  2. Vtune,这个名字中的V借自于其模拟表亲“压控振荡器VCO”(当然,这只是一个名字而已。表示它类似于或者说对应于VCO的电压输入)。来自于前级的环路滤波器输出。表示基于环路滤波器的输出信号对NCO在每一个time-step的相位增量的(相对于基准频率Fnco)的调节量。“Knco”只是一个用于提高模型调节灵活的增益参数(也可以被吸收到环路滤波器参数中去)。

        “Phase wrap-around”,顾名思义,相位卷绕处理。因为相位(或者说正弦波)的周期为2*pi,所以需要把相位卷绕到长度为2*pi的区间内,可以是[0,2*pi],也可以是[-pi, pi],视实现方便而定。在本模型中,进一步可以归一化到[0,1],也可以是[-1/2, 1/2],这个也仅仅是为了实现方便而已,没有必然性。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yo54mb5oWi6ICV,size_20,color_FFFFFF,t_70,g_se,x_16

图 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

 2.4 完整的模型

        将相位误差检测、环路滤波器和NCO组装到一起即得到了我们的基本仿真模型,如下图所示:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yo54mb5oWi6ICV,size_20,color_FFFFFF,t_70,g_se,x_16

 图 4 DPLL时域仿真模型模块框图

3. 代码及仿真结果

        在以下仿真中,我们给定的输入信号是一个采样率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');

 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yo54mb5oWi6ICV,size_20,color_FFFFFF,t_70,g_se,x_16

图 5 相位跟踪结果示意图

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56yo54mb5oWi6ICV,size_20,color_FFFFFF,t_70,g_se,x_16

图 6 输入输出频谱对比

        如以上两图所示,相位误差检测器的输出最终收敛于0,表明NCO输出相位很好地跟住了输入相位,实现了相位锁定。自然地,输出信号频率也与输入信号会保持一致,这一点输入输出信号频谱对比图中也可以看出来。

 

4. 小结

        以上是一个最基本的DPLL的仿真。

        进一步,将结合分析或仿真来探讨DPLL的参数设计,针对不同的应用需求如何设计参数能够获得最佳性能。

        此外,以上模型只是让NCO生成了输入正弦波信号的一个复制品(replica)。如果只能做这个的话,就没有什么意思了,直接使用输入信号就好了。当然不是这样的。接下来将讨论DPLL的几种不同的实际应用,它们的核心与本文所介绍的模型相一致,只不过为了迎合不同的应用需求要在基本模型的基础上加一些“调味品”。

 

参考文献:

[1] Digital PLL's -- Part 1 - Neil Robertson (dsprelated.com)

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐