Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Compound Members | File Members

RemoveNoise.cc

Go to the documentation of this file.
00001 /*
00002 
00003     Background noise estimation and removal
00004     Copyright (C) 2000-2003 Jussi Laako
00005 
00006     This program is free software; you can redistribute it and/or modify
00007     it under the terms of the GNU General Public License as published by
00008     the Free Software Foundation; either version 2 of the License, or
00009     (at your option) any later version.
00010 
00011     This program is distributed in the hope that it will be useful,
00012     but WITHOUT ANY WARRANTY; without even the implied warranty of
00013     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014     GNU General Public License for more details.
00015 
00016     You should have received a copy of the GNU General Public License
00017     along with this program; if not, write to the Free Software
00018     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
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 

Generated on Sun Oct 26 19:11:21 2003 for HASAS by doxygen 1.3.3