Loading lib_com/prot_fx.h +2 −1 Original line number Diff line number Diff line Loading @@ -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*/ Loading @@ -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 */ ); Loading lib_dec/cng_dec_fx.c +286 −104 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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() Loading Loading @@ -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 ) ) { Loading @@ -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*/ Loading Loading @@ -772,6 +782,7 @@ void swb_CNG_dec_ivas_fx( return; } #endif /*---------------------------------------------------------------------* * shb_CNG_decod() Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; Loading @@ -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 { Loading @@ -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 ) ) { Loading @@ -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 ) ) { Loading Loading @@ -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 ) ) Loading @@ -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 ) ) { Loading @@ -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++ ) { Loading Loading @@ -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 ) ) Loading @@ -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(); Loading Loading @@ -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 */ Loading Loading @@ -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 ); Loading lib_dec/ivas_core_dec_fx.c +4 −0 Original line number Diff line number Diff line Loading @@ -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 ) ) Loading Loading
lib_com/prot_fx.h +2 −1 Original line number Diff line number Diff line Loading @@ -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*/ Loading @@ -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 */ ); Loading
lib_dec/cng_dec_fx.c +286 −104 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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() Loading Loading @@ -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 ) ) { Loading @@ -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*/ Loading Loading @@ -772,6 +782,7 @@ void swb_CNG_dec_ivas_fx( return; } #endif /*---------------------------------------------------------------------* * shb_CNG_decod() Loading @@ -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; Loading Loading @@ -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; Loading @@ -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; Loading @@ -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 { Loading @@ -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 ) ) { Loading @@ -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 ) ) { Loading Loading @@ -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 ) ) Loading @@ -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 ) ) { Loading @@ -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++ ) { Loading Loading @@ -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 ) ) Loading @@ -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(); Loading Loading @@ -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 */ Loading Loading @@ -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 ); Loading
lib_dec/ivas_core_dec_fx.c +4 −0 Original line number Diff line number Diff line Loading @@ -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 ) ) Loading