Changeset 11099 in ntrip


Ignore:
Timestamp:
Oct 19, 2026, 10:30:14 AM (less than one hour ago)
Author:
stuerze
Message:

Combination: further improvements

Location:
trunk/BNC
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/CHANGELOG.md

    r11098 r11099  
    1111- ADDED: Combination: hourly report of AC satellites persistently rejected as outliers, and of satellites skipped because fewer than 2 ACs provide corrections
    1212- CHANGED: Combination: the orbits of a system come from the first stream in the table providing that system; after an outage of that stream, BNC switches back to it once it delivers again for 60 s (before, a single missing epoch moved the orbits permanently to another stream)
     13- CHANGED: Combination: the random walk of the AC satellite offsets is defined per time (1 cm per 10 s) instead of per epoch, so the result no longer depends on the sampling interval (at 5 s the offsets were sqrt(2) noisier per hour)
     14- CHANGED: Combination: an AC excluded from the clock datum because of inconsistent code biases is used again only after 12 passing checks in a row (1 hour), not after the first one (a borderline AC changed the clock datum every 5 minutes)
    1315- ADDED: Combination of APC (SSRA) and CoM (SSRC) streams together: with an ANTEX file the combination is done in the CoM frame, the orbits of the APC streams are converted to CoM; ACs not combined because of a different reference point are reported
    1416- ADDED: Option 'Reference Signals' (key ssrRefSignals): reference signals of the satellite clocks per GNSS for the combination (AC clock referral, code biases from the Bias SINEX file) and the SSR QC, default IGS Real-Time convention G:1W&2W R:1P&2P E:1C&5Q C:2I&6I J:1C&2L S:1C&5Q, e.g. for a switch of BDS to C1P/C5P or of QZSS to L1/L5
  • trunk/BNC/src/combination/bnccomb.cpp

    r11098 r11099  
    3434
    3535const double sig0_offACSat = 1000.0;
    36 const double sigP_offACSat =   0.01;
     36const double sigP_offACSat =   0.01; // per REF_SAMPL_offACSat, scaled with the time between the epochs
     37const double REF_SAMPL_offACSat = 10.0; // [s]
    3738
    3839const double sig0_clkSat   =  100.0;
    … …  
    11831184  // Prediction Step
    11841185  // ---------------
     1186  // The random walk of the AC satellite offsets is defined per time, not per
     1187  // epoch (sigP_offACSat per REF_SAMPL_offACSat seconds), so that the result
     1188  // does not depend on the combination sampling interval
     1189  double dt = _lastFilterEpoch[sys].valid() ? epoTime - _lastFilterEpoch[sys] : double(_cmbSampl);
     1190  if (dt <= 0.0) {
     1191    dt = double(_cmbSampl);
     1192  }
     1193  _lastFilterEpoch[sys] = epoTime;
    11851194  int nPar = _params[sys].size();
    11861195  ColumnVector x0(nPar);
    … …  
    11941203    }
    11951204    else {
    1196       _QQ[sys](iPar,iPar) += pp->sigP * pp->sigP;
     1205      double fac = (pp->type == cmbParam::offACSat) ? dt / REF_SAMPL_offACSat : 1.0;
     1206      _QQ[sys](iPar,iPar) += pp->sigP * pp->sigP * fac;
    11971207    }
    11981208    x0(iPar) = pp->xx;
    … …  
    13491359    double slope     = (sxx > 0.0) ? sxy / sxx : 0.0;
    13501360    double corrCoeff = (sxx > 0.0 && syy > 0.0) ? sxy / sqrt(sxx * syy) : 0.0;
     1361    // Hysteresis: a flagged AC is used for the clock datum again only after
     1362    // REINCLUDE_CHECKS passing checks in a row (1 hour). Right after the
     1363    // exclusion the offsets are reset and not yet converged, so a single
     1364    // passing check does not prove consistency; a borderline AC would
     1365    // otherwise change the clock datum every few minutes.
     1366    const int REINCLUDE_CHECKS = 12;
    13511367    if (spread < MIN_SPREAD || slope < MIN_SLOPE || corrCoeff < MIN_CORR) {
     1368      if (_biasInconsistent.contains(key) && ++_biasConsistentChecks[key] < REINCLUDE_CHECKS) {
     1369        continue;
     1370      }
     1371      _biasConsistentChecks.remove(key);
    13521372      if (_biasInconsistent.remove(key)) {
    13531373        QString msg = QString("%1 %2 code biases consistent with its clocks again, "
    … …  
    13721392                  .arg(acName).arg(sys).arg(refSig).arg(nn)
    13731393                  .arg(spread, 0, 'f', 3).arg(slope, 0, 'f', 2).arg(corrCoeff, 0, 'f', 2);
     1394    _biasConsistentChecks[key] = 0;
    13741395    if (!_biasInconsistent.contains(key)) {
    13751396      _biasInconsistent.insert(key);
  • trunk/BNC/src/combination/bnccomb.h

    r11098 r11099  
    257257  QMap<QString, bncTime>                     _biasCheckWarned; // last inconsistency warning per AC and system
    258258  QSet<QString>                              _biasInconsistent; // AC+system excluded from the clock datum
     259  QMap<QString, int>                         _biasConsistentChecks; // flagged AC+system: passing checks in a row
     260  QMap<char, bncTime>                        _lastFilterEpoch;      // per system: last epoch of the filter prediction
    259261  void checkBiasConsistency(bncTime epoTime, char sys, QTextStream& out);
    260262  void checkPersistentOutliers(bncTime epoTime, char sys, QTextStream& out);
Note: See TracChangeset for help on using the changeset viewer.