You are on page 1of 5

数字锁相环的MATLAB实现

陈老湿
中国科学技术大学 信息与通信工程硕士

30 人赞同了该文章

陈老湿:第4章:载波同步与锁相环仿真(1)

陈老湿:第4章:载波同步与锁相环仿真(2)

陈老湿:第4章:载波同步与锁相环仿真(3)

陈老湿:第4章:载波同步和位同步偏差的纠正

今天介绍一下数字锁相环的原理,并给出部分MATLAB代码供你参考。

本文主要参考英文资料是《Fundamentals of Global Positioning System


Receivers》的第8章,中文版本的西安电子科技大学杨俊、武奇生《GPS基本
原理及其仿真》第6章与前者内容将近一致。以上两者材料中对数字锁相环的
原理讲解不错,但均缺少MATLAB代码实现。

因此,本文需要你阅读完上面的理论知识,尤其是而二阶锁相环的原理,s变换
到z变换的转换后,再结合下面z变换如何转换到MATLAB代码实现的过程,能
帮助你更加深刻理解锁相环。除此之外,CSDN上《二阶数字锁相环仿真(内
附MATLAB代码)》也是一份非常不错的材料。

假设你已经阅读过上面提到的两份材料后,但你大概率还是没有写出可以实现
的MATLAB代码,这是为什么呢?

这是由于z变换后,具体的程序是采用迭代实现。因此,需要将之前的表达式转
换成迭代式子,方可让程序进行进行计算。

因此,我将结合图与公式,将以上提到的材料转化成迭代表达式,便是本文的
主要贡献。
环路滤波器的z变换图如图6-2,假设鉴相器的输入是   ,VCO(压控振荡
器)的输出是   ,则有下列表达式:

 (1)

 (2)

 (3)

由材料中已经给出的N(Z)公式:

 (4)

转化到时域,有:   (5)

即   (6)

令   ,即可得到

for i = 2:length

error(i) = f(i) - fin(i);

A(i) = A(i-1) + error(i)*C2;

B(i) = C1*error(i) + A(i);

fin(i+1) = B(i) + fin(i);

end % end for i

结合材料中已经计算出来的:

 (7)

 (8)

其中   是等效噪声带宽,   是采样周期,   是阻尼因子,

 (9)

通过(9)可得到   是系统固有频率。

更多内容参考:

陈老湿:《通信MATLAB仿真》合集
366 赞同 · 23 评论 文章

编辑于 2022-03-23 15:57

锁相环 MATLAB

​ 赞同 30 ​ ​ 8 条评论 ​ 分享 ​ 喜欢 ​ 收藏 ​ 申请转载 ​

写下你的评论...

8 条评论 默认 最新

Nonconformist
为何error(i) = f(i)-fin(i)呢?不应该是θ(i)-θin(i)?他压控振荡器输出的还有进入鉴相器的不是
相位量吗
2021-07-08 ​ 赞
Nonconformist
还想问下这一句ts = 1e-4;%频率变化率为0.1除以T,依旧是100Hz/s,fstep是按照0.1步进
来变化的,0.1/ts=0.1/1e-4=1e3呀,我不是很懂这个依旧是100Hz/s是想表达什么
2021-07-07 赞

Nonconformist
Wn = 2*Bn/(damp+1*(4*damp));这个是不是应该改成Wn = 2*Bn/(damp+1/(4*damp));

2021-07-07 赞

陈老湿 作者
是的 你看我载波同步那一篇已经将公式和代码改过来了 这个忘记改了 我下次改一下
2021-07-07 赞

没有时间了
博主,您好!下面这段代码是锁相环的另一种实现,其中Discriminator_Out(也就是鉴相器
的输出),对于BPSK和QPSK的计算不是很明白,可以解释一下吗?
C1=0.022013;
C2=0.00024722;
for i=2:Simulation_Length
Signal_PLL(i)=Signal_Channel(i)*exp(-j*mod(NCO_Phase(i-1),2*pi));
I_PLL(i)=real(Signal_PLL(i));
Q_PLL(i)=imag(Signal_PLL(i));
if PLL_Mode == 1 %单载波信号
Discriminator_Out(i)=atan2(Q_PLL(i),I_PLL(i));
else if PLL_Mode == 2 % BPSK信号
Discriminator_Out(i)=sign(I_PLL(i))*Q_PLL(i)/abs(Signal_PLL(i));
else
Discriminator_Out(i)=(sign(I_PLL(i))*Q_PLL(i)-sign(Q_PLL(i))*I_PLL(i))...
/(sqrt(2)*abs(Signal_PLL(i))); % QPSK信号
end
end
PLL_Phase_Part(i)=Discriminator_Out(i)*C1;
Freq_Control(i)=PLL_Phase_Part(i)+PLL_Freq_Part(i-1);
PLL_Freq_Part(i)=Discriminator_Out(i)*C2+PLL_Freq_Part(i-1);
NCO_Phase(i)=NCO_Phase(i-1)+Freq_Control(i);
end
2021-06-03 赞

陈老湿 作者
1、这主要是因为鉴相器的不同
Discriminator_Out(i)=sign(I_PLL(i))*Q_PLL(i)/abs(Signal_PLL(i));这是一个极性鉴相器
而对于Discriminator_Out(i)=(sign(I_PLL(i))*Q_PLL(i)-sign(Q_PLL(i))*I_PLL(i))...
/(sqrt(2)*abs(Signal_PLL(i))); 这是针对QPSK中的一种鉴相器
2、MPSK所用鉴相器会有所区别 我只知道这么个结论 但是我没有就每一种比如2PSK,
QPSK,8PSK,都去调试过哪一种鉴相器性能会好一些
3、你可以参考知网论文《卫星定时接收机的关键技术研究》,里面有关于锁相环的介
绍,应该对你有所帮助
2021-07-08 赞

铁匠
用乘法器做的鉴相器,用上面的迭代,可以收敛,但是收敛的值,并不是参考信号的频率
用正交相乘和atan2求得相差,用上面的迭代,收敛的结果就是参考信号频率

不知怎么回事,能指点一下不?
08-25 赞

陈老湿 作者
这个我还没试过
10-14 赞

写下你的评论...

文章被以下专栏收录

You might also like