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); } }
/******************************************************************************* 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); } }