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

📄 rinex.c

📁 针对GPS系统的全面的源程序 希望能够对学习GPS技术的朋友有所帮助
💻 C
📖 第 1 页 / 共 3 页
字号:
             Islip -=1; 
             goto repeat1; }} 
       nextkk:;
    } 
/* 自检:不允许同样两个 id_slips[] 和 slips_t[] */
    repeat2:;
for(k=Islip-1;k>0;k--) 
{ for(k1=k-1;k1>=0;k1--) 
  { if(fabs(slips_t[k]-slips_t[k1])<0.4) 
    { if(id_slips[k]==id_slips[k1]) 	/* 找到两个相同的,取消第 k个元素 */
      { for(i2=k+1;i2<Islip;i2++) 
        { id_slips[i2-1]=id_slips[i2];
              slips_t[i2-1]=slips_t[i2]; } 
             Islip -=1; 
             goto repeat2; }}}} 
/* 自检:在相邻时间上不允许两个'相同'的id_slips[],即 id 30700 - 29065 and id 30703 - 29066 */
   
    if(Islip>=Islips) {printf("dimension of Islip error\n"); exit(0);} /* Islip 检查 */     
    if(O_cycle <= 1 && Islip>Islip0)			 /* 为控制输出数据 */
 { printf("cycle slips id and time vectors : i,id_slips[],slips_t[]\n");
       for (i=0;i<Islip;i++) 
       printf("%4d %8d %8.1f\n",i+1,id_slips[i],slips_t[i]); }
if(O_cycle <= 0) 
{  printf("cycle slips id and time vectors : i,id_slips[],slips_t[]\n");
       for (i=0;i<Islip;i++) 
       printf("%4d %8d %8.1f\n",i+1,id_slips[i],slips_t[i]); }
    endof_f:;}
double line2_integrate(t0,t1,t2,y0,y1,y2)
/* 此函数应用t0 t1 t2 的多普勒数据预测相位从t1到t2的增加,比较其相位增加以检查是否存在跳周。为此f(t)从t1到t2凑整,t1到t2 的平均值为凑整值(t1,t2) f(t)*dt/(t2-t1) */
double t0,t1,t2,y0,y1,y2;
{  double b,c=0.,var;
   if(fabs(t2-t1)<1.e-2 && fabs(t1-t0)<1.e-2) return(y2);
   if(fabs(t1-t0)<1.e-2) {b=(y2-y1)/(t2-t1);c=0.;}
   else 
  {  c = ((y2-y1)/(t2-t1) - (y1-y0)/(t1-t0))/(t2-t0); 
     b = (y2-y1)/(t2-t1) - c*(t2-t1); }
   var = y1*(t2-t1)+(b/2.)*(t2-t1)*(t2-t1)
         +(c/3.)*(t2-t1)*(t2-t1)*(t2-t1); 
   return(var);}
void id_obs(xhidat,iC1,iC2,iL1,iL2,iP1,iP2,iD1,iD2)
/* 利用xhidat[i] 设置 C1, C2, P1, P2, L1, L2, D1, D2 的值,1=L1,2=L2,3=C1 */ 
long xhidat[Ista*Isat*2];
int *iC1,*iC2,*iL1,*iL2,*iP1,*iP2,*iD1,*iD2;
{  int i,j,i1;
   *iC1=100;*iC2=100;*iL1=100;*iL2=100;*iP1=100;*iP2=100;*iD1=100;*iD2=100;
   j = (int)xhidat[0];
   for(i=1;i<=j;i++) 
   {  i1 = xhidat[i];
      switch(i1) 
       { case 1: { *iL1 = i-1;break;}
         case 2: { *iL2 = i-1;break;}
         case 3: { *iC1 = i-1;break;}
         case 4: { *iC2 = i-1;break;}
         case 5: { *iP1 = i-1;break;}
         case 6: { *iP2 = i-1;break;}
         case 7: { *iD1 = i-1;break;}
         case 8: { *iD2 = i-1;break;}}}}
void sdtdat(ista,xhidat,odat_t,odat_dt,odat_n,odat1,id_odat,iodat1,
            sdat,id_sdat,isdat,sdat_n,ddat,id_ddat,iddat,ddat_n,
            tdat,id_tdat,itdat,tdat_n,ref_sv)
