Commit 3b87007a authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Few bug fixes, mld improvements

parent 794bda24
Loading
Loading
Loading
Loading
Loading
+10 −9
Original line number Diff line number Diff line
@@ -3015,6 +3015,7 @@ void GenShapedSHBExcitation_ivas_enc_fx(
    const Word32 extl_brate,    /* i  : extension layer bitarte                 */
    const Word16 MSFlag,        /* i  : Multi Source flag                       */
    Word16 EnvSHBres_4k[],      /* i/o: TD envelope of the SHB residual signal  */
    Word16 Q_EnvSHBres_4k,
    Word32 *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame */
    Word16 *prev_mix_factor,      /* i/o: mixing factor in the previous frame     */
    Word16 *Env_error,            /* o  : error in SHB residual envelope modelling*/
+67 −73
Original line number Diff line number Diff line
@@ -2853,6 +2853,7 @@ void GenShapedSHBExcitation_ivas_enc_fx(
    const Word32 extl_brate,    /* i  : extension layer bitarte                                    */
    const Word16 MSFlag,        /* i  : Multi Source flag                                          */
    Word16 EnvSHBres_4k[],      /* i/o: TD envelope of the SHB residual signal                     */
    Word16 Q_EnvSHBres_4k,
    Word32 *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame    */
    Word16 *prev_mix_factor,      /* i/o: mixing factor in the previous frame                        */
    Word16 *Env_error,            /* o  : error in SHB residual envelope modelling                Q0 */
@@ -2872,6 +2873,7 @@ void GenShapedSHBExcitation_ivas_enc_fx(

    Word16 excTmp2[L_FRAME16k];
    Word16 *White_exc16k;
    Word16 Q_White_exc16k;
    Word16 excNoisyEnv[L_FRAME16k];
    Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */
    move16();
@@ -2899,7 +2901,6 @@ void GenShapedSHBExcitation_ivas_enc_fx(
    Word16 White_exc16k_FB_temp[L_FRAME16k];
    Word32 White_exc16k_32[L_FRAME16k];
    Word16 White_exc16k_tmp[L_FRAME16k];
    Word16 Q_temp;
    Word16 prev_Q_bwe_exc_fb;
    Word16 chk1, chk2;
    chk1 = 0;
@@ -3089,7 +3090,6 @@ void GenShapedSHBExcitation_ivas_enc_fx(
    }

    White_exc16k = exc16k;
    move16();
    Word16 Q_excTmp2 = add( getScaleFactor16( excTmp2, L_FRAME16k ), *Q_bwe_exc );
    IF( *mem_csfilt )
    {
@@ -3168,12 +3168,12 @@ void GenShapedSHBExcitation_ivas_enc_fx(
        /* generate gaussian (white) excitation */
        FOR( k = 0; k < L_FRAME16k; k++ )
        {
            White_exc16k[k] = own_random( &bwe_seed[0] );
            White_exc16k[k] = own_random( &bwe_seed[0] ); // Q0
            move16();
        }

        /* normalize the amplitude of the gaussian excitation to that of the LB exc. */
        Word32 pow22_inv = POW_EXC16k_WHTND_FX_INV_SQRT;
        Word32 pow22_inv = POW_EXC16k_WHTND_FX_INV_SQRT; // Q31
        move32();
        move32();
        pow22 = POW_EXC16k_WHTND_FX;
@@ -3189,27 +3189,20 @@ void GenShapedSHBExcitation_ivas_enc_fx(
        // v_multc_fixed_16_16(White_exc16k, round_fx(temp_pow), White_exc16k, L_FRAME16k);
        L_tmp = 0;
        move32();
        Q_White_exc16k = add( getScaleFactor16( White_exc16k, L_FRAME16k ), norm_l( temp_pow ) );
        FOR( k = 0; k < L_FRAME16k; k++ )
        {
            White_exc16k_32[k] = Mpy_32_16_1( temp_pow, White_exc16k[k] );
            White_exc16k_32[k] = Mpy_32_16_1( temp_pow, White_exc16k[k] ); // Q31 + Q0 - Q15 = Q16
            move32();
            White_exc16k[k] = round_fx( L_shl( White_exc16k_32[k], sub( *Q_bwe_exc, NOISE_QADJ ) ) ); //  Q_bwe_exc - NOISE_QADJ
            White_exc16k[k] = round_fx( L_shl( White_exc16k_32[k], Q_White_exc16k ) ); //  Q16 + Q_White_exc16k - Q16 = Q_White_exc16k
            move16();
            L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
        }
        Q_temp = norm_l( L_tmp );
        IF( L_tmp == 0 )
        {
            Q_temp = 31;
            move16();
        }
    }
    ELSE
#endif
    {
        /* create a random excitation - Reuse exc16k memory */
        White_exc16k = exc16k;
        move16();
        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

@@ -3222,12 +3215,6 @@ void GenShapedSHBExcitation_ivas_enc_fx(
            move32();
            L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
        }
        Q_temp = norm_l( L_tmp );
        IF( L_tmp == 0 )
        {
            Q_temp = 31;
            move16();
        }
        /*Copy_Scale_sig( White_exc16k, White_exc16k, L_FRAME16k, sub(NOISE_QFAC, 5) );)*/
        /* White_exc16k in Q6 */

@@ -3235,22 +3222,23 @@ void GenShapedSHBExcitation_ivas_enc_fx(
        /* pow22=0.00001f */
        tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 );
        Word64 sum = W_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(*Q_bwe_exc-NOISE_QADJ) */
        Q_White_exc16k = getScaleFactor32( White_exc16k_32, L_FRAME16k );
        FOR( k = 0; k < L_FRAME16k; k++ )
        {
            /* White_exc16k[k] *= excNoisyEnv[k]; */
            White_exc16k[k] = mult_r( excNoisyEnv[k], shl( White_exc16k[k], 1 ) ); // Q_excTmp2 + 5 + 1 - 15 ==> Q_excTmp2 - 9
            White_exc16k[k] = extract_h( L_shl( White_exc16k_32[k], Q_White_exc16k ) ); // Q_excTmp2 + 6 + Q_White_exc16k - 16 ==> Q_excTmp2 + Q_White_exc16k - 10
            move16();
            chk2 = s_or( chk2, White_exc16k[k] );
            /* 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]; */
            sum = W_mac0_16_16( sum, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_excTmp2-NOISE_QADJ)*/
            sum = W_mac0_16_16( sum, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_excTmp2 + Q_White_exc16k - 10)*/
        }
        Q_pow22 = W_norm( sum );
        pow22 = W_extract_h( W_shl( sum, Q_pow22 ) ); // 2*(Q_excTmp2-NOISE_QADJ)+Q_pow22-32
        Q_pow22 = sub( add( Q_pow22, shl( sub( Q_excTmp2, NOISE_QADJ ), 1 ) ), 32 );
        Scale_sig( White_exc16k, L_FRAME16k, sub( *Q_bwe_exc, Q_excTmp2 ) );
        pow22 = W_extract_h( W_shl( sum, Q_pow22 ) ); // 2*(Q_excTmp2 + Q_White_exc16k - 10)+Q_pow22-32
        Q_pow22 = sub( add( Q_pow22, shl( sub( add( Q_White_exc16k, Q_excTmp2 ), 10 ), 1 ) ), 32 );
        Q_White_exc16k = add( Q_White_exc16k, sub( Q_excTmp2, 10 ) );
    }

#if 1 // def ADD_IVAS_TBE_CODE
@@ -3272,7 +3260,7 @@ void GenShapedSHBExcitation_ivas_enc_fx(
            {
                FOR( k = 0; k < L_FRAME16k; k++ )
                {
                    White_exc16k_tmp[k] = round_fx( L_shl( White_exc16k_32[k], *Q_bwe_exc ) );
                    White_exc16k_tmp[k] = shl( White_exc16k[k], sub( *Q_bwe_exc, Q_White_exc16k ) );
                    move16();
                }

@@ -3298,8 +3286,8 @@ void GenShapedSHBExcitation_ivas_enc_fx(
                move32();

                temp1 = add( shl( *Q_bwe_exc, 1 ), 1 );
                temp2 = add( add( Q_shb, *Q_bwe_exc ), 1 );
                temp3 = add( shl( Q_shb, 1 ), 1 );
                temp2 = add( add( Q_EnvSHBres_4k, *Q_bwe_exc ), 1 );
                temp3 = add( shl( Q_EnvSHBres_4k, 1 ), 1 );
                FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ )
                {
                    // c0_part[i] = sum2_f( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
@@ -3474,7 +3462,7 @@ void GenShapedSHBExcitation_ivas_enc_fx(
#endif
            {
                Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k,
                                         ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind );
                                         Q_White_exc16k, pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind );
                tmp = voiceFacEst[0];
                tmp2 = MAX_16;
                move16();
@@ -3538,6 +3526,7 @@ void GenShapedSHBExcitation_ivas_enc_fx(
        }
    }
#if 1                                                                         // def ADD_IVAS_TBE_CODE
    Scale_sig( White_exc16k, L_FRAME16k, sub( *Q_bwe_exc, Q_White_exc16k ) ); // Q_bwe_exc
    test();
    IF( GE_16( element_mode, IVAS_CPE_DFT ) && nlExc16k != NULL )
    {
@@ -3553,24 +3542,25 @@ void GenShapedSHBExcitation_ivas_enc_fx(
        // v_multc_fixed_16_16(White_exc16k,shr(temp_fac, temp_fac_exp) , mixExc16k, L_FRAME16k);
        FOR( k = 0; k < L_FRAME16k; k++ )
        {
            mixExc16k[k] = mult_r( White_exc16k[k], temp_fac );
            mixExc16k[k] = mult_r( White_exc16k[k], temp_fac ); // Q_bwe_exc
            move16();
        }
    }
#endif

    tmp = sub( Q_temp, 3 );
    FOR( k = 0; k < L_FRAME16k; k++ )
    {
        White_exc16k_FB[k] = White_exc16k[k]; /* Q_bwe_exc-NOISE_QADJ */
        White_exc16k_FB[k] = White_exc16k[k]; /* Q_bwe_exc */
        move16();
    }
    prev_Q_bwe_exc_fb = *Q_bwe_exc_fb;
    move16();
    *Q_bwe_exc_fb = sub( *Q_bwe_exc, NOISE_QADJ );
    *Q_bwe_exc_fb = *Q_bwe_exc;
    move16();

    deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph );
    /* i/o: White_exc16k (Q_bwe_exc-NOISE_QADJ) */
    /* i: tbe_demph (Q_bwe_exc-NOISE_QADJ) */
    /* i/o: White_exc16k (Q_bwe_exc) */
    /* i: tbe_demph (Q_bwe_exc) */

#if 1 // def ADD_IVAS_TBE_CODE
    test();
@@ -3585,34 +3575,39 @@ void GenShapedSHBExcitation_ivas_enc_fx(
            // old_scale = Sqrt16(old_scale, &old_scale_exp);
            // old_scale = shl(old_scale, old_scale_exp); //Q15
            L_tmp = root_a_over_b_fx( *prev_pow_exc16kWhtnd, 0, pow1, Q_pow1, &exp );
            old_scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); // Q15
            // new_scale = 1.0f;
            new_scale = 32767;
            IF( exp < 0 )
            {
                L_tmp = L_shl( L_tmp, exp );
                exp = 0;
                move16();
            }
            old_scale = round_fx_sat( L_tmp ); // exp
            // new_scale = 1.0f;
            new_scale = shr( 32767, exp ); // exp
            // step_scale = (new_scale - old_scale) / (L_FRAME16k / 2);
            step_scale = mult_r( sub( new_scale, old_scale ), 205 );
            scale = old_scale;
            step_scale = mult_r( sub( new_scale, old_scale ), 205 ); // exp
            scale = old_scale;                                       // exp
            move16();
            /* interpolate between the old and the new value of the mixing factor */
            old_fact = *prev_mix_factor;
            old_fact = *prev_mix_factor; // Q15
            move16();
            new_fact = mix_factor;
            new_fact = mix_factor; // Q15
            move16();
            // step = (new_fact - old_fact) / (L_FRAME16k / 2);
            step = mult_r( sub( new_fact, old_fact ), 205 );
            fact = old_fact;
            step = mult_r( sub( new_fact, old_fact ), 205 ); // Q15
            fact = old_fact;                                 // Q15
            move16();
            /* mixing of LB and gaussian excitation in the first half of the frame */
            FOR( k = 0; k < L_FRAME16k / 2; k++ )
            {
                // exc16kWhtnd[k] = (float)fact * (White_exc16k[k] * scale) + (float)(1 - fact) * exc16kWhtnd[k];
                // exc16kWhtnd[k] = add(mult_r(fact, mult(shl(White_exc16k[k], *Q_bwe_exc), scale)), mult_r(sub(32767, fact), exc16kWhtnd[k]));
                L_tmp = L_add( L_shl( L_mult( fact, mult_r( White_exc16k[k], scale ) ), NOISE_QADJ ),
                               L_mult( sub( 32767, fact ), exc16kWhtnd[k] ) ); // Q_bwe_exc
                exc16kWhtnd[k] = round_fx( L_tmp );
                L_tmp = L_add_sat( L_shl_sat( L_mult( fact, mult_r( White_exc16k[k], scale ) ), exp ), // Q15 + Q_bwe_exc + (Q15-exp) - Q15 + exp + Q1
                                   L_mult( sub( 32767, fact ), exc16kWhtnd[k] ) );                     // Q_bwe_exc + Q16
                exc16kWhtnd[k] = round_fx_sat( L_tmp );                                                // Q_bwe_exc
                move16();
                fact = add_sat( fact, step );
                scale = add_sat( scale, step_scale );
                fact = add_sat( fact, step );         // Q15
                scale = add_sat( scale, step_scale ); // exp
            }

            /* mixing of LB and gaussian excitation in the second half of the frame */
@@ -3620,14 +3615,14 @@ void GenShapedSHBExcitation_ivas_enc_fx(
            {
                // exc16kWhtnd[k] = (float)new_fact * White_exc16k[k] + (float)(1 - new_fact) * exc16kWhtnd[k];
                // exc16kWhtnd[k] = add(mult_r(new_fact, shl(White_exc16k[k], *Q_bwe_exc)), mult_r(sub(32767, new_fact), exc16kWhtnd[k]));
                L_tmp = L_add( L_shl( L_mult( new_fact, White_exc16k[k] ), NOISE_QADJ ),
                               mult_r( sub( 32767, new_fact ), exc16kWhtnd[k] ) ); // Q_bwe_exc
                exc16kWhtnd[k] = round_fx( L_tmp );
                L_tmp = L_add( L_mult( new_fact, White_exc16k[k] ),
                               mult_r( sub( 32767, new_fact ), exc16kWhtnd[k] ) ); // Q_bwe_exc + Q15 + Q1 => Q_bwe_exc + Q16
                exc16kWhtnd[k] = round_fx( L_tmp );                                // Q_bwe_exc
                move16();
            }
        }
        // preemph(exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph);
        PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph );
        PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); // Q_bwe_exc
    }
    ELSE
#endif
@@ -3650,13 +3645,13 @@ void GenShapedSHBExcitation_ivas_enc_fx(
            FOR( k = 0; k < L_FRAME16k; k++ )
            {
                /* White_exc16k: (Q_bwe_exc-NOISE_QADJ), scale: Q15 */
                L_tmp = L_mult( White_exc16k[k], scale );
                L_tmp = L_mult( White_exc16k[k], scale ); // Q_bwe_exc + Q15 + Q1 => Q_bwe_exc + Q16
                /* L_tmp: (Q_bwe_exc-NOISE_QADJ) + 15 + 1 */
                exc16kWhtnd[k] = round_fx_sat( L_shl_sat( L_tmp, NOISE_QADJ ) );
                exc16kWhtnd[k] = round_fx_sat( L_tmp ); // Q_bwe_exc
                move16();
                /* exc16kWhtnd:  Q_bwe_exc */
            }
            PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph );
            PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); // Q_bwe_exc
            /* i/o: exc16kWhtnd  (Q_bwe_exc) */
            /* i/o: tbe_premph (Q_bwe_exc) */
        }
@@ -3721,9 +3716,8 @@ void GenShapedSHBExcitation_ivas_enc_fx(
                FOR( j = 0; j < lSubFr; j++ )
                {
                    /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */
                    L_tmp = L_mult( temp2, White_exc16k[k + j] ); /* 16+(Q_bwe_exc-NOISE_QADJ)*/
                    L_tmp = L_shl_sat( L_tmp, NOISE_QADJ );       /* 16+(Q_bwe_exc) */
                    exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] );
                    L_tmp = L_mult( temp2, White_exc16k[k + j] );                       /* 16+(Q_bwe_exc)*/
                    exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] ); // Q_bwe_exc
                    move16();
                    /* Q_bwe_exc */
                }
