Commit 96089fa0 authored by vaillancour's avatar vaillancour
Browse files

fixes EVS stv16c_13200_16kHz

parent 9b30c487
Loading
Loading
Loading
Loading
+58 −9
Original line number Diff line number Diff line
@@ -835,7 +835,9 @@ void Interpolate_allpass_steep_fx(
    Word16 k;
    Word32 Lacc=0, Lacc1=0;
    Word16 temp1, temp2;

#ifdef BASOP_NOGLOB_DECLARE_LOCAL
    Flag Overflow = 0;
#endif
    /*** State in Q0,in_fx Q0, AP1_STEEP in Q15 AP2_STEEP in Q15  OP in Q0 ************/
    /*upper allpass filter chain     */

@@ -843,28 +845,50 @@ void Interpolate_allpass_steep_fx(
    {

        Lacc = L_deposit_h( mem[0] );               /* Q(16+x) */
#ifdef BASOP_NOGLOB
        Lacc = L_mac_o( Lacc, AP2_STEEP_FX[0], in_fx[k], &Overflow );  /* Q(16+x):temp[0] */
#else
        Lacc = L_mac( Lacc, AP2_STEEP_FX[0], in_fx[k] );  /* Q(16+x):temp[0] */

#endif
        Lacc1 = L_deposit_h( in_fx[k] );             /* Q(16+x) */
#ifdef BASOP_NOGLOB
        temp1 = round_fx_o( Lacc, &Overflow);                   /* Qx */
        Lacc1 = L_msu_o( Lacc1, AP2_STEEP_FX[0], temp1, &Overflow); /* Q(16+x)  */

        mem[0] = round_fx_o( Lacc1, &Overflow);
#else
        temp1 = round_fx(Lacc);                   /* Qx */
        Lacc1 = L_msu(Lacc1, AP2_STEEP_FX[0], temp1); /* Q(16+x)  */

        mem[0] = round_fx(Lacc1);

#endif
        Lacc1 = L_deposit_h( mem[1] );            /* Q(16+x) */
#ifdef BASOP_NOGLOB
        Lacc1 = ( L_mac_o(Lacc1, AP2_STEEP_FX[1], temp1, &Overflow));  /* Q(16+x):temp[1] */
#else
        Lacc1 = ( L_mac(Lacc1, AP2_STEEP_FX[1], temp1 ));  /* Q(16+x):temp[1] */

#endif
        Lacc = L_deposit_h( temp1 );

#ifdef BASOP_NOGLOB
        temp2 = round_fx_o( Lacc1, &Overflow);                    /* Qx */
        Lacc = L_msu_o( Lacc, AP2_STEEP_FX[1], temp2, &Overflow);    /* Q(16+x) */
        mem[1] = round_fx_o( Lacc, &Overflow);                /* Qx */
#else
        temp2 = round_fx( Lacc1 );                    /* Qx */
        Lacc = L_msu( Lacc, AP2_STEEP_FX[1], temp2 );    /* Q(16+x) */
        mem[1] = round_fx( Lacc );                /* Qx */
#endif

        Lacc1 = L_deposit_h( temp2 );
        Lacc = L_deposit_h( mem[ALLPASSSECTIONS_STEEP-1] );            /* Q(16+x) */
#ifdef BASOP_NOGLOB
        out_fx[2*k+1] = round_fx_o( L_mac_o( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP-1], temp2, &Overflow), &Overflow); /* Qx format */
        mem[ALLPASSSECTIONS_STEEP-1] = round_fx_o( L_msu_o(Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP-1], out_fx[2*k+1], &Overflow), &Overflow);/* Qx  */
#else
        out_fx[2*k+1] = round_fx( L_mac( Lacc, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP-1], temp2 )); /* Qx format */
        mem[ALLPASSSECTIONS_STEEP-1] = round_fx( L_msu(Lacc1, AP2_STEEP_FX[ALLPASSSECTIONS_STEEP-1], out_fx[2*k+1] ));/* Qx  */

#endif
    }

    /*  lower allpass filter chain    */