/* 此函数利用 GPS RINEX 数据或接收机经时间改正的数据,组成单差sd 、双差dd和三差td */ 
long ista,ref_sv;
long xhidat[Ista*Isat*2];
long odat_n[Iepoches];
double odat1[Isato*I10*Ista*Iepoches],odat_t[Iepoches];
double odat_dt[Ista*Iepoches];
long id_odat[I10*Ista*Iepoches];
unsigned int iodat1[Isato*I10*Ista*Iepoches];
double sdat[Isato*I10*Ista*Iepoches],ddat[Isato*I10*Ista*Iepoches],
       tdat[Isato*I10*Ista*Iepoches];
long id_sdat[I10*Ista*Iepoches],id_ddat[I10*Ista*Iepoches],
     id_tdat[I10*Ista*Iepoches],
     sdat_n[Iepoches],ddat_n[Iepoches],tdat_n[Iepoches];
unsigned int isdat[Isato*I10*Ista*Iepoches],iddat[Isato*I10*Ista*Iepoches],
             itdat[Isato*I10*Ista*Iepoches];
{   long i,i1,i2,j,j1,j2,j3,k,k1,kp1,k2,ob_num;
    double rit,sec;
    int hour,minute,I1,I2,J1,J2;  
    ob_num = (int)xhidat[0]; /*printf("%d\n",ob_num);*/
/* 组成单差数据 ( 径向基线情况) */
for(k=0;k<Iepoches;k++) 				/* 每一历元 */
{ for(i=0,k1=0;k1<odat_n[k];k1++) 	/* 每一卫星 */
      { id_i12j12(&id_odat[k1+I10*Ista*k],&I1,&I2,&J1,&J2);
        i1 = I1-1; j1 = J1;
        if(i1==0) 						/* sta 0 作为参考测站 */
         { for(k2=k1+1;k2<odat_n[k];k2++) 
           { id_i12j12(&id_odat[k2+I10*Ista*k],&I1,&I2,&J1,&J2);
             i2 = I1-1; j2 = J1;
             if(i2!=0 && j1==j2) 			/* 非参考测站和同样卫星 */
              {    id_sdat[i+k*I10*Ista]=(i1+1)*10000+(i2+1)*100+j2;
                   for(j=0;j<ob_num;j++) 
                 { if(iodat1[j+k1*Isato+Isato*I10*Ista*k]==1 &&
                   iodat1[j+k2*Isato+Isato*I10*Ista*k]==1) 
                    { sdat[j+i*Isato+Isato*I10*Ista*k]=
                         odat1[j+k2*Isato+Isato*I10*Ista*k]-
                         odat1[j+k1*Isato+Isato*I10*Ista*k];
                         isdat[j+i*Isato+Isato*I10*Ista*k]=1;}
                    else 
                    { sdat[j+i*Isato+Isato*I10*Ista*k]=0.;
                      isdat[j+i*Isato+Isato*I10*Ista*k]=0;}}
                   i += 1;}}}}
       sdat_n[k]=i; 
    }         
/* 为检查输出单差数据 */
if(O_sdtdat==0) 
{ for(k=0;k<Iepoches;k++) 
  { if(sdat_n[k]!=0) 
    { t_hms(odat_t[k],&hour,&minute,&sec);
          printf("sdat at time %2d %2d %4.1f ",hour,minute,sec);
          printf(", sdat_n = %3d\n",sdat_n[k]); }
          for (j1=0;j1<sdat_n[k];j1++) 
        { printf("%8d ",id_sdat[j1+I10*Ista*k]);
          for(j=0;j<ob_num;j++)
          printf("%15.3lf",sdat[j+j1*Isato+Isato*I10*Ista*k]);
          for(j=0;j<ob_num;j++)
          printf(" %d",isdat[j+j1*Isato+Isato*I10*Ista*k]);
          printf("\n");}}}         
/* 组成双差数据 ( 径向基线情况) */
for(k=0;k<Iepoches;k++) 				/* 每一历元 */
{ for(i=0,k1=0;k1<sdat_n[k];k1++) 	/* 每一单差 sdat */
       { id_i12j12(&id_sdat[k1+I10*Ista*k],&I1,&I2,&J1,&J2);
          /*printf("%8d %2d %2d %2d %2d\n",
          id_sdat[k1+I10*Ista*k],I1,I2,J1,J2);*/
          i1 = I1*100+I2; j1 = J1;
          if(j1==ref_sv)				 /* 如果相同卫星是参考卫星 */
           { for(k2=0;k2<sdat_n[k];k2++) 
             {  id_i12j12(&id_sdat[k2+I10*Ista*k],&I1,&I2,&J1,&J2);
                i2 = I1*100+I2; j2 = J1;
                if(i1==i2 && j2!=j1)   	/* 非参考卫星和相同基线 */
                 { id_ddat[i+k*I10*Ista]=i1*10000+j1*100+j2;
                   for(j=0;j<ob_num;j++) 
                    { if(isdat[j+k1*Isato+Isato*I10*Ista*k]==1 &&
                      isdat[j+k2*Isato+Isato*I10*Ista*k]==1) 
                      {  ddat[j+i*Isato+Isato*I10*Ista*k]=
                         sdat[j+k2*Isato+Isato*I10*Ista*k]-
                         sdat[j+k1*Isato+Isato*I10*Ista*k];
                         iddat[j+i*Isato+Isato*I10*Ista*k]=1;}
                   else 
                      {  ddat[j+i*Isato+Isato*I10*Ista*k]=0.;
                         iddat[j+i*Isato+Isato*I10*Ista*k]=0;}}
                   i += 1;}}}}
       ddat_n[k]=i; 
    }         
/* 为检查输出双差数据 */
if(O_sdtdat==0) 
{ for(k=0;k<Iepoches;k++) 
   { if(ddat_n[k]!=0) 
      {  t_hms(odat_t[k],&hour,&minute,&sec);
             printf("ddat at time %2d %2d %4.1f ",hour,minute,sec);
             printf(", ddat_n = %3d\n",ddat_n[k]); }
          for (j1=0;j1<ddat_n[k];j1++) 
           { printf("%8d ",id_ddat[j1+I10*Ista*k]);
             for(j=0;j<ob_num;j++)
             printf("%15.3lf",ddat[j+j1*Isato+Isato*I10*Ista*k]);
             for(j=0;j<ob_num;j++)
             printf(" %d",iddat[j+j1*Isato+Isato*I10*Ista*k]);
             printf("\n");}}}   
/* 组成三差数据 ( 每两个连续的双差数据) */
    tdat_n[0] = 0;
for(k=0;k<Iepoches-1;k++) 		 /* 每一历元 */
{  i=0; tdat_n[k+1] = 0; kp1 = k+1;
       if(ddat_n[k]!=0 & ddat_n[k+1]!=0) 
        { for(k1=0;k1<ddat_n[k];k1++) /* k 历元双差 ddat */
           { i1 = id_ddat[k1+I10*Ista*k];
             for(k2=0;k2<ddat_n[k+1];k2++) /* k+1 历元双差 ddat */
              { i2 = id_ddat[k2+I10*Ista*kp1];
                if(i1==i2) 				/* 如果两个 id_ddat 相同 */
                  { id_tdat[i+kp1*I10*Ista]=id_ddat[k1+I10*Ista*k];
                    for(j=0;j<ob_num;j++) 
                     { if(iddat[j+k1*Isato+Isato*I10*Ista*k]==1 &&
                       iddat[j+k2*Isato+Isato*I10*Ista*kp1]==1) 
                       { tdat[j+i*Isato+Isato*I10*Ista*kp1]=
                         ddat[j+k2*Isato+Isato*I10*Ista*kp1]-
                         ddat[j+k1*Isato+Isato*I10*Ista*k];
                         itdat[j+i*Isato+Isato*I10*Ista*kp1]=1;}
                   else 
                      {  tdat[j+i*Isato+Isato*I10*Ista*kp1]=0.;
                         itdat[j+i*Isato+Isato*I10*Ista*kp1]=0;}}
                   i += 1;}}}}
       tdat_n[kp1]=i; 
    }         
/* 为检查输出三差数据 */
if(O_sdtdat==0) 
{ for(k=0;k<Iepoches;k++) 
  { if(tdat_n[k]!=0) 
     {  t_hms(odat_t[k],&hour,&minute,&sec);
             printf("tdat at time %2d %2d %4.1f ",hour,minute,sec);
             printf(", tdat_n = %3d",tdat_n[k]);
             printf(", dt = %f\n",odat_t[k]-odat_t[k-1]); }
          for (j1=0;j1<tdat_n[k];j1++) 
          {  printf("%8d ",id_tdat[j1+I10*Ista*k]);
             for(j=0;j<ob_num;j++)
             printf("%15.3lf",tdat[j+j1*Isato+Isato*I10*Ista*k]);
             for(j=0;j<ob_num;j++)
             printf(" %d",itdat[j+j1*Isato+Isato*I10*Ista*k]);
             printf("\n"); }}}}
