Skip to content

Commit 0a929ca

Browse files
Merge pull request #833 from ourairquality/readrnxclk-std-interp
readrnxclk: interpolate the standard deviations
2 parents bdb5af2 + bfd6491 commit 0a929ca

1 file changed

Lines changed: 44 additions & 11 deletions

File tree

src/rinex.c

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1558,34 +1558,33 @@ static int readrnxnav(FILE *fp, const char *opt, double ver, int sys,
15581558
/* read RINEX clock ----------------------------------------------------------*/
15591559
static int readrnxclk(FILE *fp, const char *opt, double ver, int index, nav_t *nav)
15601560
{
1561-
pclk_t *nav_pclk;
1562-
gtime_t time;
1563-
double data[2];
1564-
int i,j,sat,mask,off;
1565-
char buff[MAXRNXLEN],satid[8]="";
1566-
15671561
trace(3,"readrnxclk: index=%d\n", index);
15681562

15691563
if (!nav) return 0;
15701564

1565+
pclk_t *nav_pclk;
1566+
char buff[MAXRNXLEN];
15711567
/* set system mask */
1572-
mask=set_sysmask(opt);
1573-
off=ver>=3.04?5:0; /* format change for ver>=3.04 */
1568+
int mask=set_sysmask(opt);
1569+
int off=ver>=3.04?5:0; /* format change for ver>=3.04 */
15741570

15751571
while (fgets(buff,sizeof(buff),fp)) {
1576-
1572+
gtime_t time;
15771573
if (str2time(buff,8+off,26,&time)) {
15781574
trace(2,"rinex clk invalid epoch: %34.34s\n",buff);
15791575
continue;
15801576
}
1577+
char satid[8]="";
15811578
memcpy(satid,buff+3,4);
15821579

15831580
/* only read AS (satellite clock) record */
1581+
int sat;
15841582
if (strncmp(buff,"AS",2)||!(sat=satid2no(satid))) continue;
15851583

15861584
if (!(satsys(sat,NULL)&mask)) continue;
15871585

1588-
for (i=0,j=40+off;i<2;i++,j+=20) data[i]=str2num(buff,j,19);
1586+
double data[2];
1587+
for (int i=0,j=40+off;i<2;i++,j+=20) data[i]=str2num(buff,j,19);
15891588

15901589
if (nav->nc>=nav->ncmax) {
15911590
nav->ncmax+=1024;
@@ -1600,14 +1599,48 @@ static int readrnxclk(FILE *fp, const char *opt, double ver, int index, nav_t *n
16001599
nav->nc++;
16011600
nav->pclk[nav->nc-1].time =time;
16021601
nav->pclk[nav->nc-1].index=index;
1603-
for (i=0;i<MAXSAT;i++) {
1602+
for (int i=0;i<MAXSAT;i++) {
16041603
nav->pclk[nav->nc-1].clk[i][0]=0.0;
16051604
nav->pclk[nav->nc-1].std[i][0]=0.0f;
16061605
}
16071606
}
16081607
nav->pclk[nav->nc-1].clk[sat-1][0]=data[0];
16091608
nav->pclk[nav->nc-1].std[sat-1][0]=(float)data[1];
16101609
}
1610+
1611+
// Interpolate the standard deviations. The standard deviations can be
1612+
// supplied at a lower rate than the clock biases, e.g. 30 sec biases with
1613+
// 5 minute standard deviations.
1614+
for (int k = 0; k < MAXSAT; k++) {
1615+
int last_std_idx = -1;
1616+
for (int i = 0; i < nav->nc; i++) {
1617+
double std = nav->pclk[i].std[k][0];
1618+
if (std > 0) {
1619+
if (last_std_idx < 0) {
1620+
for (int j = 0; j < i; j++)
1621+
if (nav->pclk[j].clk[k][0] != 0) nav->pclk[j].std[k][0] = std;
1622+
} else {
1623+
// Linear interpolation of the variance.
1624+
for (int j = last_std_idx + 1; j < i; j++) {
1625+
if (nav->pclk[j].clk[k][0] != 0) {
1626+
double last_std = nav->pclk[last_std_idx].std[k][0];
1627+
double t0 = timediff(nav->pclk[j].time, nav->pclk[last_std_idx].time);
1628+
double t1 = timediff(nav->pclk[j].time, nav->pclk[i].time);
1629+
double var = (SQR(std) * t0 - SQR(last_std) * t1) / (t0 - t1);
1630+
nav->pclk[j].std[k][0] = (float)sqrt(var);
1631+
}
1632+
}
1633+
}
1634+
last_std_idx = i;
1635+
}
1636+
}
1637+
if (last_std_idx >= 0) {
1638+
double last_std = nav->pclk[last_std_idx].std[k][0];
1639+
for (int j = last_std_idx + 1; j < nav->nc; j++)
1640+
if (nav->pclk[j].clk[k][0] != 0) nav->pclk[j].std[k][0] = last_std;
1641+
}
1642+
}
1643+
16111644
return nav->nc>0;
16121645
}
16131646
/* read RINEX file -----------------------------------------------------------*/

0 commit comments

Comments
 (0)