Commit b630f769 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Merge branch '3gpp_issue_818_fix' into 'main'

Fix for 3GPP issue 818: example of under performing code from complexity and...

See merge request !473
parents c02e2ebf 45af4f71
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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
+78 −0
Original line number Diff line number Diff line
@@ -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)