38 "category",
"Synthesis",
39 "description",
"IFFT_fftw3",
42 static FactoryRegistrator<ProcessingFactory, IFFT_fftw3>
reg =
metadata;
45 struct IFFT_fftw3::Implementation
47 Implementation(
unsigned size)
50 _complexInput = (fftw_complex*) fftw_malloc(
sizeof(fftw_complex) * size);
51 _realOutput = (
double*) fftw_malloc(
sizeof(
double) * size);
52 fftw_import_system_wisdom();
53 _plan = fftw_plan_dft_c2r_1d(size, _complexInput, _realOutput, FFTW_ESTIMATE);
57 fftw_destroy_plan(_plan);
58 fftw_free(_realOutput);
59 fftw_free(_complexInput);
62 fftw_complex * _complexInput;
77 CLAM_ASSERT (
mConfig.GetAudioSize()>=0,
"Wrong (negative) Size in IFFT Configuration.");
93 void IFFT_fftw3::ReleaseMemory()
95 if (_fftw3)
delete _fftw3;
97 void IFFT_fftw3::SetupMemory()
100 _fftw3 =
new Implementation(mSize);
103 void IFFT_fftw3::CheckTypes(
const Spectrum& in,
const Audio &out)
const
105 CLAM_ASSERT(out.HasBuffer(),
"IFFT Do: Float attribute required for Audio object.");
108 if (out.GetSize()!=
mSize) {
109 std::stringstream ss;
110 ss <<
"IFFT_fftw3::Do: Wrong size in IFFT Audio output\n"
111 <<
" Expected: " << mSize*2+1 <<
", used " << out.GetSize();
114 if (in.GetSize() < mSize/2+1 ) {
115 std::stringstream ss;
116 ss <<
"IFFT_fftw3::Do: not enough memory in input Spectrum.\n"
117 <<
" Expected: " << mSize/2+1 <<
", used " << in.GetSize();
170 "Not proper IFFT output size");
172 if (mState==sComplex)
179 fftw_execute(_fftw3->_plan);
180 TData * outbuffer = out.GetBuffer().GetPtr();
181 for (
int i=0; i<
mSize; i++)
182 outbuffer[i] = _fftw3->_realOutput[i];
184 out.SetSampleRate(
TData(in.GetSpectralRange()*2));
192 CLAM_ASSERT(
false,
"IFFT_fftw3::SetPrototypes: Not implemented.");
196 inline void IFFT_fftw3::ComplexToRIFFTW(
const Spectrum &in)
const
198 CLAM_ASSERT(in.HasComplexArray(),
"Input spectrum has no complex array");
200 CLAM_ASSERT(inbuffer.Size() == mSize/2+1,
"IFFT_fftw3::ComplexToRIFFTW: sizes doesn't match.");
201 for (
int i=0; i< inbuffer.Size(); i++)
203 _fftw3->_complexInput[i][0] = inbuffer[i].Real()/
mSize;
204 _fftw3->_complexInput[i][1] = inbuffer[i].Imag()/
mSize;
220 inline void IFFT_fftw3::OtherToRIFFTW(
const Spectrum &in)
const
222 if (in.HasComplexArray())
231 spec.SetTypeSynchronize(flags);
232 ComplexToRIFFTW(spec);