static void udbias(rtk_t *rtk, double tt, const obsd_t *obs, const int *sat, const int *iu, const int *ir, int ns, const nav_t *nav,char **msg) { double cp,pr,*bias,offset; int i,j,slip,reset; for (i=0; i<ns; i++) { /* detect cycle slip by LLI */ rtk->ssat[sat[i]-1].slip&=0xFC; detslp_ll(rtk,obs,iu[i],1,msg); detslp_ll(rtk,obs,ir[i],2,msg); } /* reset phase-bias if expire obs outage counter */ for (i=1; i<=MAX_SAT; i++) { reset=++rtk->ssat[i-1].outc>(unsigned int)rtk->opt.maxout; if (reset&&rtk->x[IB(i,0,&rtk->opt)]!=0.0) { initx(rtk,0.0,0.0,IB(i,0,&rtk->opt)); } if (reset) { rtk->ssat[i-1].lock=-rtk->opt.minlock; } } /* reset phase-bias if instantaneous AR or expire obs outage counter */ for (i=1; i<=MAX_SAT; i++) { reset=++rtk->ssat[i-1].outc>(unsigned int)rtk->opt.maxout; if (reset&&rtk->x[IB(i,0,&rtk->opt)]!=0.0) { initx(rtk,0.0,0.0,IB(i,0,&rtk->opt)); } if (rtk->opt.modear!=ARMODE_INST&&reset) { rtk->ssat[i-1].lock=-rtk->opt.minlock; } } /* reset phase-bias if detecting cycle slip */ for (i=0; i<ns; i++) { j=IB(sat[i],0,&rtk->opt); rtk->P[j+j*rtk->nx]+=rtk->opt.prn[0]*rtk->opt.prn[0]*tt; slip=rtk->ssat[sat[i]-1].slip; if (!(slip&1)) continue; rtk->x[j]=0.0; rtk->ssat[sat[i]-1].lock=-rtk->opt.minlock; } bias=zeros(ns,1); /* estimate approximate phase-bias by phase - code */ for (i=j=0,offset=0.0; i<ns; i++) { cp=sdobs(obs,iu[i],ir[i],0); /* cycle */ pr=sdobs(obs,iu[i],ir[i],1); if (cp==0.0||pr==0.0) continue; bias[i]=cp-pr*FREQ1/CLIGHT; if (rtk->x[IB(sat[i],0,&rtk->opt)]!=0.0) { offset+=bias[i]-rtk->x[IB(sat[i],0,&rtk->opt)]; j++; } } /* correct phase-bias offset to enssure phase-code coherency */ if (j>0) { for (i=1; i<=MAX_SAT; i++) { if (rtk->x[IB(i,0,&rtk->opt)]!=0.0) rtk->x[IB(i,0,&rtk->opt)]+=offset/j; } } /* set initial states of phase-bias */ for (i=0; i<ns; i++) { if (bias[i]==0.0||rtk->x[IB(sat[i],0,&rtk->opt)]!=0.0) continue; initx(rtk,bias[i],SQR(rtk->opt.std[0]),IB(sat[i],0,&rtk->opt)); } free(bias); }
/* temporal update of phase biases -------------------------------------------*/ static void udbias_ppp(rtk_t *rtk, const obsd_t *obs, int n, const nav_t *nav) { double meas[2],var[2],bias[MAXOBS]={0},offset=0.0,pos[3]={0}; int i,j,k,sat,brk=0; trace(3,"udbias : n=%d\n",n); for (i=0;i<MAXSAT;i++) for (j=0;j<rtk->opt.nf;j++) { rtk->ssat[i].slip[j]=0; } /* detect cycle slip by LLI */ detslp_ll(rtk,obs,n); /* detect cycle slip by geometry-free phase jump */ detslp_gf(rtk,obs,n,nav); /* reset phase-bias if expire obs outage counter */ for (i=0;i<MAXSAT;i++) { if (++rtk->ssat[i].outc[0]>(unsigned int)rtk->opt.maxout) { initx(rtk,0.0,0.0,IB(i+1,&rtk->opt)); } } ecef2pos(rtk->sol.rr,pos); for (i=k=0;i<n&&i<MAXOBS;i++) { sat=obs[i].sat; j=IB(sat,&rtk->opt); if (!corrmeas(obs+i,nav,pos,rtk->ssat[sat-1].azel,&rtk->opt,NULL,NULL, 0.0,meas,var,&brk)) continue; if (brk) { rtk->ssat[sat-1].slip[0]=1; trace(2,"%s: sat=%2d correction break\n",time_str(obs[i].time,0),sat); } bias[i]=meas[0]-meas[1]; if (rtk->x[j]==0.0|| rtk->ssat[sat-1].slip[0]||rtk->ssat[sat-1].slip[1]) continue; offset+=bias[i]-rtk->x[j]; k++; } /* correct phase-code jump to enssure phase-code coherency */ if (k>=2&&fabs(offset/k)>0.0005*CLIGHT) { for (i=0;i<MAXSAT;i++) { j=IB(i+1,&rtk->opt); if (rtk->x[j]!=0.0) rtk->x[j]+=offset/k; } trace(2,"phase-code jump corrected: %s n=%2d dt=%12.9fs\n", time_str(rtk->sol.time,0),k,offset/k/CLIGHT); } for (i=0;i<n&&i<MAXOBS;i++) { sat=obs[i].sat; j=IB(sat,&rtk->opt); rtk->P[j+j*rtk->nx]+=SQR(rtk->opt.prn[0])*fabs(rtk->tt); if (rtk->x[j]!=0.0&& !rtk->ssat[sat-1].slip[0]&&!rtk->ssat[sat-1].slip[1]) continue; if (bias[i]==0.0) continue; /* reinitialize phase-bias if detecting cycle slip */ initx(rtk,bias[i],VAR_BIAS,IB(sat,&rtk->opt)); trace(5,"udbias_ppp: sat=%2d bias=%.3f\n",sat,meas[0]-meas[1]); } }