void SantiFFT::DoFFT(double *rData, double *iData, unsigned InvertFlag, unsigned FFTSize, unsigned ReplaceFlag) { register unsigned i, j; unsigned n, k, idx, BlockEnd, BlockSize; double tr, ti; // Temporal vriables;
Resize(FFTSize); // Update 'Size' , 'NumBits' and Parameters
for(i=0; i { j = ReverseBits(i, NumBits); Real.Data[j] = rData[i]; Imag.Data[j] = (iData[i] == NULL) ? 0.0 : iData[i]; }
BlockEnd = 1;
idx = (InvertFlag)?NumBits:0; for (idx=idx, BlockSize=2; BlockSize<=FFTSize; BlockSize<<=1, idx++) { double sm2,sm1,cm2,cm1,w,ar[3],ai[3],temp; sm2 = xsm2.Data[idx]; sm1 = xsm1.Data[idx]; cm2 = xcm2.Data[idx]; cm1 = xcm1.Data[idx]; w = xw.Data[idx];
for ( i=0; i < FFTSize; i += BlockSize ) { ar[2] = cm2; ar[1] = cm1;
ai[2] = sm2; ai[1] = sm1;
for ( j=i, n=0; n < BlockEnd; j++, n++ ) { ar[0] = w*ar[1] - ar[2]; ar[2] = ar[1]; ar[1] = ar[0];
ai[0] = w*ai[1] - ai[2]; ai[2] = ai[1]; ai[1] = ai[0];
k = j + BlockEnd; tr = ar[0]*Real.Data[k] - ai[0]*Imag.Data[k]; ti = ar[0]*Imag.Data[k] + ai[0]*Real.Data[k];
Real.Data[k] = Real.Data[j] - tr; Imag.Data[k] = Imag.Data[j] - ti;
Real.Data[j] += tr; Imag.Data[j] += ti; } } BlockEnd = BlockSize; }
if(InvertFlag) { double denom = (double)FFTSize; for(i=0; i { Real.Data[i] /= denom; Imag.Data[i] /= denom; } }
if(ReplaceFlag) { for(i=0; i { rData[i] = Real.Data[i]; iData[i] = Imag.Data[i]; } } } |