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程序自行改变信号频率参数,更改鉴频器,修改环路带宽等一些参数来观察实验结果,以便更深的理解锁频环的运行。

获取完整程序

见公众号

相关推荐
某不知名網友2 小时前
ROS2进阶:服务通信、自定义SRV接口、参数服务器与基于服务的参数通信详解
java·开发语言·microsoft
java_nnnn2 小时前
LeetCode刷题滑动窗口(水果成篮+找到字符串中所有字母的异位词)Java
java·开发语言·leetcode
qetfw2 小时前
Bash 字符串处理:参数展开、序列与脚本执行方式
linux·开发语言·chrome·bash
小羊没烦恼!2 小时前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#
学Linux的语莫3 小时前
python中类的常见写法
开发语言·python·状态模式
需要8263 小时前
容器化 Java:镜像瘦身与 JVM 容器感知(cgroup)
java·开发语言·jvm
dyxal3 小时前
A2A 协议 v1.0 完全指南:方法名、Agent Card、三种绑定与 FastAPI 实战
开发语言·qt·fastapi
譕痕3 小时前
Rabbit 实例
java·开发语言·java-rabbitmq
综合简报4 小时前
黑五海外发稿投给谁?三类海外媒体发稿渠道的分工
开发语言·php·媒体
大风起兮云飞扬丶4 小时前
Java——线程池
java·开发语言