Commit 1276285c authored by Sandesh Venkatesh's avatar Sandesh Venkatesh Committed by Manuel Jander
Browse files

Fix for 3GPP issue 1018: ParamISM: Ext-Output: Difference in high-band

Link #1018
parent 40dd464d
Loading
Loading
Loading
Loading
+63 −62
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@

#define POW_EXC16k_WHTND                    1.14e11f   /* power of random excitation, length 320 samples, uniform distribution */
#define POW_EXC16k_WHTND_FX_INV_SQRT        6360       // Q31
#define POW_EXC16k_WHTND_FX_INV_SQRT_IN_Q49 1667313793 // Q49
#define POW_EXC16k_WHTND_FX                 178125000  // Q-6
#define THR_ENV_ERROR_PLOSIVE               200.0f     /* threshold for envelope error used in plosive detection */
#define THR_ENV_ERROR_PLOSIVE_FX            200        /* threshold for envelope error used in plosive detection Q0 */
@@ -3958,7 +3959,7 @@ void GenShapedSHBExcitation_ivas_dec_fx(
    Word16 exc32k[L_FRAME32k], exc16k[L_FRAME16k];
    Word32 pow1, pow22;
    Word16 scale, temp1, temp2, temp3;

    Word16 Q_White_exc16k;
    Word16 excTmp2[L_FRAME16k];
    Word16 *White_exc16k;
    Word16 excNoisyEnv[L_FRAME16k];
@@ -3989,12 +3990,13 @@ void GenShapedSHBExcitation_ivas_dec_fx(
    Word32 White_exc16k_32[L_FRAME16k];
    Word16 White_exc16k_tmp[L_FRAME16k];
    Word16 Q_temp;
    Word16 prev_Q_bwe_exc_fb;
    Word16 chk1, chk2;
    Word16 prev_Q_bwe_exc_fb, Q_exc16kWhtnd;
    Word16 chk1;
    Word32 chk2;
    chk1 = 0;
    chk2 = 0;
    move16();
    move16();
    move32();

#if 1 // def ADD_IVAS_TBE_CODE
    Word16 alpha, step, mem_csfilt_left, mem_csfilt_right, excNoisyEnvLeft[L_FRAME16k], excNoisyEnvRight[L_FRAME16k];
@@ -4262,7 +4264,7 @@ void GenShapedSHBExcitation_ivas_dec_fx(
        }

        /* 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_IN_Q49;
        move32();
        move32();
        pow22 = POW_EXC16k_WHTND_FX;
@@ -4271,21 +4273,23 @@ void GenShapedSHBExcitation_ivas_dec_fx(
        // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), White_exc16k, L_FRAME16k);
        Word16 pow1_exp = sub( Q31, Q_pow1 );
        Word32 temp_pow = Sqrt32( pow1, &pow1_exp );
        temp_pow = L_shl( Mpy_32_32( temp_pow, pow22_inv ), pow1_exp );
        temp_pow = Mpy_32_32( temp_pow, pow22_inv );
        /*Word16 out_exp;
        Word32 temp_pow1 = root_a_over_b_fx(pow1, Q_pow1, pow22, Q_pow22, &out_exp);
        temp_pow1 = L_shl(temp_pow1, out_exp);*/
        // v_multc_fixed_16_16(White_exc16k, round_fx(temp_pow), White_exc16k, L_FRAME16k);
        L_tmp = 0;
        move32();
        shift = getScaleFactor16( White_exc16k, L_FRAME16k );
        FOR( k = 0; k < L_FRAME16k; k++ )
        {
            White_exc16k_32[k] = Mpy_32_16_1( temp_pow, White_exc16k[k] );
            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], shift ) ); // Q_White_exc16k
            move16();
            L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
        }
        Q_White_exc16k = add( shift, sub( 49 - 31, pow1_exp ) );
        Q_temp = norm_l( L_tmp );
        IF( L_tmp == 0 )
        {
@@ -4323,22 +4327,24 @@ void GenShapedSHBExcitation_ivas_dec_fx(
        /* calculate pow22 */
        /* pow22=0.00001f */
        tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 );
        pow22 = L_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(*Q_bwe_exc-NOISE_QADJ) */
        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
            move16();
            chk2 = s_or( chk2, White_exc16k[k] );

            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
            chk2 = L_or( chk2, White_exc16k_32[k] );
            /* i: excNoisyEnv in (Q_excTmp2)     */
            /* i: White_exc16k  in Q6               */
            /* o: White_exc16k in (Q_bwe_exc-NOISE_QADJ)  */
            /* o: White_exc16k in (Q_White_exc16k)  */
            /* pow22 += White_exc16k[k] * White_exc16k[k]; */
            pow22 = L_mac0_sat( pow22, 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)*/
            move16();
        }
        /*Q_pow22 = sub( shl(*Q_bwe_exc,1), 18 );*/
        Q_pow22 = shl( sub( Q_excTmp2, NOISE_QADJ ), 1 );
        Scale_sig( White_exc16k, L_FRAME16k, sub( *Q_bwe_exc, Q_excTmp2 ) );
        Q_pow22 = W_norm( sum );
        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
@@ -4625,7 +4631,6 @@ void GenShapedSHBExcitation_ivas_dec_fx(
            move16();
        }
    }
