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

📄 preprocess.cpp

📁 综合利用三次法和blewitt法检测与修复周跳
💻 CPP
📖 第 1 页 / 共 3 页
字号:
						//i2nd = NOPNT;

						calc[j].token = BREAKS * calc[j].token + jb;

						n++;
						m = 1;
					}

					else if ( i2nd < 0 )
					{
						if ( fabs( comb[j].Bw - comb[i1st].Bw ) > TolStep )
						{
							calc[i1st].token = DEL_TURBOEDIT_OUTLIER;
							ncut++;


							fprintf( fpOutPut, "%ld\t", obs[i1st].epoch );



							i1st = j;
						
							calc[j].token = BREAKS * calc[j].token + jb;

					
						}

						else
						{
							//i1st = i1st;
							i2nd = j;

							calc[j].token = BREAKS * calc[j].token + jb;

							n++;
							m++;
	
							mean = ( comb[i1st].Bw + comb[i2nd].Bw ) / 2.0;
							sigma = fabs( comb[i1st].Bw - comb[i2nd].Bw ) / sqrt( 2.0 );
						}
					}

					else	
					{
						if ( fabs( comb[j].Bw - mean ) >= MultiFactor * sigma )
						{
							for ( k = j + 1, l = 0; k < N, l < 1; k++ )
							{
								if ( calc[k].token == b )
								{
									nextPnt = k;
									l++;
								}
								else if ( calc[k].token > b )
								{
									break;
								}
							}

							if ( l < 1 )
							{
								
								calc[j].token = DEL_TURBOEDIT_OUTLIER;
								ncut++;



								fprintf( fpOutPut, "%ld\t", obs[j].epoch );



								if ( m < TEMinArc )
								{
									for ( k = j - 1, l = 0; k >= 0, l < m; k-- )
									{
										if ( calc[k].token == BREAKS * b + jb )
										{
											calc[k].token = DEL_TURBOEDIT_TOOSHORT;
											ncut++;



											fprintf( fpOutPut, "%ld\t", obs[k].epoch );



											l++;
										}

										//else if ( ... )	{ ...... }
									}
								}
							}

							else
							{
								if ( fabs( comb[nextPnt].Bw - comb[j].Bw ) > TolStep )
								{
									calc[j].token = DEL_TURBOEDIT_OUTLIER;
									ncut++;



									fprintf( fpOutPut, "%ld\t", obs[j].epoch );



								}

								else
								{
									if ( m < TEMinArc )
									{
										for ( k = j - 1, l = 0; k >= 0, l < m; k-- )
										{
											if ( calc[k].token == (BREAKS * b + jb ))
											{
												calc[k].token = DEL_TURBOEDIT_TOOSHORT;
												ncut++;



												fprintf( fpOutPut, "%ld\t", obs[k].epoch );



												l++;
											}

											//else if ( ... )	{ ...... }
										}

										//jb = jb;
									}

									else
									{
										jb++;
									}

									i1st = j;
									i2nd = NOPNT;

									calc[j].token = BREAKS * calc[j].token + jb;

									n++;
									m = 1;
								}
							}
						}

						else
						{
							calc[j].token = BREAKS * calc[j].token + jb;

							n++;
							m++;

							sigma = sqrt( pow( sigma, 2.0 ) * ( ( double )n - 2 ) / ( ( double )n - 1 ) + pow( ( comb[j].Bw - mean ), 2.0 ) / ( double )n );
							mean = mean + ( comb[j].Bw - mean ) / ( double )n;
						}
					}
				}

				else if ( calc[j].token > b )
				{
					break;
				}
			}

			i = j - 1;
		}
	}
						

	
	fprintf( fpOutPut, "\n共剔除野值(太短弧段历元) %d 个\nTurboEdit方法分段信息\n  历元编码\tb1\tb2\tbw\t记号\n", ncut );
	
	for ( i = 0; i < N; i++ )
	{
		if ( calc[i].token >= 0 )
		{
			fprintf( fpOutPut, "%5ld\t%16.5lf\t%16.5lf\t%16.5lf\t%d\n", obs[i].epoch, calc[i].cb1, calc[i].cb2, comb[i].Bw, calc[i].token );
		}
		else
		{
			fprintf( fpOutPut, "%5ld\t%s\t%s\t%s\t%d\n", obs[i].epoch, strNOVALUE, strNOVALUE, strNOVALUE, calc[i].token );
		}
	}

	fflush( fpOutPut );



	return TURBOEDITDETECTOK;
}




