enhering

A smart data smoothing function.

Jul 2nd, 2013
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.01 KB | None | 0 0
  1. void SmoothData(mglData * cX, mglData * cY,
  2.                 mglData * cXAvg, mglData * cYAvg,
  3.                 mglData * cXStdDev, mglData * cYStdDev,
  4.                 double dThresholdX, double dThresholdY) {
  5.  
  6.   bool bAcquire = false;
  7.  
  8.   float fXSum = 0;
  9.   float fXSumSqr = 0;
  10.   float fXAvg = 0;
  11.   float fXStdDev = 0;
  12.  
  13.   float fYSum = 0;
  14.   float fYSumSqr = 0;
  15.   float fYAvg = 0;
  16.   float fYStdDev = 0;
  17.  
  18.   long nNumTempSamples = 0;
  19.   long nNumDataPoints = 0;
  20.  
  21.   float fStartX = cX->a[0];
  22.   float fStartY = cY->a[0];
  23.  
  24.   for (int nIndex = 0; nIndex <= cX->nx; nIndex++) {
  25.  
  26.     nNumTempSamples++;
  27.  
  28.     fXSum += cX->a[nIndex];
  29.     fYSum += cY->a[nIndex];
  30.    
  31.     fXSumSqr += cX->a[nIndex] * cX->a[nIndex];
  32.     fYSumSqr += cY->a[nIndex] * cY->a[nIndex];
  33.    
  34.     //printf("  Sample %ld: Pair: (%f, %f) Sum: (%f, %f) SumSqr: (%f, %f)\n",
  35.     //                                                            nNumTempSamples,
  36.     //                                                            cX->a[nIndex], cY->a[nIndex],
  37.     //                                                            fXSum, fYSum,
  38.     //                                                            fXSumSqr, fYSumSqr);
  39.    
  40.     if (nNumTempSamples == 1) {
  41.       fXAvg = cX->a[nIndex];
  42.       fYAvg = cY->a[nIndex];
  43.     }
  44.    
  45.     if (nNumTempSamples > 1) {
  46.       fXAvg = fXSum / nNumTempSamples;
  47.       fYAvg = fYSum / nNumTempSamples;
  48.     }
  49.     if (nNumTempSamples > 2) {
  50.       fXStdDev = sqrt((fXSumSqr - (fXSum * fXSum)/nNumTempSamples) / (nNumTempSamples - 1) );
  51.       fYStdDev = sqrt((fYSumSqr - (fYSum * fYSum)/nNumTempSamples) / (nNumTempSamples - 1) );
  52.     }
  53.    
  54.     //printf("  Avg: (%f, %f) StdDev(%f, %f) Start: (%f, %f)\n", fXAvg, fYAvg,
  55.     //                                                           fXStdDev, fYStdDev,
  56.     //                                                           fStartX, fStartY);
  57.     if (fXAvg > 1) {
  58.       if ( fabs((fXAvg - fStartX) ) > dThresholdX*10) {
  59.         bAcquire = true;
  60.       }
  61.     }
  62.     else {
  63.       if ( fabs((fXAvg - fStartX) ) > dThresholdX) {
  64.         bAcquire = true;
  65.       }
  66.     }
  67.     if ( fabs((fYAvg - fStartY) / fStartY) > dThresholdY) {
  68.       bAcquire = true;
  69.     }
  70.    
  71.     if (bAcquire) {
  72.       bAcquire = false;
  73.       nNumDataPoints++;
  74.      
  75.       cXAvg->Put(fXAvg, (nNumDataPoints -1) );
  76.       cXStdDev->Put(fXStdDev, (nNumDataPoints -1) );
  77.      
  78.       cYAvg->Put(fYAvg, (nNumDataPoints -1) );
  79.       cYStdDev->Put(fYStdDev, (nNumDataPoints -1) );
  80.      
  81.       //printf("  * New datapoint: (%f+-%f, %f+-%f)\n", fXAvg, fXStdDev, fYAvg, fYStdDev);
  82.      
  83.       nNumTempSamples = 0;
  84.      
  85.       fStartX = fXAvg;
  86.       fStartY = fYAvg;
  87.      
  88.       fXAvg = 0;
  89.       fXStdDev = 0;
  90.       fXSum = 0;
  91.       fXSumSqr = 0;
  92.      
  93.       fYAvg = 0;
  94.       fYStdDev = 0;
  95.       fYSum = 0;
  96.       fYSumSqr = 0;
  97.     }
  98.   }
  99.   cXAvg->Resize(nNumDataPoints);
  100.   cYAvg->Resize(nNumDataPoints);
  101.   cXStdDev->Resize(nNumDataPoints);
  102.   cXStdDev->Resize(nNumDataPoints);
  103. }
Advertisement
Add Comment
Please, Sign In to add comment