数字锁相环路(DPLL)介绍及其matlab仿真
目录
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输出相位与参考信号的相位之间的误差均值趋近于零。
图 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
图 2 环路滤波器
2.3 NCO
NCO(数值控制振荡器:Numerically Controlled Oscillator)用于生成正弦波输出,或者单纯地输出相位信息,如下图所示。在本仿真中,只需要输出归一化相位。
如图所示,NCO其实就是一个相位积分器(在离散系统中也称为累加器:accumulator)。积分器的输入包含两部分信息:
- “Fnco*Ts”表示NCO的基本振荡频率。
- 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],这个也仅仅是为了实现方便而已,没有必然性。
图 3 NCO model
以上NCO模型可以用时域差分方程表示如下:
x = fnco*Ts + u(n-1) + vtune(n-1)*Knco; % cycles NCO phaseu(n) = mod(x,1); % cycles NCO phase mod 1y(n) = sin(2*pi*u(n-1)); % NCO sine output
2.4 完整的模型
将相位误差检测、环路滤波器和NCO组装到一起即得到了我们的基本仿真模型,如下图所示:
图 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 timen = 0:N-1; % time index
t = n*Ts*1000; % msref_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) gainfnco = 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:Nif mod(n,round(N/10)) == 0fprintf(1,'n = %d\n', n);end% NCOx = fnco*Ts + u(n-1) + vtune(n-1)*Knco; % cycles NCO phaseu(n) = mod(x,1); % cycles NCO phase mod 1y(n) = sin(2*pi*u(n-1)); % NCO sine output% Phase Detectorif(1)pe= ref_phase(n-1) - u(n-1); % phase errorelse % Seems that this one matches with Figure9. But maybe it doesn't matter(?)pe= ref_phase(n) - u(n); % phase errorendpe = 2*(mod(pe+0.5,1) - 0.5); % wrap if phase crosses +/- 1/2 cycleperr_buf(n) = pe;% Loop Filterint(n) = KI*pe + int(n-1); % integratorvtune(n) = int(n) + KL*pe; % loop filter output
endfigure;
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输出相位很好地跟住了输入相位,实现了相位锁定。自然地,输出信号频率也与输入信号会保持一致,这一点输入输出信号频谱对比图中也可以看出来。
4. 小结
以上是一个最基本的DPLL的仿真。
进一步,将结合分析或仿真来探讨DPLL的参数设计,针对不同的应用需求如何设计参数能够获得最佳性能。
此外,以上模型只是让NCO生成了输入正弦波信号的一个复制品(replica)。如果只能做这个的话,就没有什么意思了,直接使用输入信号就好了。当然不是这样的。接下来将讨论DPLL的几种不同的实际应用,它们的核心与本文所介绍的模型相一致,只不过为了迎合不同的应用需求要在基本模型的基础上加一些“调味品”。
参考文献:
[1] Digital PLL's -- Part 1 - Neil Robertson (dsprelated.com)
数字锁相环路(DPLL)介绍及其matlab仿真相关推荐
- 数字PID控制算法原理及Matlab仿真
引言 最近碰到一个项目需要用到PID控制算法,于是在网上找了一些资料学习了一下,发现网上对于PID算法的Matlab仿真方面的内容比较少,所以我就把我自己所学习到的内容分享给大家.本次博文主要介绍了位 ...
- 数字基带调制解调matlab仿真,数字通信系统课程设计--基于MATLAB数字基带调制.doc...
吉林工程技术师范学院 信息工程学院 第一章 绪论3 1.1通信的发展史简介3 1.2设计的目的及意义4 第二章 数字基带信号5 2.1数字基带调制原理5 2.2单极性不归零波形6 2.3双极性不归零波 ...
- 数字信号载波传输的Matlab仿真
摘要:数字信号与信息科学的迅猛发展,计算机和通信系统的迅速发展的理论和实践,通信系统是将信息从信源发送到一个或者多个目的地,用来达到各种信息传输过程的一般技术体系.数字信号调制与解调过程中起着重要的信 ...
- fvdm 跟驰模型 matlab仿真_【新书推荐】【2009.01】控制系统MATLAB计算及仿真(第3版)(黄忠霖)...
本书包括MATLAB语言基础.控制系统MATLAB仿真基础.控制系统MATLAB计算与仿真3篇. 本书上篇介绍了MATLAB 7.1 系统的相关知识,包括MATLAB 7.1系统概述与活的笔记本Not ...
- 使用python代替matlab仿真线性控制系统(倒立摆)
matlab可以仿真很多控制系统,其实python也有这种中功能.不仅是基础的自动控制原理所涉及的定理如伯德图,奈奎斯特曲线,pid之类的能够仿真,较为复杂的线性系统理论上面的一些原理也可以仿真. 这 ...
- lf模型下声门脉冲matlab程序,数字语音处理及MATLAB仿真.rar第二章
<数字语音处理及MATLAB仿真.rar第二章>由会员分享,可在线阅读,更多相关<数字语音处理及MATLAB仿真.rar第二章(60页珍藏版)>请在人人文库网上搜索. 1.第二 ...
- 语音信号调制matlab,第二章 语音信号的数字模型 数字语音处理及MATLAB仿真 教学课件.ppt...
第二章 语音信号的数字模型 数字语音处理及MATLAB仿真 教学课件 第二章 语音信号的数字模型 2.1 概述 本章重点介绍语音信号产生的数字模型,对语音信号的特性和听觉特性做一般介绍. 2.2 语音 ...
- matlab抽样仿真混叠图,数字信号处理及MATLAB仿真__前言
前言 历史背景 像许多电子工程课程一样,数字信号处理(Digital Signal Processing,DSP)最初是一门研究生课程,近30年来,其逐渐向本科课程渗透,成为电子与计算机工程的本科课程 ...
- 超级干货:BPSK/QPSK数字调制系统误码率MATLAB仿真
本文旨在通过简单实例来对基于MATLAB的数字调制解调系统仿真进行一个较为全面的介绍,并加深对一些基础知识的理解.且有详细解释大多数人在进行数字调制MATLAB仿真时遇到的大部分问题. 数字调制的概念 ...
最新文章
- 在团800运维工作总结之squid做回源图片的二级缓存
- windows下flink示例程序的执行
- bugku-杂项 听首音乐
- telnet到设备里 php_PHP自动生成设备周检修计划
- [蓝桥杯][算法提高VIP]凶手-思维
- .流程引擎对接的三种方式_02
- 解封装(四):avformat_find_stream_info探测获取封装上下文并打印
- python实现团队游戏小程序——你画我猜
- CCS 软件仿真 支持6678
- win10隐藏任务栏_推荐我使用的一个任务栏软件:7+ Taskbar Tweaker
- windows11百度网盘下载,win11iso镜像百度云下载
- 凯恩斯乘数到底有多么神奇?
- php超链接打不开了,excel超链接无法打开怎么办
- linux程序接口实验,实验 一 操作系统接口实验
- python进行表白,画爱心
- 【iMessage苹果推信家庭推】位置推通过苹果实现iMessage群发的Apple script脚本代码如下: tell application “Messages” set csvDatator
- Authentication(认证方式)与 Authorization(授权)
- Git与Bitbucket配合使用教程
- 【Java并发】double-checked-locking设计模式
- 【Docker】——镜像
热门文章
- 标签软件如何批量打印多排条码标签
- hmacsha256 java实现_java实现HMACSHA256(md5私钥key)加密签名
- 基本农田卫星定位图_多种全球定位导航系统的对比,信号及频谱分布
- 面试经历(签约华为,违约华为,签约移动)
- 团队任务分配管理软件,可以分配团队任务的团队管理软件
- 《战地3》9800gt 画面设置 ultra跑50帧以上,最优设置方法公开
- 利用Python3.x 删除字符串中的特殊字符——即ASCII控制字符
- 小程序主体为个人的教育类小程序备案——教育APP备案问题
- AMS1117 sot-223 稳压芯片的dxp库
- C语言每日一练——第72天:打印杨辉三角(使用两种方法)