GPS跟踪环路MATLAB之——数字锁频环

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

GPS跟踪环路MATLAB之------数字锁频环


前言

从事卫星导航基带处理的童鞋都知道,跟踪环路属于整个卫星导航信号处理中的精华之中的精华。接收机通过跟踪环在本地能够准确的复现接收到的信号的载波和伪码,是后续能够正确定位解算的关键步骤。整个跟踪环路将分成三小节,数字锁频环、数字锁相环和码环。其中数字锁频环和锁相环属于载波跟踪环。笔者所做的《从零开始研发GPS接收机》的工作中所使用的跟踪环路也将会在这里提到

《从零开始研发GPS接收机》记录了笔者实现一个硬件接收机的全过程,可通过公众号找到。

为什么要锁频环

导航信号在捕获成功之后,得到了粗略的多普勒频率值,加上中频IF,即可得到一个粗略的载波频率值。这个频率误差与真正的载波频率最高可能有一两百Hz的误差。如果没有锁频环,只有锁相环,锁相环路捕获时间直接与初始频差相关,初始频差越大,捕获时间越长。另一方面,锁相环的捕获带宽较小,在信噪比较低的时候可能出现锁定失败。相较于锁相环,锁频环能够将频差更大的信号牵引入锁,且收敛速度比锁相环会快很多。因此,十分有必要在锁相环路前加一级锁频环路,首先锁频环将频率牵引到频差很小的范围,然后在开启锁相环,这样就能既快又稳的锁定载波。

科斯塔斯环

这里首先要介绍一下一个新的概念,科斯塔斯环。

科斯塔斯环是一种基于锁相环 (PLL) 的电路,用于从抑制载波调制信号(例如双边带抑制载波信号)和相位调制信号(例如 BPSK、QPSK)中恢复载波频率。它是由通用电气公司的 John P. Costas 在 1950 年代发明的。它的发明对现代数字通信产生了深远的影响。Costas 环的主要应用是无线接收器。与其他基于 PLL 的检测器相比,优势在于,在小偏差下,Costas 环路误差电压为

,相比于其他PLL检测器的

,灵敏度翻倍,也使科斯塔斯环路特别适合跟踪多普勒频移载波。

基于科斯塔斯环结构的锁频环和锁相环的实现也比较类似,都是分成这几个部分

1、 鉴频器/鉴相器

2、 环路滤波器

3、 频率可变振荡器

鉴别器

关于鉴频器介绍一下几种鉴频器:

点积和叉积的定义

鉴频器1,四象限反正切函数:

优点:同样是最准确的鉴频方法,而且不受比特跳变的影响

缺点:鉴频牵入范围为

缺点:会受比特跳变影响

鉴频器2,二象限反正切函数,这是最准确的鉴频方法,缺点是会受比特跳变影响

优点:同样是最准确的鉴频方法,而且不受比特跳变的影响

缺点:鉴频牵入范围为

鉴频器3

也就是信号的幅值,而也就是也就是相当于信号幅值的平方。一些情况下,如果输入前存在AGC功能的话,幅值是一个相对稳定的一个值,因此可以以一个固定数来进行替代。

优点:计算量小,而且不受比特跳变的影响,适合纯逻辑实现

缺点:鉴频近似准确,鉴频牵入范围为

环路滤波器

二阶环路滤波器的结构如下图:

噪声带宽为固有频率,

k0是鉴别器的增益,k1是VCO的增益。

matlab程序

模拟一个接收信号,接收信号为一个(1e6- 240)Hz信号的点频,采样率为4.1e6Hz,在第1秒的时候频率会变成(1e6- 190)Hz,在第2秒的时候频率会变成(1e6+ 10)Hz.我们看看本地产生的载波信号是否能够在频率上跟踪上这个接收信号。而且这个接收信号在前面1秒钟有随机的bit翻转,bit速率为1KHz,1ms的积分时间

bash 复制代码
format long g;

clc;clear all;close all


SampleClk = 4.1e6;  

PointNum = SampleClk*5;  
IF      = 1e6- 240 ;

Carr_cos(1:SampleClk) = cos(2*pi*(IF/SampleClk).*[1:SampleClk] + 0);
Carr_sin(1:SampleClk) = sin(2*pi*(IF/SampleClk).*[1:SampleClk] + 0); 
IF = IF + 50;
Carr_cos(1+SampleClk:PointNum) = cos(2*pi*(IF/SampleClk).*[SampleClk+1:PointNum] + 0);
Carr_sin(1+SampleClk:PointNum) = sin(2*pi*(IF/SampleClk).*[SampleClk+1:PointNum] + 0); 
IF = IF + 200;
Carr_cos(1+2*SampleClk:PointNum) = cos(2*pi*(IF/SampleClk).*[2*SampleClk+1:PointNum] + 0);
Carr_sin(1+2*SampleClk:PointNum) = sin(2*pi*(IF/SampleClk).*[2*SampleClk+1:PointNum] + 0); 


signal0 = Carr_cos +j*Carr_sin;
data = awgn(signal0,-5,'measured');

%以下为付费内容

频率跟踪示意图:(fll_frame变量)

I/Q幅度示意图 PI、PQ

在两次频率跳变中,都正常响应,能够进行快速调整跟踪到与输入信号相同的频率。

但如果将第二次变频幅度变成300Hz的话,则频率锁定到错误的频率上去了。如下图所示:

如果使用atan2的鉴相器,在有码元翻转的情况下,鉴频结果会被干扰,如果不加额外的判断,那么只有在没有码元翻转的时候,才能正常工作。

因此实际应用中,根据情况来确定使用哪一种鉴频器。读者可以根据这套matlab程序自行改变信号频率参数,更改鉴频器,修改环路带宽等一些参数来观察实验结果,以便更深的理解锁频环的运行。

获取完整程序

见公众号

相关推荐
喵叔哟5 分钟前
重构代码之用委托替代继承
开发语言·重构
lzb_kkk11 分钟前
【JavaEE】JUC的常见类
java·开发语言·java-ee
SEEONTIME11 分钟前
python-24-一篇文章彻底掌握Python HTTP库Requests
开发语言·python·http·http库requests
起名字真南30 分钟前
【OJ题解】C++实现字符串大数相乘:无BigInteger库的字符串乘积解决方案
开发语言·c++·leetcode
tyler_download41 分钟前
golang 实现比特币内核:实现基于椭圆曲线的数字签名和验证
开发语言·数据库·golang
小小小~42 分钟前
qt5将程序打包并使用
开发语言·qt
hlsd#42 分钟前
go mod 依赖管理
开发语言·后端·golang
小春学渗透43 分钟前
Day107:代码审计-PHP模型开发篇&MVC层&RCE执行&文件对比法&1day分析&0day验证
开发语言·安全·web安全·php·mvc
杜杜的man1 小时前
【go从零单排】迭代器(Iterators)
开发语言·算法·golang
亦世凡华、1 小时前
【启程Golang之旅】从零开始构建可扩展的微服务架构
开发语言·经验分享·后端·golang