前言

        hello呀我的老铁们,本篇是小编第三次针对GNSS这道赛题的,经过更深入理解学习之后的成果分享。小编选择保留前两篇而不是在其基础上重新编辑,是因为前两篇都有其各自的特色,一个详细介绍了本赛题的核心处理逻辑,一个对本赛题的实现方案进行了简化革新。而且,这三篇,也是小编的一个升级打怪之路的印证。(下面的链接,就是这两篇的内容,大家感兴趣也欢迎移步,大家的支持,就是小编的创作动力!)👇     已于6.6更新)深度剖析测绘程序设计大赛试题:GNSS 多星多频数据预处理与质量检测(2025国赛选题二) 简易实现测绘程序设计大赛试题:GNSS 多星多频数据预处理与质量检测(2025国赛选题二)   

        本篇与前两篇的不同之处,一方面是小编的水准,一方面是小编对本赛题的理解程度,还有也是最重要的一方面,就是本篇将针对本赛题的三大核心处理模块中,各个模块所涉及到的常用常见算法(非一种),进行全面介绍和实现,以保证若抽到本题,无论他们用什么算法来实现,各位都能够淡定应对。

        为了照顾不曾了解或者没有太多时间去再看这前两篇文章的家人,本次全文依旧从选题介绍出发,首先介绍2025六大选题方向,给出本赛题的题目要求;然后针对本题进行全面详细的分析;在第三部分给出C#实现方案;最后一部分,对本篇进行总结,也是小编的废话区哈哈。

        OK话不多说,就让我们开始!


一、2025国赛选题

(一)2025六大选题

        //源自官方文件

(二)本题要求

        单 / 双 / 三频相位周跳探测、伪距多路径误差估算、相位平滑伪距。


二、本题超详析⭐

        //这一部分的结构如下:首先从数据、参数含义和我们要实现什么功能三方面,向大家介绍整体情况;然后按照以下顺序对本题进行剖析:周跳探测原理与算法详析--多路径探测原理与算法详析--相位平滑伪距原理与算法详析。(算法部分,小编会尽可能用简单通俗的方式来展开,但可能会在一些部分因为小编水平的局限而出现错误,家人们多多批评指教,有好的想法和思路欢迎在评论区讨论,小编会认真评估并予以答复!)(而且要写在最前面,比赛前会下发试题册,按照往年套路,试题册中一定会给出各个算法的各步处理的公式的,到时候直接硬带也OK的,不理解各个参数的原理,that is no matter!)

(一)整体介绍

  • 数据(基于RINEX 格式)
    • 头部分(Header):记录测站和观测的基本信息。文件开头到END OF HEADER的内容,主要告诉我们 “谁、在什么时间、用什么设备、观测了哪些卫星”:(关于数据的介绍就是基于已经同本文绑定的.txt数据,家人有需自取。)
    • 数据部分:每个卫星的具体观测值:头部分之后是实际观测数据,按卫星分组(比如G01G02C01),每组包含该卫星在不同时间的观测值。

  • 重点参数含义

    • L1/L2:L1 和 L2 频段的载波相位观测值(单位:周,整数 + 小数部分,精度极高,是 GNSS 定位的核心数据)。
    • P1/P2:L1 和 L2 频段的伪距观测值(单位:米,是卫星到接收机的距离观测值,噪声较大但无整周模糊度)。
    • SNR1/SNR2:L1 和 L2 频段的信噪比(单位:dB-Hz,反映信号强度,值越高信号越稳定)。
  • 功能任务
    • 读取原始数据
    • 周跳检测:找载波相位里的 “计数中断”,避免错误数据影响定位。
    • 多路径检测:识别 “信号回声” 导致的误差,标记不可靠数据。
    • 相位平滑伪距:用高精度的相位修正低精度的伪距,得到更优的观测值。
    • 质量检测:这部分见名知意,就是借助一些手段或评估指标,基于原始数据和我们处理后的精准值,来判断这次接收机获取到的数据的质量。


