Loading lib_com/options.h +1 −0 Original line number Diff line number Diff line Loading @@ -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 Loading lib_enc/ivas_stereo_td_analysis.c +78 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 ); Loading Loading @@ -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; Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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) Loading Loading
lib_com/options.h +1 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
lib_enc/ivas_stereo_td_analysis.c +78 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 ); Loading Loading @@ -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; Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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) Loading