⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 preprocess.h

📁 综合利用三次法和blewitt法检测与修复周跳
💻 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 + -