原始 Markdown文档、Visio流程图、XMind思维导图见:https://github.com/LiZhengXiao99/Navigation-Learning
[TOC]
SoftGNSS 是《软件定义的GPS和伽利略接收机》附带的程序,使用 MATLAB 编写,实现了一套最简单的 GNSS 软件接收机功;输入经过天线接收,射频前端滤波下变频后的数字中频信号文件,进行 GPS L1 C/A 码的捕获跟踪,生成伪距观测值,解译导航电文,最小二乘定位解算;代码量很小也很简单,适合作为 GNSS 基带数字信号处理的入门阅读程序。
-
基于 softGNSS 实现的深组合:kongtian-SiBu / ZCJ_GNSSINS_DeepIntegration,作者是空天院的硕士,他还上传了一些他和他同学的一些硕士论文开题报告,相关论文。
这部分内容主要摘自谢刚的《GPS原理与接收机设计》,和我老师上课的 PPT
GNSS 接收机归根结底是作为一种传感器,它的主要任务在于感应、测量GNSS卫星相对于接收机本身的距离以及卫星信号的多普勒频移,并从卫星信号中解调出导航电文。内部结构沿其信号工作流程的先后顺序,通常分为射频前端处理、基带信号处理和定位导航运算三大功能模块:
-
射频前端处理模块:通过天线接收所有可见的 GPS 卫星信号,经前置滤波器和前置放大器的滤波放大后,再与本机振荡器产生的正弦波本振信号进行混频而下变频成中频信号(IF),最后经模数(A/D)转换器将中频信号转变成离散时间的数字中频信号。
-
基带数字信号处理模块:通过处理射频前端所输出的数字中频信号,经过捕获、跟踪复制出与接收到的卫星信号相一致的本地载波和本地伪码信号,从而实现对 GPS 信号的捕获与跟踪,并且从中获得GPS伪距和载波相位等测量值以及解调出导航电文。
-
定位导航运算功能模块:在基带数字信号处理模块处理完数字中频信号后,各个通道分别输出其所跟踪的卫星信号的伪距、多普勒频移和载波相位等测量值以及信号上解调出来的导航电文,而这些卫星测量值和导航电文中的星历参数等信息再经后续的定位导航运算功能模块的处理,接收机最终获得GPS定位结果,或者再输出各种导航信息。
GPS 卫星所发送的信号从结构上可以分为载波、伪码和数据码三个层次。在这三个层次中,伪码和数据码一起先通过调制而依附在正弦波形式的载波上, 然后卫星将调制后的载波信号播发出去。
以载波 L1上的 C/A 码为例,在卫星信号发射端,PRN 编号为 i 的卫星首先将数据码与 C/A 码
GPS接收机接收到卫星信号后,首先对卫星信号进 行载波解调,然后再将载波解调后的卫星信号与内部复制的 C/A 码
凭着 C/A 码良好的自相关特性,接收机一方面解出 卫星信号中的数据码(导航电文);另一方面根据 C/A 码自相关函数主峰位置而获得接收到的 C/A 码信号的相位,进而将其转化为从卫星到接收机的距离测量值。
卫星中的核心设备是原子钟,而由此原子钟所提供的基准频率
- 地球表面的电特性、地貌和电离层等因素对不同频率的电磁波有不同的影响。GNSS 所选择的信号频率一定要能穿透大气层(尤其是电离层)被用户接收,而且受到大气层的影响要尽量小。
- 伪码信号会被用来调制载波信号,所以要求载波频率必须远远高于伪码频宽。
- 采用高频率的载波可以允许接收机使用更小尺寸的用户天线,天线和波长通常呈正比关系(常用 1/4 波长)。
- 无线电波的频带是有限的宝贵资源,由国际电信联盟(ITU)和美国的联邦通信委员会(FCC)负责频谱资源的分配。比如 Galileo 系统为了能和 GPS 系统相同的 L1 频段,采用了 BOC 调制,将功率谱的主瓣分裂成对称的两部分,减少与 GPS 信号之间的干扰。
伪随机噪声码(PRN)简称伪随机码或者伪码,它是一种能预先确定的、有周期性的二进制序列, 而且具有接近于二进制随机序列的良好自相关特性。这种周期性的伪随机码可由一个多级反馈移位寄存器产生。伪码有两层目的,一是实现码分多址、二是用来测距。
二进制数随机序列所具有的一个很重要的特点是它的良好自相关性,一个二进制随机序列
-
移位寄存器:这种周期性的伪随机码可由一个多级反馈移位寄存器产生。
-
M(maximum) 序列:n 级反馈移位寄存器产生的、周期等于最大可能值(即 2n -1 码片)的序列,称为最长线性反馈移位寄存器序列,通常简称为 m(maximum)序列。
$\mathrm{m}$ 序列的自相关函数$R_{x}(\tau)$ 为: $$ R_{x}\left(i T_{c}\right)=\left{\begin{array}{c} 1, \text { 当 } i \text { 是 } N \text { 的整数倍时 } \ -\frac{1}{N}, \text { 当 } i \text { 不是 } N \text { 的整数倍的其他整数时 } \end{array}\right. $$ 当$\tau$ 不是码宽 $\mathrm{T}{\mathrm{C}}$ 的整数倍时, 那么 $R{x}(\tau)$ 等于相邻两点之间相关函数的线性插值。 -
Gold 码:伪码可以通过 m 序列产生,也可以通过两个或多个 m 序列组合而成。GPS 广泛使用的 C/A 码属于 Gold 码,就是由一对技术相同的 m 序列线性组合而成。但是,并不是任何一对级数相同的 m 序列都可以产生金码,我们把能产生 Gold 码的一对 m 序列称为优选m序列对。通过调节其中一个 m 序列的延时,一对 n 级优选 m 序列可组合产生
$2^n-1$ 个不同的 Gold 码,再加上他们自身的一对 m 序列,总共就有$2^n+1$ 个金码。对于任何一个
$n$ 级Gold码$x_{i}$ , 它的自相关函数$R_{x_{i}}(\tau)$ 在为整数码片时的值只有四种可能: $$ \begin{array}{ll} & R_{x_{i}}\left(\tau=k T_{C}\right) \in\left{1, \frac{\beta(n)-2}{N},-\frac{1}{N},-\frac{\beta(n)}{N}\right} \ \end{array} $$ 其中,$\beta(n)=1+2^{\left\lfloor\frac{n+2}{2}\right\rfloor}$,$\lfloor a\rfloor \quad$ 代表小于或等于$a$ 的最大的整数。 两个$n$ 级 Gold 码$x_{i}(t)$ 与$x_{j}(t)$ 之间不完全正交,它们之间的互相关函数$R_{x_{i}, x_{j}}(\tau)$ 的峰值只有以下三种可能: $$ R_{x_{i}}\left(\tau=k T_{C}\right) \in\left{\frac{\beta(n)-2}{N},-\frac{1}{N},-\frac{\beta(n)}{N}\right} $$ -
C/A 码:C/A 码是周期为1023 (即
$2^{10}-1$ ) 个码片的Gold码,即一个C/A 码的长度为 1023 个码片。它每个毫秒重复一周,因此其码速率为$1.023 \times 10^{6}$ 码片/秒,即 (1.023Mcps),码宽$T_{C}$ 约等于$977.5 \mathrm{~ns}$ 或$293 \mathrm{~m}$ (我们时常将一个$/ \mathrm{A}$ 码的码片近似说成$300 \mathrm{~m}$ 长)。$\mathrm{C} / \mathrm{A}$ 码的码率与载波$\mathrm{L} 1$ 的频率在数值上具有这样种关系: 在一个$\mathrm{C} / \mathrm{A}$ 码码片的时间内载波$\mathrm{L} 1$ 重复 1540周。C/A码产生器由两个十级反馈移位寄存器构成,这 两个移位寄存器的特征多项式分别为:
改变不同的抽头,可以产出不同卫星的 C\A 码:
数据码是 GPS 信号中的第三个层次,它是一列载有导航电文的二进制码,数据码的码率为 50 比特每秒(bps),它采用不归零制的二进制编码方式,产生主峰频宽为 100Hz 的数据脉冲信号。
50bps 的数据码的码宽
卫星将导航电文以帧与子帧的结构形式编排成数据流。每颗卫星一帧接着一帧发送导航电文,而在发 送每帧电文的时候,卫星又以一子帧接着一子帧的形式进行。
每帧导航电文长 1500 比特,共 30 秒,依次由 5 个子帧组成。每个子帧长 300 比特,计 6 秒,依次由十个个字组成。每个字长 30 比特,其最高位比特先被发送,而每一子帧中的每一个字又均以 6 比特奇偶校验码结束。每一比特长 20 毫秒,期间 C/A 码重复 20 个周期。
每一个子帧的前两个字分别为遥测字(TLW)与交接字(HOW),后八个字则组成数据块。不同子帧内的数据块侧重不同方面的导航信息,第 一子帧中的数据块通常称为第一数据块,第二和第三子帧中的数据块合成为第二数据块,而第四和第五子帧中的数据块则合并称为第三数据块。
- 第一数据块又常称为时钟数据块,内容包括:星期数、用户测距精度、卫星健康状况、时钟矫正参数、群波延时矫正值、时钟数据期号。
- 第二数据块提供卫星自身的星历参数。
- 第三数据块不是定位解算所急需的,主要提供所有卫星的历书参数、电离层延时校正参数、GPS时间与UTC之间的关系以及卫星健康状况等数据信息。
GPS 对第三数据块采用了分页结构,即第一帧中的第四和第五帧为一页,然后在下一帧中的第四和第五帧继续发送下一页,而第三数据块的内容各占 25 页。因为一帧电文长 30 秒,所以发送一套完整的导航电文总共需要花 750 秒(12.5分钟)的时间,然后整个导航电文的内容每 12.5 分钟重复一次,整体的结构层次如下图:
-
遥测字
- 同步码 10001011 是每一子帧的最先 8 个比特,接收机用它来匹配接收到的数据。
- 每一个字中的奇偶校验码可以帮助用户接收机检查 经解调得到的字中是否包含错误比特。
-
交接字
- 截短的周内时计数:交接字包含从 Z 计数器上得到的截短的周内时计数值,由于计数单位为 1.5 秒,所以将周期内时数乘 以 6 可得在这一子帧结束、下一子帧开始所对应的 GPS 时间。
- 子帧码:子帧码可以标识该子帧是第几子帧。如果知道了当 前子帧的识别标识,则接收机就可以按照这一子帧 的相应格式解译数据码。
目前,GPS 卫星对调制有 C/A 码的 L1 载波信号的发射功率约为 26.8 W。
假如某一卫星信号的发射功率为
同样,用来接收信号的接收天线经常也具有一定的指向性。若接收天线在某一方向上的有效接收面积为
信号接收功率的强弱并不能完整的用来描述信号的清晰程度或质量好坏,我们还需要知道信号相对于噪声的强弱。信号的质量通常用信噪比(SNR)来衡量,它定义为信号功率
载波噪声比
根据以下关系:
$$
C / N_{0}=\frac{P_{R}}{N_{0}} \quad \mathrm{SNR}=\frac{P_{R}}{N} \quad N=N_{0} B_{n}
$$
很容易得出信噪比和载噪比之间的关系:
$$
C / N_{0}=\mathrm{SNR} \times \mathrm{B}{\mathrm{n}}
$$
对于一般的接收机,$N{0}$ 的典型值为
射频电子元件在信号处理过程中会将其本身所产生的热噪声附加到信号上。噪声指数(NF)用来衡量某一电子器件的噪声性能,它定义为信号在进入这一器件前和从该器件输出后的信噪比变化倍数,F 是一个没有单位的标量,其值经常表达成分贝的形式:
$$
F=\frac{\mathrm{SNR}{\text {in }}}{\mathrm{SNR}{\text {out }}}
$$
噪声指数
Friis 公式用于计算串联器件的噪声指数: $$ T_{t}=T_{1}+\frac{T_{2}}{G_{1}}+\frac{T_{3}}{G_{1} G_{2}} $$ 从公式可以看出,一个串联器件系统中的首级器件的噪声性能尤为重要,它的噪声温度通常会主导整个串联器件系统的噪声温度,而后面几级器件的噪声温度经折算后被缩小,缩小的倍数等于其前面几级器件的增益之积。所以接收机的首级器件常常采用低噪声放大器 LNA。
在椭圆极化和圆极化中,电场强度矢量的旋转方向有两种可能,我们可以用右手来定义来判断它们是属于左旋还是右旋:将右手大拇指指向电磁波的传播方向,若其余四指的方向与电 场强度矢量的旋转方向一致,则该信号为右旋极化(RHCP),反之则为左旋极化(LHCP)。
GNSS 载波信号是一种右旋圆极化(RHCP)信号。当电磁波信号经过电磁界面反射后,反射信号的极化状况有可能会发生改变。通常,经过奇数次反射后变为左旋圆极化,而经过偶数次反射后仍为右旋圆极化,但是其功率也因多次反射产生很大的衰减。
为了使接收天线具有最高的信号接收功率,接收天线的极化形式必须与接收信号的极化形式 一致。所以 GNSS 接收天线大都以右旋圆极化的方式工作,并且要具有较强的抵制接收左旋极化信号的能力。
射频前端模块位于接收机天线与基带数字信号处理模块之间,它的主要目的是将接收到的甚高频射频模拟信号离散成包含 GPS 信号成分的、频率较低的数字中频信号,并在此过程中进行必要的滤波和增益控制。常采用 1918 年由 Armstrong 发明的超外差接收机技术框架,将射频前端的工作可以依次分为射频信号调整、下变频混频、中频信号滤波放大以及模数转换这几个主要部分:
由于从接收天线接收到的 GNSS 信号功率很弱。而且信号中不但掺杂噪声,在信号波段内还可能存在着各种故意或无意的干扰信号。因此射频前端 对接收到的卫星信号的第一步处理是进行信号调整,即利用带通滤波器尽可能的滤除需要波段之外的各种噪声和干扰,并对信号进行功率放大。
天线接收到的 GNSS 卫星射频信号的中心频率在 1~2MHz 左右,而频率如此高的射频信号一般不适于被直接采样。下变频混频是通过混频器将低噪声放大器输出的射频信号与本机振荡器产生的本振信号进行相乘,再对乘积产生的高频成分进行滤波,载波信号频率就从射频下降到中频。作为混频结果,中频信号不仅原封不动的保留着原先 GNSS 射频信号上所调制的全部数据与信息, 而且由于频率较低,适合用来采样。
射频前端可能采用多级放大器,它们的功率放大倍数(即增益值)的选取需要考虑射频前端各个器件的噪声指数、功耗和器件饱和等多方面的因素,因而它们的成本会很高。于是,人们偏向于将各级放大器尽量安排在混频之后。
射频前端总的功率放大倍数是指考虑了电缆、滤波器、混频器、放大器等各级器件在处理信号过 程中的功率损耗或增加后的净增益值。
如果经过放大后的功率增益过低,则随后输入到 A/D 转换器的信号幅值不能激活多位 ADC 的各个输出位;反之,如果增益过高,则包含 ADC 在内的多种器件会达到饱和,而 ADC 在饱和的情况下将输出失去真实信息的最大幅值。
经过前面几级的混频、滤波和放大等处理,接收到的 GPS 卫星信号的功率至此已经得到了足够的 放大,其中心频率也已经变成了较低的中频,而这些状况均有利于模数转换器(ADC)对信号做 最后一步的模数(A/D)变换,主要是进行采样、量化、编码三个步骤:
- 采样:
- 量化:量化的基本原理是将采样信号与一些门限值进行比较,从而决定相应的数据位输出是 0 还是 1。
- 编码:模拟形式的采样信号值就被量化成一个用二进制表示的数据(二进制、BCD、ASCII)来表示,这就是数字量的编码。
为了防止 ADC 在信号采样过程中发生混叠失真,采样频率必须满足带通采样定理,采样频率必须大于两倍的信号带宽。由于中心频率位于
ADC 采用较少的位数的另一个原因是 GPS 信号是 CDMA 信号,而且已经通过发送功率的控制使得地面上每一点的卫星信号强度差不多。
为了充分利用 ADC 的多位资源,多位 ADC 通常需要配置一级或多级自动增益控制(AGC)。AGC 放大器通常是射频前端的最后一个增益元器件。 自动增益控制根据ADC的输出情况随时、相应的 调节 ADC 之前的滤波增益,使最后一级混频器输 出的中频信号幅值(即 ADC 的输出信号幅值)大致维持在一个常数。这样,当接收信号变弱时,自动增益控制可提高滤波增益,以避免 ADC 的输出全部为 0;当接收信号变强时,自动增益控制又可相应的降低滤波增益,以避免ADC 的输出全为正负最大值。
信号捕获是接收机内部数字信号处理的第一步,目的是获取所有可见卫星信号的载波频率和码相位的粗略初始值,只有完成了信号捕获,才有可能开始信号跟踪,基带信号处理和定位导航算法等后续过程。
- PRN 码:卫星由不同的 PRN 码进行区分,通过 ,确定出有哪些卫星。
- 码相位:
- 载波频率:在下变频的情况下指中频,
-
冷启动:接收机不知道当前的时间及所处的位置,并且也没有保存有效的卫星星历和历书。 冷启动的接收机只能处于盲目搜索的状态。冷启 动的首次定位所需时间一般在 60s 左右
-
暖启动:接收机没有有效星历但却掌握着误差小于 5 分钟的当前时间、误差小于 100km 的当前位置以及有效的历书。暖启动的首次定位所需时间一般在 45s 左右
-
热启动:接收机不但具备暖启动条件,而且还保存着有效星历。热启动的首次定位所需时间 一般小于 12s。
考虑到码相位的周期特性,所以码相位的搜索区域就是一个完整的 CA 码周期(即1ms),待确定的就是载波频率的搜索范围。接收机接收到的载波信号中心频率并不等于发射信 号的标称频率,原因为包括卫星和接收机相对运动引起的多普勒频移、接收机振荡频率漂移、卫星原子钟频率漂移。我们可以认为一般陆基运动载体上的接收机所接收到的载波信号的最大多普勒频移量为 ±10kHz 。而以载波 L1 的标称频率 f1 为中心的这 ±10kHz 不定区间,通常作为接收机冷启动时的频率搜索范围。
信号搜索的基本步骤是在各个伪码、频率和码相位的三维搜索单元上进行信号搜索,而搜索的主要操作是进行 C/A 码相关运算。相关运算既可以在时域内由数字相关器硬件实现,也可以在频域内运用数字信号处理(DSP)技术(主要是指傅里叶变换)来完成。按照相关运算实现的方式不同,信号搜索捕获算法可主要分为以下三种:
-
线性搜索(串行捕获算法):利用数字相关器在时域内对所指定的卫星信号的多 普勒频移和码相位这两维内进行扫描式搜索,每次只搜索一个搜索单元而不是一组搜索单元,因而它的搜索运算量巨大、速度较慢。可以采用常规的信号捕获电路来实现:
-
并行频率搜索:
-
并行码相位搜索:并行码相位捕获搜索算法可以 2046 次码相位搜索通过傅立叶变换一次性完成,从而使搜索次数急剧减少至只在频率一维内的 41次搜索。
一旦接收机捕获到卫星信号,就可以提取出卫星信号的载波频率和 C/A 码码相位的粗略估计值,然后各个相应的信号通道就进入跟踪阶段。简单来说,如果接收机内部复制的载波信号和伪码信号与接收到的卫星信号中的载波和伪码保持同步与一致(精确),那么复制载波与接收信号进行混频可以实现载波剥离并将信号下变频。复制伪码与接收信号进行相乘可以实现伪码剥离和信号解调,这时在接收信号中剩下的便只是数据码。
载波环的目的是尽力使其所复制的载波信号与接收到的卫星载波信号保持一致,从而通过混频机制彻底的剥离卫星信号中的载波。若复制载波与接收载波不一致,则接收信号中的载波就不能被彻底的剥离,也就是说接收信号不能被下变频到真正的基带。
码环通过其内部的码发生器尽量复制出一个与接收信号中的 C/A 码相一致的 C/A 码,然后让两者做相关运算,以剥离接收信号中的 C/A 码。复制 C/A 码的相位必须与接收信号中的 C/A 码相位一致。
在载波环和码环分别彻底的剥离了数字中频信号中的 C/A 码和载波后,尚留存在接收信号中的则是完整无损的导航电文数据比特。
一个典型的锁相环主要是由鉴相器、环路滤波器和压控振荡器(VCO)三部分构成:
我们将锁相环的输出和输出信号表达成:
锁相环的系统函数表明了环路滤波器 F(s) 基本上决定着锁相环的性能,由此可见环路滤波器在锁相环设计中的重要性。 $$ H(s)=\frac{\theta_{o}(s)}{\theta_{i}(s)}=\frac{\frac{K F(s)}{s}}{1+\frac{K F(s)}{s}}=\frac{K F(s)}{s+K F(s)} \quad\quad\quad\quad K=K_{d} K_{o} $$
针对 GPS 信号的 BPSK 调制和强度微弱等特点,GPS 接收机通常采用 I/Q 解调法来帮助完成对输入信号的载波剥离、鉴相和数据解调等任务。
科斯塔锁相环采用的相位鉴别方法主要有以下几种:
-
二象限反正切函数鉴相器的离散时间型: $$ \phi_{e}(n)=\arctan \left(\frac{Q_{P}}{I_{p}}\right) $$
-
为了避免反正切函数: $$ \phi_{e}=\frac{Q_{P}}{I_{P}} $$
-
将 I 和 Q 支路上的信号相乘: $$ \phi_{e}=Q_{P} I_{P} $$
-
最后一种鉴相方法为: $$ \phi_{\varepsilon}=Q_{P} \cdot \operatorname{sign}\left(I_{P}\right) $$
C/A 码具有良好的自相关和互相关性。码环的用意在于将复制C/A码与接收C/A码之间的相关结果维持在最大值,并以此锁定接收信号。如果码环在每一时刻只复制一份C/A码,那么由于缺乏可比性,码环会难以判断出相关结果是否真的达到最大。鉴于此,码环一般复制出三份不同相位的C/A码,分别称为超前(Early)、即时(Prompt)和滞后(Late)C/A码,并分别用 E、P 和 L 来表示。超前、即时与滞后复制 C/A 码在码相位上逐次落后 d 码片,相邻相位差称为相应两个相关器的间距。码环通过比较多个相关结果,利用了自相关函数主峰的对称性,推算出 C/A 码自相关函数主峰顶端的位置:
这相当于确定了即时C/A码和接收C/A码之间的相位差异,进而一方面获得接收信号的码相位测量值,另一方面将码相位差异信息反馈给C/A码数控振荡器(NCO)而闭合环路。如果超前与滞后相关器输出的相关幅值E与L相等,那么位于超前码与滞后码中间的即时码就必然与接收C/A码在相位上保持一致;否则,就意味着即时码与接收C/A码之间的相位不一致,于是码环根据相关幅值E与L之间的差异鉴别出此时即时码与接收C/A码之间的相位差异d**cp,然后再通过反馈调节机制使下一时刻超前与滞后相关器输出的相关幅值相等。
在获得了超前、即时和滞后支路所输出的相干积分结果后,码环鉴别器通常先对它们进行非相干积分,然后利用所得的 C/A 码自相关函数幅值上的非相干积分值 E,P 和 L 估算出码相位差异$\delta_{c p}$,其码相位差异 确切的说是复制的即时 C/A 码落后接收 C/A 码的相位量。常见的码环鉴别器方法有:
-
非相干超前减滞后幅值法: $$ \delta_{c p}=\frac{1}{2}(E-L) \quad\quad\quad\quad \delta_{c p}=\frac{1}{2} \frac{E-L}{E+L} $$
-
非相干超前减滞后功率法: $$ \delta_{c p}=\frac{1}{2}\left(E^{2}-L^{2}\right) \quad\quad\quad\quad \delta_{c p}=\frac{1}{2} \frac{E^{2}-L^{2}}{E^{2}+L^{2}} $$
-
似相干点积功率法: $$ \delta_{c p}=\frac{1}{2}\left(\left(I_{E}-I_{L}\right) I_{P}+\left(Q_{E}-Q_{L}\right) Q_{P}\right) \quad\quad \delta_{c p}=\frac{1}{4}\left(\frac{I_{E}-I_{L}}{I_{P}}+\frac{Q_{E}-Q_{L}}{Q_{P}}\right) $$
-
相干点积功率法等: $$ \delta_{c p}=\frac{1}{2}\left(I_{E}-I_{L}\right) I_{P} \quad\quad\quad\quad \delta_{c p}=\frac{1}{4} \frac{I_{E}-I_{L}}{I_{P}} $$
在这一跟踪环路的运行过程中,载波环根据其所复制的载波信号输出多普勒频移、积分多普勒和载波相位测量值,同时码环根据其所复制的 C/A 码信号状态输出码相位和伪距测量值,而载波相位鉴别器还可以额外的解调出卫星信号上的导航电文数据比特。
在跟踪环路中,载波剥离发生在伪码剥离之前。无论是载波剥离还是伪码剥离在前,在理论上和信号跟踪性能上不存在差异,然而,伪码剥离在前的方式会增加载波剥离的复杂度。现实中的接收机一般均采用先载波剥离、后伪码剥离的设计方式。
接收机对卫星信号进行跟踪的目的,主要是为了解调出卫星信号上的导航电文和获取对该可见卫星的伪距测量值。在信号跟踪阶段后,还需要完成位同步,即从接收信号中找到数据比特的边缘;接着再实现帧同步,即从接收信号中找到子帧的起始边缘;在完成位同步之后,接收机可以进行正常 20ms 宽的数据解调,而在实现帧同步后,它又可以进一步对解调出的数据比特进行导航电文译码。产生伪距测量值基本上等同于确定接收信号的发射时间,而发射时间信息的一部分隐含在接收到的导航电文数据比特中,剩下的部分与当前接收机信号在导航电文子帧格式中的位置有关。
在位同步之前,接收机并不知道哪 20 个相继的 1ms 数据属于同一比特;反过来,如果接收机能通过数据分析而将这一连串的 1ms 数据合理的划分成每 20 个一组,那么位同步也就得以实现。
-
过零检测法:
-
直方图法:实际中,由于噪声等各种原因,1ms 宽的数据比特流有时并不呈现一个清晰而又有规律的模式,因此 我们不能简单的凭着1ms 宽数据流中的单个跳变来决定比特边缘,否则会发生很高的位同步错误率。 可以借助于直方图法进行判断。
过程如下:
-
初始时,每个格子计数器设定为 0。
-
若每次 C/A 码符号变化则在对应的直方图格子中加 1。
-
该过程继续下去直到下面情况之一发生:
-
a.两个格子的计数超过了门限 N2。
-
b.失锁。
-
c.一个格子的计数超过了门限 N1
-
-
如果 a 发生,说明载噪比变小或者缺乏 C/A 码符号变化,位同步失败了,需要系新启动位同步;如果 b 发生,需要重新捕获锁定;如果 c 发生,说明位同步成功了,并且 C/A码计数复位到正确值。
-
在译码之前,接收机还需要对所解调出的以字为单位的数据比特进行奇偶检验,以确保被用于译码的数据比特的正确性。
- 伪距观测值生成:
- 载波相位观测值生成:
程序的根目录里:
必须要设置好的配置有:
clear; close all; clc;
清理工作空间,关闭打开的窗口。- format
'compact'
:这个选项会让MATLAB使用紧凑的格式来显示结果。对于小数,它仅显示足够的小数位以区分不同的实数。例如,1.2和1.200将被显示为相同的输出。'long'
:这个选项会让MATLAB使用长格式来显示结果。对于小数,它显示所有的有效数字,即使这些数字在末尾是零。例如,1.2和1.200将被显示为不同的输出:1.200和1.2。'g'
:这是'general'
的缩写,它让MATLAB选择一种格式,这种格式对于大多数情况都能产生可读的结果。这通常是5位小数,但对于非常大或非常小的数字,小数位数可能会更多或更少。
- addpath 添加 include、geoFunctions 文件夹到工作空间。
- 调用 initSettings() 生成选项结构体 settings。
- 尝试打开设置的文件路径,打开失败输出错误信息,程序终止。
- 打开成功就调用 probeData() 绘制原始 IF 数据的时域采样波、直方图统计、功率谱密度,以对采样数据进行时域和频域分析。
函数有两种调用方式:
- settings:
- settings和fileName:
- 以二进制只读的方式打开数据文件 fileNameStr,获取文件描述符 fid。
- 根据设置的采样频率 samplesPerCode、采样类型 fileType,读取开头的 100ms 数据,然后关闭文件。
- 判断是否读到 100ms 数据,如果没读取到 100ms 数据,说明文件太短,不进行处理。
- 创建绘图界面,设置时间轴尺度 timeScale,从 0~0.005
包括解算初始化、信号捕获、通道初始化、信号跟踪、导航定位结算、结果绘制
-
初始化:打开数据文件,跳过设置的字节数。
-
信号捕获:如果没有设置跳过捕获,就根据设置的采样频率和文件类型读取前 11ms 数据到 data,调用 acquisition() 进行捕获,捕获程序搜索所有可能的 GPS 信号,估计信号频率和C/A码相位,结果保存在结构体 acqResults 中,最后调用 plotAcquisition() 绘制捕获结果。
-
通道初始化:接下来 preRun() 函数读取捕获结果,并初始化所有软件通道。如果卫星数少于通道数,未用的通道被禁用。该程序还负责清空前一次的结果,给本次运行提供新环境。如果没有捕获结果程序就此结束。
-
信号跟踪:通道初始化以后,从记录的文件中读取一组信号采样点送到跟踪模块 track。跟踪模块跟踪所有启用通道中的信号,检测位边界,存储导航数据位并解码。解码之后的卫星星历储存在结构体 eph 中。跟踪结果(相关器、鉴相器等的输出)储存在结构体trackResults中。在 settings 中可设置跟踪数据的长度。
-
导航定位解算:跟踪之后,启动 postNavigaton() 继续对数据进行处理。该函数识别导航电文的子帧头,计算信号传输时间并估算所有的伪距,然后计算天线处的 ECEF 坐标,并转换成指定的坐标系统,如UTM或者WGS84。
-
结果绘制:画出捕获、跟踪和定位结果。
捕获的目的是确定可见卫星及卫星信号的载波频率、码相位的粗略值。
-
可见卫星:卫星由不同的 PRN 码进行区分,利用 PRN 码良好的自相关性和互相关关性,确定出信号中有对应的 PRN 码,即确定了可见卫星。
-
码相位:两个伪码只有在时延为零的时候才能得到最大相关值,也就是说,两个信号必须完全对齐才能去除接收信号中的伪码。指的是伪随机码在当前数据块中的时间同步信息。为产生与接收信号伪码相位完全对齐的本地伪码,需要知道码相位,此时则可从信号中去除伪码。
-
载波频率:在下变频的情况下指的是中频。接收到的 L1 频点 1575.42MHz 射频信号,在下变频器中经过混频后可获得中频信号。但是,接收信号的频率有可能偏离预期值。在视距范围内的卫星速度(相对于接收机)引起的多普勒频移可导致接收信号频率的升高或降低。在最坏的情况下,频差有可能达到 ±10kHz。产生本地载波信号的前提是必须知道接收信号的频率,其目的是用于去除接收信号载波。在通常情况下,搜索得到的最大频率误差为 500Hz 是可以接受的。
信号捕获对应于各个不同伪码、频率、码相位的三维搜索单元上通过做码相关运算进行信号搜索,根据相关运算实现方式的不同,信号搜索捕获算法可分为三种:
-
串行搜索:输入信号先后与本地产生的 PRN 码、载波相乘,然后进行 1ms 积分之后平方相加;串行搜索算法包括两个不同的扫描过程:
- 步长 500z、载波频率范围为 IF±10kHz 的频率搜索过程,
- 遍历 1023 种不同码相位的码相位搜索过程。
搜索总共需要经过的次数为: $$ \underbrace{1023}{\text {码相位 }}(\underbrace{2 \frac{10000}{500}+1}{\text {赖率 }})=1023 \times 41=41943 $$ 计算分主要有三部分:
- PRN 码生成:采用移位寄存器生成,可以在每次捕获的时候由伪码发生器生成,也可以离线产生;由于要做伪码相移相乘,还要存下伪码所有可能的相位值,也就是要存下 1023 * 32 = 32736 组不同的伪码;为了能使本地的伪码于接收到的信号相乘,本地伪码也要于进行接收信号相同的采样,假设接收的中频信号采样频率为 10 MHz,那对应伪随机序列长度由 1023 变为 10000。
- 载波相位生成:
- 积分于平方:平方是为了获得信号功率,再做积分将信号所有点的功率相加,如果本地 PRN 码于接收到信号的 PRN 码完全对齐,将达到相关峰值。
-
并行频率搜索:接收信号与对应于某一特定卫星的本地伪码序列相乘,码相位从0~1022。将得到的结果通过傅里叶变换转换为频域信号,
-
并行码相位搜索:
可以基于不同的标准选择用于捕获的数据长度。第一个需要考虑的因素是导航数据位跳变的影响。前面提到的这些算法均不能忽略捕获过程中出现的位跳变。为了保证捕获算法的最佳性能,必须保证在分析的数据序列中不存在数据跳变。
正如前面所提到的,导航数据传输速率为 50b/s,因此每 20ms 可能出现一次位跳变。假定将10s 的数据用于捕获,就有可能出现 1 次位跳变,且其出现概率几乎可达 50%(不是确切的 50%,主要是因为两个连续的数据位可能具有相同的数值)。但是,如果捕获是在两个连续的序列中进行的,每个序列的长度均为 10ms,则至少一个序列应不包括位跳变。
当选择用于捕获的数据长度时,第二个需要考虑的因素是成功捕获的概率。这个问题可以基于对某一特定卫星而言检测到正确参数的概率与被分析数据长度成正比的原理考虑。
第三个需要考虑的因素是计算量,也是数据长度的函数。此因素实际上与前一个因素是冲突的,序列越长则计算速度越慢。用于捕获的数据长度的选择一定要综合考虑前面所提到的三个因素。如果考虑数据位跳变的影响,则有可能对于每一次捕获均需要运行两次相应的捕获算法。为了保证捕获成功,数据长度不能太短。但是,也不能太长,否则会导致计算量非常大并且很耗时。
一个折中的办法是用于捕获算法的数据长度为1ms,对应于一个完整的C/A码周期,这样简化了算法,也不需要对伪码进行复制。数据长度不能再短了,否则会导致与不完整伪码的相关。被分析数据可以比 1s 长些,但是正如前面所提到的,这样会导致计算效率的降低。为了保证在分析的数据序列中发生数据位跳变时仍能实现对某一颗卫星信号的捕获,在第一次捕获未成功的情况下可以进行第二次捕获。
输入参数:
- longSignal:
- settings:
输出参数:
- acqResults:
捕获函数每隔 0.5kHz 搜索一次 GPS 信号,在每个频率搜索阶段,同时搜索码相位。每次搜索之后保存相关结果并进入下一频率单元,由此函数遍历所有的频段(用户定义的多普勒空间),接下来寻找函数最大相关值(相关峰)。之后,寻找同一频率单元中的第二大相关值,然后计算其比值并作为信号检测的规则,该比值用于和接收机中预设的变量值acq_threshold进行比较。 检测器与采样频率无关,因此也与峰值大小及噪声电平无关。
如果第一峰值与第二峰值的比值超过门限值,则利用FFT方法找到精确的载波频率,以协助跟踪环中的PLL启动信号跟踪。0.5kHz的频率精度对于PLL跟踪太粗略了。
输出是数组结构变量acqResult,包含Acq_satelliteList中指定的所有卫星的搜索结果。如果某一颗卫星的信号被检测到,那么对应的signalDetected会被置1。
函数参数为初始的数据记录、预先产生的C/A码表和settings结构体。Settings结构中包含的与捕获有关的变量如下:
-
Acg_satelliteList:指定一组卫星伪随机序列。捕获只对特定卫星进行。默认状态为空表,启动搜索所有可见卫星1~32.
-
Acq_searchBand:指定卫星信号搜索的频率范围,为 kHz 的整数倍,并以 F 为中心频率。用于捕获函数的步长为 0.5kHz.
-
Acq_threshold:信号检测器的门限。
-
初始化:
- 计算单码片采样点数 samplesPerCode
- 创建两个 1ms
- 计算采样间隔 ts (采样频率的倒数)
- 查找本地载波的相位点 phasePoints
- 计算搜索带宽内采样点数 numberOfFrqBins:以中心频率为中心,两边各 acqSearchBand 个点
- 调用 makeCaTable() 生成所有 C/A 代码到 caCodesTable,并根据采样频率进行采样。
-
做相关运算:遍历设置的卫星 PRN 列表 acqSatelliteList(默认全部的 32 个 PRN 都搜索)
- 对 caCodesTable 存的 C/A 码做 fft 并取复共轭存到 caCodeFreqDom
- for 循环,在搜索带宽内
-
查找结果中的相关峰值:
-
高分辨率搜索:
输入参数:
- fid:
- channel:
- settings:
输出参数:
- trackResults:
- channel:
该函数跟踪分配到每一通道中的GPS信号。此函数需要如下参数:从前端获得的一段数据,结构变量Channel,正弦函数,余弦函数和C/A码表。此函数处理采样数据并返回两个结构变量:跟踪结果TrackResults和更新的结构变量Channel.Channel结构变量用来传递每个通道的初始信息并存储当前通道的信息,其另外一个目的是使跟踪具有连贯性。用这种方法,处理两个或者更多的数据段可以连续进行。该结构包含当前(处理上1s数据)的载波频率、码相位、跟踪卫星号、环路滤波器的临时参数和本地信号发生器的信息。
Settings 结构中的载波跟踪参数包括:
- PLL_dampingRatio:阻尼比。
- PLL_noiseBandwidth PLL:噪声带宽。
Settings 结构中的码跟踪相关的参数如下:
- DLL_CACorrelatorSpacing:超前和滞后相关器的间距,单位是码片。
- DLL_damplingRatio DLL:阻尼比。
- DLL_noiseBandwidth DLL:噪声带宽。
trackResults 结构是跟踪函数的主要输出,包含所有通道每Ims的跟踪结果:信号属性信息(载波频率和码相位)和6个相关器及环路鉴别器的输出。跟踪结果将作为函数 postNavigation 的输人,Plottracking 用来绘制每一通道的结果,其余信息用于绘制跟踪结果并分析接收机性能。
输入参数:
- trackResults:
- settings:
输出参数:
- navSolutions:
- eph:
该函数从确定位转变和帧头位置开始,得到每一位的值,并解码获得星历,包括子帧1、子帧2和子帧3。子帧4和子帧5里的信息也可能包括,如图A.4所示。
接下来该函数调用伪距测量函数并计算位置坐标。伪距和位置的计算覆盖接收机settings结构变量中描述的指定时间段
postNavigation 函数读取以下变量:
- navSolPeriod:计算伪距和位置的频率。
- elevationMask:卫星屏蔽角,设置用于位置计算的卫星的最小仰角。低仰角卫星信号其大气误差大。
- UTMzone:UTM时区用来转换坐标(ECEF到UTM),这是一个与接收机位置有关的整数。
- truePosition:如果接收机天线的精确位置已知,则可指定天线的(东、北、天)坐标,此坐标从软件接收机计算的结果中提取,并画出其图。也可输人(E、N、U)做为近似坐标或零点。
主要就是计算传播时间 pseudoranges,传播时间乘以光速得到伪距观测值。
leastSquaresPos函数通过伪距计算接收机位置。如果一颗卫星的完整星历无法得到,那么,该卫星的伪距也无法使用。
在第一次计算时所有卫星的仰角都被设为最大值。因为在一开始,接收机并不知道卫星的仰角,所以使用所有的卫星计算位置,当确定了接收机的位置以后,排除仰角低于elevation_Mask的卫星。
postNavigation函数使用了Easy Suite中几个修改的函数,在postNavigation 函数的最后,ECEF坐标被转化为 UTM 和大地坐标系统,结果保存在 navSolutions 结构变量中。