void odat_tc(ista,xhidat,odat_t,odat1,odat_dt,odat_n,odat,id_odat,iodat,iodat1
             ,singlet)
/* 此函数内插 GPS RINEX 数据,将所有的观测值归算为同一时间 odat_t,删去零向量 odat_dt1 */
long ista;
long xhidat[Ista*Isat*2];
long odat_n[Iepoches];
double odat[Isato*I10*Ista*Iepoches],odat1[Isato*I10*Ista*Iepoches];
double odat_dt[Ista*Iepoches],odat_t[Iepoches];
long id_odat[I10*Ista*Iepoches];
unsigned int iodat[Isato*I10*Ista*Iepoches],iodat1[Isato*I10*Ista*Iepoches];
double singlet[Ista*Iepoches];
{
    long i,i1,i2,i3,i4,j,j1,j2,j3,k,km1,kp1,k1,k2,ob_num,id;
    int I1,I2,J1,J2;
    double rit,sec,t0,t1,t2,y0,y1,y2,var;
    double dct,dct1,dct2,dct3;
    int hour,minute;  
    ob_num = (int)xhidat[0];
/* 将原始数据 odat 和 iodat 放入 odat1 和 iodat1 */
for(k=0;k<Iepoches;k++) 
{ if(odat_n[k]!=0) 
  { for(j1=0;j1<odat_n[k];j1++) 
     { for(j=0;j<ob_num;j++) 
        {   odat1[j+j1*Isato+Isato*I10*Ista*k] = 
                odat[j+j1*Isato+Isato*I10*Ista*k];
                iodat1[j+j1*Isato+Isato*I10*Ista*k]=
                iodat[j+j1*Isato+Isato*I10*Ista*k];}}}}
    if(ReceivC==0) goto function_end;
/* 内插数据,使新数据无时间改正 (odat_dt==0) */
for(k=0;k<Iepoches-1;k++)		/* 每一历元 */ 
{  if(odat_n[k]==0) goto function_end;
       for(j1=0;j1<odat_n[k];j1++) 	/* 每一观测量 */
        { id = id_odat[j1+I10*Ista*k];
          id_i12j12(&id,&I1,&I2,&J1,&J2);
          /*printf("%8d %2d %2d %2d %2d %lf\n",
          id_odat[j1+I10*Ista*k],I1,I2,J1,J2,
          odat_dt[I1-1+k*Ista]);*/
          dct=odat_dt[I1-1+k*Ista];
          if(ReceivC==2) dct=singlet[I1-1+k*Ista]*1.e-6;/* 这里只用原始数据 I1,J1  */
          if(fabs(dct)>=0.000001) 	/* dt != 0 以相同id求最后历元数据 */
           { i1 = -1; i2 = -1;
             if(k!=0) 
              { km1 = k-1; 
                for(j2=0;j2<odat_n[km1];j2++) 
                if(id==id_odat[j2+I10*Ista*km1]) i1=j2;
                t_hms(odat_t[km1],&hour,&minute,&sec);
                t0 = hour*3600.+minute*60.+sec;
                dct1 = odat_dt[i1+km1*Ista];
                if(ReceivC==2) dct1=singlet[i1+km1*Ista]*1.e-6;
                if(i1!=-1) t0 += dct1; }
             if(odat_n[k+1]!=0) 		/* 以相同id求下一个历元数据 */
              { kp1 = k+1; 
                for(j2=0;j2<odat_n[kp1];j2++) 
                if(id==id_odat[j2+I10*Ista*kp1]) i2=j2;
                t_hms(odat_t[kp1],&hour,&minute,&sec);
                t2 = hour*3600.+minute*60.+sec;
                dct2 = odat_dt[i2+kp1*Ista];
                if(ReceivC==2) dct2=singlet[i2+kp1*Ista]*1.e-6;
                if(i2!=-1) t2 += dct2; }
             if(i1==-1 && i2==-1) /* 数据是单个,不能内插,设置相关状态 iodat=0 */
              { for(j=0;j<ob_num;j++) iodat1[j+j1*Isato+Isato*I10*Ista*k]=0; }
             t_hms(odat_t[k],&hour,&minute,&sec); /* 内插时间 rit */
             rit = hour*3600.+minute*60.+sec;
             t1 = rit + dct;
             for(j=0;j<ob_num;j++) 		/* 每一观测值 */
              { if(iodat[j+j1*Isato+Isato*I10*Ista*k]==1) 
                 { y1 = odat[j+j1*Isato+Isato*I10*Ista*k];
                   if(i1!=-1) 
                    { if(odat[j+i1*Isato+Isato*I10*Ista*km1]==0) i1=-1;
                      else y0 = odat[j+i1*Isato+Isato*I10*Ista*km1]; }
                   if(i2!=-1) 
                    { if(odat[j+i2*Isato+Isato*I10*Ista*kp1]==0) i2=-1;
                      else y2 = odat[j+i2*Isato+Isato*I10*Ista*kp1]; }
                   if(i1!=-1 && i2!=-1)
                   var=line2_interpo(t0,t1,t2,y0,y1,y2,rit);
                   if(i1!=-1 && i2==-1) var = line_interpo(t0,t1,y0,y1,rit);
                   if(i1==-1 && i2!=-1) var = line_interpo(t1,t2,y1,y2,rit);
                   if(i1==-1 && i2==-1) 
                    { var=0.; iodat1[j+j1*Isato+Isato*I10*Ista*k]=0; }
                   odat1[j+j1*Isato+Isato*I10*Ista*k] = var;}}}
                   if(DopplerI==1) /* 应用多普勒数据内插,内插的时间 rit */
                    { t_hms(odat_t[k],&hour,&minute,&sec);
                      rit = hour*3600.+minute*60.+sec;
                      t1 = rit + dct;
                      for(j=0;j<ob_num;j++) 	/* 伪距和相位 */
                       { if(iodat[j+j1*Isato+Isato*I10*Ista*k]==1) 
                         { y1 = odat[j+j1*Isato+Isato*I10*Ista*k];
                           y2 = odat1[PD1+j1*Isato+Isato*I10*Ista*k];
                           if(j==PC1||j==PC2) 
                            { var=y1-y2*Lambda1*dct*Doppler_sign;
                              odat1[j+j1*Isato+Isato*I10*Ista*k] = var;}
                      if(j==L1) 
                       { var=y1-y2*dct*Doppler_sign;
                         odat1[j+j1*Isato+Isato*I10*Ista*k] = var;}
                         if(j==L2) { rit=1./Lambda2; t1=Lambda1;
                         var=y1-y2*dct*Doppler_sign*(60./77.);
                         odat1[j+j1*Isato+Isato*I10*Ista*k] = var;}}}}/*若(DopplerI==1)结束*/
       }}         
    function_end:; 			/* 为检查输出数据 */
}
double line2_interpo(t0,t1,t2,y0,y1,y2,t)
/* f(t) = a+b(t-t1)+c*(t-t1)*(t-t1) 对时间t 内插 */
double t0,t1,t2,y0,y1,y2,t;
{  double b,c,var;
   c = ((y2-y1)/(t2-t1) - (y1-y0)/(t1-t0))/(t2-t0); 
   b = (y2-y1)/(t2-t1) - c*(t2-t1);
   var = y1 + (t-t1)*b + c*(t-t1)*(t-t1); 
   return(var);}
double line_interpo(t1,t2,y1,y2,t)
/* 线性内插 f(t) = a + b(t-t1) */
double t1,t2,y1,y2,t;

⌨️ 快捷键说明

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