00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include <math.h>
00024 #include <float.h>
00025 #include <stdio.h>
00026
00027 #ifdef USE_GSL
00028 #include <gsl/gsl_sort_float.h>
00029 #include <gsl/gsl_sort_double.h>
00030 #endif
00031
00032 #include "RemoveNoise.hh"
00033
00034
00035 clSortedArray::clSortedArray ()
00036 {
00037 lFrontSerial = 0;
00038 lTailSerial = 0;
00039 }
00040
00041
00042 clSortedArray::~clSortedArray ()
00043 {
00044 }
00045
00046
00047 void clSortedArray::Initialize (const float *fpValues, long lValueCount)
00048 {
00049 long lValueCntr;
00050
00051 Clear();
00052
00053 DataType = TYPE_FLOAT;
00054 for (lValueCntr = 0; lValueCntr < lValueCount; lValueCntr++)
00055 InsertTail(fpValues[lValueCntr]);
00056 }
00057
00058
00059 void clSortedArray::InsertTail (float fValue)
00060 {
00061 mapValuesf[fValue] = lTailSerial;
00062 lTailSerial++;
00063 }
00064
00065
00066 void clSortedArray::RemoveHead ()
00067 {
00068 if (DataType == TYPE_FLOAT)
00069 {
00070 ValueMapf_t::iterator iterValues;
00071
00072 iterValues = mapValuesf.begin();
00073 while (iterValues != mapValuesf.end())
00074 {
00075 if ((*iterValues).second == lFrontSerial)
00076 {
00077 mapValuesf.erase(iterValues);
00078 lFrontSerial++;
00079 break;
00080 }
00081 iterValues++;
00082 }
00083 }
00084 }
00085
00086
00087 void clSortedArray::GetValues (float *fpValues, long lValueSize)
00088 {
00089 long lDestCntr = 0;
00090
00091 if (lValueSize != GetSize())
00092 throw clXSortedArray(
00093 "clSortedArray::GetValues(): lValueSize != GetSize()");
00094
00095 if (DataType == TYPE_FLOAT)
00096 {
00097 ValueMapf_t::iterator iterValues;
00098
00099 iterValues = mapValuesf.begin();
00100 while (iterValues != mapValuesf.end())
00101 {
00102 fpValues[lDestCntr++] = (*iterValues).first;
00103 iterValues++;
00104 }
00105 }
00106 }
00107
00108
00109 long clSortedArray::GetSize ()
00110 {
00111 switch (DataType)
00112 {
00113 case TYPE_DOUBLE:
00114 return ((long) mapValues.size());
00115 case TYPE_FLOAT:
00116 return ((long) mapValuesf.size());
00117 }
00118 throw clXSortedArray("clSortedArray::GetSize(): internal datatype error");
00119 }
00120
00121
00122 void clSortedArray::Clear ()
00123 {
00124 mapValues.clear();
00125 mapValuesf.clear();
00126 lFrontSerial = 0;
00127 lTailSerial = 0;
00128 }
00129
00130
00131 inline void clRemoveNoise::GetPosSize (long *lpStartIdx, long *lpMeanCount,
00132 long lCenter, long lMeanLength, long lWinLength)
00133 {
00134 long lHalfMeanLen;
00135 long lEndIdx;
00136
00137 lHalfMeanLen = lMeanLength / 2L;
00138 *lpStartIdx = lCenter - lHalfMeanLen;
00139 if (*lpStartIdx < 0L) *lpStartIdx = 0L;
00140 lEndIdx = lCenter + lHalfMeanLen;
00141 if (lEndIdx >= lWinLength) lEndIdx = lWinLength - 1L;
00142 *lpMeanCount = lEndIdx - *lpStartIdx + 1L;
00143 }
00144
00145
00146 inline void clRemoveNoise::GetPosSize1 (long *lpStartIdx, long *lpMeanCount,
00147 long lCenter, long lMeanLength, long lGapLength, long lWinLength)
00148 {
00149 long lHalfMeanLen;
00150 long lHalfGapLen;
00151 long lEndIdx;
00152
00153 lHalfMeanLen = lMeanLength / 2L;
00154 lHalfGapLen = (lGapLength + 1L) / 2L;
00155 *lpStartIdx = lCenter - lHalfGapLen - lHalfMeanLen;
00156 if (*lpStartIdx < 0L) *lpStartIdx = 0L;
00157 lEndIdx = lCenter - lHalfGapLen;
00158 if (lEndIdx < 0L) lEndIdx = 0L;
00159 *lpMeanCount = lEndIdx - *lpStartIdx + 1L;
00160 }
00161
00162
00163 inline void clRemoveNoise::GetPosSize2 (long *lpStartIdx, long *lpMeanCount,
00164 long lCenter, long lMeanLength, long lGapLength, long lWinLength)
00165 {
00166 long lHalfMeanLen;
00167 long lHalfGapLen;
00168 long lEndIdx;
00169
00170 lHalfMeanLen = lMeanLength / 2L;
00171 lHalfGapLen = (lGapLength + 1L) / 2L;
00172 *lpStartIdx = lCenter + lHalfGapLen;
00173 if (*lpStartIdx >= lWinLength) *lpStartIdx = lWinLength - 1L;
00174 lEndIdx = lCenter + lHalfGapLen + lHalfMeanLen;
00175 if (lEndIdx >= lWinLength) lEndIdx = lWinLength - 1L;
00176 *lpMeanCount = lEndIdx - *lpStartIdx + 1L;
00177 }
00178
00179
00180 inline long clRemoveNoise::GetAlphaMedian (const float *fpSrc, float fAlpha,
00181 long lLength)
00182 {
00183 long lAlphaMedian;
00184 float fMedian;
00185
00186 fMedian = ((lLength % 2L) != 0L) ?
00187 fpSrc[(lLength - 1L) / 2L] :
00188 (0.5F * (fpSrc[lLength / 2L - 1L] + fpSrc[lLength / 2L]));
00189 for (lAlphaMedian = lLength / 2L - 1L;
00190 lAlphaMedian < lLength;
00191 lAlphaMedian++)
00192 {
00193 if (fpSrc[lAlphaMedian] > (fAlpha * fMedian)) return lAlphaMedian;
00194 }
00195 return lLength;
00196 }
00197
00198
00199 inline long clRemoveNoise::GetAlphaMedian (const double *dpSrc, double dAlpha,
00200 long lLength)
00201 {
00202 long lAlphaMedian;
00203 double dMedian;
00204
00205 dMedian = ((lLength % 2L) != 0L) ?
00206 dpSrc[(lLength - 1L) / 2L] :
00207 (0.5 * (dpSrc[lLength / 2L - 1L] + dpSrc[lLength / 2L]));
00208 for (lAlphaMedian = lLength / 2L - 1L;
00209 lAlphaMedian < lLength;
00210 lAlphaMedian++)
00211 {
00212 if (dpSrc[lAlphaMedian] > (dAlpha * dMedian)) return lAlphaMedian;
00213 }
00214 return lLength;
00215 }
00216
00217
00218 clRemoveNoise::clRemoveNoise ()
00219 {
00220 lPrevSize = 0L;
00221 }
00222
00223
00224 clRemoveNoise::~clRemoveNoise ()
00225 {
00226 }
00227
00228
00229 void clRemoveNoise::TPSW (float *fpVect, float fAlpha, long lMeanLength,
00230 long lGapLength, long lLength)
00231 {
00232 long lLoopCntr;
00233 long lStartIdx;
00234 long lMeanCount;
00235 float fTempMean;
00236 #ifdef __GNUG__
00237 float fpClippedMean[lLength];
00238 #else
00239 clDSPAlloc ClippedMean;
00240 float *fpClippedMean = (float *)
00241 ClippedMean.Size(lLength * sizeof(float));
00242 #endif
00243
00244 for (lLoopCntr = 0; lLoopCntr < lLength; lLoopCntr++)
00245 {
00246 GetPosSize1(&lStartIdx, &lMeanCount, lLoopCntr, lMeanLength,
00247 lGapLength, lLength);
00248 fTempMean = Mean(&fpVect[lStartIdx], lMeanCount);
00249 GetPosSize2(&lStartIdx, &lMeanCount, lLoopCntr, lMeanLength,
00250 lGapLength, lLength);
00251 fTempMean += Mean(&fpVect[lStartIdx], lMeanCount);
00252 fTempMean *= 0.5f;
00253 fpClippedMean[lLoopCntr] =
00254 (fpVect[lLoopCntr] > (fAlpha * fTempMean)) ?
00255 fTempMean : fpVect[lLoopCntr];
00256 }
00257 for (lLoopCntr = 0; lLoopCntr < lLength; lLoopCntr++)
00258 {
00259 GetPosSize1(&lStartIdx, &lMeanCount, lLoopCntr, lMeanLength,
00260 lGapLength, lLength);
00261 fTempMean = Mean(&fpClippedMean[lStartIdx], lMeanCount);
00262 GetPosSize2(&lStartIdx, &lMeanCount, lLoopCntr, lMeanLength,
00263 lGapLength, lLength);
00264 fTempMean += Mean(&fpClippedMean[lStartIdx], lMeanCount);
00265 fTempMean *= 0.5f;
00266 fpVect[lLoopCntr] = (fTempMean != 0.0f) ?
00267 (fpVect[lLoopCntr] - fTempMean) / fTempMean : 0.0f;
00268 }
00269 }
00270
00271
00272 void clRemoveNoise::TPSW (double *dpVect, double dAlpha, long lMeanLength,
00273 long lGapLength, long lLength)
00274 {
00275 long lLoopCntr;
00276 long lStartIdx;
00277 long lMeanCount;
00278 double dTempMean;
00279 #ifdef __GNUG__
00280 double dpClippedMean[lLength];
00281 #else
00282 clDSPAlloc ClippedMean;
00283 double *dpClippedMean = (double *)
00284 ClippedMean.Size(lLength * sizeof(double));
00285 #endif
00286
00287 for (lLoopCntr = 0; lLoopCntr < lLength; lLoopCntr++)
00288 {
00289 GetPosSize1(&lStartIdx, &lMeanCount, lLoopCntr, lMeanLength,
00290 lGapLength, lLength);
00291 dTempMean = Mean(&dpVect[lStartIdx], lMeanCount);
00292 GetPosSize2(&lStartIdx, &lMeanCount, lLoopCntr, lMeanLength,
00293 lGapLength, lLength);
00294 dTempMean += Mean(&dpVect[lStartIdx], lMeanCount);
00295 dTempMean *= 0.5;
00296 dpClippedMean[lLoopCntr] =
00297 (dpVect[lLoopCntr] > (dAlpha * dTempMean)) ?
00298 dTempMean : dpVect[lLoopCntr];
00299 }
00300 for (lLoopCntr = 0; lLoopCntr < lLength; lLoopCntr++)
00301 {
00302 GetPosSize1(&lStartIdx, &lMeanCount, lLoopCntr, lMeanLength,
00303 lGapLength, lLength);
00304 dTempMean = Mean(&dpClippedMean[lStartIdx], lMeanCount);
00305 GetPosSize2(&lStartIdx, &lMeanCount, lLoopCntr, lMeanLength,
00306 lGapLength, lLength);
00307 dTempMean += Mean(&dpClippedMean[lStartIdx], lMeanCount);
00308 dTempMean *= 0.5;
00309 dpVect[lLoopCntr] = (dTempMean != 0.0) ?
00310 (dpVect[lLoopCntr] - dTempMean) / dTempMean : 0.0;
00311 }
00312 }
00313
00314
00315 void clRemoveNoise::TPSW (float *fpDest, const float *fpSrc, float fAlpha,
00316 long lMeanLength, long lGapLength, long lLength)
00317 {
00318 long lLoopCntr;
00319 long lStartIdx;
00320 long lMeanCount;
00321 float fTempMean;
00322 #ifdef __GNUG__
00323 float fpClippedMean[lLength];
00324 #else
00325 clDSPAlloc ClippedMean;
00326 float *fpClippedMean = (float *)
00327 ClippedMean.Size(lLength * sizeof(float));
00328 #endif
00329
00330 for (lLoopCntr = 0; lLoopCntr < lLength; lLoopCntr++)
00331 {
00332 GetPosSize1(&lStartIdx, &lMeanCount, lLoopCntr, lMeanLength,
00333 lGapLength, lLength);
00334 fTempMean = Mean(&fpSrc[lStartIdx], lMeanCount);
00335 GetPosSize2(&lStartIdx, &lMeanCount, lLoopCntr, lMeanLength,
00336 lGapLength, lLength);
00337 fTempMean += Mean(&fpSrc[lStartIdx], lMeanCount);
00338 fTempMean *= 0.5f;
00339 fpClippedMean[lLoopCntr] =
00340 (fpSrc[lLoopCntr] > (fAlpha * fTempMean)) ?
00341 fTempMean : fpSrc[lLoopCntr];
00342 }
00343 for (lLoopCntr = 0; lLoopCntr < lLength; lLoopCntr++)
00344 {
00345 GetPosSize1(&lStartIdx, &lMeanCount, lLoopCntr, lMeanLength,
00346 lGapLength, lLength);
00347 fTempMean = Mean(&fpClippedMean[lStartIdx], lMeanCount);
00348 GetPosSize2(&lStartIdx, &lMeanCount, lLoopCntr, lMeanLength,
00349 lGapLength, lLength);
00350 fTempMean += Mean(&fpClippedMean[lStartIdx], lMeanCount);
00351 fTempMean *= 0.5f;
00352 fpDest[lLoopCntr] = (fTempMean != 0.0f) ?
00353 (fpSrc[lLoopCntr] - fTempMean) / fTempMean : 0.0f;
00354 }
00355 }
00356
00357
00358 void clRemoveNoise::TPSW (double *dpDest, const double *dpSrc, double dAlpha,
00359 long lMeanLength, long lGapLength, long lLength)
00360 {
00361 long lLoopCntr;
00362 long lStartIdx;
00363 long lMeanCount;
00364 double dTempMean;
00365 #ifdef __GNUG__
00366 double dpClippedMean[lLength];
00367 #else
00368 clDSPAlloc ClippedMean;
00369 double *dpClippedMean = (double *)
00370 ClippedMean.Size(lLength * sizeof(double));
00371 #endif
00372
00373 for (lLoopCntr = 0; lLoopCntr < lLength; lLoopCntr++)
00374 {
00375 GetPosSize1(&lStartIdx, &lMeanCount, lLoopCntr, lMeanLength,
00376 lGapLength, lLength);
00377 dTempMean = Mean(&dpSrc[lStartIdx], lMeanCount);
00378 GetPosSize2(&lStartIdx, &lMeanCount, lLoopCntr, lMeanLength,
00379 lGapLength, lLength);
00380 dTempMean += Mean(&dpSrc[lStartIdx], lMeanCount);
00381 dTempMean *= 0.5;
00382 dpClippedMean[lLoopCntr] =
00383 (dpSrc[lLoopCntr] > (dAlpha * dTempMean)) ?
00384 dTempMean : dpSrc[lLoopCntr];
00385 }
00386 for (lLoopCntr = 0; lLoopCntr < lLength; lLoopCntr++)
00387 {
00388 GetPosSize1(&lStartIdx, &lMeanCount, lLoopCntr, lMeanLength,
00389 lGapLength, lLength);
00390 dTempMean = Mean(&dpClippedMean[lStartIdx], lMeanCount);
00391 GetPosSize2(&lStartIdx, &lMeanCount, lLoopCntr, lMeanLength,
00392 lGapLength, lLength);
00393 dTempMean += Mean(&dpClippedMean[lStartIdx], lMeanCount);
00394 dTempMean *= 0.5;
00395 dpDest[lLoopCntr] = (dTempMean != 0.0) ?
00396 (dpSrc[lLoopCntr] - dTempMean) / dTempMean : 0.0;
00397 }
00398 }
00399
00400
00401 void clRemoveNoise::OTA (float *fpVect, float fAlpha, long lMeanLength,
00402 long lLength)
00403 {
00404 long lLoopCntr;
00405 long lStartIdx;
00406 long lMedianCount;
00407 long lMeanCount;
00408 float fTempMean;
00409 #ifdef __GNUG__
00410 float fpTempWin[lMeanLength];
00411 float fpNoiseMean[lLength];
00412 #else
00413 clDSPAlloc TempWin;
00414 clDSPAlloc NoiseMean;
00415 float *fpTempWin = (float *)
00416 TempWin.Size(lMeanLength * sizeof(float));
00417 float *fpNoiseMean = (float *)
00418 NoiseMean.Size(lLength * sizeof(float));
00419 #endif
00420
00421 for (lLoopCntr = 0; lLoopCntr < lLength; lLoopCntr++)
00422 {
00423 GetPosSize(&lStartIdx, &lMedianCount, lLoopCntr, lMeanLength,
00424 lLength);
00425 Copy(fpTempWin, &fpVect[lStartIdx], lMedianCount);
00426 #ifndef USE_GSL
00427 Sort(fpTempWin, lMedianCount);
00428 #else
00429 gsl_sort_float(fpTempWin, 1, lMedianCount);
00430 #endif
00431 lMeanCount = GetAlphaMedian(fpTempWin, fAlpha, lMedianCount);
00432 fpNoiseMean[lLoopCntr] = Mean(fpTempWin, lMeanCount);
00433 }
00434 for (lLoopCntr = 0; lLoopCntr < lLength; lLoopCntr++)
00435 {
00436 fTempMean = fpNoiseMean[lLoopCntr];
00437 fpVect[lLoopCntr] = (fTempMean != 0.0f) ?
00438 (fpVect[lLoopCntr] - fTempMean) / fTempMean : 0.0f;
00439 }
00440 }
00441
00442
00443 void clRemoveNoise::OTA (double *dpVect, double dAlpha, long lMeanLength,
00444 long lLength)
00445 {
00446 long lLoopCntr;
00447 long lStartIdx;
00448 long lMedianCount;
00449 long lMeanCount;
00450 double dTempMean;
00451 #ifdef __GNUG__
00452 double dpTempWin[lMeanLength];
00453 double dpNoiseMean[lLength];
00454 #else
00455 clDSPAlloc TempWin;
00456 clDSPAlloc NoiseMean;
00457 double *dpTempWin = (double *)
00458 TempWin.Size(lMeanLength * sizeof(double));
00459 double *dpNoiseMean = (double *)
00460 TempWin.Size(lLength * sizeof(double));
00461 #endif
00462
00463 for (lLoopCntr = 0; lLoopCntr < lLength; lLoopCntr++)
00464 {
00465 GetPosSize(&lStartIdx, &lMedianCount, lLoopCntr, lMeanLength,
00466 lLength);
00467 Copy(dpTempWin, &dpVect[lStartIdx], lMedianCount);
00468 #ifndef USE_GSL
00469 Sort(dpTempWin, lMedianCount);
00470 #else
00471 gsl_sort(dpTempWin, 1, lMedianCount);
00472 #endif
00473 lMeanCount = GetAlphaMedian(dpTempWin, dAlpha, lMedianCount);
00474 dpNoiseMean[lLoopCntr] = Mean(dpTempWin, lMeanCount);
00475 }
00476 for (lLoopCntr = 0; lLoopCntr < lLength; lLoopCntr++)
00477 {
00478 dTempMean = dpNoiseMean[lLoopCntr];
00479 dpVect[lLoopCntr] = (dTempMean != 0.0) ?
00480 (dpVect[lLoopCntr] - dTempMean) / dTempMean : 0.0;
00481 }
00482 }
00483
00484
00485 void clRemoveNoise::OTA (float *fpDest, const float *fpSrc, float fAlpha,
00486 long lMeanLength, long lLength)
00487 {
00488 long lLoopCntr;
00489 long lStartIdx;
00490 long lMedianCount;
00491 long lMeanCount;
00492 float fTempMean;
00493 #ifdef __GNUG__
00494 float fpTempWin[lMeanLength];
00495 #else
00496 clDSPAlloc TempWin;
00497 float *fpTempWin = (float *)
00498 TempWin.Size(lMeanLength * sizeof(float));
00499 #endif
00500
00501 for (lLoopCntr = 0; lLoopCntr < lLength; lLoopCntr++)
00502 {
00503 GetPosSize(&lStartIdx, &lMedianCount, lLoopCntr, lMeanLength,
00504 lLength);
00505 Copy(fpTempWin, &fpSrc[lStartIdx], lMedianCount);
00506 #ifndef USE_GSL
00507 Sort(fpTempWin, lMedianCount);
00508 #else
00509 gsl_sort_float(fpTempWin, 1, lMedianCount);
00510 #endif
00511 lMeanCount = GetAlphaMedian(fpTempWin, fAlpha, lMedianCount);
00512 fTempMean = Mean(fpTempWin, lMeanCount);
00513 fpDest[lLoopCntr] = (fTempMean != 0.0f) ?
00514 (fpSrc[lLoopCntr] - fTempMean) / fTempMean : 0.0f;
00515 }
00516 }
00517
00518
00519 void clRemoveNoise::OTA (double *dpDest, const double *dpSrc, double dAlpha,
00520 long lMeanLength, long lLength)
00521 {
00522 long lLoopCntr;
00523 long lStartIdx;
00524 long lMedianCount;
00525 long lMeanCount;
00526 double dTempMean;
00527 #ifdef __GNUG__
00528 double dpTempWin[lMeanLength];
00529 #else
00530 clDSPAlloc TempWin;
00531 double *dpTempWin = (double *)
00532 TempWin.Size(lMeanLength * sizeof(double));
00533 #endif
00534
00535 for (lLoopCntr = 0; lLoopCntr < lLength; lLoopCntr++)
00536 {
00537 GetPosSize(&lStartIdx, &lMedianCount, lLoopCntr, lMeanLength,
00538 lLength);
00539 Copy(dpTempWin, &dpSrc[lStartIdx], lMedianCount);
00540 #ifndef USE_GSL
00541 Sort(dpTempWin, lMedianCount);
00542 #else
00543 gsl_sort(dpTempWin, 1, lMedianCount);
00544 #endif
00545 lMeanCount = GetAlphaMedian(dpTempWin, dAlpha, lMedianCount);
00546 dTempMean = Mean(dpTempWin, lMeanCount);
00547 dpDest[lLoopCntr] = (dTempMean != 0.0) ?
00548 (dpSrc[lLoopCntr] - dTempMean) / dTempMean : 0.0;
00549 }
00550 }
00551
00552
00553 void clRemoveNoise::Diff (float *fpVect, float fWeight, long lLength)
00554 {
00555 float *fpPrev;
00556 #ifdef __GNUG__
00557 float fpWork[lLength];
00558 #else
00559 clDSPAlloc Work;
00560 float *fpWork = (float *) Work.Size(lLength * sizeof(float));
00561 #endif
00562
00563 if (lLength != lPrevSize)
00564 {
00565 PrevBuf.Size(lLength * sizeof(float));
00566 Zero((float *) PrevBuf, lLength);
00567 lPrevSize = lLength;
00568 }
00569 fpPrev = PrevBuf;
00570
00571 Sub(fpWork, fpVect, fpPrev, lLength);
00572 Abs(fpWork, lLength);
00573
00574 Mul(fpVect, fWeight, lLength);
00575 Mul(fpPrev, 1.0f - fWeight, lLength);
00576 Add(fpPrev, fpVect, lLength);
00577
00578 Copy(fpVect, fpWork, lLength);
00579 }
00580
00581
00582 void clRemoveNoise::Diff (double *dpVect, double dWeight, long lLength)
00583 {
00584 double *dpPrev;
00585 #ifdef __GNUG__
00586 double dpWork[lLength];
00587 #else
00588 clDSPAlloc Work;
00589 double *dpWork = (double *) Work.Size(lLength * sizeof(double));
00590 #endif
00591
00592 if (lLength != lPrevSize)
00593 {
00594 PrevBuf.Size(lLength * sizeof(double));
00595 Zero((double *) PrevBuf, lLength);
00596 lPrevSize = lLength;
00597 }
00598 dpPrev = PrevBuf;
00599
00600 Sub(dpWork, dpVect, dpPrev, lLength);
00601 Abs(dpWork, lLength);
00602
00603 Mul(dpVect, dWeight, lLength);
00604 Mul(dpPrev, 1.0 - dWeight, lLength);
00605 Add(dpPrev, dpVect, lLength);
00606
00607 Copy(dpVect, dpWork, lLength);
00608 }
00609
00610
00611 void clRemoveNoise::Diff (float *fpDest, const float *fpSrc, float fWeight,
00612 long lLength)
00613 {
00614 float *fpPrev;
00615 #ifdef __GNUG__
00616 float fpAvgWork[lLength];
00617 #else
00618 clDSPAlloc AvgWork;
00619 float *fpAvgWork = (float *) AvgWork.Size(lLength * sizeof(float));
00620 #endif
00621
00622 if (lLength != lPrevSize)
00623 {
00624 PrevBuf.Size(lLength * sizeof(float));
00625 Zero((float *) PrevBuf, lLength);
00626 lPrevSize = lLength;
00627 }
00628 fpPrev = PrevBuf;
00629
00630 Sub(fpDest, fpSrc, fpPrev, lLength);
00631 Abs(fpDest, lLength);
00632
00633 Copy(fpAvgWork, fpSrc, lLength);
00634 Mul(fpAvgWork, fWeight, lLength);
00635 Mul(fpPrev, 1.0f - fWeight, lLength);
00636 Add(fpPrev, fpAvgWork, lLength);
00637 }
00638
00639
00640 void clRemoveNoise::Diff (double *dpDest, const double *dpSrc, double dWeight,
00641 long lLength)
00642 {
00643 double *dpPrev;
00644 #ifdef __GNUG__
00645 double dpAvgWork[lLength];
00646 #else
00647 clDSPAlloc AvgWork;
00648 double *dpAvgWork = (double *) AvgWork.Size(lLength * sizeof(double));
00649 #endif
00650
00651 if (lLength != lPrevSize)
00652 {
00653 PrevBuf.Size(lLength * sizeof(double));
00654 Zero((double *) PrevBuf, lLength);
00655 lPrevSize = lLength;
00656 }
00657 dpPrev = PrevBuf;
00658
00659 Sub(dpDest, dpSrc, dpPrev, lLength);
00660 Abs(dpDest, lLength);
00661
00662 Copy(dpAvgWork, dpSrc, lLength);
00663 Mul(dpAvgWork, dWeight, lLength);
00664 Mul(dpPrev, 1.0 - dWeight, lLength);
00665 Add(dpPrev, dpAvgWork, lLength);
00666 }
00667
00668
00669 void clRemoveNoise::InvDiff (float *fpVect, float fWeight, long lLength)
00670 {
00671 float fMin;
00672 float fMax;
00673 float fAdj;
00674 float *fpPrev;
00675 #ifdef __GNUG__
00676 float fpWork[lLength];
00677 #else
00678 clDSPAlloc Work;
00679 float *fpWork = (float *) Work.Size(lLength * sizeof(float));
00680 #endif
00681
00682 if (lLength != lPrevSize)
00683 {
00684 PrevBuf.Size(lLength * sizeof(float));
00685 Zero((float *) PrevBuf, lLength);
00686 lPrevSize = lLength;
00687 }
00688 fpPrev = PrevBuf;
00689
00690 Sub(fpWork, fpVect, fpPrev, lLength);
00691 Abs(fpWork, lLength);
00692 MinMax(&fMin, &fMax, fpWork, lLength);
00693 fAdj = fMin + fMax;
00694 Negate(fpWork, lLength);
00695 Add(fpWork, fAdj, lLength);
00696
00697 Mul(fpVect, fWeight, lLength);
00698 Mul(fpPrev, 1.0f - fWeight, lLength);
00699 Add(fpPrev, fpVect, lLength);
00700
00701 Copy(fpVect, fpWork, lLength);
00702 }
00703
00704
00705 void clRemoveNoise::InvDiff (double *dpVect, double dWeight, long lLength)
00706 {
00707 double dMin;
00708 double dMax;
00709 double dAdj;
00710 double *dpPrev;
00711 #ifdef __GNUG__
00712 double dpWork[lLength];
00713 #else
00714 clDSPAlloc Work;
00715 double *dpWork = (double *) Work.Size(lLength * sizeof(double));
00716 #endif
00717
00718 if (lLength != lPrevSize)
00719 {
00720 PrevBuf.Size(lLength * sizeof(double));
00721 Zero((double *) PrevBuf, lLength);
00722 lPrevSize = lLength;
00723 }
00724 dpPrev = PrevBuf;
00725
00726 Sub(dpWork, dpVect, dpPrev, lLength);
00727 Abs(dpWork, lLength);
00728 MinMax(&dMin, &dMax, dpWork, lLength);
00729 dAdj = dMin + dMax;
00730 Negate(dpWork, lLength);
00731 Add(dpWork, dAdj, lLength);
00732
00733 Mul(dpVect, dWeight, lLength);
00734 Mul(dpPrev, 1.0 - dWeight, lLength);
00735 Add(dpPrev, dpVect, lLength);
00736
00737 Copy(dpVect, dpWork, lLength);
00738 }
00739
00740
00741 void clRemoveNoise::InvDiff (float *fpDest, const float *fpSrc,
00742 float fWeight, long lLength)
00743 {
00744 float fMin;
00745 float fMax;
00746 float fAdj;
00747 float *fpPrev;
00748 #ifdef __GNUG__
00749 float fpAvgWork[lLength];
00750 #else
00751 clDSPAlloc AvgWork;
00752 float *fpAvgWork = (float *) AvgWork.Size(lLength * sizeof(float));
00753 #endif
00754
00755 if (lLength != lPrevSize)
00756 {
00757 PrevBuf.Size(lLength * sizeof(float));
00758 Zero((float *) PrevBuf, lLength);
00759 lPrevSize = lLength;
00760 }
00761 fpPrev = PrevBuf;
00762
00763 Sub(fpDest, fpSrc, fpPrev, lLength);
00764 Abs(fpDest, lLength);
00765 MinMax(&fMin, &fMax, fpDest, lLength);
00766 fAdj = fMin + fMax;
00767 Negate(fpDest, lLength);
00768 Add(fpDest, fAdj, lLength);
00769
00770 Copy(fpAvgWork, fpSrc, lLength);
00771 Mul(fpAvgWork, fWeight, lLength);
00772 Mul(fpPrev, 1.0f - fWeight, lLength);
00773 Add(fpPrev, fpAvgWork, lLength);
00774 }
00775
00776
00777 void clRemoveNoise::InvDiff (double *dpDest, const double *dpSrc,
00778 double dWeight, long lLength)
00779 {
00780 double dMin;
00781 double dMax;
00782 double dAdj;
00783 double *dpPrev;
00784 #ifdef __GNUG__
00785 double dpAvgWork[lLength];
00786 #else
00787 clDSPAlloc AvgWork;
00788 double *dpAvgWork = (double *) AvgWork.Size(lLength * sizeof(double));
00789 #endif
00790
00791 if (lLength != lPrevSize)
00792 {
00793 PrevBuf.Size(lLength * sizeof(double));
00794 Zero((double *) PrevBuf, lLength);
00795 lPrevSize = lLength;
00796 }
00797 dpPrev = PrevBuf;
00798
00799 Sub(dpDest, dpSrc, dpPrev, lLength);
00800 Abs(dpDest, lLength);
00801 MinMax(&dMin, &dMax, dpDest, lLength);
00802 dAdj = dMin + dMax;
00803 Negate(dpDest, lLength);
00804 Add(dpDest, dAdj, lLength);
00805
00806 Copy(dpAvgWork, dpSrc, lLength);
00807 Mul(dpAvgWork, dWeight, lLength);
00808 Mul(dpPrev, 1.0 - dWeight, lLength);
00809 Add(dpPrev, dpAvgWork, lLength);
00810 }
00811