40 "category",
"Analysis",
41 "description",
"FFT_fftw3",
44 static FactoryRegistrator<ProcessingFactory, FFT_fftw3>
reg =
metadata;
49 struct FFT_fftw3_Implementation
51 FFT_fftw3_Implementation(
unsigned size)
54 realInput = (
double*) fftw_malloc(
sizeof(
double) * size);
55 complexOutput = (fftw_complex*) fftw_malloc(
sizeof(fftw_complex) * size);
56 fftw_import_system_wisdom();
57 plan = fftw_plan_dft_r2c_1d(size, realInput, complexOutput, FFTW_ESTIMATE);
59 ~FFT_fftw3_Implementation()
61 fftw_destroy_plan(plan);
63 fftw_free(complexOutput);
66 fftw_complex * complexOutput;
77 "FFT_fftw3: Do(): Not a power of two");
83 if (
mSize == oldSize)
return true;
88 void FFT_fftw3::ReleaseMemory()
90 if (_fftw3)
delete _fftw3;
93 void FFT_fftw3::SetupMemory()
96 _fftw3 =
new Hidden::FFT_fftw3_Implementation(
mSize);
122 "FFT_fftw3: Do(): Not in execution mode");
124 out.SetSpectralRange(in.GetSampleRate()/2);
126 TData * inbuffer = in.GetBuffer().GetPtr();
127 for (
int i=0; i<
mSize; i++)
128 _fftw3->realInput[i] = inbuffer[i];
129 fftw_execute(_fftw3->plan);
141 void FFT_fftw3::ToComplex(
Spectrum &out)
146 for (
int i=0; i<
mSize/2+1; i++)
148 outbuffer[i].SetReal(_fftw3->complexOutput[i][0]);
149 outbuffer[i].SetImag(_fftw3->complexOutput[i][1]);