Changeset 10791 in ntrip for trunk/BNC/src/PPP/pppFilter.cpp


Ignore:
Timestamp:
Dec 3, 2025, 5:37:16 PM (4 weeks ago)
Author:
mervart
Message:

BNC Multifrequency and PPPAR Client (initial version)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/BNC/src/PPP/pppFilter.cpp

    r10631 r10791  
    1616
    1717#include <iostream>
     18#include <sstream>
    1819#include <iomanip>
    1920#include <cmath>
     
    2829#include "pppStation.h"
    2930#include "pppClient.h"
     31#include "ambres.h"
    3032
    3133using namespace BNC_PPP;
     
    107109  }
    108110
    109   // close epoch processing
     111  // Dillution of Precision
    110112  // ----------------------
    111113  cmpDOP(allObs);
    112   _parlist->printResult(_epoTime, _QFlt, _xFlt);
     114 
     115  // Ambiguity Resolution
     116  // --------------------
     117  if (OPT->ambRes()) {
     118    AmbRes ambRes;
     119    ostringstream msg;
     120    ColumnVector    xFix     = _xFlt;
     121    SymmetricMatrix QFix     = _QFlt;
     122    double          fixRatio = 0.0;
     123    ambRes.run(_epoTime, _parlist->params(), QFix, xFix, fixRatio, msg);
     124    LOG << msg.str();
     125    _parlist->printResult(_epoTime, QFix, xFix, fixRatio);
     126  }
     127
     128  // Float Solution
     129  // --------------
     130  else {
     131    _parlist->printResult(_epoTime, _QFlt, _xFlt);
     132  }
     133
    113134  _lastEpoTimeOK = _epoTime; // remember time of last successful epoch processing
     135
    114136  return success;
    115137}
     
    117139// Process Selected LCs
    118140////////////////////////////////////////////////////////////////////////////
    119 t_irc t_pppFilter::processSystem(const vector<t_lc::type> &LCs,
     141t_irc t_pppFilter::processSystem(const vector<t_lc>& LCs,
    120142                                 const vector<t_pppSatObs*> &obsVector,
    121143                                 bool pseudoObsIonoAvailable) {
     
    158180    int iObs = -1;
    159181    vector<t_pppSatObs*> usedObs;
    160     vector<t_lc::type> usedTypes;
     182    vector<t_lc>        usedTypes;
    161183
    162184    // Real Observations
     
    171193        nSat++;
    172194        for (unsigned jj = 0; jj < usedLCs; jj++) {
    173           const t_lc::type tLC = LCs[jj];
    174           if (tLC == t_lc::GIM) {
     195          const t_lc LC = LCs[jj];
     196          if (LC._type == t_lc::GIM) {
     197            continue;
     198          }
     199          if (LC._frq1 == t_frequency::G5 && !obs->isValid(LC)) {
    175200            continue;
    176201          }
    177202          ++iObs;
    178203          usedObs.push_back(obs);
    179           usedTypes.push_back(tLC);
     204          usedTypes.push_back(LC);
    180205          for (unsigned iPar = 0; iPar < nPar; iPar++) {
    181206            const t_pppParam *par = params[iPar];
    182             AA[iObs][iPar] = par->partial(_epoTime, obs, tLC);
    183           }
    184 
    185           ll[iObs] = obs->obsValue(tLC) - obs->cmpValue(tLC) - DotProduct(_x0, AA.Row(iObs + 1));
    186           PP[iObs] = 1.0 / (obs->sigma(tLC) * obs->sigma(tLC));
     207            AA[iObs][iPar] = par->partial(_epoTime, obs, LC);
     208          }
     209
     210          ll[iObs] = obs->obsValue(LC) - obs->cmpValue(LC) - DotProduct(_x0, AA.Row(iObs + 1));
     211          PP[iObs] = 1.0 / (obs->sigma(LC) * obs->sigma(LC));
    187212        }
    188213      }
     
    202227        if (!obs->outlier()) {
    203228          for (unsigned jj = 0; jj < usedLCs; jj++) {
    204             const t_lc::type tLC = LCs[jj];
    205             if (tLC == t_lc::GIM) {
     229            const t_lc LC = LCs[jj];
     230            if (LC._type == t_lc::GIM) {
    206231              ++iObs;
    207232            } else {
     
    209234            }
    210235            usedObs.push_back(obs);
    211             usedTypes.push_back(tLC);
     236            usedTypes.push_back(LC);
    212237            for (unsigned iPar = 0; iPar < nPar; iPar++) {
    213238              const t_pppParam *par = params[iPar];
    214               AA[iObs][iPar] = par->partial(_epoTime, obs, tLC);
     239              AA[iObs][iPar] = par->partial(_epoTime, obs, LC);
    215240            }
    216             ll[iObs] = obs->obsValue(tLC) - obs->cmpValue(tLC) - DotProduct(_x0, AA.Row(iObs + 1));
    217             PP[iObs] = 1.0 / (obs->sigma(tLC) * obs->sigma(tLC));
     241            ll[iObs] = obs->obsValue(LC) - obs->cmpValue(LC) - DotProduct(_x0, AA.Row(iObs + 1));
     242            PP[iObs] = 1.0 / (obs->sigma(LC) * obs->sigma(LC));
    218243          }
    219244        }
     
    236261    double maxOutlier = 0.0;
    237262    int maxOutlierIndex = -1;
    238     t_lc::type maxOutlierLC = t_lc::dummy;
     263    t_lc maxOutlierLC;
    239264    for (unsigned ii = 0; ii < usedObs.size(); ii++) {
    240       const t_lc::type tLC = usedTypes[ii];
     265      const t_lc LC = usedTypes[ii];
    241266      double res = fabs(vv[ii]);
    242       if (res > usedObs[ii]->maxRes(tLC)) {
     267      if (res > usedObs[ii]->maxRes(LC)) {
    243268        if (res > fabs(maxOutlier)) {
    244269          maxOutlier = vv[ii];
    245270          maxOutlierIndex = ii;
    246           maxOutlierLC = tLC;
     271          maxOutlierLC = LC;
    247272        }
    248273      }
     
    254279      t_pppSatObs *obs = usedObs[maxOutlierIndex];
    255280      t_pppParam *par = 0;
    256       LOG << epoTimeStr << " Outlier " << t_lc::toString(maxOutlierLC) << ' '
     281      LOG << epoTimeStr << " Outlier " << maxOutlierLC.toString() << ' '
    257282          << obs->prn().toString() << ' ' << setw(8) << setprecision(4)
    258283          << maxOutlier << endl;
    259284      for (unsigned iPar = 0; iPar < nPar; iPar++) {
    260         t_pppParam *hlp = params[iPar];
     285        t_pppParam* hlp = params[iPar];
    261286        if (hlp->type() == t_pppParam::amb &&
    262287            hlp->prn()  == obs->prn() &&
    263             hlp->tLC()  == usedTypes[maxOutlierIndex]) {
     288            hlp->LC()   == usedTypes[maxOutlierIndex]) {
    264289          par = hlp;
    265290        }
     
    277302        for (unsigned jj = 0; jj < LCs.size(); jj++) {
    278303          for (unsigned ii = 0; ii < usedObs.size(); ii++) {
    279             const t_lc::type tLC = usedTypes[ii];
    280             t_pppSatObs *obs = usedObs[ii];
    281             if (tLC == LCs[jj]) {
    282               obs->setRes(tLC, vv[ii]);
     304            const t_lc LC = usedTypes[ii];
     305            t_pppSatObs* obs = usedObs[ii];
     306            if (LC == LCs[jj]) {
     307              obs->setRes(LC, vv[ii]);
    283308              LOG << epoTimeStr << " RES " << left << setw(3)
    284                   << t_lc::toString(tLC) << right << ' '
     309                  << LC.toString() << right << ' '
    285310                  << obs->prn().toString() << ' '
    286311                  << setw(8) << setprecision(4) << vv[ii] << endl;
     
    296321// Cycle-Slip Detection
    297322////////////////////////////////////////////////////////////////////////////
    298 t_irc t_pppFilter::detectCycleSlips(const vector<t_lc::type> &LCs,
     323t_irc t_pppFilter::detectCycleSlips(const vector<t_lc>& LCs,
    299324                                    const vector<t_pppSatObs*> &obsVector) {
    300325
     
    309334  SLIP *= fac;
    310335  string epoTimeStr = string(_epoTime);
    311   const vector<t_pppParam*> &params = _parlist->params();
    312336
    313337  for (unsigned ii = 0; ii < LCs.size(); ii++) {
    314     const t_lc::type &tLC = LCs[ii];
    315     if (t_lc::includesPhase(tLC)) {
     338    const t_lc& LC = LCs[ii];
     339    if (LC.includesPhase()) {
    316340      for (unsigned iObs = 0; iObs < obsVector.size(); iObs++) {
    317341        const t_pppSatObs *obs = obsVector[iObs];
     
    343367        // --------
    344368        if (slip) {
    345           resetAmb(obs->prn(), obsVector, tLC);
    346         }
    347 
    348         // Check Pre-Fit Residuals
    349         /* -----------------------
    350         else {
    351           ColumnVector AA(params.size());
    352           for (unsigned iPar = 0; iPar < params.size(); iPar++) {
    353             const t_pppParam* par = params[iPar];
    354             AA[iPar] = par->partial(_epoTime, obs, tLC);
    355           }
    356           double ll = obs->obsValue(tLC) - obs->cmpValue(tLC) - DotProduct(_x0, AA);
    357           double vv = DotProduct(AA, _xFlt) - ll;
    358 
    359           if (fabs(vv) > SLIP) {
    360             LOG << epoTimeStr << " cycle slip detected " << t_lc::toString(tLC) << ' '
    361                 << obs->prn().toString() << ' ' << setw(8) << setprecision(4) << vv << endl;
    362             resetAmb(obs->prn(), obsVector, tLC);
    363           }
    364         }*/
     369          resetAmb(obs->prn(), obsVector, t_lc());
     370        }
    365371      }
    366372    }
     
    371377// Reset Ambiguity Parameter (cycle slip)
    372378////////////////////////////////////////////////////////////////////////////
    373 t_irc t_pppFilter::resetAmb(const t_prn prn, const vector<t_pppSatObs*> &obsVector, t_lc::type lc,
     379t_irc t_pppFilter::resetAmb(const t_prn prn, const vector<t_pppSatObs*> &obsVector, t_lc lc,
    374380                            SymmetricMatrix *QSav, ColumnVector *xSav) {
    375381
     
    386392      (par->firstObsTime().undef()) ?
    387393        firstObsTime = lastObsTime : firstObsTime = par->firstObsTime();
    388       t_lc::type tLC = par->tLC();
    389       if (tLC != lc) {continue;}
     394      t_lc LC = par->LC();
     395      if (lc.valid() && LC != lc) {continue;}
    390396      LOG << string(_epoTime) << " RESET " << par->toString() << endl;
    391       delete par; par = new t_pppParam(t_pppParam::amb, prn, tLC, &obsVector);
     397      delete par; par = new t_pppParam(t_pppParam::amb, prn, LC, &obsVector);
    392398      par->setIndex(ind);
    393399      par->setFirstObsTime(firstObsTime);
     
    436442        for (unsigned iPar = 0; iPar < numPar; iPar++) {
    437443          t_pppParam* par = _parlist->params()[iPar];
    438           AA[_numSat - 1][iPar] = par->partial(_epoTime, obs, t_lc::c1);
     444          AA[_numSat - 1][iPar] = par->partial(_epoTime, obs, obs->rangeLC());
    439445          if      (par->type() == t_pppParam::crdX) {
    440446            parX = par;
Note: See TracChangeset for help on using the changeset viewer.