Update of /cvsroot/audacity/audacity-src/src/effects
In directory 23jxhf1.ch3.sourceforge.com:/tmp/cvs-serv18438

Modified Files:
        Equalization.cpp Equalization.h 
Log Message:
Change Equalization processing to use new RealFFTf function for improved 
performance

Index: Equalization.cpp
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/effects/Equalization.cpp,v
retrieving revision 1.96
retrieving revision 1.97
diff -u -d -r1.96 -r1.97
--- Equalization.cpp    18 Jun 2009 00:40:05 -0000      1.96
+++ Equalization.cpp    23 Jun 2009 02:05:38 -0000      1.97
@@ -307,6 +307,8 @@
 
 EffectEqualization::EffectEqualization()
 {
+   hFFT = InitializeFFT(windowSize);
+   mFFTBuffer = new float[windowSize];
    mFilterFuncR = new float[windowSize];
    mFilterFuncI = new float[windowSize];
    gPrefs->Read(wxT("/CsPresets/EQFilterLength"),
@@ -341,6 +343,12 @@
 
 EffectEqualization::~EffectEqualization()
 {
+   if(hFFT) 
+      EndFFT(hFFT);
+   hFFT = NULL;
+   if(mFFTBuffer)
+      delete[] mFFTBuffer;
+   mFFTBuffer = NULL;
    if(mFilterFuncR)
       delete[] mFilterFuncR;
    if(mFilterFuncI)
@@ -579,39 +587,28 @@
 void EffectEqualization::Filter(sampleCount len,
          float *buffer)
 {
-   float *inr = new float[len];
-   float *ini = new float[len];
-   float *outr = new float[len];
-   float *outi = new float[len];
-
    int i;
-   float temp;
-
-   for(i=0; i<len; i++)
-      inr[i] = buffer[i];
-
+   float re,im;
    // Apply FFT
-   FFT(len, false, inr, NULL, outr, outi);
+   RealFFTf(buffer, hFFT);
+   //FFT(len, false, inr, NULL, outr, outi);
 
    // Apply filter
-   for(i=0; i<len; i++)
+   // DC component is purely real
+   mFFTBuffer[0] = buffer[0] * mFilterFuncR[0];
+   for(i=1; i<(len/2); i++)
    {
-      temp = outr[i]*mFilterFuncR[i] - outi[i]*mFilterFuncI[i];
-      outi[i] = outr[i]*mFilterFuncI[i] + outi[i]*mFilterFuncR[i];
-      outr[i] = temp;
+      re=buffer[hFFT->BitReversed[i]  ];
+      im=buffer[hFFT->BitReversed[i]+1];
+      mFFTBuffer[2*i  ] = re*mFilterFuncR[i] - im*mFilterFuncI[i];
+      mFFTBuffer[2*i+1] = re*mFilterFuncI[i] + im*mFilterFuncR[i];
    }
-
+   // Fs/2 component is purely real
+   mFFTBuffer[1] = buffer[1] * mFilterFuncR[len/2];
 
    // Inverse FFT and normalization
-   FFT(len, true, outr, outi, inr, ini);
-
-   for(i=0; i<len; i++)
-      buffer[i] = float(inr[i]);
-
-   delete[] inr;
-   delete[] ini;
-   delete[] outr;
-   delete[] outi;
+   InverseRealFFTf(mFFTBuffer, hFFT);
+   ReorderToTime(hFFT, mFFTBuffer, buffer);
 }
 
 

Index: Equalization.h
===================================================================
RCS file: /cvsroot/audacity/audacity-src/src/effects/Equalization.h,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -d -r1.40 -r1.41
--- Equalization.h      12 Jun 2009 05:43:35 -0000      1.40
+++ Equalization.h      23 Jun 2009 02:05:38 -0000      1.41
@@ -37,6 +37,7 @@
 #include "../WaveTrack.h"
 #include "../xml/XMLTagHandler.h"
 #include "../widgets/Ruler.h"
+#include "../RealFFTf.h"
 
 class EqualizationDialog;
 
@@ -116,6 +117,8 @@
    void Filter(sampleCount len,
                float *buffer);
 
+   HFFT hFFT;
+   float *mFFTBuffer;
    float *mFilterFuncR;
    float *mFilterFuncI;
    int mM;


------------------------------------------------------------------------------
_______________________________________________
Audacity-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/audacity-cvs

Reply via email to