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

Merge branch '3gpp_issue_899_fix' into 'main'

Fix for issue 899: Energy burst in BWE at 32kbps (ISM 1) [allow regression]

See merge request !640
parents 55df2144 4e3f41d1
Loading
Loading
Loading
Loading
+21 −26
Original line number Diff line number Diff line
@@ -2866,29 +2866,29 @@ void GenShapedSHBExcitation_ivas_fx(

    FOR( i = 0; i < L_FRAME32k; i = i + 2 )
    {
        exc32k[i] = negate( bwe_exc_extended[i] );
        exc32k[i] = negate( bwe_exc_extended[i] ); // Q_bwe_exc
        move16();
        exc32k[i + 1] = bwe_exc_extended[i + 1];
        exc32k[i + 1] = bwe_exc_extended[i + 1]; // Q_bwe_exc
        move16();
    }

    /* Decimate by 2 */
    Decimate_allpass_steep_fx( exc32k, mem_genSHBexc_filt_down_shb, 2 * L_FRAME16k, exc16k );
    Decimate_allpass_steep_fx( exc32k, mem_genSHBexc_filt_down_shb, 2 * L_FRAME16k, exc16k ); // Q_bwe_exc
    /* i: exc32k in Q_bwe_exc */
    /* o: exc16k in Q_bwe_exc */

    autocorr_fx( exc16k, LPC_WHTN_ORDER + 1, R_h, R_l, &Q_R, L_FRAME16k, win_flatten_fx, 0, 1 );
    autocorr_fx( exc16k, LPC_WHTN_ORDER + 1, R_h, R_l, &Q_R, L_FRAME16k, win_flatten_fx, 0, 1 ); // Q_R
    /* Ensure R[0] isn't zero when entering Levinson Durbin */
    R_l[0] = s_max( R_l[0], 1 );
    move16();
    FOR( i = 1; i <= LPC_WHTN_ORDER; i++ )
    {
        L_tmp = Mpy_32( R_h[i], R_l[i], wac_h[i - 1], wac_l[i - 1] );
        L_Extract( L_tmp, &R_h[i], &R_l[i] );
        L_Extract( L_tmp, &R_h[i], &R_l[i] ); // Q_R
    }
    E_LPC_lev_dur( R_h, R_l, lpc_whtn, LepsP, LPC_WHTN_ORDER, NULL );
    Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) );
    fir_fx( exc16k, lpc_whtn, exc16kWhtnd, wht_fil_mem, L_FRAME16k, LPC_WHTN_ORDER, 0, 3 );
    Copy_Scale_sig( lpc_whtn, lpc_whtn, LPC_WHTN_ORDER + 1, sub( norm_s( lpc_whtn[0] ), 2 ) ); // Q12
    fir_fx( exc16k, lpc_whtn, exc16kWhtnd, wht_fil_mem, L_FRAME16k, LPC_WHTN_ORDER, 0, 3 );    // Q_bwe_exc

    /* i: exc16k in Q_bwe_exc */
    /* o: exc16kWhtnd in Q_bwe_exc */
@@ -2907,7 +2907,7 @@ void GenShapedSHBExcitation_ivas_fx(
            move16();
            FOR( i = 0; i < 80; i++ )
            {
                exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) );
                exc16kWhtnd[temp2 + i] = round_fx( L_shl( L_mult( exc16kWhtnd[temp2 + i], temp1 ), 1 ) ); // Q_bwe_exc
                move16();
                /* exc16kWhtnd in Q_bwe_exc, shb_res_gshape in Q14 */
            }
