26 #include "complex_midi.h"
39 int shuffle[MAXFFTSIZE];
42 struct Complex *FFTarray ;
48 struct Complex Twiddle[MAXFFTSIZE/2];
49 struct Complex Rotated;
61 static int BitReverse(
int x,
int NumBits)
76 static int BitReverse(
int x,
int NumBits)
80 for(i=0; i<NumBits; i++)
94 void FFTInit(
int level)
97 float angle=0.F, incr;
104 FFTsize = 1 << level;
105 FFThalfsize = FFTsize/2 ;
107 if(FFTsize>MAXFFTSIZE)
115 ScaleFFTby = 1.F/((double) FFTsize) ;
122 for (i=0; i<FFTsize; i++)
124 shuffle[i] = BitReverse(i, level);
127 incr = -6.2831853F / ((float) FFTsize) ;
131 for (i=0;i < FFThalfsize; i++)
133 GetEtoJtimes(angle, &Twiddle[i]);
139 static void ButterflyXfwd (
int AIndex,
int BIndex,
int TwiddleIndex,
140 struct Complex arr1[])
144 MultiplyCptr(&Rotated, &arr1[BIndex], &Twiddle[TwiddleIndex] );
145 SubtractCptr( &arr1[BIndex] , &arr1[AIndex] , &Rotated);
146 AddCptr( &arr1[AIndex] , &arr1[AIndex] , &Rotated);
149 static void ButterflyXinv (
int AIndex,
int BIndex,
int TwiddleIndex,
150 struct Complex arr1[])
154 MultiplyConjPtr(&Rotated, &arr1[BIndex], &Twiddle[TwiddleIndex] );
155 SubtractCptr( &arr1[BIndex] , &arr1[AIndex] , &Rotated);
156 AddCptr( &arr1[AIndex] , &arr1[AIndex] , &Rotated);
160 static void Type2ButterflyXinv (
int AIndex,
int BIndex,
int TwiddleIndex,
161 struct Complex arr1[])
166 SubtractCptr(&temp, &arr1[AIndex], &arr1[BIndex]);
167 AddCptr(&arr1[AIndex], &arr1[AIndex] , &arr1[BIndex]);
168 MultiplyConjPtr(&arr1[BIndex], &temp, &Twiddle[TwiddleIndex] );
177 int groups = FFTsize ;
178 int TwiddleIndex, IndexA, IndexB;
181 for (k=0;k<FFTlevel;k++)
190 for (j=0;j<groups;j++)
193 IndexA = j * skip * 2;
194 IndexB = IndexA + skip;
199 ButterflyXfwd(IndexA++, IndexB++, TwiddleIndex, FFTarray);
201 TwiddleIndex+= groups;
213 int groups = FFTsize ;
214 int TwiddleIndex, IndexA, IndexB;
217 for (k=0;k<FFTlevel;k++)
222 for (j=0;j<groups;j++)
225 IndexA = j * skip * 2;
226 IndexB = IndexA + skip;
231 ButterflyXinv(IndexA++, IndexB++, TwiddleIndex, FFTarray);
232 TwiddleIndex+= groups;
240 void Type2DoIFT(
void)
245 int TwiddleIndex, IndexA, IndexB;
248 for (k=0;k<FFTlevel;k++)
255 for (j=0;j<groups;j++)
258 IndexA = j * skip * 2;
259 IndexB = IndexA + skip;
264 Type2ButterflyXinv(IndexA++, IndexB++, TwiddleIndex, FFTarray);
265 TwiddleIndex+= groups;
276 void FFT(
struct Complex *Input,
int newlevel)
282 for(i=0; i<FFTsize; i++)
284 FFTarray[shuffle[i]] = Scalec(Input[i], ScaleFFTby);
290 void IFT(
struct Complex *Input,
int newlevel)
294 if(newlevel != FFTlevel)
296 for(i=0; i<FFTsize; i++)
298 FFTarray[shuffle[i]] = Input[i] ;
335 void SetFFTsize(
int InputSize)
337 int newFFTlevel = FFTlevel;
339 while(InputSize > FFTsize)
345 while(2*InputSize <= FFTsize)
351 FFTInit(newFFTlevel);
356 void FFTofReal(
float *Input,
int InputSize)
359 SetFFTsize(InputSize);
361 for(i=0; i<InputSize; i++)
363 FFTarray[shuffle[i]].r = Input[i]*ScaleFFTby;
364 FFTarray[shuffle[i]].i = 0.F;
367 for(i=InputSize; i<FFTsize; i++)
369 FFTarray[shuffle[i]].r = FFTarray[shuffle[i]].i = 0.F;
379 void FFTfullReal(
float *Input,
int InputSize,
float scale)
382 struct Complex Ctemp;
384 float inputscale = ((float)InputSize) /((float)FFThalfsize) ;
386 scale *= ScaleFFTby ;
393 for(i=0; i<FFThalfsize; i++)
395 Ctemp.r = scale*Input[((int) (((
float)i) * inputscale))] ;
398 FFTarray[shuffle[i]] = FFTarray[shuffle[FFTsize-i]] = Ctemp;
401 FFTarray[1].r = scale*Input[InputSize-1] ;
402 FFTarray[1].i = 0.F ;
443 int determineFFTsize (
448 while ((0.7F * ((
float) result)) < ((float) framesperscan))