Commit 78479f1a authored by Manuel Jander's avatar Manuel Jander
Browse files

Increase accuracy for SQ_gain_estimate_stereo, for the case in issue 1464

parent f66bba2c
Loading
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -69,6 +69,8 @@

#define FIX_1378_ACELP_OUT_OF_BOUNDS

#define FIX_1464_SQ_GAIN_PRECISION

/* Note: each compile switch (FIX_1101_...) is independent from the other ones */
//#define OPT_STEREO_32KBPS_V1                    /* Optimization made in stereo decoding path for 32kbps decoding */
#define OPT_AVOID_STATE_BUF_RESCALE             /* Optimization made to avoid rescale of synth state buffer */
+45 −2
Original line number Diff line number Diff line
@@ -860,9 +860,51 @@ static Word32 SQ_gain_estimate_stereo_fx( // e_res
    /* energy of quadruples with 9dB offset */
    /* ignore that we may take no all lines into account, max. 3 lines at the upper end of the spectrum can be missed (if lg is not a multiple of 4, happens also in SQGain()*/

#ifdef FIX_1464_SQ_GAIN_PRECISION
    e_tmp = s_min( 8, sub( L_norm_arr( xL_fx, lg ), 2 ) );
    e_xL = sub( e_xL, e_tmp );
    FOR( q = 0; q < lg_4; q++ )
    {
        ener_fx = BASOP_Util_Add_Mant32Exp( 21474836 /*0.01 in Q15*/, 0, Mpy_32_32( xL_fx[i], xL_fx[i] ), e_xL * 2, &e_ener ); /* Q31-e_ener */
        ener_fx = L_shr( 21474836 /* 0.01 */, shl( e_xL, 1 ) );
        tmp_32 = L_shl( xL_fx[i + 0], e_tmp );
        ener_fx = L_add( ener_fx, Mpy_32_32( tmp_32, tmp_32 ) );
        tmp_32 = L_shl( xL_fx[i + 1], e_tmp );
        ener_fx = L_add( ener_fx, Mpy_32_32( tmp_32, tmp_32 ) );
        tmp_32 = L_shl( xL_fx[i + 2], e_tmp );
        ener_fx = L_add( ener_fx, Mpy_32_32( tmp_32, tmp_32 ) );
        tmp_32 = L_shl( xL_fx[i + 3], e_tmp );
        ener_fx = L_add( ener_fx, Mpy_32_32( tmp_32, tmp_32 ) );
        en_fx[q] = BASOP_Util_Log2( ener_fx );                                                                                 /* saves a MAC */
        move32();
        en_fx[q] = Mpy_32_16_1( L_add( 2 * e_xL * ONE_IN_Q25, en_fx[q] ), 9864 /* log10(2) in Q15 */ ); // Q(25)
        move32();
        i = add( i, 4 );
    }
    e_tmp = s_min( 8, sub( L_norm_arr( xR_fx, lg ), 2 ) );
    e_xR = sub( e_xR, e_tmp );
    i = 0;
    FOR( ; q < lg2_4; q++ )
    {
        ener_fx = L_shr( 21474836 /* 0.01 */, shl( e_xR, 1 ) );
        tmp_32 = L_shl( xR_fx[i + 0], e_tmp );
        ener_fx = L_add( ener_fx, Mpy_32_32( tmp_32, tmp_32 ) );
        tmp_32 = L_shl( xR_fx[i + 1], e_tmp );
        ener_fx = L_add( ener_fx, Mpy_32_32( tmp_32, tmp_32 ) );
        tmp_32 = L_shl( xR_fx[i + 2], e_tmp );
        ener_fx = L_add( ener_fx, Mpy_32_32( tmp_32, tmp_32 ) );
        tmp_32 = L_shl( xR_fx[i + 3], e_tmp );
        ener_fx = L_add( ener_fx, Mpy_32_32( tmp_32, tmp_32 ) );
        en_fx[q] = BASOP_Util_Log2( ener_fx );                                                                              /* saves a MAC */
        move32();
        en_fx[q] = Mpy_32_16_1( L_add( 2 * e_xR * ONE_IN_Q25, en_fx[q] ), 9864 /* log10(2) in Q15 */ ); // Q(25)
        move32();
        i = add( i, 4 );
    }

#else
    FOR( q = 0; q < lg_4; q++ )
    {
        ener_fx = BASOP_Util_Add_Mant32Exp( 21474836 /*0.01 in Q31*/, 0, Mpy_32_32( xL_fx[i], xL_fx[i] ), e_xL * 2, &e_ener ); /* Q31-e_ener */
        ener_fx = BASOP_Util_Add_Mant32Exp( ener_fx, e_ener, Mpy_32_32( xL_fx[i + 1], xL_fx[i + 1] ), e_xL * 2, &e_ener );     /* Q31-e_ener */
        ener_fx = BASOP_Util_Add_Mant32Exp( ener_fx, e_ener, Mpy_32_32( xL_fx[i + 2], xL_fx[i + 2] ), e_xL * 2, &e_ener );     /* Q31-e_ener */
        ener_fx = BASOP_Util_Add_Mant32Exp( ener_fx, e_ener, Mpy_32_32( xL_fx[i + 3], xL_fx[i + 3] ), e_xL * 2, &e_ener );     /* Q31-e_ener */
@@ -875,7 +917,7 @@ static Word32 SQ_gain_estimate_stereo_fx( // e_res
    i = 0;
    FOR( ; q < lg2_4; q++ )
    {
        ener_fx = BASOP_Util_Add_Mant32Exp( 21474836 /*0.01 Q15*/, 0, Mpy_32_32( xR_fx[i], xR_fx[i] ), e_xR * 2, &e_ener ); /* Q31-e_ener */
        ener_fx = BASOP_Util_Add_Mant32Exp( 21474836 /*0.01 Q31*/, 0, Mpy_32_32( xR_fx[i], xR_fx[i] ), e_xR * 2, &e_ener ); /* Q31-e_ener */
        ener_fx = BASOP_Util_Add_Mant32Exp( ener_fx, e_ener, Mpy_32_32( xR_fx[i + 1], xR_fx[i + 1] ), e_xR * 2, &e_ener );  /* Q31-e_ener */
        ener_fx = BASOP_Util_Add_Mant32Exp( ener_fx, e_ener, Mpy_32_32( xR_fx[i + 2], xR_fx[i + 2] ), e_xR * 2, &e_ener );  /* Q31-e_ener */
        ener_fx = BASOP_Util_Add_Mant32Exp( ener_fx, e_ener, Mpy_32_32( xR_fx[i + 3], xR_fx[i + 3] ), e_xR * 2, &e_ener );  /* Q31-e_ener */
@@ -885,6 +927,7 @@ static Word32 SQ_gain_estimate_stereo_fx( // e_res
        move32();
        i = add( i, 4 );
    }
#endif

    /* SQ scale: 4 bits / 6 dB per quadruple */
    target_fx = L_mult( 19660 /* 0.15 in Q17 */, sub( nbitsSQ, shr( lg2, 4 ) ) ); // Q(18)