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

📄 preclk.cpp

📁 GPS 定位授时源码
💻 CPP
字号:

#include "stdAfx.h"

#include "PreClk.h"
#include "math.h"
#include "errorcorrection.h"
#include "matrixcsl.h"
#include "iomanip.h"


int READCLKFILE(ifstream inClkFile,char *MarkerName,PRECLK &PreClk)
{	char str[81]; 
    CString s;
    char *p;
	PreClk.Makername=MarkerName;
	int realsatnum;
    do
	{
	    inClkFile.getline(str,82,'\n');
		if(p=strstr(str,"COMMENT"))
			continue;
		if(p=strstr(str,"END OF HEADER "))
			break;
		if(p=strstr(str,MarkerName))
		{	 s=str;
		   PreClk.RecPos[0]=atof(s.Mid(24,12))/1000;
		   PreClk.RecPos[1]=atof(s.Mid(36,12))/1000;
		   PreClk.RecPos[2]=atof(s.Mid(48,12))/1000;
		}
		if(p=strstr(str,"SOLN SATS"))
		{
			s=str;
			realsatnum=atoi(s.Mid(0));
		}
	}while(1);

	int i,j;
	for (i=0;i<MAXCLKRECORDS;i++)
	{	bool EpochSucceed=false;
		while(1)
		{	inClkFile.getline(str,82,'\n');
			if(p=strstr(str,MarkerName))
			{	s=str;
				
				PreClk.pRecClk[i].UTCT.iYEAR=atoi(s.Mid(7));
				PreClk.pRecClk[i].UTCT.iMONTH=atoi(s.Mid(12));
				PreClk.pRecClk[i].UTCT.iDAY=atoi(s.Mid(15));
				PreClk.pRecClk[i].UTCT.iHOUR=atoi(s.Mid(18));
				PreClk.pRecClk[i].UTCT.iMINUTE=atoi(s.Mid(21));
				PreClk.pRecClk[i].UTCT.dSECOND=atof(s.Mid(24));
				PreClk.pRecClk[i].lClk[0]=atof(s.Mid(39));
				PreClk.pRecClk[i].lClk[1]=atof(s.Mid(59));	
			}
			
			if(p=strstr(str,"AS G01"))
			{	s=str;
				int iPrn=atoi(s.Mid(4));	
				PreClk.pSavClk[i].UTCT[iPrn-1]=PreClk.pRecClk[i].UTCT;
				PreClk.pSavClk[i].clk[iPrn-1][0]=atof(s.Mid(39));
				PreClk.pSavClk[i].clk[iPrn-1][1]=atof(s.Mid(59));
				for(j=1;j<realsatnum;j++)
				{	inClkFile.getline(str,82,'\n');
					s=str;
					int iPrn=atoi(s.Mid(4));
					if(!iPrn)
					{	printf("      The clk file is damaged for absence of satellite clock record.\n");
						break;
					}
					PreClk.pSavClk[i].UTCT[iPrn-1]=PreClk.pRecClk[i].UTCT;
					PreClk.pSavClk[i].clk[iPrn-1][0]=atof(s.Mid(39));
					PreClk.pSavClk[i].clk[iPrn-1][1]=atof(s.Mid(59));
				}
			}
			if(p=strstr(str,"AR GPST"))
			{
				s=str;
				PreClk.pDifToReference[i].UTCT=PreClk.pRecClk[i].UTCT;
				PreClk.pDifToReference[i].lClk[0]=atof(s.Mid(39));
				EpochSucceed=TRUE;
			}
		
			if(EpochSucceed)
				break;
		}
	}
	
	return 1;
}

