读取官方发布的DCB文件进行硬件延迟改正实现STEC提取

2023-12-27 08:30

本文主要是介绍读取官方发布的DCB文件进行硬件延迟改正实现STEC提取,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、引言

        如果看到这里,我就将大家当成理解甚至已经实现STEC提取步骤,目前处于需要进行硬件延迟改正的阶段。但是如果大家还理不太清楚,可看参考我之前写过的STEC提取步骤,里面较为详细地推导了STEC提取方程,该篇博客其实专业性较强,需要大家之前阅读过一些相关文献或者是书籍,如果看不太懂话我写的或者想深入了解这部分理论的话,哈哈,不要紧!我个人建议大家去读武汉大学、中科院相关的博士论文或者高水平期刊,最好是外文的(绝大多中文期刊、学位论文里面的原理很多都含糊不清甚至有错误)。

        硬件延迟改正也叫DCB改正,顾名思义就是改正伪码上的卫星硬件延迟和接收机硬件延迟,为什么不消除载波观测值的硬件延迟呢?从上篇博客STEC提取方程的推导中可以看到载波上的硬件延迟是被吸收进模糊度参数中一并估计的。所以在STEC提取中,最大的误差源就是伪码上的硬件延迟,若是不进行DCB改正,提取到的STEC会出现值异常。实验中我们可以观察到,未改正的STEC出现-10e+2TECU也属于正常现象。

        由此可见,未进行DCB改正的STEC是无法用于电离层建模的,所以说正确估计卫星和测站的DCB是保证STEC提取精度的重要一环,下面介绍利用CAS发布的BSX文件进行DCB改正的方法。

二、DCB改正

2.1 DCB改正方式

        DCB改正方式我大致归为两类:一是利用官方发布的DCB文件读取卫星和测站的DCB进行改正,二是自估计DCB,其中第一类是最为基础,直接的,但是精度不高(实验部分会进行对比),甚至有些测站不再文件测站列表中导致该测站上无法进行单站TEC提取,第二类是指采用各种算法估计测站和卫星的DCB,这里就包含单站估计以及多站全球建模两种方式。下面如何介绍利用CAS发布的BSX文件进行DCB改正。

2.2 读取BSX文件

        首先我们需要了解BSX文件,我简单介绍一下吧怕有些同学不熟悉或者还没接触。

# 这里给出了提供改正信息的卫星系统,
# 以及该系统下卫星DCB的改正频率
- Overview of the DCBs included in the file                                     GPS     C1C-C1W, C2C-C2W, C2W-C2S, C2W-C2L, C2W-C2X                         GPS     C1C-C2W, C1C_C5Q, C1C-C5X, C1W-C2W                                  GLONASS C1C-C1P, C2C-C2P                                                    GLONASS C1C-C2C, C1C-C2P, C1P-C2P                                           GALILEO C1C-C5Q, C1C-C7Q, C1C-C8Q, C1X-C5X, C1X-C7X, C1X-C8X                BDS-2   C2I-C7I, C2I-C6I                                                    
-FILE/COMMENT

        然后是卫星硬件延迟,需要注意的是卫星硬件延迟是频率相关项,具体选择什么频率组合取决于你是用哪两个频率进行的STEC提取。

#
# GPS->G01->C1W-C2W组合上的卫星硬件延迟为-7.7370ns
# 由于卫星硬件延迟与频率相关,所以一定要根据你构建的STEC提取方程进行选择DSB  G063 G01           C1W  C2W  2017:244:00000 2017:245:00000 ns                 -7.7370      0.0290DSB  G061 G02           C1W  C2W  2017:244:00000 2017:245:00000 ns                  9.2260      0.0290DSB  G069 G03           C1W  C2W  2017:244:00000 2017:245:00000 ns                 -5.4440      0.0345DSB  G036 G04           C1W  C2W  2017:244:00000 2017:245:00000 ns                 -0.5330      0.0300DSB  G050 G05           C1W  C2W  2017:244:00000 2017:245:00000 ns                  2.8960      0.0300DSB  G067 G06           C1W  C2W  2017:244:00000 2017:245:00000 ns                 -7.0080      0.0290DSB  G048 G07           C1W  C2W  2017:244:00000 2017:245:00000 ns                  3.3220      0.0360DSB  G072 G08           C1W  C2W  2017:244:00000 2017:245:00000 ns                 -7.5910      0.0290DSB  G068 G09           C1W  C2W  2017:244:00000 2017:245:00000 ns                 -4.8750      0.0290DSB  G073 G10           C1W  C2W  2017:244:00000 2017:245:00000 ns                 -5.4590      0.0290DSB  G046 G11           C1W  C2W  2017:244:00000 2017:245:00000 ns                  3.8460      0.0290DSB  G058 G12           C1W  C2W  2017:244:00000 2017:245:00000 ns                  3.8670      0.0290DSB  G043 G13           C1W  C2W  2017:244:00000 2017:245:00000 ns                  3.1550      0.0290DSB  G041 G14           C1W  C2W  2017:244:00000 2017:245:00000 ns                  2.0710      0.0295DSB  G055 G15           C1W  C2W  2017:244:00000 2017:245:00000 ns                  3.0080      0.0290DSB  G056 G16           C1W  C2W  2017:244:00000 2017:245:00000 ns                  2.9540      0.0290DSB  G053 G17           C1W  C2W  2017:244:00000 2017:245:00000 ns                  3.3400      0.0290DSB  G054 G18           C1W  C2W  2017:244:00000 2017:245:00000 ns                  3.1740      0.0290DSB  G059 G19           C1W  C2W  2017:244:00000 2017:245:00000 ns                  6.0230      0.0290DSB  G051 G20           C1W  C2W  2017:244:00000 2017:245:00000 ns                  1.4850      0.0290

        最后是测站DCB,该物理量同样需要选择相应的频率组合。