#if 1 // def ADD_IVAS_TBE_CODE
    test();
    IF( GE_16( element_mode, IVAS_CPE_DFT ) && nlExc16k != NULL )
    {
@@ -4638,29 +4643,42 @@ void GenShapedSHBExcitation_ivas_dec_fx(
        temp_fac = Sqrt16(temp_fac, &temp_fac_exp);*/
        L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
        Word16 temp_fac = round_fx_sat( L_shl_sat( L_tmp, exp ) ); // Q15
        shift = sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k );
        // 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( shl_sat( White_exc16k[k], shift ), temp_fac );
            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_White_exc16k */
    }
    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_White_exc16k;
    move16();
    *tbe_demph = shl_sat( *tbe_demph, sub( Q_White_exc16k, sub( *Q_bwe_exc, NOISE_QADJ ) ) );
    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) */
    *tbe_demph = shl_sat( *tbe_demph, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) );

#if 1 // def ADD_IVAS_TBE_CODE
    Q_exc16kWhtnd = getScaleFactor16( exc16kWhtnd, L_FRAME16k );
    Q_exc16kWhtnd = add( Q_exc16kWhtnd, *Q_bwe_exc );

    shift = getScaleFactor16( White_exc16k, L_FRAME16k );

    shift = s_min( Q_exc16kWhtnd, add( shift, Q_White_exc16k ) );
    scale_sig( exc16kWhtnd, L_FRAME16k, sub( shift, *Q_bwe_exc ) );
    scale_sig( White_exc16k, L_FRAME16k, sub( shift, Q_White_exc16k ) );

    Q_exc16kWhtnd = Q_White_exc16k = shift;
    move16();
    move16();
    *tbe_premph = shl_sat( *tbe_premph, sub( Q_White_exc16k, sub( *Q_bwe_exc, NOISE_QADJ ) ) );
    move16();
    test();
    IF( EQ_32( extl_brate, SWB_TBE_1k10 ) || EQ_32( extl_brate, SWB_TBE_1k75 ) )
    {
@@ -4693,11 +4711,8 @@ void GenShapedSHBExcitation_ivas_dec_fx(
            /* 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 );
                exc16kWhtnd[k] = mac_r( L_mult( fact, mult_r( White_exc16k[k], scale ) ),
                                        sub( 32767, fact ), exc16kWhtnd[k] ); // Q_exc16kWhtnd
                move16();
                fact = add_sat( fact, step );
                scale = add_sat( scale, step_scale );
@@ -4706,11 +4721,8 @@ void GenShapedSHBExcitation_ivas_dec_fx(
            /* mixing of LB and gaussian excitation in the second half of the frame */
            FOR( ; k < L_FRAME16k; k++ )
            {
                // 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 );
                exc16kWhtnd[k] = mac_r( L_mult( new_fact, White_exc16k[k] ),
                                        sub( 32767, new_fact ), exc16kWhtnd[k] ); // Q_exc16kWhtnd
                move16();
            }
        }
@@ -4718,14 +4730,9 @@ void GenShapedSHBExcitation_ivas_dec_fx(
        PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph );
    }
    ELSE
#endif
    {
#if 1 // def ADD_IVAS_TBE_CODE
        test();
        IF( EQ_16( coder_type, UNVOICED ) || EQ_16( MSFlag, 1 ) )
#else
        IF( EQ_16( coder_type, UNVOICED ) )
#endif
        {
            L_tmp = root_a_over_b_fx( pow1, Q_pow1, pow22, Q_pow22, &exp );
            test();
@@ -4737,16 +4744,12 @@ void GenShapedSHBExcitation_ivas_dec_fx(
            scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); /*Q15 */
            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: (Q_bwe_exc-NOISE_QADJ) + 15 + 1 */
                exc16kWhtnd[k] = round_fx_sat( L_shl_sat( L_tmp, NOISE_QADJ ) );
                exc16kWhtnd[k] = mult_r_sat( White_exc16k[k], scale );
                move16();
                /* exc16kWhtnd:  Q_bwe_exc */
            }
            PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph );
            /* i/o: exc16kWhtnd  (Q_bwe_exc) */
            /* i/o: tbe_premph (Q_bwe_exc) */
            /* i/o: exc16kWhtnd  (Q_exc16kWhtnd) */
            /* i/o: tbe_premph (Q_exc16kWhtnd) */
        }
        ELSE
        {
@@ -4809,11 +4812,10 @@ void GenShapedSHBExcitation_ivas_dec_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) */
                    L_tmp = L_mult( temp2, White_exc16k[k + j] );
                    exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] );
                    move16();
                    /* Q_bwe_exc */
                    /* Q_exc16kWhtnd */
                }
                k = add( k, lSubFr );

@@ -4827,19 +4829,18 @@ void GenShapedSHBExcitation_ivas_dec_fx(
                temp2 = add( temp, shl( temp1, -1 ) ); /* shift right by 1 to avoid overflow */
                temp = div_s( temp, temp2 );           /* Q15 */
                temp = mult_r( PREEMPH_FAC, temp );

                PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph );
                /* exc16kWhtnd: Q_bwe_exc;
                   tbe_premph: Q_bwe_exc*/
                /* exc16kWhtnd: Q_exc16kWhtnd;
                   tbe_premph: Q_exc16kWhtnd*/
            }
        }
    }
    *tbe_premph = shl_sat( *tbe_premph, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) );
    move16();
    Scale_sig( White_exc16k, L_FRAME16k, sub( sub( *Q_bwe_exc, NOISE_QADJ ), Q_White_exc16k ) );
    Scale_sig( exc16kWhtnd, L_FRAME16k, sub( *Q_bwe_exc, Q_White_exc16k ) );

#if 1 // def ADD_IVAS_TBE_CODE
    IF( LT_32( extl_brate, SWB_TBE_2k8 ) )
#else
    IF( LT_32( bitrate, ACELP_24k40 ) )
#endif
    {
        Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 );
        /* i: exc16kWhtnd in Q_bwe_exc */