int READCODCLKFILE(ifstream inClkFile,char *MarkerName,PRECLK &PreClk)
{	char str[81]; 
    CString s;
    char *p;
	PreClk.Makername=NULL;
	int realsatnum=0;
    do
	{
	    inClkFile.getline(str,82,'\n');
		if(p=strstr(str,"COMMENT"))
			continue;
		if(p=strstr(str,"END OF HEADER "))
			break;
		if(p=strstr(str,MarkerName))
		{	PreClk.Makername= MarkerName;
			s=str;
			PreClk.RecPos[0]=atof(s.Mid(24,12))/1000;
			PreClk.RecPos[1]=atof(s.Mid(36,12))/1000;
			PreClk.RecPos[2]=atof(s.Mid(48,12))/1000;
		}
		if(p=strstr(str,"SOLN SATS"))
		{
			s=str;
			realsatnum=atoi(s.Mid(0));
		}
	}while(1);

	int i,j;
	for (i=0;i<MAXCLKRECORDS*10;i++)
	{	bool EpochSucceed=false;
		while(1)
		{	inClkFile.getline(str,82,'\n');
			if(p=strstr(str,"AR AMC2"))
			{
				s=str;
				PreClk.pDifToReference[i].UTCT.iYEAR=atoi(s.Mid(7));
				PreClk.pDifToReference[i].UTCT.iMONTH=atoi(s.Mid(12));
				PreClk.pDifToReference[i].UTCT.iDAY=atoi(s.Mid(15));
				PreClk.pDifToReference[i].UTCT.iHOUR=atoi(s.Mid(18));
				PreClk.pDifToReference[i].UTCT.iMINUTE=atoi(s.Mid(21));
				PreClk.pDifToReference[i].UTCT.dSECOND=atof(s.Mid(24));
				PreClk.pDifToReference[i].lClk[0]=atof(s.Mid(39));
				continue;

			}
			if(((i/10)*10==i)&&strstr(str,MarkerName))
			{	s=str;			
				PreClk.pRecClk[i/10].UTCT=PreClk.pDifToReference[i].UTCT;
				PreClk.pRecClk[i/10].lClk[0]=atof(s.Mid(39));
				PreClk.pRecClk[i/10].lClk[1]=atof(s.Mid(59));
				continue;
			}			
			if(p=strstr(str,"AS G01"))
			{	s=str;
				int iPrn=atoi(s.Mid(4));	
				PreClk.pSavClk[i].UTCT[iPrn-1]=PreClk.pDifToReference[i].UTCT;
				PreClk.pSavClk[i].clk[iPrn-1][0]=atof(s.Mid(39));
				PreClk.pSavClk[i].clk[iPrn-1][1]=atof(s.Mid(59));
				for(j=1;j<realsatnum;j++)
				{	inClkFile.getline(str,82,'\n');
					s=str;
					int iPrn=atoi(s.Mid(4));
					if(!iPrn)
					{
						printf("      The clk file is damaged for absence of satellite clock record.\n");
						
					}
					PreClk.pSavClk[i].UTCT[iPrn-1]=PreClk.pDifToReference[i].UTCT;
					PreClk.pSavClk[i].clk[iPrn-1][0]=atof(s.Mid(39));
					PreClk.pSavClk[i].clk[iPrn-1][1]=atof(s.Mid(59));
				}
				EpochSucceed=TRUE;
			}
			if(EpochSucceed)
				break;			
		}

	}
	
	return 1;

}

int GETWCLKRMS(ofstream pFile,long double *lObs,SIGCLK  *pRecClk,
			   SIGCLK *pDifToReference,int n)
{	long double VTV=0;
	long double average =  0;
	pFile<<" The clock figured out by TRIP-T relative to true clock from the IGS Precise CLK file :"<<endl;
	pFile<<"  No       CLK By TRIP-T    CLK From IGS    The Difference   "<<endl;
	for(int i=0;i<n;i++)
	{
		long double lDif=lObs[i]-(pRecClk[i].lClk[0]-pDifToReference[i].lClk[0]);
		if(pRecClk[i].lClk[0]>1)
			lDif=0; 
		// to avoid the case of +indefinitive eg. 4.2e+66
		pFile<<setw(4)<<i+1<<"  "<<setw(15)<<lObs[i]<<"   ";
		pFile<<setw(15)<<pRecClk[i].lClk[0]-pDifToReference[i].lClk[0]<<"  "<<setw(15)<<lDif<<endl;
		VTV+=lDif*lDif;	
		average+=lDif;
	}
	
	VTV/=n;
	long double RMS=pow(VTV,0.5);
	pFile<<" RMS is:"<<RMS<<endl;
	
	average/=n;
	for(i=0;i<n;i++)
	{	long double lDif=lObs[i]-(pRecClk[i].lClk[0]-pDifToReference[i].lClk[0])-average;
		if(pRecClk[i].lClk[0]>1)
		lDif=0; 
		// to avoid the case of +indefinitive eg. 4.2e+66
		VTV+=lDif*lDif;
	}
	VTV/=(n-1);
	RMS=pow(VTV,0.5);
	pFile<<"偏差均值为:"<<average<<" 去均值 RMS is:"<<RMS<<endl;
	return 1;
}