@@ -872,26 +896,51 @@ void Interpolate_allpass_steep_fx(
    FOR ( k = 0; k < N; k++)
    {
        Lacc = L_deposit_h( mem[ ALLPASSSECTIONS_STEEP ] );               /* Q(16+x) */
#ifdef BASOP_NOGLOB
        Lacc = L_mac_o( Lacc, AP1_STEEP_FX[0], in_fx[k], &Overflow );                       /* Q(16+x):temp[0] */
#else
        Lacc = L_mac( Lacc, AP1_STEEP_FX[0], in_fx[k] );                       /* Q(16+x):temp[0] */

#endif
        Lacc1 = L_deposit_h( in_fx[k] );             /* Q(16+x) */
#ifdef BASOP_NOGLOB
        temp1 = round_fx_o( Lacc, &Overflow);                   /* Qx */
        Lacc1 = L_msu_o( Lacc1, AP1_STEEP_FX[0], temp1, &Overflow); /* Q(16+x)  */

        mem[ ALLPASSSECTIONS_STEEP ] = round_fx_o( Lacc1, &Overflow);
#else
        temp1 = round_fx( Lacc );                   /* Qx */
        Lacc1 = L_msu( Lacc1, AP1_STEEP_FX[0], temp1 ); /* Q(16+x)  */

        mem[ ALLPASSSECTIONS_STEEP ] = round_fx( Lacc1 );

#endif
        Lacc1 = L_deposit_h( mem[ ALLPASSSECTIONS_STEEP+1 ] );            /* Q(16+x) */
#ifdef BASOP_NOGLOB
        Lacc1 = L_mac_o( Lacc1, AP1_STEEP_FX[1], temp1, &Overflow);  /* Q(16+x):temp[1] */

        temp2 = round_fx_o( Lacc1, &Overflow);                    /* Qx */
#else
        Lacc1 = L_mac( Lacc1, AP1_STEEP_FX[1], temp1 );  /* Q(16+x):temp[1] */

        temp2 = round_fx( Lacc1 );                    /* Qx */
#endif
        Lacc = L_deposit_h( temp1 );
#ifdef BASOP_NOGLOB
        Lacc = L_msu_o( Lacc, AP1_STEEP_FX[ 1 ], temp2, &Overflow);    /* Q(16+x) */
        mem[ ALLPASSSECTIONS_STEEP+1 ] = round_fx_o( Lacc, &Overflow);                /* Qx */
#else
        Lacc = L_msu( Lacc, AP1_STEEP_FX[ 1 ], temp2 );    /* Q(16+x) */
        mem[ ALLPASSSECTIONS_STEEP+1 ] = round_fx( Lacc );                /* Qx */
#endif

        Lacc = L_deposit_h( mem[ 2*ALLPASSSECTIONS_STEEP-1 ] );            /* Q(16+x) */
        Lacc1 = L_deposit_h( temp2 );
#ifdef BASOP_NOGLOB
        out_fx[ 2*k ] = round_fx_o( L_mac_o( Lacc, AP1_STEEP_FX[ ALLPASSSECTIONS_STEEP-1 ], temp2, &Overflow), &Overflow); /* Qx format */
        mem[ 2*ALLPASSSECTIONS_STEEP-1 ] = round_fx_o( L_msu_o(Lacc1, AP1_STEEP_FX[ ALLPASSSECTIONS_STEEP-1 ], out_fx[ 2*k ], &Overflow), &Overflow);/* Qx */
#else
        out_fx[ 2*k ] = round_fx( L_mac( Lacc, AP1_STEEP_FX[ ALLPASSSECTIONS_STEEP-1 ], temp2 )); /* Qx format */
        mem[ 2*ALLPASSSECTIONS_STEEP-1 ] = round_fx( L_msu(Lacc1, AP1_STEEP_FX[ ALLPASSSECTIONS_STEEP-1 ], out_fx[ 2*k ] ));/* Qx */
#endif

    }

+12 −3
Original line number Diff line number Diff line
@@ -259,7 +259,9 @@ static void tcx_ltp_synth_filter(
    const Word16 *w0, *w1;
    Word16 alpha, step = 0; /* initialize just to avoid compiler warning */
    Word16 i, j, k, L;

#ifdef BASOP_NOGLOB_DECLARE_LOCAL
    Flag Overflow = 0;
#endif
    IF (gain > 0)
    {
        x0 = &synth_ltp[-pitch_int];
@@ -329,7 +331,14 @@ static void tcx_ltp_synth_filter(
            move16();

            BASOP_SATURATE_WARNING_OFF_EVS;
#ifdef BASOP_NOGLOB
            if (fade != 0)
            {
                alpha = add_o(alpha, step, &Overflow);
            }                                       
#else
            if (fade != 0) alpha = add(alpha, step);
#endif
            BASOP_SATURATE_WARNING_ON_EVS;

            x0++;
+11 −0
Original line number Diff line number Diff line
@@ -2074,13 +2074,20 @@ void add_vec_fx(
)
{
    Word16 i, Qyx1, Qyx2;
#ifdef BASOP_NOGLOB_DECLARE_LOCAL
    Flag Overflow = 0;
#endif
    Qyx1 = sub(Qx1,Qy);
    Qyx2 = sub(Qx2,Qy);
    IF (Qyx1 == 0)
    {
        FOR (i=0 ; i<N ; i++)
        {
#ifdef BASOP_NOGLOB
            y[i] = add_o(x1[i],shr_ro(x2[i],Qyx2, &Overflow), &Overflow);
#else
            y[i] = add(x1[i],shr_r(x2[i],Qyx2));
#endif
            move16();
        }
    }
@@ -2088,7 +2095,11 @@ void add_vec_fx(
    {
        FOR (i=0 ; i<N ; i++)
        {
#ifdef BASOP_NOGLOB
            y[i] = add_o(shr_ro(x1[i],Qyx1, &Overflow),shr_ro(x2[i],Qyx2, &Overflow), &Overflow);
#else
            y[i] = add(shr_r(x1[i],Qyx1),shr_r(x2[i],Qyx2));
#endif
            move16();
        }
    }
+12 −0
Original line number Diff line number Diff line
@@ -430,7 +430,11 @@ void preecho_sb_fx(
            move16();
        }

#ifdef BASOP_NOGLOB
        if( LT_32(max_es_fx, L_shl_o(mean_prev_fx_loc, 2, &Overflow)))/*OK if saturated*/
#else
        if( LT_32(max_es_fx, L_shl(mean_prev_fx_loc, 2)))/*OK if saturated*/
#endif
        {
            maxind = 0;
            move16();
@@ -892,12 +896,20 @@ void preecho_sb_fx(
            {
                savehalfe_fx = L_add(mean_prev_nc_fx_loc, 0);
            }
#ifdef BASOP_NOGLOB
            mean_prev_nc_fx_loc = L_add_o(mean_prev_nc_fx_loc, es_mdct_fx[i], &Overflow);
#else
            mean_prev_nc_fx_loc = L_add(mean_prev_nc_fx_loc, es_mdct_fx[i]);
#endif
        }

        if( LT_32(savehalfe_fx, L_shr(mean_prev_nc_fx_loc,1) ))
        {
#ifdef BASOP_NOGLOB
            mean_prev_nc_fx_loc = L_shl_o(L_sub_o(mean_prev_nc_fx_loc, savehalfe_fx, &Overflow), 1, &Overflow);
#else
            mean_prev_nc_fx_loc = L_shl(L_sub(mean_prev_nc_fx_loc, savehalfe_fx), 1);
#endif
        }
        mean_prev_nc_fx_loc = L_shr(mean_prev_nc_fx_loc, 3);  /* >> LOG2_NUMSF in fixpoint */

+14 −2
Original line number Diff line number Diff line
@@ -886,7 +886,9 @@ static Word16 imax_fx( /* o: The location, relative to the middle of the 3 given
    Word16 y1, y2, y3, man, expo, edge;
    const Word16 *pY;
    Word32 numer, denom, sign, acc, y3_y1;

#ifdef BASOP_NOGLOB_DECLARE_LOCAL
    Flag Overflow = 0;
#endif
    /* Seek the extremum of the parabola P(x) defined by 3 consecutive points
       so that P([-1 0 1]) = [y1 y2 y3] */
    pY = y;
@@ -920,8 +922,11 @@ static Word16 imax_fx( /* o: The location, relative to the middle of the 3 given
    /* Although the output of ratio() is in Q14, adding the missing factor of 2 (See above)
     * in the denominator, the output is now considered to be in Q15. */
    man = ratio(numer, denom, &expo); /* The mantissa is considered in Q15 */
#ifdef BASOP_NOGLOB
    posi = shr_o(man, expo, &Overflow);  /* in Q15 (Due to saturation, it is automatically bound inside [-1.0,1.0].) */
#else
    posi = shr(man, expo);  /* in Q15 (Due to saturation, it is automatically bound inside [-1.0,1.0].) */

#endif
    if (sign < 0) /* Restore the sign. */
    {
        posi = negate(posi);
@@ -1938,9 +1943,16 @@ Word32 mult_32_32_q(const Word32 a, const Word32 b, const Word16 q)
{
    Word32 hi;
    UWord32 lo;
#ifdef BASOP_NOGLOB_DECLARE_LOCAL
    Flag Overflow = 0;
#endif
    Mpy_32_32_ss(a, b, &hi, &lo);

#ifdef BASOP_NOGLOB
    return L_or(L_shl_o(hi, 32 - q - 1, &Overflow), L_lshr(lo, q + 1));
#else
    return L_or(L_shl(hi, 32 - q - 1), L_lshr(lo, q + 1));
#endif
}

static
Loading