Commit 83a26e8a authored by vaclav's avatar vaclav
Browse files

harmonize swb_CNG_dec_fx()

parent ab189c20
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -6167,6 +6167,7 @@ void swb_CNG_dec_fx(
    const Word16 Qsyn       /* i  : Q value of ACELP core synthesis          */
);
#ifndef HARM_NON_LINEARITY
void swb_CNG_dec_ivas_fx(
    Decoder_State *st_fx,   /* i/o: State structure                          */
    const Word16 *synth_fx, /* i  : ACELP core synthesis at 32kHz        Qsyn*/
@@ -6174,7 +6175,7 @@ void swb_CNG_dec_ivas_fx(
    const Word16 sid_bw,    /* i  : 0-NB/WB, 1-SWB SID                     Q0*/
    const Word16 Qsyn       /* i  : Q value of ACELP core synthesis          */
);
#endif
void td_cng_dec_init_fx(
    DEC_CORE_HANDLE st /* i/o: decoder state structure     */
);
+286 −104
Original line number Diff line number Diff line
@@ -9,9 +9,11 @@
#include "prot_fx.h"
#include "ivas_cnst.h"

#ifndef HARM_NON_LINEARITY
/*Temporary location to be move in prot* when merge is done*/
void E_LPC_f_isp_a_conversion( const Word16 *isp, Word16 *a, const Word16 m );
void E_LPC_f_lsp_a_conversion( const Word16 *isp, Word16 *a, const Word16 m );
#endif

/*-----------------------------------------------------------------*
 * Local function prototypes
@@ -19,7 +21,10 @@ void E_LPC_f_lsp_a_conversion( const Word16 *isp, Word16 *a, const Word16 m );

static void shb_CNG_decod_fx( Decoder_State *st_fx, const Word16 *synth_fx, Word16 *shb_synth_fx, const Word16 sid_bw, const Word16 Qsyn );

#ifndef HARM_NON_LINEARITY
static void shb_CNG_decod_ivas_fx( Decoder_State *st_fx, const Word16 *synth_fx, Word16 *shb_synth_fx, const Word16 sid_bw, const Word16 Qsyn );
#endif


/*-----------------------------------------------------------------*
 * CNG_dec_fx()
@@ -723,7 +728,11 @@ void swb_CNG_dec_fx(
    {
        st_fx->last_vad_fx = 1;
        move16();
#ifdef HARM_NON_LINEARITY
        st_fx->hTdCngDec->burst_cnt_fx = add_sat( st_fx->hTdCngDec->burst_cnt_fx, 1 );
#else
        st_fx->hTdCngDec->burst_cnt_fx = add( st_fx->hTdCngDec->burst_cnt_fx, 1 );
#endif
        move16();
        if ( GT_16( st_fx->hTdCngDec->burst_cnt_fx, 10 ) )
        {
@@ -735,6 +744,7 @@ void swb_CNG_dec_fx(
    return;
}

#ifndef HARM_NON_LINEARITY
void swb_CNG_dec_ivas_fx(
    Decoder_State *st_fx,   /* i/o: State structure                          */
    const Word16 *synth_fx, /* i  : ACELP core synthesis at 32kHz        Qsyn*/
@@ -772,6 +782,7 @@ void swb_CNG_dec_ivas_fx(

    return;
}
#endif

/*---------------------------------------------------------------------*
 * shb_CNG_decod()
@@ -780,12 +791,17 @@ void swb_CNG_dec_ivas_fx(
 *---------------------------------------------------------------------*/

static void shb_CNG_decod_fx(
#ifdef HARM_NON_LINEARITY
    Decoder_State *st, /* i/o: State structure                          */
#else
    Decoder_State *st_fx,                                                                       /* i/o: State structure                          */
#endif
    const Word16 *synth_fx, /* i  : ACELP core synthesis at 32kHz        Qsyn*/
    Word16 *shb_synth_fx,   /* o  : high-band CNG synthesis                Qx*/
    const Word16 sid_bw,    /* i  : 0-NB/WB, 1-SWB SID                     Q0*/
    const Word16 Qsyn       /* i  : Q value of ACELP core synthesis          */
)
#ifndef HARM_NON_LINEARITY
{
    Word16 i;
    Word16 idx_ener_fx;
@@ -1052,6 +1068,7 @@ static void shb_CNG_decod_ivas_fx(
    Word16 *shb_synth_fx,   /* o  : high-band CNG synthesis           Qx*/
    const Word16 sid_bw,    /* i  : 0-NB/WB, 1-SWB SID                Q0*/
    const Word16 Qsyn )
#endif
{
    Word16 i;
    Word16 idx_ener;
@@ -1074,6 +1091,9 @@ static void shb_CNG_decod_ivas_fx(
    Word16 exp, exp1;
    Word16 fra;
    Word32 L_tmp;
#ifdef HARM_NON_LINEARITY
    Word16 tmp_16, tmp_16_2, step_fx16, gain_fx16, ener_fx16;
#endif
    Word16 allow_cn_step_fx;
    Word16 q;
    TD_BWE_DEC_HANDLE hBWE_TD;
@@ -1099,8 +1119,14 @@ static void shb_CNG_decod_ivas_fx(
            /* de-quantization of SHB CNG parameters */
            IF( st->element_mode == EVS_MONO )
            {
#ifdef HARM_NON_LINEARITY
                L_tmp = L_mult( idx_ener, 27400 );                                                 /*Q14  */
                hTdCngDec->last_shb_cng_ener_fx = extract_l( L_shr( L_sub( L_tmp, 295924 ), 6 ) ); /*Q8 */
                move16();
#else
                hTdCngDec->last_shb_cng_ener_fx_32 = L_sub( L_mult0( idx_ener, 6850 ), 36991 ); // Q11
                move32();
#endif
            }
            ELSE
            {
@@ -1114,11 +1140,26 @@ static void shb_CNG_decod_ivas_fx(
    interp_fx = s_min( hTdCngDec->shb_dtx_count_fx, 32 );
    interp_fx = shl_sat( interp_fx, 10 ); /*Q15*/

#ifdef HARM_NON_LINEARITY
    IF( st->element_mode == EVS_MONO )
    {
        FOR( i = 0; i < LPC_SHB_ORDER; i++ )
        {
            tmp_16_2 = mult( interp_fx, hTdCngDec->lsp_shb_prev_fx[i] );                  /*Q14*/
            tmp_16 = mult( sub( 32767, interp_fx ), hTdCngDec->lsp_shb_prev_prev_fx[i] ); /*Q14*/
            shb_lspCNG_fx[i] = add( tmp_16_2, tmp_16 );
            move16(); /*Q14*/
        }
    }
    ELSE
#endif
    {
        FOR( i = 0; i < LPC_SHB_ORDER; i++ )
        {
            shb_lspCNG_fx[i] = add( mult_r( interp_fx, hTdCngDec->lsp_shb_prev_fx[i] ), mult_r( sub( 32767, interp_fx ), hTdCngDec->lsp_shb_prev_prev_fx[i] ) ); // Q14
            move16();
        }
    }

    IF( LE_16( hTdCngDec->shb_dtx_count_fx, 1000 ) )
    {
@@ -1129,11 +1170,89 @@ static void shb_CNG_decod_ivas_fx(
    E_LPC_lsf_lsp_conversion( shb_lspCNG_fx, tmp_lsp, LPC_SHB_ORDER ); /*Q14*/
    E_LPC_f_lsp_a_conversion( tmp_lsp, shb_lpcCNG_fx, LPC_SHB_ORDER );

#ifdef HARM_NON_LINEARITY
    IF( st->element_mode != EVS_MONO )
#endif
    {
        Copy_Scale_sig( shb_lpcCNG_fx, hTdCngDec->shb_lpcCNG_fx, LPC_SHB_ORDER + 1, sub( norm_s( shb_lpcCNG_fx[0] ), -1 ) ); /* Q15 */

    }
    Copy_Scale_sig( shb_lpcCNG_fx, shb_lpcCNG_fx, LPC_SHB_ORDER + 1, sub( norm_s( shb_lpcCNG_fx[0] ), 2 ) ); /* Q12 */

    /* SHB energy estimation */
#ifdef HARM_NON_LINEARITY
    IF( st->element_mode == EVS_MONO )
    {
        wb_ener_fx = L_deposit_l( 1 ); /*Q1 */
        FOR( i = 0; i < L_FRAME32k; i++ )
        {
            wb_ener_fx = L_add( wb_ener_fx, Mpy_32_16_1( L_mult0( synth_fx[i], synth_fx[i] ), 51 ) ); /* 2*Qsyn */
        }
        exp = norm_l( wb_ener_fx );
        fra = Log2_norm_lc( L_shl( wb_ener_fx, exp ) );
        exp = sub( 30, add( exp, shl( Qsyn, 1 ) ) );
        wb_ener_fx = Mpy_32_16( exp, fra, LG10 );
        wb_ener16_fx = round_fx( L_shl( wb_ener_fx, 10 ) ); /*wb_ener_fx in Q8 */
        if ( !st->first_CNG )
        {
            hTdCngDec->wb_cng_ener_fx = wb_ener16_fx;
            move16(); /*Q8 */
        }
        if ( GT_16( abs_s( sub( wb_ener16_fx, hTdCngDec->wb_cng_ener_fx ) ), 3072 ) )
        {
            allow_cn_step_fx = 1;
            move16();
        }

        IF( EQ_16( allow_cn_step_fx, 1 ) )
        {
            hTdCngDec->wb_cng_ener_fx = wb_ener16_fx;
            move16(); /*Q8 */
        }
        ELSE
        {
            tmp_16 = sub( wb_ener16_fx, hTdCngDec->wb_cng_ener_fx );              /*Q8 */
            tmp_16 = mult_r( tmp_16, 29491 );                                     /*Q8 */
            hTdCngDec->wb_cng_ener_fx = add( hTdCngDec->wb_cng_ener_fx, tmp_16 ); /*Q8 */
            move16();
        }

        test();
        test();
        IF( EQ_32( st->core_brate, SID_2k40 ) && EQ_16( sid_bw, 1 ) && ( st->bfi == 0 ) )
        {
            hTdCngDec->last_wb_cng_ener_fx = hTdCngDec->wb_cng_ener_fx;
            move16();

            if ( !st->first_CNG )
            {
                hTdCngDec->shb_cng_ener_fx = hTdCngDec->last_shb_cng_ener_fx;
                move16();
            }
        }

        gain_fx16 = sub( hTdCngDec->wb_cng_ener_fx, hTdCngDec->last_wb_cng_ener_fx ); /* Q8 */
        if ( GT_16( gain_fx16, 15 ) )
        {
            gain_fx = 15;
            move16();
        }
        step_fx16 = sub( add( gain_fx16, hTdCngDec->last_shb_cng_ener_fx ), hTdCngDec->shb_cng_ener_fx ); /*Q8 */

        test();
        IF( EQ_16( allow_cn_step_fx, 1 ) || GT_32( st->last_core_brate, SID_2k40 ) )
        {
            hTdCngDec->shb_cng_ener_fx = add( hTdCngDec->shb_cng_ener_fx, step_fx16 ); /* Q8 */
            move16();
        }
        ELSE
        {
            hTdCngDec->shb_cng_ener_fx = add( hTdCngDec->shb_cng_ener_fx, mult( 8192, step_fx16 ) ); /*Q8 */
            move16();
        }
    }
    ELSE
#endif
    {
        wb_ener_fx = L_deposit_l( 1 ); /*Q1 */
        IF( NE_16( st->element_mode, IVAS_CPE_DFT ) )
        {
@@ -1171,6 +1290,7 @@ static void shb_CNG_decod_ivas_fx(
            hTdCngDec->wb_cng_ener_fx_32 = L_add( hTdCngDec->wb_cng_ener_fx_32, tmp ); /*Q11 */
            move32();
        }

        test();
        test();
        IF( EQ_32( st->core_brate, SID_2k40 ) && EQ_16( sid_bw, 1 ) && EQ_16( st->bfi, 0 ) )
@@ -1192,6 +1312,7 @@ static void shb_CNG_decod_ivas_fx(
            move32();
        }
        step_fx = L_sub( L_add( gain_fx, hTdCngDec->last_shb_cng_ener_fx_32 ), hTdCngDec->shb_cng_ener_fx_32 ); /*Q11 */

        test();
        IF( EQ_16( allow_cn_step_fx, 1 ) || GT_32( st->last_core_brate, SID_2k40 ) )
        {
@@ -1203,6 +1324,8 @@ static void shb_CNG_decod_ivas_fx(
            hTdCngDec->shb_cng_ener_fx_32 = L_add( hTdCngDec->shb_cng_ener_fx_32, L_shr( step_fx, 2 ) ); /*Q11 */
            move32();
        }
    }

    /* generate white noise excitation */
    FOR( i = 0; i < L_FRAME16k; i++ )
    {
@@ -1238,6 +1361,56 @@ static void shb_CNG_decod_ivas_fx(
        }
    }

#ifdef HARM_NON_LINEARITY
    IF( st->element_mode == EVS_MONO )
    {
        ener_fx16 = hTdCngDec->shb_cng_ener_fx;
        move16(); /*Q8 */
        IF( hTdCngDec->trans_cnt_fx > 0 )
        {
            i = extract_l( L_mult0( hTdCngDec->trans_cnt_fx, 17 ) );                                                                                           /*Q0 */
            ener_fx16 = add_sat( hTdCngDec->shb_cng_ener_fx, mult( sin_table256_fx[i], sub_sat( hTdCngDec->last_shb_ener_fx, hTdCngDec->shb_cng_ener_fx ) ) ); /*Q8 */
            hTdCngDec->trans_cnt_fx = sub( hTdCngDec->trans_cnt_fx, 1 );
            move16();
        }

        tmp_16 = mult( 3277, ener_fx16 ); /*Q8 */
        L_tmp = L_mult( 27213, tmp_16 );  /*Q22, 27213=3.321928 in Q13  */
        L_tmp = L_shr( L_tmp, 6 );        /*Q16 */
        L_tmp = L_add( L_tmp, 10 << 16 );
        if ( L_tmp < 0 )
        {
            L_tmp = 0;
            move32();
        }
        fra = L_Extract_lc( L_tmp, &exp );
        L_tmp = L_shl_sat( Pow2( exp, fra ), 5 ); /*Q5 */
        L_tmp = L_shr( L_tmp, 10 );
        if ( !L_tmp )
        {
            L_tmp = 1; /*Q5 */
        }
        exp = norm_l( L_tmp );
        L_tmp = L_shl( L_tmp, exp ); /*Q31*/
        tmp_16 = extract_h( L_tmp ); /*Q15*/
        exp = sub( exp, 16 );
        exp1 = norm_s( ener_excSHB_fx );
        fra = shl( ener_excSHB_fx, exp1 ); /*Q15*/

        IF( GT_16( fra, tmp_16 ) )
        {
            fra = shr( fra, 1 ); /*Q15*/
            exp1 = sub( exp1, 1 );
        }
        tmp_16 = div_s( fra, tmp_16 ); /*Q15*/

        L_tmp = L_deposit_h( tmp_16 ); /*Q31 */
        tmp = sub( add( 5, exp ), add( q, exp1 ) );
        L_gain_fx = Isqrt_lc( L_tmp, &tmp_16 ); /*Q31-Qtmp */
    }
    ELSE
#endif
    {
        ener_fx = hTdCngDec->shb_cng_ener_fx_32;
        move32(); /*Q11 */
        IF( GT_16( st->hTdCngDec->trans_cnt_fx, 0 ) )
@@ -1251,13 +1424,15 @@ static void shb_CNG_decod_ivas_fx(
        tmp = L_shr( Mpy_32_16_1( ener_fx, 3277 ), 3 ); /*Q8 */
        IF( GT_32( tmp, 32767 ) )
        abort();
#ifndef HARM_NON_LINEARITY
        Word16 tmp_16;
#endif
        tmp_16 = (Word16) tmp;
        move16();
        L_tmp = L_mult( 27213, tmp_16 ); /*Q22, 27213=3.321928 in Q13  */
        L_tmp = L_shr( L_tmp, 6 );       /*Q16 */
        L_tmp = L_add( L_tmp, L_shl( 10, 16 ) );
    if ( ( L_tmp < 0 ) )
        if ( L_tmp < 0 )
        {
            L_tmp = 0;
            move32();
@@ -1288,6 +1463,8 @@ static void shb_CNG_decod_ivas_fx(
        L_gain_fx = Isqrt_lc( L_tmp, &tmp_16 ); /*Q31-Qtmp */
        hTdCngDec->shb_cng_gain_fx_32 = ener_fx;
        move32();
    }

    FOR( i = 0; i < L_FRAME16k; i++ )
    {
        shb_syn16k_fx[i] = extract_l( L_shr( Mpy_32_16_1( L_gain_fx, excSHB_fx[i] ), sub( 5, tmp_16 ) ) ); /*Q3 = 31-Qtmp-8-15-5+Qtmp */
@@ -1317,7 +1494,12 @@ static void shb_CNG_decod_ivas_fx(
        interpolate_3_over_2_allpass_fx( shb_synth_fx, L_FRAME32k, shb_synth_fx, hTdCngDec->interpol_3_2_cng_dec_fx, allpass_poles_3_ov_2 );
    }

#ifdef HARM_NON_LINEARITY
    IF( st->element_mode != EVS_MONO )
#endif
    {
        Scale_sig( shb_synth_fx, L_FRAME48k, -3 ); /* Qx - 3 */
    }

    ResetSHBbuffer_Dec_fx( st->hBWE_TD, st->extl );

+4 −0
Original line number Diff line number Diff line
@@ -1186,7 +1186,11 @@ ivas_error ivas_core_dec_fx(
            Scale_sig( hBWE_TD->state_lpc_syn_fx, LPC_SHB_ORDER, sub( Q8, hBWE_TD->prev_Q_bwe_syn ) );                                                                                                            // Q8
            Copy_Scale_sig_32_16( hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx_32, hBWE_TD->genSHBsynth_state_lsyn_filt_shb_local_fx, ( 2 * ALLPASSSECTIONS_STEEP ), sub( hBWE_TD->prev_Q_bwe_syn2, Q11 ) ); // prev_Q_bew_syn2

#ifdef HARM_NON_LINEARITY
            swb_CNG_dec_fx( st, synth_fxl, hb_synth_16_fx[n], sid_bw[n], negate( q ) );
#else
            swb_CNG_dec_ivas_fx( st, synth_fxl, hb_synth_16_fx[n], sid_bw[n], negate( q ) );
#endif

            test();
            IF( st->core_brate == FRAME_NO_DATA || EQ_32( st->core_brate, SID_2k40 ) )