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