@@ -2982,9 +2982,9 @@ void GenShapedSHBExcitation_ivas_fx(
    varEnvShape = s_max( varEnvShape, 9830 /*0.3f Q15*/ );
    varEnvShape = s_min( varEnvShape, 16368 /*0.4995f Q15*/ );
    varEnvShape = shl( varEnvShape, 1 );
    csfilt_num2[0] = sub( MAX_16, varEnvShape );
    csfilt_num2[0] = sub( MAX_16, varEnvShape ); // Q15
    move16();
    neg_csfilt_den2[1] = varEnvShape;
    neg_csfilt_den2[1] = varEnvShape; // Q15
    move16();

    test();
@@ -3036,7 +3036,7 @@ void GenShapedSHBExcitation_ivas_fx(

    White_exc16k = exc16k;
    move16();
    Word16 Q_excTmp2 = add( getScaleFactor16( excTmp2, L_FRAME16k ), *Q_bwe_exc );
    Word16 Q_excTmp2 = sub( add( s_min( getScaleFactor16( excTmp2, L_FRAME16k ), norm_l( *mem_csfilt ) ), *Q_bwe_exc ), 1 );
    test();
    /* Track the low band envelope */
    IF( element_mode == IVAS_CPE_TD || element_mode == IVAS_CPE_DFT )
@@ -3079,7 +3079,7 @@ void GenShapedSHBExcitation_ivas_fx(
#endif
    {
        /* Track the low band envelope */
        L_tmp = *mem_csfilt;
        L_tmp = L_shl( *mem_csfilt, sub( Q_excTmp2, *Q_bwe_exc ) );
        move32();
        FOR( i = 0; i < L_FRAME16k; i++ )
        {
@@ -3089,7 +3089,7 @@ void GenShapedSHBExcitation_ivas_fx(
             *mem_csfilt: Q_excTmp2+16, excTmp2: Q_excTmp2, csfilt_num2[0] Q_excTmp2  */
            L_tmp = L_mult( excNoisyEnv[i], neg_csfilt_den2[1] ); /* Q_excTmp2 + 16 */
        }
        *mem_csfilt = L_tmp;
        *mem_csfilt = L_shr( L_tmp, sub( Q_excTmp2, *Q_bwe_exc ) );
        move32();
    }
#if 1 // def ADD_IVAS_TBE_CODE
@@ -3141,20 +3141,15 @@ void GenShapedSHBExcitation_ivas_fx(
        /* create a random excitation - Reuse exc16k memory */
        White_exc16k = exc16k;
        move16();
        create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed );
        create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed );
        create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed );                        // Q5
        create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed ); // Q5

        L_tmp = L_deposit_l( 0 );
        tmp = add( *Q_bwe_exc, 1 );
        FOR( k = 0; k < L_FRAME16k; k++ )
        {
#ifdef BASOP_NOGLOB
            L_tmp4 = L_shl_sat( L_deposit_l( White_exc16k[k] ), tmp );
#else
            L_tmp4 = L_shl( L_deposit_l( White_exc16k[k] ), tmp );
#endif
            L_tmp4 = L_mult( shr( excNoisyEnv[k], sub( Q_excTmp2, *Q_bwe_exc ) ), White_exc16k[k] ); /* (Q_bwe_exc)  +5 +1*/
            White_exc16k_32[k] = L_tmp4;
            L_tmp4 = L_mult( shr( excNoisyEnv[k], sub( Q_excTmp2, *Q_bwe_exc ) ), White_exc16k[k] ); /* (Q_excTmp2)  +5 +1*/
            White_exc16k_32[k] = L_tmp4;                                                             /* (Q_excTmp2)  +5 +1*/
            move32();
            L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
        }
@@ -3175,10 +3170,10 @@ void GenShapedSHBExcitation_ivas_fx(
        FOR( k = 0; k < L_FRAME16k; k++ )
        {
            /* White_exc16k[k] *= excNoisyEnv[k]; */
            White_exc16k[k] = mult_r( excNoisyEnv[k], shl( White_exc16k[k], tmp ) );
            White_exc16k[k] = mult_r( excNoisyEnv[k], shl( White_exc16k[k], tmp ) ); // Q_excTmp2 + 5 + 1 - 15 ==> Q_excTmp2 - 9
            move16();
            chk2 = s_or( chk2, White_exc16k[k] );
            /* i: excNoisyEnv in (Q_bwe_exc)     */
            /* i: excNoisyEnv in (Q_excTmp2)     */
            /* i: White_exc16k  in Q6               */
            /* o: White_exc16k in (Q_bwe_exc-NOISE_QADJ)  */
            /* pow22 += White_exc16k[k] * White_exc16k[k]; */
@@ -3500,11 +3495,11 @@ void GenShapedSHBExcitation_ivas_fx(
    tmp = sub( Q_temp, 3 );
    FOR( k = 0; k < L_FRAME16k; k++ )
    {
        White_exc16k_FB[k] = round_fx( L_shl( White_exc16k_32[k], tmp ) ); /* Q_bwe_exc +5 +1 +Q_temp -16 -3 */
        White_exc16k_FB[k] = White_exc16k[k]; /* Q_bwe_exc-NOISE_QADJ */
    }
    prev_Q_bwe_exc_fb = *Q_bwe_exc_fb;
    move16();
    *Q_bwe_exc_fb = sub( add( *Q_bwe_exc, Q_temp ), 13 );
    *Q_bwe_exc_fb = sub( *Q_bwe_exc, NOISE_QADJ );
    move16();
    deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph );
    /* i/o: White_exc16k (Q_bwe_exc-NOISE_QADJ) */