static int TurboEdit_PolyFit( const OBSDAT obs[],	const CALCDAT calc[],
							  COMBI comb[],			const long int N )
{



	fprintf( fpOutPut, "使用最小二乘法对电离层组合伪距进行多项式拟和\n" );

	double tempPi, tempLP;



	unsigned int m = ( unsigned int )( ( double )N / 100.0 + 1.0 );//truncation of any fractional part
	m = m < 6 ? m : 6;

	double * a;
	double dt[3];

	double * pEpoch = NULL;
	double * pPi = NULL;

	long int i, j;
	int value;

	if ( ( a = ( double * )malloc( ( m + 1 ) * sizeof( double ) ) ) == NULL )
		return TURBOEDIT_ERR_MEMORY;

	if ( ( pEpoch = ( double * )malloc( N * sizeof( double ) ) ) == NULL )
	{
		free( a );
		return TURBOEDIT_ERR_MEMORY;
	}
	
	if ( ( pPi = ( double * )malloc( N * sizeof( double ) ) ) == NULL )
	{
		free( a );
		free( pEpoch );
		return TURBOEDIT_ERR_MEMORY;
	}

	for( i = 0, j = 0; i < N; i++ )
	{
		if ( calc[i].token != DEL_PRECALC_P )
		{
			pEpoch[j] = obs[i].epoch;
			pPi[j] = obs[i].P2 - obs[i].P1;
			j++;
		}
	}

	if ( ( value = PolyFit( pEpoch, pPi, j, m, a, dt, LEASTSQUARE ) ) != ( int )m )
	{
		value = TURBOEDIT_ERR_POLYFIT;
	}

	else
	{


		fprintf( fpOutPut, "  拟和数据总量:  %ld\n", j );
		fprintf( fpOutPut, "  拟和多项式次数:  %d\n", value );

		fprintf( fpOutPut, "  表达式:  %.10lf", a[0] );
		for ( i = 1; i <= value; i++ )
			fprintf( fpOutPut, "+(%.10lf)*x^%d", a[i], i );

		fprintf( fpOutPut, "\n  残差向量2-范数(残差平方和开方):  %.12lf\n", dt[0] );
		fprintf( fpOutPut, "  残差向量1-范数:  %.12lf\n", dt[1] );
		fprintf( fpOutPut, "  残差向量∞-范数:  %.12lf\n", dt[2] );

		fprintf( fpOutPut, "Pi,deltaLi统计分析\n历元编码\tPi原始值\tPi拟和值\tPi残差\tdeltaLi原始值\t拟和Pi后deltaLi值\tdeltaLi残差\t记号\n" );



		for ( i = 0; i < N; i++ )
		{
			if ( calc[i].token != DEL_PRECALC_PHI && calc[i].token != DEL_PRECALC_P &&
				 calc[i].token != DEL_HIGHERDIFF_OUTLIER && calc[i].token != DEL_TURBOEDIT_OUTLIER )
			{


				tempLP = comb[i].LP;


				comb[i].LP = comb[i].LP + ( obs[i].P2 - obs[i].P1 ) - PolyVal( ( double )obs[i].epoch, a, value );
			}


			if ( calc[i].token != DEL_PRECALC_P )
			{
				tempPi = PolyVal( ( double )obs[i].epoch, a, value );
				fprintf( fpOutPut, "%5ld\t%16.10lf\t%16.10lf\t%16.10lf\t", obs[i].epoch, obs[i].P2 - obs[i].P1, tempPi, obs[i].P2 - obs[i].P1 - tempPi );

				if ( calc[i].token != DEL_PRECALC_PHI &&
					 calc[i].token != DEL_HIGHERDIFF_OUTLIER && calc[i].token != DEL_TURBOEDIT_OUTLIER )
				{
					fprintf( fpOutPut, "%16.10lf\t%16.10lf\t%16.10lf\t", tempLP, comb[i].LP, tempLP - comb[i].LP );
				}

				else
				{
					fprintf( fpOutPut, "%s\t%s\t%s\t", strNOVALUE, strNOVALUE, strNOVALUE );
				}

				fprintf( fpOutPut, "%d\n", calc[i].token );
			}

			else
			{
				fprintf( fpOutPut, "%5ld\t%s\t%s\t%s\t%s\t%s\t%s\t%d\n", obs[i].epoch, strNOVALUE, strNOVALUE, strNOVALUE, strNOVALUE, strNOVALUE, strNOVALUE, calc[i].token );
			}



		}

		value = TURBOEDITPOLYFITOK;
	}



	fflush( fpOutPut );



	free( a );
	free( pEpoch );
	free( pPi );

	return value;
}



