/************************************************************************************** * Function: PostMultiplyRescale * * Description: post-twiddle stage of MDCT, with rescaling for extra guard bits * * Inputs: table index (for transform size) * buffer of nmlt samples * number of guard bits to remove from output * * Outputs: processed samples in same buffer * * Return: none * * Notes: clips output to [-2^30, 2^30 - 1], guaranteeing at least 1 guard bit * see notes on PostMultiply(), above **************************************************************************************/ static void PostMultiplyRescale(int tabidx, int *fft1, int es) { int i, nmlt, ar1, ai1, ar2, ai2, skipFactor, z, f0; int t, cs2, sin2; int *fft2; const int *csptr; nmlt = nmltTab[tabidx]; csptr = cos1sin1tab; skipFactor = postSkip[tabidx]; fft2 = fft1 + nmlt - 1; /* load coeffs for first pass * cps2 = (cos+sin)/2, sin2 = sin/2, cms2 = (cos-sin)/2 */ cs2 = *csptr++; sin2 = *csptr; csptr += skipFactor; for (i = nmlt >> 2; i != 0; i--) { ar1 = *(fft1 + 0); ai1 = *(fft1 + 1); ai2 = *(fft2 + 0); /* gain 1 int bit from MULSHIFT32, and one since coeffs are stored as 0.5 * (cos+sin), 0.5*sin */ MULSHIFT32hx(sin2, ar1 + ai1,t); z = t - MULSHIFT32(cs2, ai1); CLIP_2N_SHIFT(z, es); *fft2-- = z; cs2 -= 2*sin2; MULSHIFT32hx(cs2, ar1, f0); z = t + f0; CLIP_2N_SHIFT(z, es); *fft1++ = z; cs2 = *csptr++; sin2 = *csptr; csptr += skipFactor; ar2 = *fft2; ai2 = -ai2; MULSHIFT32hx(sin2, ar2 + ai2,t); z = t - MULSHIFT32(cs2, ai2); CLIP_2N_SHIFT(z, es); *fft2-- = z; cs2 -= 2*sin2; MULSHIFT32hx(cs2, ar2, f0); z = t + f0; CLIP_2N_SHIFT(z, es); *fft1++ = z; cs2 += 2*sin2; } /* see comments in PostMultiply() for notes on scaling */ return; }
/************************************************************************************** * Function: PostMultiplyRescale * * Description: post-twiddle stage of DCT4, with rescaling for extra guard bits * * Inputs: table index (for transform size) * buffer of nmdct samples * number of guard bits to remove from output * * Outputs: processed samples in same buffer * * Return: none * * Notes: clips output to [-2^30, 2^30 - 1], guaranteeing at least 1 guard bit * see notes on PostMultiply(), above **************************************************************************************/ static void PostMultiplyRescale(int tabidx, int *fft1, int es) { int i, nmdct, ar1, ai1, ar2, ai2, skipFactor, z; int t, cs2, sin2; int *fft2; const int *csptr; nmdct = nmdctTab[tabidx]; csptr = cos1sin1tab; skipFactor = postSkip[tabidx]; fft2 = fft1 + nmdct - 1; /* load coeffs for first pass * cps2 = (cos+sin), sin2 = sin, cms2 = (cos-sin) */ cs2 = *csptr++; sin2 = *csptr; csptr += skipFactor; for (i = nmdct >> 2; i != 0; i--) { ar1 = *(fft1 + 0); ai1 = *(fft1 + 1); ai2 = *(fft2 + 0); t = MULSHIFT32(sin2, ar1 + ai1); z = t - MULSHIFT32(cs2, ai1); CLIP_2N_SHIFT(z, es); *fft2-- = z; cs2 -= 2*sin2; z = t + MULSHIFT32(cs2, ar1); CLIP_2N_SHIFT(z, es); *fft1++ = z; cs2 = *csptr++; sin2 = *csptr; csptr += skipFactor; ar2 = *fft2; ai2 = -ai2; t = MULSHIFT32(sin2, ar2 + ai2); z = t - MULSHIFT32(cs2, ai2); CLIP_2N_SHIFT(z, es); *fft2-- = z; cs2 -= 2*sin2; z = t + MULSHIFT32(cs2, ar2); CLIP_2N_SHIFT(z, es); *fft1++ = z; cs2 += 2*sin2; } }