From 45af4f71541a4d44d9a710b19c82a3eda5321809 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Thu, 25 Jul 2024 09:08:28 +0530 Subject: [PATCH] Fix for 3GPP issue 818: example of under performing code from complexity and precision point of view [x] Made the suggested changes in https://forge.3gpp.org/rep/sa4/audio/ivas-basop/-/issues/818. --- lib_com/options.h | 1 + lib_enc/ivas_stereo_td_analysis.c | 78 +++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 0c7d4b051..c40293951 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -110,6 +110,7 @@ #define IVAS_FLOAT_FIXED #ifdef IVAS_FLOAT_FIXED #define MSAN_FIX +#define FIX_818_COMPLEXITY_IMPROV /* Fix for issue 818 */ #endif #define ISM_DISABLE #define FIX_TMP_714 diff --git a/lib_enc/ivas_stereo_td_analysis.c b/lib_enc/ivas_stereo_td_analysis.c index 03288fd13..be64a0175 100644 --- a/lib_enc/ivas_stereo_td_analysis.c +++ b/lib_enc/ivas_stereo_td_analysis.c @@ -662,20 +662,43 @@ static void Get_LR_rms_fx( { Word32 ener_l, ener_r; Word32 ener_l_tmp, ener_r_tmp; +#ifdef FIX_818_COMPLEXITY_IMPROV + Word16 guard_bits; + Word64 W_ener_l_tmp, W_ener_r_tmp; +#else Word64 ener_l_tmp_64bit, ener_r_tmp_64bit; Word16 q_shift; +#endif Word16 i; Word16 exp_out_l, exp_out_r, exp_diff; +#ifdef FIX_818_COMPLEXITY_IMPROV + W_ener_l_tmp = 0; + move64(); + W_ener_r_tmp = 0; + move64(); +#else ener_l_tmp_64bit = 0; move64(); ener_r_tmp_64bit = 0; move64(); +#endif ener_l = ONE_BY_100_Q31; move32(); ener_r = ONE_BY_100_Q31; move32(); +#ifdef FIX_818_COMPLEXITY_IMPROV + guard_bits = sub( 32, find_guarded_bits_fx( input_frame ) ); + FOR( i = 0; i < input_frame; i++ ) + { + W_ener_l_tmp = W_mac0_16_16( W_ener_l_tmp, Left_in[i], Left_in[i] ); // Q0 + W_ener_r_tmp = W_mac0_16_16( W_ener_r_tmp, Right_in[i], Right_in[i] ); // Q0 + } + /* Scaling back to the original proposal */ + ener_l_tmp = W_extract_h( W_shl( W_ener_l_tmp, guard_bits ) ); // guard_bits - 32 + ener_r_tmp = W_extract_h( W_shl( W_ener_r_tmp, guard_bits ) ); // guard_bits - 32 +#else FOR( i = 0; i < input_frame; i++ ) { ener_l_tmp_64bit = W_add( ener_l_tmp_64bit, W_deposit32_l( L_mult0( Left_in[i], Left_in[i] ) ) ); // Q0 @@ -703,9 +726,15 @@ static void Get_LR_rms_fx( { ener_r_tmp = L_add( ener_r_tmp, 1 ); } +#endif +#ifdef FIX_818_COMPLEXITY_IMPROV + ener_l = BASOP_Util_Add_Mant32Exp( ener_l, 0, ener_l_tmp, sub( Q31, sub( guard_bits, 32 ) ), &exp_out_l ); + ener_r = BASOP_Util_Add_Mant32Exp( ener_r, 0, ener_r_tmp, sub( Q31, sub( guard_bits, 32 ) ), &exp_out_r ); +#else ener_l = BASOP_Util_Add_Mant32Exp( ener_l, 0, ener_l_tmp, sub( Q31, sub( q_shift, 32 ) ), &exp_out_l ); ener_r = BASOP_Util_Add_Mant32Exp( ener_r, 0, ener_r_tmp, sub( Q31, sub( q_shift, 32 ) ), &exp_out_r ); +#endif ener_l_tmp = BASOP_Util_Divide3232_Scale( ener_l, input_frame, &exp_diff ); exp_out_l = sub( add( exp_diff, exp_out_l ), Q15 ); @@ -2181,7 +2210,21 @@ static void Get_corr_n_fx( Word16 exp_diff; Word32 L_tmp; Word16 guard_bits; +#ifdef FIX_818_COMPLEXITY_IMPROV + Word64 W_corrL, W_corrR, W_ener, W_ener_side; +#endif +#ifdef FIX_818_COMPLEXITY_IMPROV + W_corrL = 0; + move64(); + W_corrR = 0; + move64(); + W_ener = EPSILON_FX; + move64(); + W_ener_side = EPSILON_FX; + move64(); + guard_bits = sub( 32, find_guarded_bits_fx( len ) ); +#else corrL = 0; move32(); corrR = 0; @@ -2191,6 +2234,7 @@ static void Get_corr_n_fx( ener_side = EPSILON_FX; move32(); guard_bits = find_guarded_bits_fx( len ); +#endif /*----------------------------------------------------------------* * Find the normalized correlation between: left/mono and right/mono based @@ -2198,6 +2242,22 @@ static void Get_corr_n_fx( IF( tdm_SM_calc_flag ) { +#ifdef FIX_818_COMPLEXITY_IMPROV + FOR( i = 0; i < len; i++ ) + { + mono_i = round_fx( L_msu( L_mult( L[i], ONE_IN_Q14 ), R[i], ONE_IN_Q14 ) ); // q_in + W_corrL = W_mac0_16_16( W_corrL, abs_s( L[i] ), abs_s( mono_i ) ); // (q_in + q_in ) + W_corrR = W_mac0_16_16( W_corrR, abs_s( R[i] ), abs_s( mono_i ) ); // (q_in + q_in ) + W_ener = W_mac0_16_16( W_ener, mono_i, mono_i ); // (q_in + q_in ) + side_i = round_fx( L_mac( L_mult( L[i], ONE_IN_Q14 ), R[i], ONE_IN_Q14 ) ); // q_in + W_ener_side = W_mac0_16_16( W_ener_side, side_i, side_i ); // (q_in + q_in ) + } + /* Scaling back to the original proposal */ + corrL = W_extract_h( W_shl( W_corrL, guard_bits ) ); + corrR = W_extract_h( W_shl( W_corrR, guard_bits ) ); + ener = W_extract_h( W_shl( W_ener, guard_bits ) ); + ener_side = W_extract_h( W_shl( W_ener_side, guard_bits ) ); +#else FOR( i = 0; i < len; i++ ) { mono_i = sub( shr( L[i], Q1 ), shr( R[i], Q1 ) ); // q_in @@ -2207,9 +2267,26 @@ static void Get_corr_n_fx( side_i = add( shr( L[i], Q1 ), shr( R[i], Q1 ) ); // q_in ener_side = L_add( ener_side, L_shr( L_mult0( side_i, side_i ), guard_bits ) ); // (q_in + q_in - guard_bits) } +#endif } ELSE { +#ifdef FIX_818_COMPLEXITY_IMPROV + FOR( i = 0; i < len; i++ ) + { + mono_i = round_fx( L_mac( L_mult( L[i], ONE_IN_Q14 ), R[i], ONE_IN_Q14 ) ); // q_in + W_corrL = W_mac0_16_16( W_corrL, L[i], mono_i ); // (q_in + q_in ) + W_corrR = W_mac0_16_16( W_corrR, R[i], mono_i ); // (q_in + q_in ) + W_ener = W_mac0_16_16( W_ener, mono_i, mono_i ); // (q_in + q_in ) + side_i = round_fx( L_msu( L_mult( L[i], ONE_IN_Q14 ), R[i], ONE_IN_Q14 ) ); // q_in + W_ener_side = W_mac0_16_16( W_ener_side, side_i, side_i ); // (q_in + q_in ) + } + /* Scaling back to the original proposal */ + corrL = W_extract_h( W_shl( W_corrL, guard_bits ) ); + corrR = W_extract_h( W_shl( W_corrR, guard_bits ) ); + ener = W_extract_h( W_shl( W_ener, guard_bits ) ); + ener_side = W_extract_h( W_shl( W_ener_side, guard_bits ) ); +#else FOR( i = 0; i < len; i++ ) { mono_i = add( shr( L[i], Q1 ), shr( R[i], Q1 ) ); // q_in @@ -2219,6 +2296,7 @@ static void Get_corr_n_fx( side_i = sub( shr( L[i], Q1 ), shr( R[i], Q1 ) ); // q_in ener_side = L_add( ener_side, L_shr( L_mult0( side_i, side_i ), guard_bits ) ); // (q_in + q_in - guard_bits) } +#endif } *ic_Lm = BASOP_Util_Divide3232_Scale_cadence( corrL, ener, &exp_diff ); // (Q31 - exp_diff) -- GitLab