Пример #1
0
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;
}
Пример #2
0
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;
        }
    }
}
Пример #3
0
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;
    }
  }
}