Commit 2f98b2d8 authored by Manuel Jander's avatar Manuel Jander
Browse files

Scale each quadruple of xL and xR vectors individually to increase precision of small

parent babe17da
Loading
Loading
Loading
Loading
Loading
+45 −3
Original line number Diff line number Diff line
@@ -861,7 +861,49 @@ static Word32 SQ_gain_estimate_stereo_fx( // e_res
    /* 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 ) );
#if 1
    FOR( q = 0; q < lg_4; q++ )
    {
        e_tmp = s_min( add( e_xL, 3 ), sub( L_norm_arr( xL_fx + i, 4 ), 2 ) );
        e_ener = shl( sub( e_xL, e_tmp ), 1 );
        ener_fx = L_shr( 21474836 /* 0.01 */,  e_ener );
        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( e_ener * ONE_IN_Q25, en_fx[q] ), 9864 /* log10(2) in Q15 */ ); // Q(25)
        move32();
        i = add( i, 4 );
    }
    i = 0;
    FOR( ; q < lg2_4; q++ )
    {
        e_tmp = s_min( add( e_xR, 3 ), sub( L_norm_arr( xR_fx + i, 4 ), 2 ) );
        e_ener = shl( sub( e_xR, e_tmp ), 1 );
        ener_fx = L_shr( 21474836 /* 0.01 */, e_ener );
        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( e_ener * ONE_IN_Q25, en_fx[q] ), 9864 /* log10(2) in Q15 */ ); // Q(25)
        move32();
        i = add( i, 4 );
    }

#else
    e_tmp = s_min( add( e_xL, 3 ), sub( L_norm_arr( xL_fx, lg ), 2 ) );
    e_xL = sub( e_xL, e_tmp );
    FOR( q = 0; q < lg_4; q++ )
    {
@@ -880,7 +922,7 @@ static Word32 SQ_gain_estimate_stereo_fx( // e_res
        move32();
        i = add( i, 4 );
    }
    e_tmp = s_min( 8, sub( L_norm_arr( xR_fx, lg ), 2 ) );
    e_tmp = s_min( add( e_xR, 3 ), sub( L_norm_arr( xR_fx, lg ), 2 ) );
    e_xR = sub( e_xR, e_tmp );
    i = 0;
    FOR( ; q < lg2_4; q++ )
@@ -900,7 +942,7 @@ static Word32 SQ_gain_estimate_stereo_fx( // e_res
        move32();
        i = add( i, 4 );
    }

#endif
#else
    FOR( q = 0; q < lg_4; q++ )
    {