39 "category",
"Synthesis",
40 "description",
"IFFT_ooura",
43 static FactoryRegistrator<ProcessingFactory, IFFT_ooura>
reg =
metadata;
47 bool IFFT_ooura::ConcreteConfigure(
const ProcessingConfig& c) {
51 CLAM_ASSERT (
mConfig.GetAudioSize()>=0,
"Wrong (negative) Size in IFFT Configuration.");
73 AddConfigErrorMessage(
"Configure failed: IFFT Ooura algorithm only works for input buffers that are a power of two!");
77 if (mSize != oldSize) {
87 void IFFT_ooura::ReleaseMemory() {
88 if (ip) {
delete[] ip; ip = 0; }
89 if (w) {
delete[] w; w = 0; }
92 void IFFT_ooura::SetupMemory() {
93 int ipSize = (
int)(2+(1<<(
int)(log(mSize/2+0.5)/log(2.0))/2));
95 for (
int i=0; i<ipSize; i++) ip[i] = 0;
97 int wSize = (
int)(mSize*5/8-1);
99 for (
int i=0; i<wSize; i++) w[i] = 0;
128 TData* outbuffer = out.GetBuffer().GetPtr();
132 "IFFT_ooura: Do(): Not in execution mode");
135 "IFFT_ooura: Do(): Not a power of two");
137 out.SetSampleRate(in.GetSpectralRange()*2);
143 ComplexToIFFTOoura(in);
148 for (i=0; i<
mSize; i++)
149 outbuffer[i]=ifftbuffer[i]*twoOverSize;
152 OtherToIFFTOoura(in);
157 for (i=0; i<
mSize; i++)
158 outbuffer[i]=ifftbuffer[i]*twoOverSize;
162 CLAM_ASSERT(
false,
"IFFT_ooura: Do(): Inconsistent state");
168 void IFFT_ooura::ComplexToIFFTOoura(
const Spectrum &in)
const {
172 ifftbuffer[0] = inbuffer[0].Real();
173 ifftbuffer[1] = inbuffer[mSize/2].Real();
175 for (i=1; i<mSize/2; i++) {
176 ifftbuffer[2*i] = inbuffer[i].Real();
177 ifftbuffer[2*i+1] = -inbuffer[i].Imag();
181 inline void IFFT_ooura::OtherToIFFTOoura(
const Spectrum &in)
const
204 Spectrum tmpSpec = in;
205 if (!in.HasComplexArray()) {
207 tmpSpec.SetTypeSynchronize(flags);
209 ComplexToIFFTOoura(tmpSpec);
237 CLAM_ASSERT(
false,
"IFFT_ooura::SetPrototypes: Not implemented.");
247 void IFFT_ooura::CheckTypes(
const Spectrum& in,
const Audio &out)
const
249 CLAM_ASSERT(out.HasBuffer(),
"IFFT Do: Float attribute required for Audio object.");
253 std::stringstream ss;
254 ss <<
"IFFT_ooura::Do: Wrong size in IFFT Audio output\n"
255 <<
" Expected: " << mSize*2+1 <<
", used " << out.
GetSize();
258 if (in.
GetSize() < mSize/2+1 ) {
259 std::stringstream ss;
260 ss <<
"IFFT_ooura::Do: not enough memory in input Spectrum.\n"
261 <<
" Expected: " << mSize/2+1 <<
", used " << in.
GetSize();