static int TurboEdit_Repair( CALCDAT calc[],		COMBI comb[],

							 const OBSDAT obs[],

							 const long int N )
{
	long int i, j, k;
	int b;
	int jb;
	long int m;
	long int Pnt[2];
	double meanBw0, meanLP0;
	double meanBw, meanLP;
	double corrBw, corrLP, corrB1, corrB2;

	for ( i = 0; i < N; i++ )
	{
		if ( calc[i].token >= 0 )
		{
			b = calc[i].token / BREAKS;
			jb = calc[i].token % BREAKS;
			fprintf( fpOutPut, "预解算分段编码:  %d  (TurboEdit方法修复周跳以首段为基准段)\n", b );
			fprintf( fpOutPut, "  TurboEditda方法分段编码\t各段Bw平均值\t各段LP(deltaLi)平均值\t各段Bw改正值\t各段LP(deltaLi)改正值\t各段B1改正值\t各段B2改正值\n" );
			meanBw0 = comb[i].Bw;
			meanLP0 = comb[i].LP;

			m = 1;
			Pnt[0] = i;
			for ( j = i + 1; j < N; j++ )
			{
				if ( calc[j].token == calc[i].token )
				{
					m++;
					meanBw0 = meanBw0 + ( comb[j].Bw - meanBw0 ) / m;
					meanLP0 = meanLP0 + ( comb[j].LP - meanLP0 ) / m;
				}

				else if ( calc[j].token > calc[i].token )
				{
					break;
				}
			}
			Pnt[1] = j - 1;


			fprintf( fpOutPut, "  %5ld [ %5ld , %5ld ]\t%16.5lf\t%16.5lf\n", jb, obs[Pnt[0]].epoch, obs[Pnt[1]].epoch, meanBw0, meanLP0 );

			while ( j < N && calc[j].token / BREAKS == b )
			{
				

				meanBw = comb[j].Bw;
				meanLP = comb[j].LP;

				m = 1;
				Pnt[0] = j;
				for ( k = j + 1; k < N; k++ )
				{
					if ( calc[k].token == calc[j].token )
					{
						m++;
						meanBw = meanBw + ( comb[k].Bw - meanBw ) / m;
						meanLP = meanLP + ( comb[k].LP - meanLP ) / m;
					}

					else if ( calc[k].token > calc[j].token )
					{
						break;
					}
				}
				Pnt[1] = k - 1;

				corrBw = meanBw - meanBw0;
				corrLP = meanLP - meanLP0;

				corrB2 = ( lambda1 * corrBw - corrLP ) / lambdai;
				corrB1 = corrBw + corrB2;

				j = k;

				for ( k = Pnt[0]; k <= Pnt[1]; k++ )
				{
					comb[k].Bw -= corrBw;
					comb[k].LP -= corrLP;
					calc[k].cb1 -= corrB1;
					calc[k].cb2 -= corrB2;
				}


				fprintf( fpOutPut, "  %5ld [ %5ld , %5ld ]\t%16.5lf\t%16.5lf\t%16.5lf\t%16.5lf\t%16.5lf\t%16.5lf\n",
					 jb, obs[Pnt[0]].epoch, obs[Pnt[1]].epoch, meanBw, meanLP, corrBw, corrLP, corrB1, corrB2 );


			}

			i = j - 1;
		}
	}

	fprintf( fpOutPut, "\n观测数据预处理结果\n  历元编码\t改正后Bw\t改正后LP\t改正后B1\t改正后B2\n" );
	
	for ( i = 0; i < N; i++ )
	{
		if ( calc[i].token >= 0 )
		{
			fprintf( fpOutPut, "%5ld\t%16.5lf\t%16.5lf\t%16.5lf\t%16.5lf\t%d\n", obs[i].epoch, comb[i].Bw, comb[i].LP, calc[i].cb1, calc[i].cb2, calc[i].token );
		}
		else
		{
			fprintf( fpOutPut, "%5ld\t%s\t%s\t%s\t%s\t%d\n", obs[i].epoch, strNOVALUE, strNOVALUE, strNOVALUE, strNOVALUE, calc[i].token );
		}
	}

	fflush( fpOutPut );


	return TURBOEDITREPAIROK;
}




static void Patch( CALCDAT calc[], const long int N )
{
	long int i;

	for ( i = 0; i < N; i++ )
	{
		if ( calc[i].token < 0 )
		{
			calc[i].cb1 = 0.0;
			calc[i].cb2 = 0.0;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -