导航电文包含卫星的时间和位置信息,是进行导航定位不可缺少的起算数据。导航电文,又称为数据码或 D 码,包含有关卫星的星历、卫星工作状态、时间系统、卫星钟运行状态等信息,是卫星信号的重要组成部分,也是用户利用卫星进行定位的数据基础。

1 编码及校验计算

根据 GPS ICD-200 规定,导航电文子帧以字为单位组成,字结构如图所示,每个字由24 位比特数据位和 6 比特的奇偶校验位组成。采用奇偶校验可以检验接受端和发送端数据是否一致,从而提高数据传输质量。下面给出传输导航电文的校验过程。

D1 = d1⊕D*30

D2 = d2⊕D*30

D3 = d3⊕D*30

D4 = d4⊕D*30

......

D24 = d24⊕D*30

D25 =D*29⊕d1⊕d2⊕d3⊕d5⊕d6⊕d10⊕d11⊕d12⊕d14⊕d14⊕d17⊕d18⊕d20⊕d23

D26 = D*30⊕d2⊕d3⊕d4⊕d6⊕d7⊕d11⊕d12⊕d14⊕d14⊕d15⊕d18⊕d19⊕d21⊕d24

D27 = D*29⊕d1⊕d3⊕d4⊕d5⊕d7⊕d8⊕d12⊕d13⊕d14⊕d15⊕d16⊕d19⊕d20⊕d22

D28 = D*30⊕d2⊕d4⊕d5⊕d6⊕d8⊕d9⊕d13⊕d14⊕d15⊕d16⊕d17⊕d20⊕d21⊕d23

D29 = D*30⊕d1⊕d3⊕d5⊕d6⊕d7⊕d9⊕d10⊕d14⊕d15⊕d16⊕d17⊕d18⊕d21⊕d22⊕d24

D30 = D*29⊕d3⊕d5⊕d6⊕d8⊕d9⊕d10⊕d11⊕d13⊕d15⊕d19⊕d22⊕d23⊕d24

式中d1-d24为原始数据位;D25-D30为通过公式计算得到的6比特奇偶校验码位;D1-D30为传输的比特位;D*29,D*30为每一子帧中上一个字的最后两位数据。需要注意的是第 1 子帧第 2字奇偶校验最后两位必须设置为 0,每一个子帧的最后一个字的奇偶校验最后两位也必须为0,为了保证该两位置零,通常利用该字的第 23、24 位配合实现;当 D*29,D*30为子帧第一个字时,D*29,D*30通常置零处理。

2 编码及校验程序

两个函数:

unsigned int computeChecksum(unsigned int source, int nib);// nib= 1 表示要通过配d23 d24使校验值的最后两位为0

unsigned int countBits(unsigned int v);

unsigned int countBits(unsigned int v)
{unsigned long c;const int S[] = {1, 2, 4, 8, 16};const unsigned long B[] = {0x55555555, 0x33333333, 0x0F0F0F0F, 0x00FF00FF, 0x0000FFFF};c = v;c = ((c >> S[0]) & B[0]) + (c & B[0]);c = ((c >> S[1]) & B[1]) + (c & B[1]);c = ((c >> S[2]) & B[2]) + (c & B[2]);c = ((c >> S[3]) & B[3]) + (c & B[3]);c = ((c >> S[4]) & B[4]) + (c & B[4]);return(c);
}unsigned int computeChecksum(unsigned int source, int nib)
{/*Bits 31 to 30 = 2 LSBs of the previous transmitted word, D29* and D30*Bits 29 to  6 = Source data bits, d1, d2, ..., d24Bits  5 to  0 = Empty parity bits*//*Bits 31 to 30 = 2 LSBs of the previous transmitted word, D29* and D30*Bits 29 to  6 = Data bits transmitted by the SV, D1, D2, ..., D24Bits  5 to  0 = Computed parity bits, D25, D26, ..., D30*//*1            2           3bit    12 3456 7890 1234 5678 9012 3456 7890---    -------------------------------------D25    11 1011 0001 1111 0011 0100 1000 0000D26    01 1101 1000 1111 1001 1010 0100 0000D27    10 1110 1100 0111 1100 1101 0000 0000D28    01 0111 0110 0011 1110 0110 1000 0000D29    10 1011 1011 0001 1111 0011 0100 0000D30    00 1011 0111 1010 1000 1001 1100 0000*/unsigned long bmask[6] = {0x3B1F3480UL, 0x1D8F9A40UL, 0x2EC7CD00UL,0x1763E680UL, 0x2BB1F340UL, 0x0B7A89C0UL };unsigned long D;unsigned long d = source & 0x3FFFFFC0UL;unsigned long D29 = (source>>31)&0x1UL;unsigned long D30 = (source>>30)&0x1UL;if (nib) // Non-information bearing bits for word 2 and 10{/*Solve bits 23 and 24 to presearve parity checkwith zeros in bits 29 and 30.*/if ((D30 + countBits(bmask[4] & d)) % 2)d ^= (0x1UL<<6);if ((D29 + countBits(bmask[5] & d)) % 2)d ^= (0x1UL<<7);}D = d;if (D30)D ^= 0x3FFFFFC0UL;D |= ((D29 + countBits(bmask[0] & d)) % 2) << 5;D |= ((D30 + countBits(bmask[1] & d)) % 2) << 4;D |= ((D29 + countBits(bmask[2] & d)) % 2) << 3;D |= ((D30 + countBits(bmask[3] & d)) % 2) << 2;D |= ((D30 + countBits(bmask[4] & d)) % 2) << 1;D |= ((D29 + countBits(bmask[5] & d)) % 2);D &= 0x3FFFFFFFUL;//D |= (source & 0xC0000000UL); // Add D29* and D30* from source data bitsreturn(D);
}

