From 4e3f41d1c7b89fc3ce99f456a73a5438295c7e83 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 8 Oct 2024 10:09:38 +0530 Subject: [PATCH] Fix for issue 899: Energy burst in BWE at 32kbps (ISM 1) --- lib_com/swb_tbe_com_fx.c | 47 ++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 26 deletions(-) diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index 6cd0d3302..d13d56705 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -2866,29 +2866,29 @@ void GenShapedSHBExcitation_ivas_fx( FOR( i = 0; i < L_FRAME32k; i = i + 2 ) { - exc32k[i] = negate( bwe_exc_extended[i] ); + exc32k[i] = negate( bwe_exc_extended[i] ); // Q_bwe_exc move16(); - exc32k[i + 1] = bwe_exc_extended[i + 1]; + exc32k[i + 1] = bwe_exc_extended[i + 1]; // Q_bwe_exc move16(); } /* Decimate by 2 */ - Decimate_allpass_steep_fx( exc32k, mem_genSHBexc_filt_down_shb, 2 * L_FRAME16k, exc16k ); + Decimate_allpass_steep_fx( exc32k, mem_genSHBexc_filt_down_shb, 2 * L_FRAME16k, exc16k ); // Q_bwe_exc /* i: exc32k in Q_bwe_exc */ /* o: exc16k in Q_bwe_exc */ - autocorr_fx( exc16k, LPC_WHTN_ORDER + 1, R_h, R_l, &Q_R, L_FRAME16k, win_flatten_fx, 0, 1 ); + autocorr_fx( exc16k, LPC_WHTN_ORDER + 1, R_h, R_l, &Q_R, L_FRAME16k, win_flatten_fx, 0, 1 ); // Q_R /* Ensure R[0] isn't zero when entering Levinson Durbin */ R_l[0] = s_max( R_l[0], 1 ); move16(); FOR( i = 1; i <= LPC_WHTN_ORDER; i++ ) { L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] ); - L_Extract( L_tmp, &R_h[i], &R_l[i] ); + L_Extract( L_tmp, &R_h[i], &R_l[i] ); // Q_R } E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER, NULL ); - Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) ); - fir_fx( exc16k, lpc_whtn, exc16kWhtnd, wht_fil_mem, L_FRAME16k, LPC_WHTN_ORDER, 0, 3 ); + Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) ); // Q12 + fir_fx( exc16k, lpc_whtn, exc16kWhtnd, wht_fil_mem, L_FRAME16k, LPC_WHTN_ORDER, 0, 3 ); // Q_bwe_exc /* i: exc16k in Q_bwe_exc */ /* o: exc16kWhtnd in Q_bwe_exc */ @@ -2907,7 +2907,7 @@ void GenShapedSHBExcitation_ivas_fx( move16(); FOR( i = 0; i < 80; i++ ) { - exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) ); + exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) ); // Q_bwe_exc move16(); /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */ } @@ -2982,9 +2982,9 @@ void GenShapedSHBExcitation_ivas_fx( varEnvShape = s_max( varEnvShape, 9830 /*0.3f Q15*/ ); varEnvShape = s_min( varEnvShape, 16368 /*0.4995f Q15*/ ); varEnvShape = shl( varEnvShape, 1 ); - csfilt_num2[0] = sub( MAX_16, varEnvShape ); + csfilt_num2[0] = sub( MAX_16, varEnvShape ); // Q15 move16(); - neg_csfilt_den2[1] = varEnvShape; + neg_csfilt_den2[1] = varEnvShape; // Q15 move16(); test(); @@ -3036,7 +3036,7 @@ void GenShapedSHBExcitation_ivas_fx( White_exc16k = exc16k; move16(); - Word16 Q_excTmp2 = add( getScaleFactor16( excTmp2, L_FRAME16k ), *Q_bwe_exc ); + Word16 Q_excTmp2 = sub( add( s_min( getScaleFactor16( excTmp2, L_FRAME16k ), norm_l( *mem_csfilt ) ), *Q_bwe_exc ), 1 ); test(); /* Track the low band envelope */ IF( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_DFT ) @@ -3079,7 +3079,7 @@ void GenShapedSHBExcitation_ivas_fx( #endif { /* Track the low band envelope */ - L_tmp = *mem_csfilt; + L_tmp = L_shl( *mem_csfilt, sub( Q_excTmp2, *Q_bwe_exc ) ); move32(); FOR( i = 0; i < L_FRAME16k; i++ ) { @@ -3089,7 +3089,7 @@ void GenShapedSHBExcitation_ivas_fx( *mem_csfilt: Q_excTmp2+16, excTmp2: Q_excTmp2, csfilt_num2[0] Q_excTmp2 */ L_tmp = L_mult( excNoisyEnv[i], neg_csfilt_den2[1] ); /* Q_excTmp2 + 16 */ } - *mem_csfilt = L_tmp; + *mem_csfilt = L_shr( L_tmp, sub( Q_excTmp2, *Q_bwe_exc ) ); move32(); } #if 1 // def ADD_IVAS_TBE_CODE @@ -3141,20 +3141,15 @@ void GenShapedSHBExcitation_ivas_fx( /* create a random excitation - Reuse exc16k memory */ White_exc16k = exc16k; move16(); - create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed ); - create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed ); + create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed ); // Q5 + create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed ); // Q5 L_tmp = L_deposit_l( 0 ); tmp = add( *Q_bwe_exc, 1 ); FOR( k = 0; k < L_FRAME16k; k++ ) { -#ifdef BASOP_NOGLOB - L_tmp4 = L_shl_sat( L_deposit_l( White_exc16k[k] ), tmp ); -#else - L_tmp4 = L_shl( L_deposit_l( White_exc16k[k] ), tmp ); -#endif - L_tmp4 = L_mult( shr( excNoisyEnv[k], sub( Q_excTmp2, *Q_bwe_exc ) ), White_exc16k[k] ); /* (Q_bwe_exc) +5 +1*/ - White_exc16k_32[k] = L_tmp4; + L_tmp4 = L_mult( shr( excNoisyEnv[k], sub( Q_excTmp2, *Q_bwe_exc ) ), White_exc16k[k] ); /* (Q_excTmp2) +5 +1*/ + White_exc16k_32[k] = L_tmp4; /* (Q_excTmp2) +5 +1*/ move32(); L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) ); } @@ -3175,10 +3170,10 @@ void GenShapedSHBExcitation_ivas_fx( FOR( k = 0; k < L_FRAME16k; k++ ) { /* White_exc16k[k] *= excNoisyEnv[k]; */ - White_exc16k[k] = mult_r( excNoisyEnv[k], shl( White_exc16k[k], tmp ) ); + White_exc16k[k] = mult_r( excNoisyEnv[k], shl( White_exc16k[k], tmp ) ); // Q_excTmp2 + 5 + 1 - 15 ==> Q_excTmp2 - 9 move16(); chk2 = s_or( chk2, White_exc16k[k] ); - /* i: excNoisyEnv in (Q_bwe_exc) */ + /* i: excNoisyEnv in (Q_excTmp2) */ /* i: White_exc16k in Q6 */ /* o: White_exc16k in (Q_bwe_exc-NOISE_QADJ) */ /* pow22 += White_exc16k[k] * White_exc16k[k]; */ @@ -3500,11 +3495,11 @@ void GenShapedSHBExcitation_ivas_fx( tmp = sub( Q_temp, 3 ); FOR( k = 0; k < L_FRAME16k; k++ ) { - White_exc16k_FB[k] = round_fx( L_shl( White_exc16k_32[k], tmp ) ); /* Q_bwe_exc +5 +1 +Q_temp -16 -3 */ + White_exc16k_FB[k] = White_exc16k[k]; /* Q_bwe_exc-NOISE_QADJ */ } prev_Q_bwe_exc_fb = *Q_bwe_exc_fb; move16(); - *Q_bwe_exc_fb = sub( add( *Q_bwe_exc, Q_temp ), 13 ); + *Q_bwe_exc_fb = sub( *Q_bwe_exc, NOISE_QADJ ); move16(); deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph ); /* i/o: White_exc16k (Q_bwe_exc-NOISE_QADJ) */ -- GitLab