示例#1
0
文件: fft.cpp 项目: 0xf1sh/scummvm
void FFT::fft(int n, int logn, Complex *z) {
	switch (logn) {
	case 2:
		fft4(z);
		break;
	case 3:
		fft8(z);
		break;
	case 4:
		fft16(z);
		break;
	default:
		fft((n / 2), logn - 1, z);
		fft((n / 4), logn - 2, z + (n / 4) * 2);
		fft((n / 4), logn - 2, z + (n / 4) * 3);
		assert(_cosTables[logn - 4]);
		if (n > 1024)
			pass_big(z, _cosTables[logn - 4]->getTable(), (n / 4) / 2);
		else
			pass(z, _cosTables[logn - 4]->getTable(), (n / 4) / 2);
	}
}
示例#2
0
/*******************************************************************************
 Functionname:  sinMod
 *******************************************************************************

 Description: Performs sine modulation.
 Return:      none

*******************************************************************************/
static void
sinMod (float *subband, HANDLE_SBR_QMF_FILTER_BANK qmfBank)
{
  int i;
  float wre, wim;
  float re1, im1, re2, im2;



  



    /* subband[2 * i]
                   subband[32 - 2 * i]
                   qmfBank->sin_twiddle[i]
                   qmfBank->cos_twiddle[i]
                   qmfBank->sin_twiddle[15 - i]
                   qmfBank->cos_twiddle[15 - i]
                */
  
  for (i = 0; i < 8; i++) {

    
    re1 = subband[2 * i];
    im2 = subband[2 * i + 1];
    re2 = subband[30 - 2 * i];
    im1 = subband[31 - 2 * i];

    
    wre = qmfBank->sin_twiddle[i];
    wim = qmfBank->cos_twiddle[i];

     
    subband[2 * i + 1] = im1 * wim + re1 * wre;
     
    subband[2 * i]     = im1 * wre - re1 * wim;

    
    wre = qmfBank->sin_twiddle[15 - i];
    wim = qmfBank->cos_twiddle[15 - i];

     
    subband[31 - 2 * i] = im2 * wim + re2 * wre;
     
    subband[30 - 2 * i] = im2 * wre - re2 * wim;
  }

  
  fft16(subband);

    /* subband[2 * i],
                   subband[32 - 2 * i],
                   qmfBank->alt_sin_twiddle[i],
                   qmfBank->sin_twiddle[15 - i]
                */

  
  wim = qmfBank->alt_sin_twiddle[0];
  wre = qmfBank->alt_sin_twiddle[16];

  
  for (i = 0; i < 8; i++) {

    
    re1 = subband[2 * i];
    im1 = subband[2 * i + 1];
    re2 = subband[30 - 2 * i];
    im2 = subband[31 - 2 * i];


     
    subband[31 - 2 * i] = -(re1 * wre + im1 * wim);
     
    subband[2 * i]      = -(re1 * wim - im1 * wre);

    
    wim = qmfBank->alt_sin_twiddle[i + 1];
    wre = qmfBank->alt_sin_twiddle[15 - i];

     
    subband[2 * i + 1]  = -(re2 * wim + im2 * wre);
     
    subband[30 - 2 * i] = -(re2 * wre - im2 * wim);

  }

  
}