# ALBH->C1C-C1W
# 测站DCB为3.1370nsDSB  G    G   ALBH      C1C  C1W  2017:244:00000 2017:245:00000 ns                  3.1370      0.0165DSB  G    G   ALG2      C1C  C1W  2017:244:00000 2017:245:00000 ns                  2.8910      0.0170DSB  G    G   ALG3      C1C  C1W  2017:244:00000 2017:245:00000 ns                  2.7920      0.0170DSB  G    G   ALGO      C1C  C1W  2017:244:00000 2017:245:00000 ns                  1.4050      0.0170DSB  G    G   AMC2      C1C  C1W  2017:244:00000 2017:245:00000 ns                  0.3450      0.0165DSB  G    G   AREV      C1C  C1W  2017:244:00000 2017:245:00000 ns                  1.4650      0.0165

2.3 读取代码以及示例

""" Read BSX file to get dcb of satellites and receivers """""" ----------------------------------------- """
import numpy as np""" ----------------------------------------- """""" --------------const---------------------- """
""" const_max_satellites_nums """
const_max_satellites_nums = 120*4*9
""" const_max_receiver_nums """
const_max_satellites_nums = 2400*9*4
""" ----------------------------------------- """""" class SatDCB """
class SatDCB:def __init__( self ):self.SVN    = [ [0]*4 for i in range( const_max_satellites_nums ) ]self.PRN    = [ [0]*3 for i in range( const_max_satellites_nums ) ]self.obs1   = [ [0]*3 for i in range( const_max_satellites_nums ) ]self.obs2   = [ [0]*3 for i in range( const_max_satellites_nums ) ]self.START  = [ [0]*14 for i in range( const_max_satellites_nums ) ]self.END    = [ [0]*14 for i in range( const_max_satellites_nums ) ]self.UNIT   = [ [0]*4 for i in range( const_max_satellites_nums ) ]self.dcb    = np.zeros( shape=(const_max_satellites_nums) )self.std    = np.zeros( shape=(const_max_satellites_nums) )""" class RecDCB """
class RecDCB:def __init__( self ):self.STATION    = [ [0]*4 for i in range( const_max_satellites_nums ) ]self.obs1       = [ [0]*3 for i in range( const_max_satellites_nums ) ]self.obs2       = [ [0]*3 for i in range( const_max_satellites_nums ) ]self.START      = [ [0]*14 for i in range( const_max_satellites_nums ) ]self.END        = [ [0]*14 for i in range( const_max_satellites_nums ) ]self.UNIT       = [ [0]*4 for i in range( const_max_satellites_nums ) ]self.dcb        = np.zeros( shape=(const_max_satellites_nums) )self.std        = np.zeros( shape=(const_max_satellites_nums) )""" class ReadBSX """
class ReadBSX:def __init__( self, fname ):""" DCB filename """self.filename = fname""" DCB file object """self.dcbf = open( self.filename, "r" )""" satellite dcb """self.satDCB = SatDCB()""" receiver dcb """self.recDCB = RecDCB()""" fileline index(used to read bsx file) """self.sindex = 0self.rindex = 0def readdcb( self ):for line in self.dcbf:if "DSB"==line[1:4] and line[15:19].isspace():self.satDCB.SVN[self.sindex] = line[6:10]self.satDCB.PRN[self.sindex] = line[11:14]self.satDCB.obs1[self.sindex] = line[25:28]self.satDCB.obs2[self.sindex] = line[30:33]self.satDCB.START[self.sindex] = line[35:49]self.satDCB.END[self.sindex] = line[50:64]self.satDCB.UNIT[self.sindex] = line[65:69]self.satDCB.dcb[self.sindex] = line[69:91]self.satDCB.std[self.sindex] = line[91:103]self.sindex = self.sindex + 1elif "DSB"==line[1:4] and line[15:19]:self.recDCB.STATION[self.rindex] = line[15:19]self.recDCB.obs1[self.rindex] = line[25:28]self.recDCB.obs2[self.rindex] = line[30:33]self.recDCB.START[self.rindex] = line[35:49]self.recDCB.END[self.rindex] = line[50:64]self.recDCB.UNIT[self.rindex] = line[65:69]self.recDCB.dcb[self.rindex] = line[69:91]self.recDCB.std[self.rindex] = line[91:103]self.rindex = self.rindex + 1""" --------------interface----------------- """
""" get satellite dcb """
def get_sdcb( sdcb, prn, obst1, obst2 ):for i in range( const_max_satellites_nums ):if (sdcb.PRN[i]==prn) and (sdcb.obs1[i]==obst1) and (sdcb.obs2[i]==obst2):return sdcb.dcb[i]return -999
""" get receiver dcb """
def get_rdcb( rdcb, sta, obst1, obst2 ):for i in range( const_max_satellites_nums ):if rdcb.STATION[i]==sta and rdcb.obs1[i]==obst1 and rdcb.obs2[i]==obst2:return rdcb.dcb[i]return -999
""" ---------------------------------------- """

        下面给出一个示例程序进行演示:

