Loading lib_com/basop_util.c +0 −2 Original line number Diff line number Diff line Loading @@ -714,7 +714,6 @@ Word16 getScaleFactor16( /* o: measured headroom in range [ return i; } #ifdef OPTIMIZE_FFT_STACK /* o: measured headroom in range [0..31], 0 if all x[i] == 0 */ Word16 getScaleFactor32_cmplx( cmplx *x, /* i: array containing 32-bit data */ Loading Loading @@ -772,7 +771,6 @@ Word16 getScaleFactor32_cmplx( return s_min( i_re, i_im ); } #endif /********************************************************************/ Loading lib_com/basop_util.h +0 −2 Original line number Diff line number Diff line Loading @@ -221,13 +221,11 @@ Word16 getScaleFactor16( const Word16 *x, /* i: array containing 16-bit data */ const Word16 len_x ); /* i: length of the array to scan */ #ifdef OPTIMIZE_FFT_STACK /* o: measured headroom in range [0..31], 0 if all x[i] == 0 */ Word16 getScaleFactor32_cmplx( cmplx *x, /* i: array containing 32-bit data */ const Word16 len_x /* i: length of the array to scan */ ); #endif /********************************************************************/ /*! Loading lib_com/edct_fx.c +0 −265 Original line number Diff line number Diff line Loading @@ -55,12 +55,7 @@ static Word16 get_edxt_factor( } ELSE IF( EQ_16( length, 40 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else factor = 7327; /*0.223 in Q15*/ move16(); #endif } ELSE IF( EQ_16( length, 960 ) ) { Loading @@ -79,48 +74,23 @@ static Word16 get_edxt_factor( } ELSE IF( EQ_16( length, 120 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else factor = 4230; /*0.1290 in Q15*/ move16(); #endif } ELSE IF( EQ_16( length, 1200 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else factor = 1338; /*0.040 in Q15*/ move16(); #endif } ELSE IF( EQ_16( length, 800 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else factor = 1638; /*0.05 in Q15*/ move16(); #endif } ELSE IF( EQ_16( length, 400 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else factor = 2317; /*0.070 in Q15*/ move16(); #endif } ELSE IF( EQ_16( length, 200 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else factor = 3277; /*0.1 in Q15*/ move16(); #endif } return factor; /*Q15*/ Loading Loading @@ -219,11 +189,7 @@ void edct_fx( Word32 re; Word32 im; const Word16 *edct_table; /*Q16 */ #ifdef OPTIMIZE_FFT_STACK cmplx spec[L_FRAME_PLUS / 2]; #else Word32 complex_buf[2 * ( L_FRAME48k / 2 + 240 )]; #endif Word32 L_tmp; Word16 tmp; Word16 len1; Loading @@ -234,19 +200,11 @@ void edct_fx( FOR( i = 0; i < len1; i++ ) { L_tmp = Mult_32_16( x[2 * i], edct_table[i] ); /*Q(q+1) */ #ifdef OPTIMIZE_FFT_STACK spec[i].re = Madd_32_16( L_tmp, x[( length - ( 1 + ( i * 2 ) ) )], edct_table[( len1 - ( 1 + i ) )] ); /*Q(q+1) */ #else complex_buf[2 * i] = Madd_32_16( L_tmp, x[( length - ( 1 + ( i * 2 ) ) )], edct_table[( len1 - ( 1 + i ) )] ); /*Q(q+1) */ #endif move32(); L_tmp = Mult_32_16( x[( length - ( 1 + ( i * 2 ) ) )], edct_table[i] ); /*Q(q+1) */ #ifdef OPTIMIZE_FFT_STACK spec[i].im = Msub_32_16( L_tmp, x[( i * 2 )], edct_table[( len1 - ( 1 + i ) )] ); /*Q(q+1) */ #else complex_buf[( ( i * 2 ) + 1 )] = Msub_32_16( L_tmp, x[( i * 2 )], edct_table[( len1 - ( 1 + i ) )] ); /*Q(q+1) */ #endif move32(); } Loading @@ -256,11 +214,7 @@ void edct_fx( #endif *q = sub( 15, *q ); move16(); #ifdef OPTIMIZE_FFT_STACK BASOP_cfft( spec, len1, q, y ); #else BASOP_cfft( (cmplx *) complex_buf, len1, q, y ); #endif tmp = div_s( 1, length ); /*Q15 */ tmp = round_fx( L_shl( L_mult( tmp, 19302 /*0.75f * EVS_PI in Q13*/ ), 2 ) ); /*Q15 */ Loading @@ -284,13 +238,8 @@ void edct_fx( FOR( i = 0; i < len1; i++ ) { #ifdef OPTIMIZE_FFT_STACK re = Msub_32_16( spec[i].re, spec[i].im, tmp ); /*Q(q+1) */ im = Madd_32_16( spec[i].im, spec[i].re, tmp ); /*Q(q+1) */ #else re = Msub_32_16( complex_buf[2 * i], complex_buf[( ( i * 2 ) + 1 )], tmp ); /*Q(q+1) */ im = Madd_32_16( complex_buf[( ( i * 2 ) + 1 )], complex_buf[2 * i], tmp ); /*Q(q+1) */ #endif y[2 * i] = L_add( Mult_32_16( re, edct_table[i] ), Mult_32_16( im, edct_table[( len1 - ( 1 + i ) )] ) ); /*Q(q+2)*/ move32(); y[( length - ( 1 + ( i * 2 ) ) )] = L_sub( Mult_32_16( re, edct_table[( len1 - ( 1 + i ) )] ), Mult_32_16( im, edct_table[i] ) ); /*Q(q+2)*/ Loading Loading @@ -399,11 +348,7 @@ void edst_fx( Word32 re; Word32 im; const Word16 *edct_table; /*Q16 */ #ifdef OPTIMIZE_FFT_STACK cmplx complex_buf[L_FRAME_PLUS / 2]; #else Word32 complex_buf[2 * ( L_FRAME48k / 2 + 240 )]; #endif Word32 L_tmp; Word16 tmp; Word16 len1; Loading @@ -414,41 +359,24 @@ void edst_fx( FOR( i = 0; i < len1; i++ ) { L_tmp = Mult_32_16( x[( length - ( 1 + ( i * 2 ) ) )], edct_table[i] ); /*Qq+1*/ #ifdef OPTIMIZE_FFT_STACK complex_buf[i].re = Madd_32_16( L_tmp, x[2 * i], edct_table[( len1 - ( 1 + i ) )] ); /*Qq+1*/ #else complex_buf[2 * i] = Madd_32_16( L_tmp, x[2 * i], edct_table[( len1 - ( 1 + i ) )] ); /*Qq+1*/ #endif move32(); L_tmp = Mult_32_16( x[2 * i], edct_table[i] ); /*Qq+1*/ #ifdef OPTIMIZE_FFT_STACK complex_buf[i].im = Msub_32_16( L_tmp, x[( length - ( 1 + ( i * 2 ) ) )], edct_table[( len1 - ( 1 + i ) )] ); /*Qq+1*/ #else complex_buf[( ( i * 2 ) + 1 )] = Msub_32_16( L_tmp, x[( length - ( 1 + ( i * 2 ) ) )], edct_table[( len1 - ( 1 + i ) )] ); /*Qq+1*/ #endif move32(); } *q = sub( 15, *q ); move16(); #ifdef OPTIMIZE_FFT_STACK BASOP_cfft( complex_buf, len1, q, y ); #else BASOP_cfft( (cmplx *) complex_buf, len1, q, y ); #endif tmp = div_s( 1, length ); /*Q15 */ tmp = round_fx( L_shl( L_mult( tmp, 19302 /*0.75f * EVS_PI in Q13*/ ), 2 ) ); /*Q15 */ FOR( i = 0; i < len1; i++ ) { #ifdef OPTIMIZE_FFT_STACK re = Msub_32_16( complex_buf[i].re, complex_buf[i].im, tmp ); /*Qq+1*/ im = Madd_32_16( complex_buf[i].im, complex_buf[i].re, tmp ); /*Qq+1*/ #else re = Msub_32_16( complex_buf[2 * i], complex_buf[( ( i * 2 ) + 1 )], tmp ); /*Qq+1*/ im = Madd_32_16( complex_buf[( ( i * 2 ) + 1 )], complex_buf[2 * i], tmp ); /*Qq+1*/ #endif y[2 * i] = L_add( Mult_32_16( re, edct_table[i] ), Mult_32_16( im, edct_table[( len1 - ( 1 + i ) )] ) ); /*Qq+2*/ move32(); y[( length - ( 1 + ( i * 2 ) ) )] = L_sub( Mult_32_16( im, edct_table[i] ), Mult_32_16( re, edct_table[( len1 - ( 1 + i ) )] ) ); /*Qq+2*/ Loading Loading @@ -496,16 +424,8 @@ void edct_16fx( Word16 re[L_FRAME48k / 2]; Word16 im[L_FRAME48k / 2]; const Word16 *edct_table = NULL; #ifndef OPTIMIZE_FFT_STACK Word16 re2[L_FRAME48k / 2]; Word16 im2[L_FRAME48k / 2]; #endif Word32 L_tmp, Lacc, Lmax; #ifdef OPTIMIZE_FFT_STACK Word16 tmp, tmp_re, fact; #else Word16 tmp, fact; #endif Word16 Q_edct; Word16 Len2, i2; const Word16 *px, *pt; Loading Loading @@ -569,46 +489,26 @@ void edct_16fx( L_tmp = L_mult( x[i2], edct_table[i] ); /*Q(Qx+16) */ Lacc = L_mac_sat( L_tmp, *px, *pt ); /*Q(Qx+16) */ #ifdef OPTIMIZE_FFT_STACK re[i] = round_fx_sat( L_shl_sat( Lacc, Q_edct ) ); /* Q(Qx+Q_edct) */ #else re2[i] = round_fx_sat( L_shl_sat( Lacc, Q_edct ) ); /* Q(Qx+Q_edct) */ #endif move16(); L_tmp = L_mult( *px, edct_table[i] ); /*Q(Qx+16) */ Lacc = L_msu_sat( L_tmp, x[i2], *pt ); /*Q(Qx+16) */ #ifdef OPTIMIZE_FFT_STACK im[i] = round_fx_sat( L_shl_sat( Lacc, Q_edct ) ); /* Q(Qx+Q_edct) */ #else im2[i] = round_fx_sat( L_shl_sat( Lacc, Q_edct ) ); /* Q(Qx+Q_edct) */ #endif move16(); px -= 2; pt--; } IF( EQ_16( length, L_FRAME32k ) ) { #ifdef OPTIMIZE_FFT_STACK DoRTFT320_16fx( re, im ); #else DoRTFT320_16fx( re2, im2 ); #endif } ELSE IF( EQ_16( length, L_FRAME ) ) { #ifdef OPTIMIZE_FFT_STACK DoRTFT128_16fx( re, im ); #else DoRTFT128_16fx( re2, im2 ); #endif } ELSE IF( EQ_16( length, L_FRAME16k ) ) { #ifdef OPTIMIZE_FFT_STACK DoRTFT160_16fx( re, im ); #else DoRTFT160_16fx( re2, im2 ); #endif } ELSE { Loading @@ -618,7 +518,6 @@ void edct_16fx( fact = round_fx( L_shl( L_tmp, 2 ) ); /*Q15 */ FOR( i = 0; i < shr( length, 1 ); i++ ) { #ifdef OPTIMIZE_FFT_STACK tmp = mult_r( im[i], fact ); /*Q(Qx+Q_edct) */ tmp_re = sub_sat( re[i], tmp ); /*Q(Qx+Q_edct) */ move16(); Loading @@ -629,15 +528,6 @@ void edct_16fx( re[i] = tmp_re; move16(); #else tmp = mult_r( im2[i], fact ); /*Q(Qx+Q_edct) */ re[i] = sub_sat( re2[i], tmp ); /*Q(Qx+Q_edct) */ move16(); tmp = mult_r( re2[i], fact ); /*Q(Qx+Q_edct) */ im[i] = add_sat( im2[i], tmp ); /*Q(Qx+Q_edct) */ move16(); #endif } /* Post-rotate and obtain the output data */ Loading Loading @@ -799,14 +689,7 @@ void edxt_fx( } ELSE IF( EQ_16( length, 40 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else cosPtr = cos_scale_tbl_640; /*Q15*/ sinPtr = sin_scale_tbl_640; /*Q15*/ n = 16; move16(); #endif } ELSE IF( EQ_16( length, 960 ) ) { Loading @@ -831,58 +714,23 @@ void edxt_fx( } ELSE IF( EQ_16( length, 120 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else cosPtr = cos_scale_tbl_960; /*Q15*/ sinPtr = sin_scale_tbl_960; /*Q15*/ n = 8; move16(); #endif } ELSE IF( EQ_16( length, 1200 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else cosPtr = cos_scale_tbl_1200; /*Q15*/ sinPtr = sin_scale_tbl_1200; /*Q15*/ n = 1; move16(); #endif } ELSE IF( EQ_16( length, 800 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else cosPtr = cos_scale_tbl_800; /*Q15*/ sinPtr = sin_scale_tbl_800; /*Q15*/ n = 1; move16(); #endif } ELSE IF( EQ_16( length, 400 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else cosPtr = cos_scale_tbl_800; /*Q15*/ sinPtr = sin_scale_tbl_800; /*Q15*/ n = 2; move16(); #endif } ELSE IF( EQ_16( length, 200 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else cosPtr = cos_scale_tbl_800; /*Q15*/ sinPtr = sin_scale_tbl_800; /*Q15*/ n = 4; move16(); #endif } test(); Loading @@ -890,26 +738,15 @@ void edxt_fx( { const Word16 Nm1 = sub( length, 1 ); const Word16 xSign = sub( imult1616( 2, shr( kernelType, 1 ) ), 1 ); /*Q0*/ #ifdef OPTIMIZE_FFT_STACK cmplx spec[L_FRAME_MAX]; #else Word32 re[L_FRAME_PLUS]; Word32 im[L_FRAME_PLUS]; #endif IF( !synthesis ) { FOR( k = ( Nm1 / 2 ); k >= 0; k-- ) /* pre-modulation of audio input */ { #ifdef OPTIMIZE_FFT_STACK spec[k].re = x[2 * k]; /*Qx*/ spec[( Nm1 - k )].re = Mpy_32_16_1( x[( ( k * 2 ) + 1 )], shl_sat( xSign, 15 ) ); /*Qx*/ spec[k].im = spec[( Nm1 - k )].im = 0; #else re[k] = x[2 * k]; /*Qx*/ re[( Nm1 - k )] = Mpy_32_16_1( x[( ( k * 2 ) + 1 )], shl_sat( xSign, 15 ) ); /*Qx*/ im[k] = im[( Nm1 - k )] = 0; #endif move32(); move32(); move32(); Loading @@ -918,46 +755,24 @@ void edxt_fx( IF( EQ_16( length, 512 ) ) { /* Scaling down re and im buffers to avoid overflow in DoRTFTn_fx if the minimum headroom is less than 4 bits */ #ifdef OPTIMIZE_FFT_STACK hdrm = L_norm_arr_cmplx( spec, 512 ); #else hdrm = s_min( L_norm_arr( re, 512 ), L_norm_arr( im, 512 ) ); #endif IF( LT_16( hdrm, 4 ) ) { tmp = sub( hdrm, 4 ); #ifdef OPTIMIZE_FFT_STACK scale_sig32_cmplx( spec, 512, tmp ); #else scale_sig32( re, 512, tmp ); scale_sig32( im, 512, tmp ); #endif } #ifdef OPTIMIZE_FFT_STACK DoRTFTn_fx( NULL, NULL, spec, 512 ); #else DoRTFTn_fx( re, im, 512 ); #endif IF( LT_16( hdrm, 4 ) ) { tmp = negate( tmp ); #ifdef OPTIMIZE_FFT_STACK scale_sig32_cmplx( spec, 512, tmp ); #else scale_sig32( re, 512, tmp ); scale_sig32( im, 512, tmp ); #endif } } ELSE /* fft() doesn't support 512 */ { #ifdef OPTIMIZE_FFT_STACK fft_fx( spec, length ); #else fft_fx( re, im, length, 1 ); #endif } IF( shr( kernelType, 1 ) ) Loading @@ -969,21 +784,12 @@ void edxt_fx( const Word16 wRe = cosPtr[( k * n )]; /*Q15*/ const Word16 wIm = sinPtr[( k * n )]; /*Q15*/ #ifdef OPTIMIZE_FFT_STACK y[k] /*pt 1*/ = L_add( Mpy_32_16_1( spec[k].re, wRe ), Mpy_32_16_1( spec[k].im, wIm ) ); /*Qx*/ y[( length - k )] = L_sub( Mpy_32_16_1( spec[k].re, wIm ), Mpy_32_16_1( spec[k].im, wRe ) ); /*Qx*/ #else y[k] /*pt 1*/ = L_add( Mpy_32_16_1( re[k], wRe ), Mpy_32_16_1( im[k], wIm ) ); /*Qx*/ y[( length - k )] = L_sub( Mpy_32_16_1( re[k], wIm ), Mpy_32_16_1( im[k], wRe ) ); /*Qx*/ #endif move32(); move32(); } #ifdef OPTIMIZE_FFT_STACK y[( length / 2 )] = Mpy_32_16_1( spec[( length / 2 )].re, INV_SQRT_2_Q15 ); /*Qx*/ #else y[( length / 2 )] = Mpy_32_16_1( re[( length / 2 )], INV_SQRT_2_Q15 ); /*Qx*/ #endif move32(); } ELSE /* forw. DST-II */ Loading @@ -995,29 +801,16 @@ void edxt_fx( const Word16 wRe = cosPtr[( k * n )]; /*Q15*/ const Word16 wIm = sinPtr[( k * n )]; /*Q15*/ #ifdef OPTIMIZE_FFT_STACK y[( Nm1 - k )] = L_add( Mpy_32_16_1( spec[k].re, wRe ), Mpy_32_16_1( spec[k].im, wIm ) ); /*Qx*/ y[k - 1] = L_sub( Mpy_32_16_1( spec[k].re, wIm ), Mpy_32_16_1( spec[k].im, wRe ) ); /*Qx*/ #else y[( Nm1 - k )] = L_add( Mpy_32_16_1( re[k], wRe ), Mpy_32_16_1( im[k], wIm ) ); /*Qx*/ y[k - 1] = L_sub( Mpy_32_16_1( re[k], wIm ), Mpy_32_16_1( im[k], wRe ) ); /*Qx*/ #endif move32(); move32(); } #ifdef OPTIMIZE_FFT_STACK y[( Nm1 / 2 )] = Mpy_32_16_1( spec[( length / 2 )].re, INV_SQRT_2_Q15 ); /*Qx*/ #else y[( Nm1 / 2 )] = Mpy_32_16_1( re[( length / 2 )], INV_SQRT_2_Q15 ); /*Qx*/ #endif move32(); } #ifdef OPTIMIZE_FFT_STACK y[( Nm1 - ( Nm1 * ( kernelType / 2 ) ) )] = L_shr( spec[0].re, 1 ); /*Qx*/ #else y[( Nm1 - ( Nm1 * ( kernelType / 2 ) ) )] = L_shr( re[0], 1 ); /*Qx*/ #endif move32(); } ELSE /* inverse II = III */ Loading @@ -1031,21 +824,12 @@ void edxt_fx( const Word16 wRe = shr( cosPtr[imult1616( k, n )], 1 ); const Word16 wIm = shr( sinPtr[imult1616( k, n )], 1 ); #ifdef OPTIMIZE_FFT_STACK spec[k].re = L_add( Mpy_32_16_1( x[k], wRe ), Mpy_32_16_1( x[( length - k )], wIm ) ); /*Qx*/ spec[k].im = L_sub( Mpy_32_16_1( x[( length - k )], wRe ), Mpy_32_16_1( x[k], wIm ) ); /*Qx*/ #else re[k] = L_add( Mpy_32_16_1( x[k], wRe ), Mpy_32_16_1( x[( length - k )], wIm ) ); /*Qx*/ im[k] = L_sub( Mpy_32_16_1( x[( length - k )], wRe ), Mpy_32_16_1( x[k], wIm ) ); /*Qx*/ #endif move32(); move32(); } #ifdef OPTIMIZE_FFT_STACK spec[( length / 2 )].re = Mpy_32_16_1( x[( length / 2 )], INV_SQRT_2_Q15 ); /*Qx*/ #else re[( length / 2 )] = Mpy_32_16_1( x[( length / 2 )], INV_SQRT_2_Q15 ); /*Qx*/ #endif move32(); } ELSE /* DST type III */ Loading @@ -1057,42 +841,23 @@ void edxt_fx( const Word16 wRe = shr( cosPtr[( k * n )], 1 ); /*Q15*/ const Word16 wIm = shr( sinPtr[( k * n )], 1 ); /*Q15*/ #ifdef OPTIMIZE_FFT_STACK spec[k].re = L_add( Mpy_32_16_1( x[( Nm1 - k )], wRe ), Mpy_32_16_1( x[( k - 1 )], wIm ) ); /*Qx*/ spec[k].im = L_sub( Mpy_32_16_1( x[( k - 1 )], wRe ), Mpy_32_16_1( x[( Nm1 - k )], wIm ) ); /*Qx*/ #else re[k] = L_add( Mpy_32_16_1( x[( Nm1 - k )], wRe ), Mpy_32_16_1( x[( k - 1 )], wIm ) ); /*Qx*/ im[k] = L_sub( Mpy_32_16_1( x[( k - 1 )], wRe ), Mpy_32_16_1( x[( Nm1 - k )], wIm ) ); /*Qx*/ #endif move32(); move32(); } #ifdef OPTIMIZE_FFT_STACK spec[( length / 2 )].re = Mpy_32_16_1( x[( Nm1 / 2 )], INV_SQRT_2_Q15 ); /*Qx*/ #else re[( length / 2 )] = Mpy_32_16_1( x[( Nm1 / 2 )], INV_SQRT_2_Q15 ); /*Qx*/ #endif move32(); } #ifdef OPTIMIZE_FFT_STACK spec[0].re = x[( Nm1 - ( Nm1 * ( kernelType / 2 ) ) )]; /*Qx*/ spec[0].im = spec[( length / 2 )].im = 0; #else re[0] = x[( Nm1 - ( Nm1 * ( kernelType / 2 ) ) )]; /*Qx*/ im[0] = im[( length / 2 )] = 0; #endif move32(); move32(); FOR( k = ( Nm1 / 2 ); k > 0; k-- ) { #ifdef OPTIMIZE_FFT_STACK spec[( length - k )].re = spec[k].re; /*Qx*/ spec[( length - k )].im = L_negate( spec[k].im ); /*Qx*/ #else re[( length - k )] = re[k]; /*Qx*/ im[( length - k )] = L_negate( im[k] ); /*Qx*/ #endif move32(); move32(); } Loading @@ -1100,63 +865,33 @@ void edxt_fx( IF( EQ_16( length, 512 ) ) { /* Scaling down re and im buffers to avoid overflow in DoRTFTn_fx if the minimum headroom is less than 4 bits */ #ifdef OPTIMIZE_FFT_STACK hdrm = L_norm_arr_cmplx( spec, 512 ); #else hdrm = s_min( L_norm_arr( re, 512 ), L_norm_arr( im, 512 ) ); #endif IF( LT_16( hdrm, 4 ) ) { tmp = sub( hdrm, 4 ); #ifdef OPTIMIZE_FFT_STACK scale_sig32_cmplx( spec, 512, tmp ); #else scale_sig32( re, 512, tmp ); scale_sig32( im, 512, tmp ); #endif } #ifdef OPTIMIZE_FFT_STACK DoRTFTn_fx( NULL, NULL, spec, 512 ); #else DoRTFTn_fx( re, im, 512 ); #endif IF( LT_16( hdrm, 4 ) ) { tmp = negate( tmp ); #ifdef OPTIMIZE_FFT_STACK scale_sig32_cmplx( spec, 512, tmp ); #else scale_sig32( re, 512, tmp ); scale_sig32( im, 512, tmp ); #endif } } ELSE /* fft() doesn't support 512 */ { #ifdef OPTIMIZE_FFT_STACK fft_fx( spec, length ); #else fft_fx( re, im, length, 1 ); #endif } FOR( k = ( Nm1 / 2 ); k >= 0; k-- ) /* post-modulation of FFT output */ { #ifdef OPTIMIZE_FFT_STACK y[2 * k] = spec[k].re; /*Qx*/ #else y[2 * k] = re[k]; /*Qx*/ #endif move32(); IF( xSign != 0 ) { #ifdef OPTIMIZE_FFT_STACK y[( ( k * 2 ) + 1 )] = Mpy_32_16_1( spec[( Nm1 - k )].re, shl_sat( xSign, 15 ) ); /*Qx*/ #else y[( ( k * 2 ) + 1 )] = Mpy_32_16_1( re[( Nm1 - k )], shl_sat( xSign, 15 ) ); /*Qx*/ #endif } ELSE { Loading lib_com/fft_fx_evs.c +0 −10 Original line number Diff line number Diff line Loading @@ -52,16 +52,13 @@ static void cftmdl_fx( Word16 n, Word16 l, Word32 *a, const Word16 *w ); void DoRTFTn_fx( Word32 *x, /* i/o : real part of input and output data Q(x) */ Word32 *y, /* i/o : imaginary part of input and output data Q(x) */ #ifdef OPTIMIZE_FFT_STACK cmplx *spec, /* i/o : complex input and output data */ #endif const Word16 n /* i : size of the FFT up to 1024 */ ) { Word16 i; Word32 z[2048], *pt; #ifdef OPTIMIZE_FFT_STACK IF( spec != NULL ) { pt = z; Loading @@ -75,7 +72,6 @@ void DoRTFTn_fx( } ELSE { #endif pt = z; FOR( i = 0; i < n; i++ ) { Loading @@ -84,9 +80,7 @@ void DoRTFTn_fx( *pt++ = y[i]; move16(); } #ifdef OPTIMIZE_FFT_STACK } #endif IF( EQ_16( n, 16 ) ) { Loading Loading @@ -117,7 +111,6 @@ void DoRTFTn_fx( assert( 0 ); } #ifdef OPTIMIZE_FFT_STACK IF( spec != NULL ) { spec[0].re = z[0]; Loading @@ -135,7 +128,6 @@ void DoRTFTn_fx( } ELSE { #endif x[0] = z[0]; move16(); y[0] = z[1]; Loading @@ -148,9 +140,7 @@ void DoRTFTn_fx( y[i] = *pt++; move16(); } #ifdef OPTIMIZE_FFT_STACK } #endif return; } Loading lib_com/options.h +0 −1 Original line number Diff line number Diff line Loading @@ -92,7 +92,6 @@ #define NONBE_FIX_ISSUE_2206_AVOID_OVERFLOW_MSVQ_Interpol_Tran_fx /* FhG: Fix saturation crash in MSVQ_Interpol_Tran_fx() */ #define FIX_2452_HQ_CORE_PEAQ_AVR_RATIO_HARM /* Eri: Basop issue 2453: Fix alignment of peak_avrg_ratio_fx */ #define FIX_FLOAT_1539_G192_FORMAT_SWITCH /* VA/Nokia: reintroduce format switching for g192 bitstreams */ #define OPTIMIZE_FFT_STACK /* VA: removal of intermediate FFT buffers */ #define HARMONIZE_DCT /* VA: removal of duplicated DCT functions */ #define FIX_2489_HARMONIZE_FdCng_encodeSID /* FhG: harmonize FdCng_encodeSID_fx() and FdCng_encodeSID_ivas_fx() */ #define FIX_1527_CMR_BITRATE_IDX /* Fix for incorrect bitrate idx packed in rtp CMR E-byte */ Loading Loading
lib_com/basop_util.c +0 −2 Original line number Diff line number Diff line Loading @@ -714,7 +714,6 @@ Word16 getScaleFactor16( /* o: measured headroom in range [ return i; } #ifdef OPTIMIZE_FFT_STACK /* o: measured headroom in range [0..31], 0 if all x[i] == 0 */ Word16 getScaleFactor32_cmplx( cmplx *x, /* i: array containing 32-bit data */ Loading Loading @@ -772,7 +771,6 @@ Word16 getScaleFactor32_cmplx( return s_min( i_re, i_im ); } #endif /********************************************************************/ Loading
lib_com/basop_util.h +0 −2 Original line number Diff line number Diff line Loading @@ -221,13 +221,11 @@ Word16 getScaleFactor16( const Word16 *x, /* i: array containing 16-bit data */ const Word16 len_x ); /* i: length of the array to scan */ #ifdef OPTIMIZE_FFT_STACK /* o: measured headroom in range [0..31], 0 if all x[i] == 0 */ Word16 getScaleFactor32_cmplx( cmplx *x, /* i: array containing 32-bit data */ const Word16 len_x /* i: length of the array to scan */ ); #endif /********************************************************************/ /*! Loading
lib_com/edct_fx.c +0 −265 Original line number Diff line number Diff line Loading @@ -55,12 +55,7 @@ static Word16 get_edxt_factor( } ELSE IF( EQ_16( length, 40 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else factor = 7327; /*0.223 in Q15*/ move16(); #endif } ELSE IF( EQ_16( length, 960 ) ) { Loading @@ -79,48 +74,23 @@ static Word16 get_edxt_factor( } ELSE IF( EQ_16( length, 120 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else factor = 4230; /*0.1290 in Q15*/ move16(); #endif } ELSE IF( EQ_16( length, 1200 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else factor = 1338; /*0.040 in Q15*/ move16(); #endif } ELSE IF( EQ_16( length, 800 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else factor = 1638; /*0.05 in Q15*/ move16(); #endif } ELSE IF( EQ_16( length, 400 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else factor = 2317; /*0.070 in Q15*/ move16(); #endif } ELSE IF( EQ_16( length, 200 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else factor = 3277; /*0.1 in Q15*/ move16(); #endif } return factor; /*Q15*/ Loading Loading @@ -219,11 +189,7 @@ void edct_fx( Word32 re; Word32 im; const Word16 *edct_table; /*Q16 */ #ifdef OPTIMIZE_FFT_STACK cmplx spec[L_FRAME_PLUS / 2]; #else Word32 complex_buf[2 * ( L_FRAME48k / 2 + 240 )]; #endif Word32 L_tmp; Word16 tmp; Word16 len1; Loading @@ -234,19 +200,11 @@ void edct_fx( FOR( i = 0; i < len1; i++ ) { L_tmp = Mult_32_16( x[2 * i], edct_table[i] ); /*Q(q+1) */ #ifdef OPTIMIZE_FFT_STACK spec[i].re = Madd_32_16( L_tmp, x[( length - ( 1 + ( i * 2 ) ) )], edct_table[( len1 - ( 1 + i ) )] ); /*Q(q+1) */ #else complex_buf[2 * i] = Madd_32_16( L_tmp, x[( length - ( 1 + ( i * 2 ) ) )], edct_table[( len1 - ( 1 + i ) )] ); /*Q(q+1) */ #endif move32(); L_tmp = Mult_32_16( x[( length - ( 1 + ( i * 2 ) ) )], edct_table[i] ); /*Q(q+1) */ #ifdef OPTIMIZE_FFT_STACK spec[i].im = Msub_32_16( L_tmp, x[( i * 2 )], edct_table[( len1 - ( 1 + i ) )] ); /*Q(q+1) */ #else complex_buf[( ( i * 2 ) + 1 )] = Msub_32_16( L_tmp, x[( i * 2 )], edct_table[( len1 - ( 1 + i ) )] ); /*Q(q+1) */ #endif move32(); } Loading @@ -256,11 +214,7 @@ void edct_fx( #endif *q = sub( 15, *q ); move16(); #ifdef OPTIMIZE_FFT_STACK BASOP_cfft( spec, len1, q, y ); #else BASOP_cfft( (cmplx *) complex_buf, len1, q, y ); #endif tmp = div_s( 1, length ); /*Q15 */ tmp = round_fx( L_shl( L_mult( tmp, 19302 /*0.75f * EVS_PI in Q13*/ ), 2 ) ); /*Q15 */ Loading @@ -284,13 +238,8 @@ void edct_fx( FOR( i = 0; i < len1; i++ ) { #ifdef OPTIMIZE_FFT_STACK re = Msub_32_16( spec[i].re, spec[i].im, tmp ); /*Q(q+1) */ im = Madd_32_16( spec[i].im, spec[i].re, tmp ); /*Q(q+1) */ #else re = Msub_32_16( complex_buf[2 * i], complex_buf[( ( i * 2 ) + 1 )], tmp ); /*Q(q+1) */ im = Madd_32_16( complex_buf[( ( i * 2 ) + 1 )], complex_buf[2 * i], tmp ); /*Q(q+1) */ #endif y[2 * i] = L_add( Mult_32_16( re, edct_table[i] ), Mult_32_16( im, edct_table[( len1 - ( 1 + i ) )] ) ); /*Q(q+2)*/ move32(); y[( length - ( 1 + ( i * 2 ) ) )] = L_sub( Mult_32_16( re, edct_table[( len1 - ( 1 + i ) )] ), Mult_32_16( im, edct_table[i] ) ); /*Q(q+2)*/ Loading Loading @@ -399,11 +348,7 @@ void edst_fx( Word32 re; Word32 im; const Word16 *edct_table; /*Q16 */ #ifdef OPTIMIZE_FFT_STACK cmplx complex_buf[L_FRAME_PLUS / 2]; #else Word32 complex_buf[2 * ( L_FRAME48k / 2 + 240 )]; #endif Word32 L_tmp; Word16 tmp; Word16 len1; Loading @@ -414,41 +359,24 @@ void edst_fx( FOR( i = 0; i < len1; i++ ) { L_tmp = Mult_32_16( x[( length - ( 1 + ( i * 2 ) ) )], edct_table[i] ); /*Qq+1*/ #ifdef OPTIMIZE_FFT_STACK complex_buf[i].re = Madd_32_16( L_tmp, x[2 * i], edct_table[( len1 - ( 1 + i ) )] ); /*Qq+1*/ #else complex_buf[2 * i] = Madd_32_16( L_tmp, x[2 * i], edct_table[( len1 - ( 1 + i ) )] ); /*Qq+1*/ #endif move32(); L_tmp = Mult_32_16( x[2 * i], edct_table[i] ); /*Qq+1*/ #ifdef OPTIMIZE_FFT_STACK complex_buf[i].im = Msub_32_16( L_tmp, x[( length - ( 1 + ( i * 2 ) ) )], edct_table[( len1 - ( 1 + i ) )] ); /*Qq+1*/ #else complex_buf[( ( i * 2 ) + 1 )] = Msub_32_16( L_tmp, x[( length - ( 1 + ( i * 2 ) ) )], edct_table[( len1 - ( 1 + i ) )] ); /*Qq+1*/ #endif move32(); } *q = sub( 15, *q ); move16(); #ifdef OPTIMIZE_FFT_STACK BASOP_cfft( complex_buf, len1, q, y ); #else BASOP_cfft( (cmplx *) complex_buf, len1, q, y ); #endif tmp = div_s( 1, length ); /*Q15 */ tmp = round_fx( L_shl( L_mult( tmp, 19302 /*0.75f * EVS_PI in Q13*/ ), 2 ) ); /*Q15 */ FOR( i = 0; i < len1; i++ ) { #ifdef OPTIMIZE_FFT_STACK re = Msub_32_16( complex_buf[i].re, complex_buf[i].im, tmp ); /*Qq+1*/ im = Madd_32_16( complex_buf[i].im, complex_buf[i].re, tmp ); /*Qq+1*/ #else re = Msub_32_16( complex_buf[2 * i], complex_buf[( ( i * 2 ) + 1 )], tmp ); /*Qq+1*/ im = Madd_32_16( complex_buf[( ( i * 2 ) + 1 )], complex_buf[2 * i], tmp ); /*Qq+1*/ #endif y[2 * i] = L_add( Mult_32_16( re, edct_table[i] ), Mult_32_16( im, edct_table[( len1 - ( 1 + i ) )] ) ); /*Qq+2*/ move32(); y[( length - ( 1 + ( i * 2 ) ) )] = L_sub( Mult_32_16( im, edct_table[i] ), Mult_32_16( re, edct_table[( len1 - ( 1 + i ) )] ) ); /*Qq+2*/ Loading Loading @@ -496,16 +424,8 @@ void edct_16fx( Word16 re[L_FRAME48k / 2]; Word16 im[L_FRAME48k / 2]; const Word16 *edct_table = NULL; #ifndef OPTIMIZE_FFT_STACK Word16 re2[L_FRAME48k / 2]; Word16 im2[L_FRAME48k / 2]; #endif Word32 L_tmp, Lacc, Lmax; #ifdef OPTIMIZE_FFT_STACK Word16 tmp, tmp_re, fact; #else Word16 tmp, fact; #endif Word16 Q_edct; Word16 Len2, i2; const Word16 *px, *pt; Loading Loading @@ -569,46 +489,26 @@ void edct_16fx( L_tmp = L_mult( x[i2], edct_table[i] ); /*Q(Qx+16) */ Lacc = L_mac_sat( L_tmp, *px, *pt ); /*Q(Qx+16) */ #ifdef OPTIMIZE_FFT_STACK re[i] = round_fx_sat( L_shl_sat( Lacc, Q_edct ) ); /* Q(Qx+Q_edct) */ #else re2[i] = round_fx_sat( L_shl_sat( Lacc, Q_edct ) ); /* Q(Qx+Q_edct) */ #endif move16(); L_tmp = L_mult( *px, edct_table[i] ); /*Q(Qx+16) */ Lacc = L_msu_sat( L_tmp, x[i2], *pt ); /*Q(Qx+16) */ #ifdef OPTIMIZE_FFT_STACK im[i] = round_fx_sat( L_shl_sat( Lacc, Q_edct ) ); /* Q(Qx+Q_edct) */ #else im2[i] = round_fx_sat( L_shl_sat( Lacc, Q_edct ) ); /* Q(Qx+Q_edct) */ #endif move16(); px -= 2; pt--; } IF( EQ_16( length, L_FRAME32k ) ) { #ifdef OPTIMIZE_FFT_STACK DoRTFT320_16fx( re, im ); #else DoRTFT320_16fx( re2, im2 ); #endif } ELSE IF( EQ_16( length, L_FRAME ) ) { #ifdef OPTIMIZE_FFT_STACK DoRTFT128_16fx( re, im ); #else DoRTFT128_16fx( re2, im2 ); #endif } ELSE IF( EQ_16( length, L_FRAME16k ) ) { #ifdef OPTIMIZE_FFT_STACK DoRTFT160_16fx( re, im ); #else DoRTFT160_16fx( re2, im2 ); #endif } ELSE { Loading @@ -618,7 +518,6 @@ void edct_16fx( fact = round_fx( L_shl( L_tmp, 2 ) ); /*Q15 */ FOR( i = 0; i < shr( length, 1 ); i++ ) { #ifdef OPTIMIZE_FFT_STACK tmp = mult_r( im[i], fact ); /*Q(Qx+Q_edct) */ tmp_re = sub_sat( re[i], tmp ); /*Q(Qx+Q_edct) */ move16(); Loading @@ -629,15 +528,6 @@ void edct_16fx( re[i] = tmp_re; move16(); #else tmp = mult_r( im2[i], fact ); /*Q(Qx+Q_edct) */ re[i] = sub_sat( re2[i], tmp ); /*Q(Qx+Q_edct) */ move16(); tmp = mult_r( re2[i], fact ); /*Q(Qx+Q_edct) */ im[i] = add_sat( im2[i], tmp ); /*Q(Qx+Q_edct) */ move16(); #endif } /* Post-rotate and obtain the output data */ Loading Loading @@ -799,14 +689,7 @@ void edxt_fx( } ELSE IF( EQ_16( length, 40 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else cosPtr = cos_scale_tbl_640; /*Q15*/ sinPtr = sin_scale_tbl_640; /*Q15*/ n = 16; move16(); #endif } ELSE IF( EQ_16( length, 960 ) ) { Loading @@ -831,58 +714,23 @@ void edxt_fx( } ELSE IF( EQ_16( length, 120 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else cosPtr = cos_scale_tbl_960; /*Q15*/ sinPtr = sin_scale_tbl_960; /*Q15*/ n = 8; move16(); #endif } ELSE IF( EQ_16( length, 1200 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else cosPtr = cos_scale_tbl_1200; /*Q15*/ sinPtr = sin_scale_tbl_1200; /*Q15*/ n = 1; move16(); #endif } ELSE IF( EQ_16( length, 800 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else cosPtr = cos_scale_tbl_800; /*Q15*/ sinPtr = sin_scale_tbl_800; /*Q15*/ n = 1; move16(); #endif } ELSE IF( EQ_16( length, 400 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else cosPtr = cos_scale_tbl_800; /*Q15*/ sinPtr = sin_scale_tbl_800; /*Q15*/ n = 2; move16(); #endif } ELSE IF( EQ_16( length, 200 ) ) { #ifdef OPTIMIZE_FFT_STACK assert( 0 ); #else cosPtr = cos_scale_tbl_800; /*Q15*/ sinPtr = sin_scale_tbl_800; /*Q15*/ n = 4; move16(); #endif } test(); Loading @@ -890,26 +738,15 @@ void edxt_fx( { const Word16 Nm1 = sub( length, 1 ); const Word16 xSign = sub( imult1616( 2, shr( kernelType, 1 ) ), 1 ); /*Q0*/ #ifdef OPTIMIZE_FFT_STACK cmplx spec[L_FRAME_MAX]; #else Word32 re[L_FRAME_PLUS]; Word32 im[L_FRAME_PLUS]; #endif IF( !synthesis ) { FOR( k = ( Nm1 / 2 ); k >= 0; k-- ) /* pre-modulation of audio input */ { #ifdef OPTIMIZE_FFT_STACK spec[k].re = x[2 * k]; /*Qx*/ spec[( Nm1 - k )].re = Mpy_32_16_1( x[( ( k * 2 ) + 1 )], shl_sat( xSign, 15 ) ); /*Qx*/ spec[k].im = spec[( Nm1 - k )].im = 0; #else re[k] = x[2 * k]; /*Qx*/ re[( Nm1 - k )] = Mpy_32_16_1( x[( ( k * 2 ) + 1 )], shl_sat( xSign, 15 ) ); /*Qx*/ im[k] = im[( Nm1 - k )] = 0; #endif move32(); move32(); move32(); Loading @@ -918,46 +755,24 @@ void edxt_fx( IF( EQ_16( length, 512 ) ) { /* Scaling down re and im buffers to avoid overflow in DoRTFTn_fx if the minimum headroom is less than 4 bits */ #ifdef OPTIMIZE_FFT_STACK hdrm = L_norm_arr_cmplx( spec, 512 ); #else hdrm = s_min( L_norm_arr( re, 512 ), L_norm_arr( im, 512 ) ); #endif IF( LT_16( hdrm, 4 ) ) { tmp = sub( hdrm, 4 ); #ifdef OPTIMIZE_FFT_STACK scale_sig32_cmplx( spec, 512, tmp ); #else scale_sig32( re, 512, tmp ); scale_sig32( im, 512, tmp ); #endif } #ifdef OPTIMIZE_FFT_STACK DoRTFTn_fx( NULL, NULL, spec, 512 ); #else DoRTFTn_fx( re, im, 512 ); #endif IF( LT_16( hdrm, 4 ) ) { tmp = negate( tmp ); #ifdef OPTIMIZE_FFT_STACK scale_sig32_cmplx( spec, 512, tmp ); #else scale_sig32( re, 512, tmp ); scale_sig32( im, 512, tmp ); #endif } } ELSE /* fft() doesn't support 512 */ { #ifdef OPTIMIZE_FFT_STACK fft_fx( spec, length ); #else fft_fx( re, im, length, 1 ); #endif } IF( shr( kernelType, 1 ) ) Loading @@ -969,21 +784,12 @@ void edxt_fx( const Word16 wRe = cosPtr[( k * n )]; /*Q15*/ const Word16 wIm = sinPtr[( k * n )]; /*Q15*/ #ifdef OPTIMIZE_FFT_STACK y[k] /*pt 1*/ = L_add( Mpy_32_16_1( spec[k].re, wRe ), Mpy_32_16_1( spec[k].im, wIm ) ); /*Qx*/ y[( length - k )] = L_sub( Mpy_32_16_1( spec[k].re, wIm ), Mpy_32_16_1( spec[k].im, wRe ) ); /*Qx*/ #else y[k] /*pt 1*/ = L_add( Mpy_32_16_1( re[k], wRe ), Mpy_32_16_1( im[k], wIm ) ); /*Qx*/ y[( length - k )] = L_sub( Mpy_32_16_1( re[k], wIm ), Mpy_32_16_1( im[k], wRe ) ); /*Qx*/ #endif move32(); move32(); } #ifdef OPTIMIZE_FFT_STACK y[( length / 2 )] = Mpy_32_16_1( spec[( length / 2 )].re, INV_SQRT_2_Q15 ); /*Qx*/ #else y[( length / 2 )] = Mpy_32_16_1( re[( length / 2 )], INV_SQRT_2_Q15 ); /*Qx*/ #endif move32(); } ELSE /* forw. DST-II */ Loading @@ -995,29 +801,16 @@ void edxt_fx( const Word16 wRe = cosPtr[( k * n )]; /*Q15*/ const Word16 wIm = sinPtr[( k * n )]; /*Q15*/ #ifdef OPTIMIZE_FFT_STACK y[( Nm1 - k )] = L_add( Mpy_32_16_1( spec[k].re, wRe ), Mpy_32_16_1( spec[k].im, wIm ) ); /*Qx*/ y[k - 1] = L_sub( Mpy_32_16_1( spec[k].re, wIm ), Mpy_32_16_1( spec[k].im, wRe ) ); /*Qx*/ #else y[( Nm1 - k )] = L_add( Mpy_32_16_1( re[k], wRe ), Mpy_32_16_1( im[k], wIm ) ); /*Qx*/ y[k - 1] = L_sub( Mpy_32_16_1( re[k], wIm ), Mpy_32_16_1( im[k], wRe ) ); /*Qx*/ #endif move32(); move32(); } #ifdef OPTIMIZE_FFT_STACK y[( Nm1 / 2 )] = Mpy_32_16_1( spec[( length / 2 )].re, INV_SQRT_2_Q15 ); /*Qx*/ #else y[( Nm1 / 2 )] = Mpy_32_16_1( re[( length / 2 )], INV_SQRT_2_Q15 ); /*Qx*/ #endif move32(); } #ifdef OPTIMIZE_FFT_STACK y[( Nm1 - ( Nm1 * ( kernelType / 2 ) ) )] = L_shr( spec[0].re, 1 ); /*Qx*/ #else y[( Nm1 - ( Nm1 * ( kernelType / 2 ) ) )] = L_shr( re[0], 1 ); /*Qx*/ #endif move32(); } ELSE /* inverse II = III */ Loading @@ -1031,21 +824,12 @@ void edxt_fx( const Word16 wRe = shr( cosPtr[imult1616( k, n )], 1 ); const Word16 wIm = shr( sinPtr[imult1616( k, n )], 1 ); #ifdef OPTIMIZE_FFT_STACK spec[k].re = L_add( Mpy_32_16_1( x[k], wRe ), Mpy_32_16_1( x[( length - k )], wIm ) ); /*Qx*/ spec[k].im = L_sub( Mpy_32_16_1( x[( length - k )], wRe ), Mpy_32_16_1( x[k], wIm ) ); /*Qx*/ #else re[k] = L_add( Mpy_32_16_1( x[k], wRe ), Mpy_32_16_1( x[( length - k )], wIm ) ); /*Qx*/ im[k] = L_sub( Mpy_32_16_1( x[( length - k )], wRe ), Mpy_32_16_1( x[k], wIm ) ); /*Qx*/ #endif move32(); move32(); } #ifdef OPTIMIZE_FFT_STACK spec[( length / 2 )].re = Mpy_32_16_1( x[( length / 2 )], INV_SQRT_2_Q15 ); /*Qx*/ #else re[( length / 2 )] = Mpy_32_16_1( x[( length / 2 )], INV_SQRT_2_Q15 ); /*Qx*/ #endif move32(); } ELSE /* DST type III */ Loading @@ -1057,42 +841,23 @@ void edxt_fx( const Word16 wRe = shr( cosPtr[( k * n )], 1 ); /*Q15*/ const Word16 wIm = shr( sinPtr[( k * n )], 1 ); /*Q15*/ #ifdef OPTIMIZE_FFT_STACK spec[k].re = L_add( Mpy_32_16_1( x[( Nm1 - k )], wRe ), Mpy_32_16_1( x[( k - 1 )], wIm ) ); /*Qx*/ spec[k].im = L_sub( Mpy_32_16_1( x[( k - 1 )], wRe ), Mpy_32_16_1( x[( Nm1 - k )], wIm ) ); /*Qx*/ #else re[k] = L_add( Mpy_32_16_1( x[( Nm1 - k )], wRe ), Mpy_32_16_1( x[( k - 1 )], wIm ) ); /*Qx*/ im[k] = L_sub( Mpy_32_16_1( x[( k - 1 )], wRe ), Mpy_32_16_1( x[( Nm1 - k )], wIm ) ); /*Qx*/ #endif move32(); move32(); } #ifdef OPTIMIZE_FFT_STACK spec[( length / 2 )].re = Mpy_32_16_1( x[( Nm1 / 2 )], INV_SQRT_2_Q15 ); /*Qx*/ #else re[( length / 2 )] = Mpy_32_16_1( x[( Nm1 / 2 )], INV_SQRT_2_Q15 ); /*Qx*/ #endif move32(); } #ifdef OPTIMIZE_FFT_STACK spec[0].re = x[( Nm1 - ( Nm1 * ( kernelType / 2 ) ) )]; /*Qx*/ spec[0].im = spec[( length / 2 )].im = 0; #else re[0] = x[( Nm1 - ( Nm1 * ( kernelType / 2 ) ) )]; /*Qx*/ im[0] = im[( length / 2 )] = 0; #endif move32(); move32(); FOR( k = ( Nm1 / 2 ); k > 0; k-- ) { #ifdef OPTIMIZE_FFT_STACK spec[( length - k )].re = spec[k].re; /*Qx*/ spec[( length - k )].im = L_negate( spec[k].im ); /*Qx*/ #else re[( length - k )] = re[k]; /*Qx*/ im[( length - k )] = L_negate( im[k] ); /*Qx*/ #endif move32(); move32(); } Loading @@ -1100,63 +865,33 @@ void edxt_fx( IF( EQ_16( length, 512 ) ) { /* Scaling down re and im buffers to avoid overflow in DoRTFTn_fx if the minimum headroom is less than 4 bits */ #ifdef OPTIMIZE_FFT_STACK hdrm = L_norm_arr_cmplx( spec, 512 ); #else hdrm = s_min( L_norm_arr( re, 512 ), L_norm_arr( im, 512 ) ); #endif IF( LT_16( hdrm, 4 ) ) { tmp = sub( hdrm, 4 ); #ifdef OPTIMIZE_FFT_STACK scale_sig32_cmplx( spec, 512, tmp ); #else scale_sig32( re, 512, tmp ); scale_sig32( im, 512, tmp ); #endif } #ifdef OPTIMIZE_FFT_STACK DoRTFTn_fx( NULL, NULL, spec, 512 ); #else DoRTFTn_fx( re, im, 512 ); #endif IF( LT_16( hdrm, 4 ) ) { tmp = negate( tmp ); #ifdef OPTIMIZE_FFT_STACK scale_sig32_cmplx( spec, 512, tmp ); #else scale_sig32( re, 512, tmp ); scale_sig32( im, 512, tmp ); #endif } } ELSE /* fft() doesn't support 512 */ { #ifdef OPTIMIZE_FFT_STACK fft_fx( spec, length ); #else fft_fx( re, im, length, 1 ); #endif } FOR( k = ( Nm1 / 2 ); k >= 0; k-- ) /* post-modulation of FFT output */ { #ifdef OPTIMIZE_FFT_STACK y[2 * k] = spec[k].re; /*Qx*/ #else y[2 * k] = re[k]; /*Qx*/ #endif move32(); IF( xSign != 0 ) { #ifdef OPTIMIZE_FFT_STACK y[( ( k * 2 ) + 1 )] = Mpy_32_16_1( spec[( Nm1 - k )].re, shl_sat( xSign, 15 ) ); /*Qx*/ #else y[( ( k * 2 ) + 1 )] = Mpy_32_16_1( re[( Nm1 - k )], shl_sat( xSign, 15 ) ); /*Qx*/ #endif } ELSE { Loading
lib_com/fft_fx_evs.c +0 −10 Original line number Diff line number Diff line Loading @@ -52,16 +52,13 @@ static void cftmdl_fx( Word16 n, Word16 l, Word32 *a, const Word16 *w ); void DoRTFTn_fx( Word32 *x, /* i/o : real part of input and output data Q(x) */ Word32 *y, /* i/o : imaginary part of input and output data Q(x) */ #ifdef OPTIMIZE_FFT_STACK cmplx *spec, /* i/o : complex input and output data */ #endif const Word16 n /* i : size of the FFT up to 1024 */ ) { Word16 i; Word32 z[2048], *pt; #ifdef OPTIMIZE_FFT_STACK IF( spec != NULL ) { pt = z; Loading @@ -75,7 +72,6 @@ void DoRTFTn_fx( } ELSE { #endif pt = z; FOR( i = 0; i < n; i++ ) { Loading @@ -84,9 +80,7 @@ void DoRTFTn_fx( *pt++ = y[i]; move16(); } #ifdef OPTIMIZE_FFT_STACK } #endif IF( EQ_16( n, 16 ) ) { Loading Loading @@ -117,7 +111,6 @@ void DoRTFTn_fx( assert( 0 ); } #ifdef OPTIMIZE_FFT_STACK IF( spec != NULL ) { spec[0].re = z[0]; Loading @@ -135,7 +128,6 @@ void DoRTFTn_fx( } ELSE { #endif x[0] = z[0]; move16(); y[0] = z[1]; Loading @@ -148,9 +140,7 @@ void DoRTFTn_fx( y[i] = *pt++; move16(); } #ifdef OPTIMIZE_FFT_STACK } #endif return; } Loading
lib_com/options.h +0 −1 Original line number Diff line number Diff line Loading @@ -92,7 +92,6 @@ #define NONBE_FIX_ISSUE_2206_AVOID_OVERFLOW_MSVQ_Interpol_Tran_fx /* FhG: Fix saturation crash in MSVQ_Interpol_Tran_fx() */ #define FIX_2452_HQ_CORE_PEAQ_AVR_RATIO_HARM /* Eri: Basop issue 2453: Fix alignment of peak_avrg_ratio_fx */ #define FIX_FLOAT_1539_G192_FORMAT_SWITCH /* VA/Nokia: reintroduce format switching for g192 bitstreams */ #define OPTIMIZE_FFT_STACK /* VA: removal of intermediate FFT buffers */ #define HARMONIZE_DCT /* VA: removal of duplicated DCT functions */ #define FIX_2489_HARMONIZE_FdCng_encodeSID /* FhG: harmonize FdCng_encodeSID_fx() and FdCng_encodeSID_ivas_fx() */ #define FIX_1527_CMR_BITRATE_IDX /* Fix for incorrect bitrate idx packed in rtp CMR E-byte */ Loading