/* dpll.c - general purpose 1st - 4th order standard underdamped DPLL's
Ref: Stephens & Thomas, IEEE Trans. on Aero and Elec. Sys., Jan. '95,
p. 78-95
Author : Jon Hamkins
Date : Fri Sep 10 09:16:45 PDT 1999
Language : Ansi C
Modified by : Jon Hamkins
Last Revised: Thu Oct 14 19:15:02 PDT 1999
*/
#include "dpll.h"
/* Given a phase error, update the frequency and phase estimate */
void
dpll(double error, dpllstruct *dpll)
{
int i;
double prev_freq; /* in cycles/update */
error /= M_2PI; /* convert from radians to cycles */
if (dpll->firsttime) { /* first time through, initialize constants */
dpll->firsttime=0; /* for a standard underdamped loop */
dpll->frequency = prev_freq = 0.; /* frequency, in cycles/update */
dpll->sum2 = dpll->sum3 = dpll->sum4 = 0.; /* initialize loop sums */
switch (dpll->order) {
case 1: dpll->k1 = 4.*dpll->bandwidth;
break;
case 2: dpll->k1 = 8.*dpll->bandwidth*dpll->update_period/3.;
dpll->k2 = dpll->k1*dpll->k1/2.;
break;
case 3: dpll->k1 = 60.*dpll->bandwidth*dpll->update_period/23.;
dpll->k2 = 4.*dpll->k1*dpll->k1/9.;
dpll->k3 = 2.*dpll->k1*dpll->k1*dpll->k1/27.;
break;
case 4: dpll->k1 = 64.*dpll->bandwidth*dpll->update_period/27.;
dpll->k2 = dpll->k1*dpll->k1/2.;
dpll->k3 = dpll->k1*dpll->k1*dpll->k1/8.;
dpll->k4 = dpll->k1*dpll->k1*dpll->k1*dpll->k1/64.;
break;
}
}
/* loop filter update (compute the NCO input dpll->frequency) */
prev_freq = dpll->frequency; /* save previous frequency */
/* update the list of most recent loop filter inputs (error signal) */
for (i=1; i<=COMPUTATIONAL_DELAY; i++) dpll->error[i] = dpll->error[i-1];
dpll->error[0] = error; /* most recent error signal */
switch (dpll->order) {
case 1: dpll->frequency = dpll->k1*dpll->error[COMPUTATIONAL_DELAY];
break;
case 2: dpll->sum2 += dpll->error[COMPUTATIONAL_DELAY];
dpll->frequency = dpll->k1*dpll->error[COMPUTATIONAL_DELAY]
+ dpll->k2*dpll->sum2;
break;
case 3: dpll->sum2 += dpll->error[COMPUTATIONAL_DELAY];
dpll->sum3 += dpll->sum2;
dpll->frequency = dpll->k1*dpll->error[COMPUTATIONAL_DELAY]
+ dpll->k2*dpll->sum2 + dpll->k3*dpll->sum3;
break;
case 4: dpll->sum2 += dpll->error[COMPUTATIONAL_DELAY];
dpll->sum3 += dpll->sum2;
dpll->sum4 += dpll->sum3;
dpll->frequency = dpll->k1*dpll->error[COMPUTATIONAL_DELAY]
+ dpll->k2*dpll->sum2 + dpll->k3*dpll->sum3
+ dpll->k4*dpll->sum4;
break;
}
/* NCO update -- 1/2 from old frequency, 1/2 from new frequency */
/* NOTE: nominal frequency is stored in Hz, while dpll->frequency
* and prev frequency are stored in cycles/update, for efficiency and
* for conformance to the Stephans & Thomas paper */
/* dpll->phase += M_2PI*(dpll->update_period*dpll->nominal_frequency +
dpll->frequency); /* phase, in radians */
dpll->phase += M_2PI*dpll->frequency; /* phase, in radians */
/* 0.5*(dpll->frequency+prev_freq)); */
}
结构体数字锁相放大器源码
需积分: 35 4 浏览量
2014-08-17
20:15:12
上传
评论 2
收藏 30KB RAR 举报
foolqiang
- 粉丝: 4
- 资源: 15
最新资源
- asp代码ASP基于WEB楼宇专业网站毕业设计(源代码+论文)
- 九宫重排.docx 验证重排后的九宫格是否满足所有条件,包括每行、每列和每个子区域的目标和值相等,以及是否包含1到9的所有数字
- asp代码ASP基于WEB聊天室的设计与实现(源代码+论文+任务书)
- 质数的判断条件.docx
- android-ocr-master,android-ocr-master
- asp代码ASP基于WEB教学评估系统设计(源代码+论文)
- asp代码ASP基于WEB购物系统(论文+源代码+开题报告+答辩PPT+操作说明)
- quartus ii安装教程.docx
- 基于Django框架的后台管理系统设计源码
- 众数问题.docx "众数"是统计学中的一个概念,指的是一组数据中出现次数最频繁的值
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