(二)周跳检测原理与实现算法

    1. 什么是 “周跳”?

        载波相位观测的本质是 “接收机计数卫星信号的载波周期数”。比如卫星信号的载波频率是 1.5GHz(L1 频段),意味着 1 秒内有 15 亿个周期,接收机需要精确记录 “从信号锁定开始到当前时刻,一共收到了多少个完整周期(整周数)+ 不足一个周期的小数部分”。但如果信号被遮挡(比如过隧道、被大树挡了一下)、接收机短暂断电,或者信号太弱,接收机会 “暂时失忆”——突然漏记或多记了几百甚至几千个整周数,这种整周数的突变就叫 “周跳。

        比如文件里G01卫星在 10:10:00 的注释写着 “# G01 周跳 + 1”,意思是这里的 L1 相位整周数突然多了 1 周,属于周跳。

        我们进行周跳检测,就是找出存在周跳的数据,要么修正,要么弃用。

    2. 周跳处理三大算法(核心处理方法&步骤)

  • MW 组合法:把两种观测值(相位和伪距)“组合” 起来,得到一个几乎不受 “整周模糊度” 影响的稳定值。如果这个值突然跳变,就说明发生了周跳。

    • 计算 MW 组合值(Nw)

      • 相位转距离:

        • L = 周数  × 波长(固定值)

      • 组合相位和伪距

        • Lw = 相位组合 - 伪距组合(这么一减,相位的 “整周模糊度” 就被抵消了,剩下的是一个稳定的小值)

      • 转成周数 Nw

        • Nw = Lw / 等效波长(就是两个频段波长差)

    • 确定 “正常波动范围”

      • 滑动平均值:类似 “平滑曲线”,把 Nw 的小波动平均掉,得到一个稳定的趋势值(比如 5.0)。
      • 滑动方差:衡量 Nw 的波动程度(比如正常波动在 ±0.2 内,方差就小;波动大,方差就大)。
    • 判断周跳

      • 用 “3 倍标准差” 作为阈值(标准差是方差的平方根,反映正常波动范围),如果某个时刻的 Nw 与滑动平均值的差超过 3 倍标准差,说明它偏离正常范围太远,就是周跳。

  • GF 组合法:先消除卫星到接收机的 “几何距离”(这部分是我们要测的,但会干扰周跳检测),剩下的主要是 “电离层误差”。电离层误差(信号穿过大气层时的延迟)随时间缓慢变化(比如几小时内慢慢变),正常情况下应该是平滑曲线;如果突然跳变,就是周跳。

    • 相位的 GF 组合(LI):消除几何距离后的核心变量

      • LI = (L1相位 × L1波长) - (L2相位 × L2波长)(家人们只需要知道,相位距离计算的公式中包含很多误差项,GF的关键就是利用相位差来消除部分干扰项,只保留了正常情况下要么变化缓慢(I1​−I2​),要么就是常数(λ1​N1​−λ2​N2​)的项。不用强行理解,就知道第一步就是计算这玩意儿,在本篇代码部分会给出这块的实现)

    •  拟合 LI 的趋势(消除电离层(I1​−I2​)的缓慢变化)

      • 用多项式(代码中为 2 阶多项式)拟合 LI 随时间的变化趋势,得到 “理论上的 LI 值”(无周跳时的理想值):fitLI(t)=C0​+C1​⋅t+C2​⋅t2 (其中t是时间索引(0,1,2,...),C0,1,2是多项式系数(由最小二乘拟合得到))

    • 计算残差的变化量(核心判断指标)

      • 残差定义为 “实际 LI 与拟合趋势的偏差”:残差(t)=LI(t)−fitLI(t无周跳时,残差应围绕 0 小幅波动;若发生周跳,残差会突变。

      • (一般阈值设置:4 倍等效波长(λI​),残差绝对值大于4λ,标记为周跳)

  • 二次差分法:连续计算相位观测值的 “差分的差分”(类似加速度),正常情况下这个值很小,如果突然变大,就是周跳。(这个就简单了,就像看车速表,正常慢慢加速,突然猛踩油门就是问题!)

    • 提取载波相位观测值

    • 计算二阶差分(代码部分有算法的程序实现)

    • 周跳判断(依旧用阈值法)

    • 二阶差分法通过计算载波相位的二阶变化量,利用 “正常平稳、周跳突变” 的特性实现周跳检测的,比起GF,步骤真的很简答优雅。

(三)多路径效应检测原理与实现算法

    1. 什么是 “多路径效应”?

        卫星信号是无线电波,正常情况下应该 “直线到达接收机”(直射信号)。但如果周围有建筑物、地面、水面,信号会被反射(比如地面反射、大楼反射),形成 “反射信号”—— 这些反射信号会和直射信号一起被接收机接收,导致观测值出现误差,这就是 “多路径效应”。

    2. 多路径效应处理三大算法

        //这三种算法各有优缺点,在实际中,通常会结合三种方法的结果:比如 “残差大 + SNR 低 + 波动剧烈”,就几乎可以确定有严重的多路径干扰。

  • 看相位和伪距的残差:正常情况下,经过修正的 “相位数据” 和经过修正的 “伪距数据” 应该很接近(差距很小)。但如果有多路径干扰,会让相位测量不准(就算修正了,两者差距还是很大),导致两者的差距突然变大 —— 这个差距就是 “残差”,残差越大,干扰越严重。
    • 计算残差:各个频段修正后的相位距离 - 伪距距离(注意保证单位都是m)
      • 对 L1 频段:residualL1 = 修正后的L1相位距离 - L1伪距距离

      • 对 L2 频段:residualL2 = 修正后的L2相位距离 - L2伪距距离

    • 如果残差的绝对值超过一个设定的 “阈值”(比如 L1 频段阈值设为 1 米,L2 设为 1.5 米),就认为这个时间点受到了多路径干扰。

  • 看信噪比(SNR):简单理解为 “有用信号” 和 “无用噪音” 的比例。SNR 越高,信号越清晰(噪音少);SNR 越低,信号越模糊(噪音多)。多路径会导致信号不稳定,信噪比(SNR1、SNR2)会突然降低(比如从 45 降到 30),所以低 SNR 的观测值可能受多路径影响。
    • 多路径干扰本质是 “无用的反射信号”,属于 “噪音”。当 SNR 很低时(有用信号弱),一点点多路径干扰都会显得特别明显,就像在安静的房间里,小声说话也能听清,而在嘈杂的菜市场,大声说话可能都听不清 —— 低 SNR 时,干扰的影响被放大了
    • 步骤很简单:
      • 设定一个 “低信噪比阈值”
      • 如果L1/L2任意一个频段的SNR低于阈值,我们就认为这个时间点的信号可能受到了多路径干扰。
      • (这个就是纯纯的估计了,我们是基于“低SNR ==> 易受干扰”这个知识,所以就简单粗暴的只看它SNR高低,来判断这条数据受到多路径干扰的“可能性”,相比于上一个方法,这个只能说是一种更粗糙的估计)
  • 看残差的波动:多路径干扰不是稳定的(反射信号的强度会随接收机位置、障碍物角度变化),所以它导致的 “残差”(第一个方法里算的那个差距)会忽大忽小,像坐过山车一样 “波动剧烈”,而正常情况下观测的残差应该平稳波动。故以此为指标,若其突然上下跳变(比如从 0.1 米跳到 0.8 米),可能是多路径。
    • 滑动窗口:想象一个 “小框”,框住连续的几个数据点(比如 5 个),然后把框慢慢向右移,每次移一个点,逐个分析每个框内的数据。(比如窗口大小 = 5 时,先看第 1-5 个数据,再看第 2-6 个,再看第 3-7 个)
    • 标准差:用来衡量数据的 “波动程度”。标准差越大,说明数据忽高忽低越厉害(波动剧烈);标准差越小,说明数据越稳定。(对每个窗口,计算里面残差的标准差)
    • 如果窗口内的标准差超过 “阈值的一半”(因为标准差反映的是整体波动,比单次残差更敏感),就认为这个窗口对应的时间点有干扰。

(四)伪距平滑处理原理与实现算法

    1.相位平滑伪距

        用相位的高精度 “修正” 伪距的低精度。(就是给带噪音的数据” 做美容,让它们变得更光滑、更可靠。)

    2. 平滑处理三大算法

  • 指数平滑法(简化版本卡尔曼滤波法):给历史数据分配不同的权重,越近的数据权重越大。

    • 当前平滑值 = 上一次平滑值 × α + 当前原始值 × (1-α)
      • α就是权重系数,0-1,越大表示历史数据权重越高,平滑效果越好,但是对新变化反应就不敏感。

      • 两个细节:
        • 周跳处理:如果当前数据有周跳(突变),直接把平滑值设为当前原始值(因为周跳会让历史数据 “失效”)。
        • 初始值:第一个数据点的平滑值就是它自己(因为没有历史数据)。
  • 滑动窗口平均法:拿股票来说,想象你在看股票走势图,曲线波动很大,很难看出趋势。这时你可以用一个 “小窗口”。

    • 当前平滑值 = 窗口内所有有效数据的平均值
    • 滑动,就是说你这个窗口会按照时间“移动”。平均,就是说每一次你的取值,就是这个窗口中值的平均值。

  • 考虑周跳修复的平滑处理:载波相位数据有个特殊问题:周跳会导致相位值突然跳变(比如从 1000 周突然变成 995 周)。如果直接用前面两种方法平滑,会把这个 “错误跳变” 也平滑进去,导致后续所有数据都错。所以,遇到周跳时,要先 “修复” 这个跳变,再继续平滑。就像你在画一条平滑的曲线,突然遇到一个断点,你得先把断点 “接好”,再继续画。

    • 当前平滑值 = 上一次平滑值 × α + 当前原始值 × (1-α)
    • 和指数平滑法公式是一样的,但是请注意区别:如果当前点有周跳,直接把平滑值设为当前原始值(相当于 “重启” 平滑过程)。如果无周跳,正常平滑。

    • 这个方法是针对相位的平滑,目的在于,为多路径效应提供一个更精准的相位数据,注意与前两种方法的平滑对象做区分。(其实放到多路径效应板块更容易理解,但是因为这三类都是实现的平滑处理,所以还是决定放一起。)


三、C#完整实现

(一)窗体设计

  • 和地图图幅处理那篇的风格一样,小编可能在之后的试题研究文章中都会沿用这个风格哈哈。

(二)数据结构设计

        //小编知道可以直接上代码,但是因为行数真的真的真的太多了哈哈,图片还是要更好一些的。

(三)数据管理器设计

(四)周跳检测实现

  • MW

  • GF

  • 二次差分

 (五)多路径效应检测实现

  • 相位伪距残差

  • 信噪比

  • 残差波动 

(六)相位平滑伪距实现

  • 指数

  • 滑动窗口平均

  • 考虑周跳修复


四、唠唠叨叨

  • 哈哈,这篇文章确实有些长,看到这里真的辛苦家人们!
  • 本篇其实预计在昨天就是可以完成的,但是因为昨天下午受到了一些紧急通知需要我去处理,晚上处理好之后又接到了家里那边的一些小意外,昨天真的是小编最难熬的一天哈哈,是在今天凌晨两三点才感觉有点困哈哈。上午依旧在处理意外,一整个上午都是在路上,在打电话,在和各种人沟通哈哈哈,小编真的是一边崩溃一边告诉自己必须绷住,不是崩溃的时候哈哈。
  • 今天中午处理好了能控制的那部分,然后我知道这件事已经耽搁不短了,这过去的一些时间,受到了很多家人们给我的私信,给我的鼓励和支持,给我的莫大的信任,我不能辜负大家,我早点做完,大家就能早点有一个参考,一些我自己发现不了的问题我们也能一起探讨,一起进步。
  • 行文至此,小编想说的,依旧是感谢各位过去一路的陪伴和支持,由于小编水平和能力有限,以上介绍到的所有内容,如有差错还望大家批评指教。
  • 感谢大家的支持!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