# 输入BSX文件路径(以MAXOS系统为例)
bsx = ReadBSX.ReadBSX("./201791/CAS0MGXRAP_20172440000_01D_01D_DCB.BSX")
# 进行卫星和测站DCB信息
bsx.readdcb()# 获取JFNG测站C1C-C2W上的DCB
rec_dcb = ReadBSX.get_rdcb(bsx.recDCB, “JFNG”, “C1C”, “C2W”)
# 存在BSX文件不提供该测站DCB的情况
if rec_dcb==-999:raise ValueError("该测站DCB无法从BSX文件中获取")# 获取G01卫星C1C-C2W上的DCB
sat_dcb = ReadBSX.get_sdcb(bsx.satDCB, “G01”, "C1C", "C2W")
# 出于程序完备性考虑
# 可能输入卫星prn或是输入该导航系统不存在的观测类型
# 或者你选择的双频组合不在文件提供的范围内
if sat_dcb==-999:raise ValueError("该卫星DCB无法从BSX文件中获取")

三、利用CAS发布的BSX文件进行VTEC提取

3.1 VTEC提取结果对比

图1 利用CAS发布的DCB文件提取VTEC与自估计DCB的VTEC提取二者效果对比

3.2 总结

        从图中不难看出利用官方发布的DCB进行TEC提取,在单站上的提取精度相对于自估计DCB的提取精度较差,有时甚至会发生从文件中获取不到对应测站DCB的情况,此时就必须采用算法进行DCB估计了。

        到目前为止,已经有很多的DCB估计方式包括单站估计、多站建模。教大家一个最简单的实现方式也是麻省理工学院(MIT)2006年推出MAPGPS估计方式,卫星DCB我们暂且通过文件读取,测站DCB在MAPGPS估计中作为估计参数。

图2 我采用算法估计DCB后提取的GPS系统的VTEC

        从上图可以看出,一般来说VTEC在夜间时表现平稳,在白天扰动较大,在图上表现为夜晚各卫星VTEC弧段最为贴合。而MIT在06年提出的MAPGPS方法正是基于这样的思想来寻找一个值,该值使得VTEC弧段变得最为聚合,该值即为对应测站DCB。

        该方法有一定局限性,精度大多数情况不如其他常用估计方式(该方法的提取效果不如图2所展现的),但是实现上较为简单适合作为入门DCB估计算法,MIT2016年也就是10年后又推出了新的DCB估计方式以及统计框架,大家有兴趣可以去了解一下。(MIT也发布了电离层地图、视线向TEC等产品哟

        不知道我有没有讲清楚,如果大家有什么建议或者问题可以私信或者发在评论区,我不嫌麻烦😭,我有时间了等闲下来的时候肯定会及时回复。

这篇关于读取官方发布的DCB文件进行硬件延迟改正实现STEC提取的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/542520

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P