@@ -3740,7 +3734,7 @@ void GenShapedSHBExcitation_ivas_enc_fx(
                temp = div_s( temp, temp2 );           /* Q15 */
                temp = mult_r( PREEMPH_FAC, temp );

                PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph );
                PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph ); // Q_bwe_exc
                /* exc16kWhtnd: Q_bwe_exc;
                   tbe_premph: Q_bwe_exc*/
            }
@@ -3753,7 +3747,7 @@ void GenShapedSHBExcitation_ivas_enc_fx(
    IF( LT_32( bitrate, ACELP_24k40 ) )
#endif
    {
        Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 );
        syn_filt_fx( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 );
        /* i: exc16kWhtnd in Q_bwe_exc */
        /* o: excSHB in Q_bwe_exc */
    }
+7 −5
Original line number Diff line number Diff line
@@ -185,7 +185,8 @@ void syn_filt_fx(
{
    Word16 i, j;
    Word16 buf[L_FRAME48k + L_FRAME48k / 2 + TCXLTP_LTP_ORDER]; /* temporary synthesis buffer */
    Word16 s, *yy;
    Word16 *yy;
    Word32 s;
    Word16 q;
    Flag Overflow = 0;
    move16();
@@ -212,15 +213,16 @@ void syn_filt_fx(

    FOR( i = 0; i < l; i++ )
    {
        s = mult_r( shl_o( a0, q, &Overflow ), x[i] );
        s = L_mult( a0, x[i] );
        FOR( j = 1; j <= m; j++ )
        {
            s = msu_ro( L_deposit_h( s ), shl_o( a[j], q, &Overflow ), yy[i - j], &Overflow );
            s = L_msu_sat( s, a[j], yy[i - j] );
        }

        yy[i] = s;
        s = L_shl_sat( s, q );
        yy[i] = extract_h( s );
        move16();
        y[i] = s;
        y[i] = extract_h( s );
        move16();
    }

+2 −2
Original line number Diff line number Diff line
@@ -374,8 +374,8 @@ void ivas_param_ism_stereo_dmx_fx(
    tmp_1 = W_norm( ene_data );
    tmp_2 = W_norm( ene_dmx );
    ene_data = W_shl( ene_data, tmp_1 );
    ene_dmx = W_add( W_shl( ene_dmx, tmp_2 ), 1 );
    dmx_gain = BASOP_Util_Divide3232_Scale( W_extract_h( ene_data ), W_extract_h( ene_dmx ), &dmx_gain_e );
    ene_dmx = W_shl( ene_dmx, tmp_2 );
    dmx_gain = BASOP_Util_Divide3232_Scale( W_extract_h( ene_data ), L_add_sat( W_extract_h( ene_dmx ), 1 ), &dmx_gain_e );
    dmx_gain_e = sub( dmx_gain_e, sub( tmp_1, tmp_2 ) );
    dmx_gain = Sqrt16( dmx_gain, &dmx_gain_e );

+23 −6
Original line number Diff line number Diff line
@@ -2940,7 +2940,7 @@ void swb_tbe_enc_ivas_fx(
    Word16 formant_fac_fx;
    // int16_t stab_check = 1;
    Word16 MSFlag;
    Word16 *nlExc16k_fx, *mixExc16k_fx;
    Word16 *nlExc16k_fx, *mixExc16k_fx, *mixExc16k_e;

    Word16 shaped_shb_excitationTemp_fx[L_FRAME16k];

@@ -2948,6 +2948,9 @@ void swb_tbe_enc_ivas_fx(

    Word16 acorr_EnvSHBres[ENVSHBRES_ACORR_MAX - ENVSHBRES_ACORR_MIN], *p_acorr, shb_env_tilt_fx;
    Word16 buf_EnvSHBres_fx[2 * L_FRAME4k], *p_buf, EnvSHBres_fx[L_FRAME16k], EnvSHBres_4k_fx[L_FRAME4k], EnvSHBres_4k_norm_fx[L_FRAME4k], env_mean_normf_fx[L_FRAME4k];
    Word32 tmp_buf[L_FRAME4k];
    Word16 Q_EnvSHBres_4k_norm = Q31;
    move16();
    Word16 GainShape_Interp_fx[NUM_SHB_SUBGAINS], GainShape_tilt_fx; /* Q15 */
    Word16 seg_mean[4], den_seg_mean[4], *p_env, step;
    Word16 temp, scale_fx, scale_e, pow_e, tmp_e, tmp1_e;
@@ -2995,6 +2998,7 @@ void swb_tbe_enc_ivas_fx(
    {
        nlExc16k_fx = hStereoICBWE->nlExc16k_fx;
        mixExc16k_fx = hStereoICBWE->mixExc16k_fx;
        mixExc16k_e = &hStereoICBWE->mixExc16k_e;
        MSFlag = hStereoICBWE->MSFlag;
        move16();
    }
@@ -3002,6 +3006,7 @@ void swb_tbe_enc_ivas_fx(
    {
        nlExc16k_fx = NULL;
        mixExc16k_fx = NULL;
        mixExc16k_e = NULL;
        MSFlag = 0;
        move16();
    }
@@ -3503,7 +3508,13 @@ void swb_tbe_enc_ivas_fx(
        /* normalize residual SHB envelope with its long-term mean envelope */
        FOR( k = 0; k < L_FRAME4k; k++ )
        {
            EnvSHBres_4k_norm_fx[k] = mult( EnvSHBres_4k_fx[k], env_mean_normf_fx[k] );
            tmp_buf[k] = L_mult( EnvSHBres_4k_fx[k], env_mean_normf_fx[k] ); // Q_shb + Q15 + Q1 => Q_shb + Q16
            move32();
        }
        Q_EnvSHBres_4k_norm = sub( getScaleFactor32( tmp_buf, L_FRAME4k ), 1 /* Guard bit */ );
        FOR( k = 0; k < L_FRAME4k; k++ )
        {
            EnvSHBres_4k_norm_fx[k] = extract_h( L_shl( tmp_buf[k], Q_EnvSHBres_4k_norm ) ); // Q_shb + Q16 + Q_EnvSHBres_4k_norm - Q16 => Q_EnvSHBres_4k_norm + Q_shb
            move16();
        }

@@ -3515,15 +3526,16 @@ void swb_tbe_enc_ivas_fx(

        /* subtract mean value from the normalized SHB residual envelope */
        p_buf = &buf_EnvSHBres_fx[L_FRAME4k];
        temp = mean_no_sat_fx( EnvSHBres_4k_norm_fx, L_FRAME4k );
        temp = mean_no_sat_fx( EnvSHBres_4k_norm_fx, L_FRAME4k ); // Q_EnvSHBres_4k_norm + Q_shb
        FOR( k = 0; k < L_FRAME4k; k++ )
        {
            *p_buf++ = sub( EnvSHBres_4k_norm_fx[k], temp );
            *p_buf++ = shr( sub( EnvSHBres_4k_norm_fx[k], temp ), Q_EnvSHBres_4k_norm ); // Q_shb
            move16();
        }
        Q_EnvSHBres_4k_norm = add( Q_EnvSHBres_4k_norm, Q_shb );

        /* update memory */
        Copy( &buf_EnvSHBres_fx[L_FRAME4k], hBWE_TD->old_EnvSHBres_fx, L_FRAME4k );
        Copy( &buf_EnvSHBres_fx[L_FRAME4k], hBWE_TD->old_EnvSHBres_fx, L_FRAME4k ); // Q_shb

        /* calculate energy normalization factor for the auto-correlation function */
        // pow0 = sum2_f( &buf_EnvSHBres[L_FRAME4k], L_FRAME4k ) + 1.0f;
@@ -3698,7 +3710,12 @@ void swb_tbe_enc_ivas_fx(
                                        &( hBWE_TD->tbe_demph_fx ), &( hBWE_TD->tbe_premph_fx ), lpc_shb_sf_fx, shb_ener_sf_Q31,
                                        shb_res_gshape_fx, shb_res_fx, &vf_ind_fx, formant_fac_fx, hBWE_TD->fb_state_lpc_syn_fx,
                                        &( hBWE_TD->fb_tbe_demph_fx ), &Q_bwe_exc, &Q_bwe_exc_fb, Q_shb, n_mem2, st_fx->prev_Q_bwe_syn, st_fx->total_brate, 0, st_fx->element_mode, st_fx->flag_ACELP16k, nlExc16k_fx, mixExc16k_fx, st_fx->extl_brate, MSFlag,
                                        EnvSHBres_4k_norm_fx, &( hBWE_TD->prev_pow_exc16kWhtnd_fx32 ), &( hBWE_TD->prev_mix_factor_fx ), &Env_error_fx, Env_error_part_fx );
                                        EnvSHBres_4k_norm_fx, Q_EnvSHBres_4k_norm, &( hBWE_TD->prev_pow_exc16kWhtnd_fx32 ), &( hBWE_TD->prev_mix_factor_fx ), &Env_error_fx, Env_error_part_fx );
    IF( mixExc16k_e )
    {
        *mixExc16k_e = sub( Q15, Q_bwe_exc );
        move16();
    }

    *Q_white_exc = Q_bwe_exc_fb;
    move16();