int GETCLKRMS(ofstream pFile,long double *lObs,int n)
{//Note:   lObs is the vector of computed(corrected) observations
	int i,j;
	long double RMS=0;
	long double *lEvalu=new long double[n];
	//the average be seemed to real values
	// 	long double lEverge=0;
	// 	for(i=0;i<n;i++)
	// 		lEverge+=lObs[i];
	// 	lEverge/=n;
	// 	for(i=0;i<n;i++)
	
	//	lEvalu[i]=lEverge;
	pFile.flags(ios::scientific);
	
	int order=6;   //the order of polynomial;
	long double **plB=TwoArrayAlloc(n,order);
	long double **plL=TwoArrayAlloc(n,1);
	long double **plX=TwoArrayAlloc(order,1);
	for (i=0;i<n;i++)
	{	for(j=0;j<order;j++)
		plB[i][j]=pow(i*30,j);
		plL[i][0]=lObs[i];
	}
	LEASTSQUAREAJUST(plX,plB,n,order,plL);
	pFile<<" The clock fitted by polynomial are:"<<endl;
	pFile<<"   Raw value      Fitting value       Difference   \n";
	for (i=0;i<n;i++)
	{	lEvalu[i]=0;
		for(j=0;j<order;j++)
			lEvalu[i]+=plX[j][0]*plB[i][j];
	}
	for(i=0;i<n;i++)
	{
		long double ldif=lObs[i]-lEvalu[i];
		pFile<<setprecision(12)<<setw(15)<<lObs[i]<<"  "<<setprecision(12)<<setw(15)<<lEvalu[i]<<"   "<<setprecision(12)<<setw(15)<<ldif<<endl;
		RMS+=ldif*ldif;
	}
	
	RMS/=n;
	RMS=pow(RMS,0.5);
	pFile<<" The clock RMS relative to its fitting value\n     according to the clock model is :  "<<RMS<<endl;
	delete []lEvalu;
	return 1;	
}

int GETPOSRMS(ofstream pFile,long double *lV,int n)
{	long double RMS,RMSSQUARE=0;
	int i;
	for(i=0;i<n;i++)
	RMSSQUARE+=lV[i]*lV[i];
	RMSSQUARE/=n;
	RMS=pow(RMSSQUARE,0.5);
	pFile<<" RMS value is:"<<RMS<<endl;
	return 1;
}

int Clk30SecTo5Min(ofstream pFile,long double *lInput,long double *lOutput,
				  int outputNum,int groups)    //least square
{	int i=0,j=0,k=0;
	pFile<<" The receiver clock with 5 min interval:"<<endl;
	for(i=0;i<outputNum;i++)
	{	int order=2;   //the order of polynomial;
		lOutput[i]=0;
		long double **plB=TwoArrayAlloc(groups,order);
		long double **plL=TwoArrayAlloc(groups,1);
		long double **plX=TwoArrayAlloc(order,1);
		for(j=0;j<groups;j++)
		{	
			for(k=0;k<order;k++)
				plB[j][k]=pow(j*30,k);  //units as second
			plL[j][0]=lInput[groups*i+j];					
		}
		pFile.flags(ios::fixed);
		LEASTSQUAREAJUST(plX,plB,groups,order,plL);	
		for(k=0;k<order;k++)
			lOutput[i]+=plX[k][0]*pow(0*30,k);
		pFile<<setw(3)<<i+1<<"  "<<setw(15)<<setprecision(12)<<lOutput[i]<<endl;
	}
	return 1;
}

//int Clk30SecToMin(long double *lInput,long double *lOutput,int outputNum,
//				  int groups)    //average the clk
//{	int i=0,j=0;
//	for(i=0;i<outputNum;i++)
//	{
//		lOutput[i]=0;	
//		for(j=0;j<groups;j++)
//			lOutput[i]+=lInput[groups*i+j];
//		lOutput[i]/=groups;	
//		cout<<setw(12)<<lOutput[i]<<endl;
//	}
//	return 1;

⌨️ 快捷键说明

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