@@ -1558,34 +1558,33 @@ static int readrnxnav(FILE *fp, const char *opt, double ver, int sys,
15581558/* read RINEX clock ----------------------------------------------------------*/
15591559static 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