3 解码

GPS的IDC文件中给出了解码和校验的流程图如下

4 解校验程序

其中:dta的bit23-bit存放导航电文比特的d1-d24,parity是参考校验值

unsigned int GPS_ParityCheck(int data,int parity,int D29,int D30)
{unsigned int i,j,S[6];int temp,S_temp,P;int GPSX_Flag_Data_Parity;unsigned int GPS_H[6]={0xEC7CD2,0x763E69,0xBB1F34,0x5D8F9A,0xAEC7CD,0x2DEA27};temp=0;P=0;GPSX_Flag_Data_Parity=0;if (D30==1) data=(~data)&0xFFFFFF;for(i=0;i<6;i++){S[i]=GPS_H[i]&data;S_temp=S[i];temp=0;for(j=0;j<24;j++){temp+=S_temp&1;S_temp=S_temp>>1;}if (temp%2==0)temp=0;elsetemp=1;if ((i==0)||(i==2)||(i==5))temp=temp^D29;elsetemp=temp^D30;P=P|(temp<<(5-i));}//printf("P = %d\r\n",P);if(P==parity)GPSX_Flag_Data_Parity=1;return GPSX_Flag_Data_Parity;
}

5 应用

#include <stdio.h>
#include <stdlib.h>
#include "GPSfun.h"
//#include "datafile.h"
int main()
{//D29 = 1//D30 = 0;int dat[32] = {0,1,0,1,1,1,0,0,0,1,1,1,1,1,1,0,1,0,0,1,0,0,0,0,1,0,0,1,0,1};//已编码已校验的测试序列int i;unsigned int tmp;tmp = 2; //D29 D30 : 10//for(i=0;i<24;i++){tmp = tmp<<1;tmp = tmp+dat[i];}tmp = tmp<<6;//第六位留空 存放校验位tmp = computeChecksum(tmp,0); //该值的bit29-bit0应与dta一致printf("tmp = %d\n",tmp);tmp = 0;for(i=0;i<24;i++){tmp = tmp<<1;tmp = tmp+dat[i];}tmp = GPS_ParityCheck(tmp,37,1,0);//37为参考校验值为dta的高六位,即六位校验码的值printf("tmp = %d\n",tmp);}

GPS导航电文编码与校验相关推荐

  1. GPS导航电文——第一子帧数据解析

    1 GPS导航电文 导航电文一帧包含1500位,需30秒时间传输完成.这1500位又分为5个子帧,每子帧300位.每子帧按顺序分为10个字,每个字有30位.每子帧开头是遥测字(Telemetry Wo ...

  2. GPS从入门到放弃(五) --- GPS导航电文

    GPS从入门到放弃(五) - GPS导航电文 GPS的导航电文以帧的形式编排为比特流,每一帧为1500比特,这1500比特又分为5个子帧,每个子帧为300比特.每一子帧又分为10个字,每个字30为比特 ...

  3. GPS基础知识(五)、GPS导航电文

    GPS的导航电文以帧的形式编排为比特流,每一帧为1500比特,这1500比特又分为5个子帧,每个子帧为300比特.每一子帧又分为10个字,每个字30为比特.发送时MSB在前.每一比特发送需要20ms, ...

  4. GPS导航电文文件和观测值文件解读

    通过无线通用平台usrp接收GPS信号.配合GNU-sdr开源软件解算卫星信号.得到卫星导航电文文件和观测值文件. 对导航文件.N和观测值文件.O查资料解读如下. https://blog.csdn. ...

  5. GPS导航电文——第四、五子帧数据解析

    第一子帧数据解析 第二子帧数据解析 第三子帧数据解析 1 数据结构 第4和第5两个子帧,其内容包括了所有GPS卫星的历书数据.历书数据是一个低精度的时钟和星历参数的子集.这个数据占据了每一页中除了字3 ...

  6. GPS导航电文——第三子帧数据解析

    第一子帧解析 第二子帧解析 1 第三子帧结构图 图表的一些说明: ***:为保留位 P:6 bits校验位 t:用于校验计算的2 bits非信息位 C:TLM的第23个比特和第24个比特为保留位 2. ...

  7. GPS导航电文——第二子帧数据解析

    第一子帧数据解析 1 第二子帧的结构图 1.1 第1个字(1-30 bit):遥测字(TLW) 1-8 bit::8位固定同步码,为10001011 9-22 bit:特许授权用户的遥测码 22-24 ...

  8. gps电文解析matlab,MATLAB读取GPS的RINEX格式的导航电文

    文件用UltraEdith32打开如下: 2.11 NAVIGATION DATA G (GPS) RINEX VERSION / TYPE DAT2RINW 3.10 001 1 16APR08 9 ...

  9. GNSS四大卫星导航系统导航电文构成

    GNSS简介 GPS:美国全球卫星导航定位系统,是当下最流行也最为成熟的卫星导航系统,采用码分多址(CDMA)技术 BDS:中国北斗卫星导航系统,为中国自主研发的卫星导航系统,旨在实现全球范围内独立自 ...

  10. GNSS导航电文模拟生成软件介绍

    引言 导航电文模拟生成是GNSS卫星导航信号模拟的关键一步,本团队投入研发的这款软件旨在解决此类难题.该研发任务本为与北京某高校的合作项目,但由于付款周期长,审查过程繁琐等问题,导致团队短期资金流出现 ...

最新文章

  1. java I/O思维导图
  2. tkinter笔记:scale 尺度 (莫烦python笔记)
  3. Linux系统编程(八)线程
  4. 浅谈三种特殊进程:孤儿进程,僵尸进程和守护进程
  5. STM32的串口通信
  6. postgresql生产环境数据库迁移
  7. thymeleaf完善前端界面 | 从0开始构建SpringCloud微服务(4)
  8. 创业的成功率只有10%?错,有的人可以高达90%!为什么?
  9. 利用Python开发一个微信定时发送器
  10. mlir toy 教程(1)
  11. javaee实验:使用mvc模式 设计一个图书管理系统
  12. 常见PCIE X1/X4/X8/X16插槽作用与区别
  13. 109:vue+openlayers 定位动画(平移-弹性平移-飞行 示例代码)
  14. cad图纸比对lisp_CompareDWG|CAD图纸比较软件(CompareDWG)下载v2018 官方版 - 欧普软件下载...
  15. Python学习笔记:2.2.3 习题课06
  16. 微信小程序“插件未授权使用”问题解决
  17. 高性能MySQL(3th)(第一章 MySQL概述) —— 04 InnoDB和MyISAM
  18. 【学习日记】opencv for vscode 的标准模板---记录
  19. mysql 矩阵乘法_矩阵乘法高级操作
  20. Solution For ImportError Of Backtrader

热门文章

  1. SSD 寿命- 三星 Magician 及 CrystalDiskInfo
  2. rgba与16进制互相转换
  3. 基于图像识别的火灾检测系统设计
  4. Win7 SP1 安装python 3.8时,提示 KB2533623 update is required to continue
  5. 直线段的矢栅转换算法(DDA算法、中心画线算法、Bresenham算法)
  6. Kubernetes 一键部署实践
  7. linux文件怎么加密,linux下文件加密方法总结
  8. MySQL电影院管理系统_电影院售票管理系统
  9. python采集数据搭建小说网站_Python制作爬虫采集小说
  10. Python学习笔记大总结(我把我所有python笔记做了总结和学习顺序,点击即可进入相关博客。希望可以便于你们阅读)