📄 preprocess.h
字号:
//-------------------------------------------------------------------------------------------------
//文件名称: Preprocess.H
//文件版本: V 1.2
//摘要: 提供使用高次差(Higher Difference)方法和 TurboEdit方法实现对双频载波相位和伪距
// 观测数据预处理模块的接口。
//-------------------------------------------------------------------------------------------------
#ifndef _PREPROCESS_H_
#define _PREPROCESS_H_
//结构体 OBSDAT 用于存储双频载波相位和伪距的原始观测值
typedef struct ObsDat
{
long int epoch; //历元编码:由观测时刻和观测间隔(采样率)换算得到
double phi1; //L1 载波相位观测值(单位:1)
double phi2; //L2 ...
double P1; //L1 载波伪距观测值(单位:m)
double P2; //L2 ...
} OBSDAT;
//结构体 CALCDAT 用于存储本模块的解算成果(修正后的双频模糊度)
typedef struct CalcDat
{
int token; //记号:用于标识观测值的属性(删除观测值的原因、观测值的分段编码)
double cb1; //修正后的 L1 载波模糊度(单位:1)
double cb2; //... L2 ...
} CALCDAT;
//结构体 TOL 用于存储客户端函数定义的观测数据预处理控制参数
//(本模块对于客户端函数输入的控制参数有一定的限制,参见下文的宏定义)
typedef struct Tolerance
{
int MaxLossDat; //允许的最大信号失锁历元记数
//(= 允许的最长信号失锁时间 / 观测间隔)
//小于此值,将被视为连续数据,可以探测周跳;
//大于此值,将被视为不连续数据,进行(大)分段,仅在段内探测周跳
int HDMinArc; //高次差方法所需的最少连续历元数
int TEMinArc; //TurboEdit方法所需的最少连续历元数
double Minphi; //载波相位观测最小值(单位:1)
double Maxphi; //... 大
double MinP; //载波伪距观测最小值(单位:m)
double MaxP; //... 大
double TolZero; //高次差方法剔除野值时判断非零量的精度
double TolScale; //... 判断符合比例关系 1:-2:1:0 的精度
double MultiFactor; //TurboEdit方法判断“跳值”时σ的系数
double TolStep; //... 区分野值和周跳时 | bw(i+1) - bw(i) | 的阈值
} TOL;
/*
* 函数介绍: 使用高次差方法和 TurboEdit 方法对单站单星的双频载波相位和伪距观测数据进行预处理的函数
* (预处理包括:剔除野值、探测和修复周跳)
*
* 输入参数: obs 双频载波相位和伪距的原始观测数据 数组的首地址
* calc 解算成果(修正后的双频模糊度) 数组的首地址
* N 原始观测值数目
* tol 预处理的控制参数集
* pbreaks 指向分段所需乘常数变量的指针
* 注: calc[i].token / ( *pbreaks ) 的值可以获得根据历元连续性进行的分段的信息
* calc[i].token % ( *pbreaks ) 的值可以获得 TurboEdit 方法分段的信息(i=0,1,...N-1)
* //fpLog (必要时,可以)使用该指针输出周跳发生的位置和数值
*
* 返回值: int 类型,标识双频载波相位和伪距原始观测数据预处理执行的状态
* 非 PREPROCESSOK 的返回值都是执行错误的,具体的错误类型与返回值的对应关系参见下文宏定义
*/
int Preprocess( const OBSDAT obs[],
CALCDAT calc[],
const long int N,
const TOL tol,
unsigned int * pbreaks );
//全局变量定义位置待定
static double c = 2.99792458E+08; //全局变量: 光速C(m/s)
static double f1 = 1575.42e6; //全局变量: L1 载波频率(Hz)
static double f2 = 1227.60e6; //全局变量: L2 载波频率(Hz)
static double lambda1 = ( c / f1 ); //全局变量: L1 载波波长(m)
static double lambda2 = ( c / f2 ); //全局变量: L2 载波波长(m)
static double lambdai = lambda2 - lambda1; //全局变量: 窄巷组合波长(m)
/*
* 以下三个宏定义用于控制中间运行结果的显示
*
* “中间运行结果”包括:
* 1、由原始观测数据计算得到的 L1、L2 载波模糊度 b1、b2 以及模糊度互差(宽巷组合相位观测值)bw
* 2、高次差方法中 bw 的一差值、二差值、三差值
* 3、高次差方法中剔除的野值的历元编码,及剔除野值后的 b1、b2、bw 及 bw 的一差值、二差值、三差值
* 4、高次差方法中探测的周跳发生的位置和数值,
* 及修复周跳后的 b1、b2、bw 及 bw 的一差值、二差值、三差值
* 5、TurboEdit方法中剔除的野值的历元编码,及剔除野值后的 b1、b2、bw
* 6、TurboEdit方法中对电离层组合伪距观测值(Pi = P2 - P1)拟和的质量,包括:
* 拟和样本数、拟和次数、拟和多项式、残差向量范数、拟和后各观测点 Pi、ΔLi 的值和残差
* (ΔLi = Li - Pi)
* 7、TurboEdit方法中分段的起讫点的历元编码,Pi、ΔLi 的段内平均值,Pi、ΔLi、b1、b2 的段间修正值
* 8、TurboEdit方法中剔除野值和修复周跳后各观测点的 bw、ΔLi、b1、b2 的值
* (b1、b2 已为本模块解算双频载波相位和伪距观测数据的最终结果)
*
* 除此之外,还包括解算观测数据的总数、解算相关的各个控制参数值、解算起止时间、解算用时,
* 以及根据历元连续性进行的分段信息、TurboEdit方法的分段信息,等等。
*/
//宏 PREPROCESS_DEBUG 定义后,计算中间运行结果并输出(至控制台或文件)
#define PREPROCESS_DEBUG
//在宏 PREPROCESS_DEBUG 定义前提下,若宏 PREPROCESS_DEBUG_strREPORT 被定义,
//中间运行结果输出至指定的测试报告文件(无法打开的文件将中止本模块的执行)
#define PREPROCESS_DEBUG_strREPORT "F:\\GPSSOFT\\zhout\\CheckReport1"
/*
* 以下的宏定义标识本模块预处理执行的状态,由 Preprocess 函数返回(所有的错误状态已列于表中)
* 注释中的“不合理”指客户端函数输入的控制参数不在本模块默认的(限制很弱的)允许范围内
*/
#define PREPROCESSOK 0X0A00 //正常执行
#define PREP_ERR_MEMORY 0X0A01 //错误:无法分配存储组合观测值(bw、ΔLi)所需的内存
#define PREPARE_ERR_N 0X0A02 //错误(Prepare 返回):观测历元数太少
#define PREPARE_ERR_LOSSDAT 0X0A03 //错误(Prepare 返回):控制参数 MaxLossDat 不合理
#define PREPARE_ERR_MINARC 0X0A04 //错误(Prepare 返回):控制参数 HDMinArc 和/或 TEMinArc 不合理
#define PREPARE_ERR_PHI 0X0A05 //错误(Prepare 返回):控制参数 Minphi 和/或 Maxphi 不合理
#define PREPARE_ERR_P 0X0A06 //错误(Prepare 返回):控制参数 MinP 和/或 MaxP 不合理
#define PREPARE_ERR_TOLZERO 0X0A07 //错误(Prepare 返回):控制参数 TolZero 不合理
#define PREPARE_ERR_TOLSCALE 0X0A08 //错误(Prepare 返回):控制参数 TolScale 不合理
#define PREPARE_ERR_FACTOR 0X0A09 //错误(Prepare 返回):控制参数 MultiFactor 不合理
#define PREPARE_ERR_STEP 0X0A0A //错误(Prepare 返回):控制参数 TolStep 不合理
#define PREPARE_ERR_BREAKS 0X0A0B //错误(Prepare 返回):控制参数 (*pbreaks) 不合理(数值太大)
#define HIGHERDIFF_ERR_MEMORY 0X0A21 //错误(HigherDiff 返回):无法分配存储 bw 三(/一/二)差值所需的内存
#define TURBOEDIT_ERR_MEMORY 0X0A31 //错误(TurboEdit 返回):无法分配存储拟和 Pi 相关数据所需的内存
#define TURBOEDIT_ERR_POLYFIT 0X0A32 //错误(TurboEdit 返回):多项式拟和 PolyFit 失败
#define DEBUG_ERR_FAILREPORT 0X0A41 //测试错误:无法打开测试文件
/*
* 以下宏定义标识本模块默认的(限制很弱的)控制参数允许范围
* 客户端函数输入的控制参数若超出此范围,将导致 Preprocess 函数返回前缀为 PREPARE_ERR_ 的错误
*/
#define MINN 20 //最弱限制:最小观测历元数
#define MAXLOSSDAT 20 //最弱限制:连续观测数据所能接受的最大失锁历元计数
#define HDMINARC 4 //最弱限制:高次差方法所需的最少连续历元
#define TEMINARC 3 //最弱限制:TurboEdit 方法所需的最少连续历元
#define MINPHI -5.0e7 //最弱限制:
#define MAXPHI 5.0e7 // 载波相位观测值的最小(大)值
#define MINP 0.0 //最弱限制:
#define MAXP 5.0e7 // 载波伪距观测值的最小(大)值
#define TOLZERO 10 //最低的 高次差方法剔除野值时判断非零量的精度
#define TOLSCALE 0.10 //最低的 高次差方法剔除野值时判断符合比例关系 1:-2:1:0 的精度
#define MINFACTOR 3.0 //最弱限制:
#define MAXFACTOR 5.0 // TurboEdit 方法判断“跳值”时σ系数的最小(大)值
#define MAXSTEP 2.0 //最大的 TurboEdit 方法区分野值和周跳时 | bw(i+1) - bw(i) | 的阈值
/*
* 以下宏定义标识解算数据中观测值属性值(calc[i].token,i=0,1,...N-1)的部分含义
* 注: 使用负整数值表示该观测值被删除
*/
#define DEL_PRECALC_PHI -1 //由 PreCalc 删除的原始观测值,原因: 载波相位观测值 φ 超限
#define DEL_PRECALC_P -2 //由 PreCalc 删除的原始观测值,原因: 载波伪距观测值 P 超限
#define DEL_PRECALC_TOOSHORT -3 //由 PreCalc 删除的原始观测值,原因: 有效连续观测历元数太少,不符合高次差方法要求
#define DEL_HIGHERDIFF_OUTLIER -4 //由 HigherDiff 删除的原始观测值,原因: 高次差方法判断其为野值
//#define DEL_HIGHERDIFF_TOOSHORT
#define DEL_TURBOEDIT_OUTLIER -5 //由 TurboEdit 删除的原始观测值,原因: TurboEdit 方法判断其为野值
#define DEL_TURBOEDIT_TOOSHORT -6 //由 TurboEdit 删除的原始观测值,原因: TurboEdit 方法分段后,其所在段有效历元数太少
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -