bool CHeap1::CheckNode( Node* tocheck ) { if ( tocheck == NULL ) return false; if ( tocheck < ( Node*)pSentinel || tocheck >= (Node*)pHeapEnd ) return false; #define CHECKPOINTER( pointer ) pointer == NULL || ( pointer >= (Node*)pSentinel && pointer <= (Node*)pHeapEnd ) bool ret = true; ret &= CHECKPOINTER( tocheck->pPrevMem ); ret &= CHECKPOINTER( tocheck->pNextMem ); ret &= CHECKPOINTER( tocheck->pPrevFree ); ret &= CHECKPOINTER( tocheck->pNextFree ); #undef CHECKPOINTER return ret; }
void fft_float ( unsigned NumSamples, int InverseTransform, float *RealIn, float *ImagIn, float *RealOut, float *ImagOut ) { unsigned NumBits; /* Number of bits needed to store indices */ unsigned i, j, k, n; unsigned BlockSize, BlockEnd; double angle_numerator = 2.0 * DDC_PI; double tr, ti; /* temp real, temp imaginary */ if ( !IsPowerOfTwo(NumSamples) ) { fprintf ( stderr, "Error in fft(): NumSamples=%u is not power of two\n", NumSamples ); exit(1); } if ( InverseTransform ) angle_numerator = -angle_numerator; CHECKPOINTER ( RealIn ); CHECKPOINTER ( RealOut ); CHECKPOINTER ( ImagOut ); NumBits = NumberOfBitsNeeded ( NumSamples ); /* ** Do simultaneous data copy and bit-reversal ordering into outputs... */ for ( i=0; i < NumSamples; i++ ) { j = ReverseBits ( i, NumBits ); RealOut[j] = RealIn[i]; ImagOut[j] = (ImagIn == NULL) ? 0.0 : ImagIn[i]; } /* ** Do the FFT itself... */ BlockEnd = 1; for ( BlockSize = 2; BlockSize <= NumSamples; BlockSize <<= 1 ) { double delta_angle = angle_numerator / (double)BlockSize; double sm2 = sin ( -2 * delta_angle ); double sm1 = sin ( -delta_angle ); double cm2 = cos ( -2 * delta_angle ); double cm1 = cos ( -delta_angle ); double w = 2 * cm1; double ar[3], ai[3]; double temp; for ( i=0; i < NumSamples; 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]*RealOut[k] - ai[0]*ImagOut[k]; ti = ar[0]*ImagOut[k] + ai[0]*RealOut[k]; RealOut[k] = RealOut[j] - tr; ImagOut[k] = ImagOut[j] - ti; RealOut[j] += tr; ImagOut[j] += ti; } } BlockEnd = BlockSize; } /* ** Need to normalize if inverse transform... */ if ( InverseTransform ) { double denom = (double)NumSamples; for ( i=0; i < NumSamples; i++ ) { RealOut[i] /= denom; ImagOut[i] /= denom; } } }
void anim_fft_double (unsigned NofSamples, int InverseTransform, double *RealIn, double *ImagIn, double *RealOut, double *ImagOut ) { unsigned NofBits; /* Number of bits needed to store indices */ unsigned LSample, j, k, n; unsigned BlockSize, BlockEnd; double AngleNumerator = 2.0 * M_PI; double TempReal, TempImagin; /* temp real, temp imaginary */ if ( !IsPowerOfTwo(NofSamples) ) { PrintError(("Error in fft(): NofSamples=%u is not power of two\n", NofSamples) ); exit(1); } if ( InverseTransform ) AngleNumerator = -AngleNumerator; CHECKPOINTER ( RealIn ); CHECKPOINTER ( RealOut ); CHECKPOINTER ( ImagOut ); NofBits = NumberOfBitsNeeded ( NofSamples ); /* ** Do simultaneous data copy and bit-reversal ordering into outputs... */ for ( LSample=0; LSample < NofSamples; LSample++ ) { j = ReverseBits ( LSample, NofBits ); RealOut[j] = RealIn[LSample]; ImagOut[j] = (ImagIn == NULL) ? 0.0 : ImagIn[LSample]; } /* ** Do the FFT itself... */ BlockEnd = 1; for ( BlockSize = 2; BlockSize <= NofSamples; BlockSize <<= 1 ) { double delta_angle = AngleNumerator / (double)BlockSize; double sm2 = sin ( -2 * delta_angle ); double sm1 = sin ( -delta_angle ); double cm2 = cos ( -2 * delta_angle ); double cm1 = cos ( -delta_angle ); double w = 2 * cm1; double ar[3], ai[3]; for ( LSample=0; LSample < NofSamples; LSample += BlockSize ) { ar[2] = cm2; ar[1] = cm1; ai[2] = sm2; ai[1] = sm1; for ( j=LSample, 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; TempReal = ar[0]*RealOut[k] - ai[0]*ImagOut[k]; TempImagin = ar[0]*ImagOut[k] + ai[0]*RealOut[k]; RealOut[k] = RealOut[j] - TempReal; ImagOut[k] = ImagOut[j] - TempImagin; RealOut[j] += TempReal; ImagOut[j] += TempImagin; } } BlockEnd = BlockSize; } /* ** Need to normalize if inverse transform... */ if ( InverseTransform ) { double denom = (double)NofSamples; for ( LSample=0; LSample < NofSamples; LSample++ ) { RealOut[LSample] /= denom; ImagOut[LSample] /= denom; } } }