Changeset 10256 in ntrip for trunk/BNC/src/PPP/pppFilter.cpp
- Timestamp:
- Nov 25, 2023, 10:44:51 PM (10 months ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/BNC/src/PPP/pppFilter.cpp
r10254 r10256 86 86 // Status Vector, Variance-Covariance Matrix 87 87 // ----------------------------------------- 88 _xFltOld = _xFlt;89 _QFltOld = _QFlt;90 setStateVectorAndVarCovMatrix( setNeuNoiseToZero);88 ColumnVector xFltOld = _xFlt; 89 SymmetricMatrix QFltOld = _QFlt; 90 setStateVectorAndVarCovMatrix(xFltOld, QFltOld, setNeuNoiseToZero); 91 91 92 92 // Process Satellite Systems separately … … 167 167 for (unsigned ii = 0; ii < obsVector.size(); ii++) { 168 168 t_pppSatObs *obs = obsVector[ii]; 169 char sys = obs->prn().system(); 169 170 if (iOutlier == 0) { 170 171 obs->resetOutlier(); … … 184 185 AA[iObs][iPar] = par->partial(_epoTime, obs, tLC); 185 186 } 186 ll[iObs] = obs->obsValue(tLC) - obs->cmpValue(tLC) - DotProduct(_x0, AA.Row(iObs + 1)); 187 double offGlo = 0; 188 if (sys == 'R' && tLC != t_lc::MW) { 189 offGlo = PPP_CLIENT->offGlo(); 190 } 191 double offGal = 0; 192 if (sys == 'E' && tLC != t_lc::MW) { 193 offGal = PPP_CLIENT->offGal(); 194 } 195 double offBds = 0; 196 if (sys == 'C' && tLC != t_lc::MW) { 197 offBds = PPP_CLIENT->offBds(); 198 } 199 ll[iObs] = obs->obsValue(tLC) - offGlo - offGal - offBds - obs->cmpValue(tLC) - DotProduct(_x0, AA.Row(iObs + 1)); 187 200 PP[iObs] = 1.0 / (obs->sigma(tLC) * obs->sigma(tLC)); 188 201 } … … 192 205 // Check number of observations 193 206 // ---------------------------- 194 if ( !nSat) {207 if (nSat < 2) { 195 208 return failure; 196 209 } … … 201 214 for (unsigned ii = 0; ii < obsVector.size(); ii++) { 202 215 t_pppSatObs *obs = obsVector[ii]; 216 char sys = obs->prn().system(); 203 217 if (!obs->outlier()) { 204 218 for (unsigned jj = 0; jj < usedLCs; jj++) { … … 215 229 AA[iObs][iPar] = par->partial(_epoTime, obs, tLC); 216 230 } 217 ll[iObs] = obs->obsValue(tLC) - obs->cmpValue(tLC) - DotProduct(_x0, AA.Row(iObs + 1)); 231 double offGlo = 0; 232 if (sys == 'R' && tLC != t_lc::MW) { 233 offGlo = PPP_CLIENT->offGlo(); 234 } 235 double offGal = 0; 236 if (sys == 'E' && tLC != t_lc::MW) { 237 offGal = PPP_CLIENT->offGal(); 238 } 239 double offBds = 0; 240 if (sys == 'C' && tLC != t_lc::MW) { 241 offBds = PPP_CLIENT->offBds(); 242 } 243 ll[iObs] = obs->obsValue(tLC) - offGlo - offGal - offBds - obs->cmpValue(tLC) - DotProduct(_x0, AA.Row(iObs + 1)); 218 244 PP[iObs] = 1.0 / (obs->sigma(tLC) * obs->sigma(tLC)); 219 245 } … … 269 295 // if (par->ambResetCandidate()) { 270 296 resetAmb(obs->prn(), obsVector, maxOutlierLC, &QSav, &xSav); 271 adjustNoise(t_pppParam::ion, obs->prn(), 0.1, &QSav);272 297 // } 273 298 // else { … … 307 332 const vector<t_pppSatObs*> &obsVector) { 308 333 309 const double SLIP = 1000.0;334 const double SLIP = 20.0; 310 335 string epoTimeStr = string(_epoTime); 311 336 const vector<t_pppParam*> ¶ms = _parlist->params(); … … 316 341 for (unsigned iObs = 0; iObs < obsVector.size(); iObs++) { 317 342 const t_pppSatObs *obs = obsVector[iObs]; 343 char sys = obs->prn().system(); 318 344 319 345 // Check set Slips and Jump Counters … … 344 370 if (slip) { 345 371 resetAmb(obs->prn(), obsVector, tLC); 346 adjustNoise(t_pppParam::ion, obs->prn(), 0.1);347 } 348 349 / / Check Pre-Fit Residuals350 // ----------------------- 372 } 373 374 // Check Pre-Fit Residuals => switched off, because after a millisecond receiver clock jump, a cycle slip is detected for all satellites 375 /* ----------------------- 376 351 377 else { 352 378 ColumnVector AA(params.size()); … … 355 381 AA[iPar] = par->partial(_epoTime, obs, tLC); 356 382 } 357 358 double ll = obs->obsValue(tLC) - obs->cmpValue(tLC) - DotProduct(_x0, AA); 383 double offGlo = 0; 384 if (sys == 'R' && tLC != t_lc::MW) { 385 offGlo = PPP_CLIENT->offGlo(); 386 } 387 double offGal = 0; 388 if (sys == 'E' && tLC != t_lc::MW) { 389 offGal = PPP_CLIENT->offGal(); 390 } 391 double offBds = 0; 392 if (sys == 'C' && tLC != t_lc::MW) { 393 offBds = PPP_CLIENT->offBds(); 394 } 395 double ll = obs->obsValue(tLC) - offGlo - offGal - offBds - obs->cmpValue(tLC) - DotProduct(_x0, AA); 359 396 double vv = DotProduct(AA, _xFlt) - ll; 360 397 … … 363 400 << obs->prn().toString() << ' ' << setw(8) << setprecision(4) << vv << endl; 364 401 resetAmb(obs->prn(), obsVector, tLC); 365 adjustNoise(t_pppParam::ion, obs->prn(), 0.1); 366 } 367 } 402 } 403 }*/ 368 404 } 369 405 } … … 413 449 } 414 450 _x0[ind] = par->x0(); 415 return success; 416 } 417 } 418 419 return irc; 420 } 421 422 // Adjust process noise of individual parameters 423 //////////////////////////////////////////////////////////////////////////// 424 t_irc t_pppFilter::adjustNoise(t_pppParam::e_type parType, t_prn prn, double noise, 425 SymmetricMatrix *QSav) { 426 427 t_irc irc = failure; 428 vector<t_pppParam*>& params = _parlist->params(); 429 for (unsigned iPar = 0; iPar < params.size(); iPar++) { 430 t_pppParam *par = params[iPar]; 431 if (par->type() == parType && par->prn() == prn) { 432 int iOld = par->indexOld(); 433 int iNew = par->indexNew(); 434 LOG << string(_epoTime) << " ADJUSTNOISE " << prn.toString() << endl; 435 _QFlt[iNew][iNew] = _QFltOld[iOld][iOld] + noise * noise; 436 if (QSav) { 437 (*QSav)(iNew + 1, iNew + 1) = _QFlt(iNew + 1, iNew + 1); 438 } 439 return success; 440 } 441 } 451 irc = success; 452 } 453 } 454 442 455 return irc; 443 456 } … … 482 495 // 483 496 //////////////////////////////////////////////////////////////////////////// 484 void t_pppFilter::predictCovCrdPart( bool setNeuNoiseToZero) {497 void t_pppFilter::predictCovCrdPart(const SymmetricMatrix &QFltOld, bool setNeuNoiseToZero) { 485 498 486 499 const vector<t_pppParam*>& params = _parlist->params(); … … 513 526 double dt = _epoTime - _firstEpoTime; 514 527 if (dt < OPT->_seedingTime || setNeuNoiseToZero) { 515 _QFlt.SymSubMatrix(1, 3) = _QFltOld.SymSubMatrix(1, 3);528 _QFlt.SymSubMatrix(1, 3) = QFltOld.SymSubMatrix(1, 3); 516 529 } 517 530 else { 518 _QFlt.SymSubMatrix(1, 3) = _QFltOld.SymSubMatrix(1, 3) + Qxyz;531 _QFlt.SymSubMatrix(1, 3) = QFltOld.SymSubMatrix(1, 3) + Qxyz; 519 532 } 520 533 } … … 523 536 // 524 537 //////////////////////////////////////////////////////////////////////////// 525 void t_pppFilter::setStateVectorAndVarCovMatrix(bool setNeuNoiseToZero) { 538 void t_pppFilter::setStateVectorAndVarCovMatrix(const ColumnVector &xFltOld, 539 const SymmetricMatrix &QFltOld, 540 bool setNeuNoiseToZero) { 526 541 527 542 const vector<t_pppParam*>& params = _parlist->params(); … … 534 549 for (unsigned ii = 0; ii < nPar; ii++) { 535 550 t_pppParam *par1 = params[ii]; 536 if ( _QFltOld.size() == 0) {551 if (QFltOld.size() == 0) { 537 552 par1->resetIndex(); 538 553 } … … 542 557 _QFlt[ii][ii] = par1->sigma0() * par1->sigma0(); // new parameter 543 558 } else { 544 _QFlt[ii][ii] = _QFltOld[iOld][iOld] + par1->noise() * par1->noise();545 _xFlt[ii] = _xFltOld[iOld];559 _QFlt[ii][ii] = QFltOld[iOld][iOld] + par1->noise() * par1->noise(); 560 _xFlt[ii] = xFltOld[iOld]; 546 561 for (unsigned jj = 0; jj < ii; jj++) { 547 562 t_pppParam *par2 = params[jj]; 548 563 int jOld = par2->indexOld(); 549 564 if (jOld >= 0) { 550 _QFlt[ii][jj] = _QFltOld(iOld + 1, jOld + 1);551 } 552 } 553 } 554 } 555 predictCovCrdPart( setNeuNoiseToZero);556 } 557 565 _QFlt[ii][jj] = QFltOld(iOld + 1, jOld + 1); 566 } 567 } 568 } 569 } 570 predictCovCrdPart(QFltOld, setNeuNoiseToZero); 571 } 572
Note:
See TracChangeset
for help on using the changeset viewer.