diff --git a/lib_com/gs_gains_fx.c b/lib_com/gs_gains_fx.c index ae7661c0ef3e35d78b35284c756e0a75971520f7..d5e9e2e9ecaae94023c36a19e57420e359c7e1a9 100644 --- a/lib_com/gs_gains_fx.c +++ b/lib_com/gs_gains_fx.c @@ -149,6 +149,121 @@ void Comp_and_apply_gain_fx( return; } +void Comp_and_apply_gain_ivas_fx( + Word16 exc_diffQ[], /* i/o: Quantized excitation */ + Word16 Ener_per_bd_iQ[], /* i : Target ener per band Q13 */ + Word16 Ener_per_bd_yQ[], /* i/o : Ener per band for norm vector i->Q13/o->Q13 */ + Word16 Mbands_gn, /* i : number of bands */ + const Word16 ReUseGain, /* i : Reuse the gain in Ener_per_bd_yQ */ + Word16 Qexc_diff, + Word16 *Q_exc ) +{ + Word16 i, i_band; + Word16 StartBin, NB_Qbins; + Word16 y_gain; + Word16 L16, frac, exp1, tmp_exp; + Word32 L32; + Word16 Q_exc_diffQ[L_FRAME16k]; +#ifdef BASOP_NOGLOB_DECLARE_LOCAL + Flag Overflow = 0; + move32(); +#endif + + /* Recreate excitation for local synthesis and decoder */ + StartBin = 0; + move16(); + NB_Qbins = 0; + move16(); + + tmp_exp = add( 14, sub( *Q_exc, Qexc_diff ) ); /* In case of reuse, it can be computed outside the loop*/ + FOR( i_band = 0; i_band < Mbands_gn; i_band++ ) + { + StartBin = add( StartBin, NB_Qbins ); + NB_Qbins = mfreq_bindiv_loc[i_band]; + move16(); + IF( EQ_16( ReUseGain, 1 ) ) + { + y_gain = Ener_per_bd_yQ[i_band]; + move16(); + + FOR( i = StartBin; i < NB_Qbins + StartBin; i++ ) + { +#ifdef BASOP_NOGLOB + L32 = L_mult( exc_diffQ[i], y_gain ); /*Q_exc+16-tmp_exp */ + exc_diffQ[i] = round_fx_o( L32, &Overflow ); /*Q_exc-tmp_exp */ +#else /* BASOP_NOGLOB */ + L32 = L_mult( exc_diffQ[i], y_gain ); /*Q_exc+16 */ + exc_diffQ[i] = round_fx( L32 ); /*Q_exc */ +#endif /* BASOP_NOGLOB */ + move16(); + IF( exc_diffQ[i] ) + { + Q_exc_diffQ[i] = sub( *Q_exc, tmp_exp ); + } + ELSE + { + Q_exc_diffQ[i] = *Q_exc; + } + move16(); + } + } + ELSE + { + /*-----------------------------------------------------------------* + * y_gain = pow(10.0, (Ener_per_bd_iQ[i_band]-Ener_per_bd_yQ[i_band])) + * = pow(2, 3.321928*(Ener_per_bd_iQ[i_band]-Ener_per_bd_yQ[i_band])) + *-----------------------------------------------------------------*/ + L16 = sub( Ener_per_bd_iQ[i_band], Ener_per_bd_yQ[i_band] ); /*Q12 */ + L32 = L_mult( L16, 27213 ); /* 3.321928 in Q13 -> Q26 */ + L32 = L_shr( L32, 10 ); /* From Q26 to Q16 */ + frac = L_Extract_lc( L32, &exp1 ); /* Extract exponent of gcode0 */ + y_gain = extract_l( Pow2( 14, frac ) ); /* Put 14 as exponent so that */ + /* output of Pow2() will be: */ + /* 16384 < Pow2() <= 32767 */ +#ifdef BASOP_NOGLOB + Ener_per_bd_yQ[i_band] = shl_o( y_gain, sub( exp1, 13 ), &Overflow ); +#else /* BASOP_NOGLOB */ + Ener_per_bd_yQ[i_band] = shl( y_gain, sub( exp1, 13 ) ); +#endif /* BASOP_NOGLOB */ + move16(); /*Q1 */ + tmp_exp = add( add( exp1, 1 ), sub( *Q_exc, Qexc_diff ) ); + + FOR( i = StartBin; i < NB_Qbins + StartBin; i++ ) + { + L32 = L_mult( exc_diffQ[i], y_gain ); /*Qexc_diff+15 */ +#ifdef BASOP_NOGLOB + exc_diffQ[i] = round_fx_o( L32, &Overflow ); /*Q_exc-tmp_exp */ +#else /* BASOP_NOGLOB */ + exc_diffQ[i] = round_fx( L_shl( L32, tmp_exp ) ); /*Q_exc */ +#endif + move16(); + IF( exc_diffQ[i] ) + { + Q_exc_diffQ[i] = sub( *Q_exc, tmp_exp ); + } + ELSE + { + Q_exc_diffQ[i] = *Q_exc; + } + move16(); + } + } + } + + FOR( i = 0; i < StartBin + NB_Qbins; i++ ) + { + *Q_exc = s_min( *Q_exc, add( Q_exc_diffQ[i], norm_s( exc_diffQ[i] ) ) ); + move16(); + } + FOR( i = 0; i < StartBin + NB_Qbins; i++ ) + { + exc_diffQ[i] = shl( exc_diffQ[i], sub( *Q_exc, Q_exc_diffQ[i] ) ); + move16(); + } + + return; +} + /*========================================================================*/ /* FUNCTION : Ener_per_band_comp_fx() */ diff --git a/lib_com/gs_noisefill_fx.c b/lib_com/gs_noisefill_fx.c index 05b0440b601beb3b1e94bcd548399858ae5289bb..93b7bb3f82af121c0df33b0f329d637b9830ae28 100644 --- a/lib_com/gs_noisefill_fx.c +++ b/lib_com/gs_noisefill_fx.c @@ -1137,7 +1137,7 @@ void highband_exc_dct_in_ivas_fx( Word16 bwidth, Word16 *exc_wo_nf, /* o : temporal excitation (in f domain) without noisefill */ Word16 Qexc_diffQ, - Word16 Q_exc, + Word16 *Q_exc, const Word16 GSC_noisy_speech, Word16 *lt_ener_per_band_fx, /* i/o: Average per band energy */ const Word16 L_frame, /* i : frame length */ @@ -1450,13 +1450,32 @@ void highband_exc_dct_in_ivas_fx( } } #endif - Comp_and_apply_gain_fx( exc_diffQ, Ener_per_bd_iQ, Ener_per_bd_yQ, last_bin, 0, Qexc_diffQ, Q_exc ); + Word16 Q_tmp = *Q_exc; + move16(); + Word16 Q_old = *Q_exc; + move16(); + Comp_and_apply_gain_ivas_fx( exc_diffQ, Ener_per_bd_iQ, Ener_per_bd_yQ, last_bin, 0, Qexc_diffQ, Q_exc ); IF( exc_wo_nf != NULL ) { - Comp_and_apply_gain_fx( exc_wo_nf, Ener_per_bd_iQ, Ener_per_bd_yQ, last_bin, 1, Qexc_diffQ, Q_exc ); + Comp_and_apply_gain_ivas_fx( exc_wo_nf, Ener_per_bd_iQ, Ener_per_bd_yQ, last_bin, 1, Qexc_diffQ, &Q_tmp ); + IF( GT_16( Q_tmp, *Q_exc ) ) + { + Scale_sig( exc_wo_nf, L_frame, sub( *Q_exc, Q_tmp ) ); + } + ELSE IF( LT_16( Q_tmp, *Q_exc ) ) + { + Scale_sig( exc_diffQ, L_frame, sub( Q_tmp, *Q_exc ) ); + *Q_exc = Q_tmp; + move16(); + } + Scale_sig( exc_dct_in, L_frame, sub( *Q_exc, Q_old ) ); Vr_add( exc_dct_in, exc_wo_nf, exc_wo_nf, L_frame ); } + ELSE + { + Scale_sig( exc_dct_in, L_frame, sub( *Q_exc, Q_old ) ); + } /*--------------------------------------------------------------------------------------* * add the correction layer to the LF bins, * and add the quantized pulses or the noise for the higher part of the spectrum @@ -1495,8 +1514,18 @@ void highband_exc_dct_in_ivas_fx( Q_hb_exc = 0; move16(); - envelop_modify_fx( exc_diffQ, seed_tcx, last_bin, Ener_per_bd_iQ, Q_exc, &Q_hb_exc ); - Copy_Scale_sig( &exc_diffQ[tmp1], &exc_dct_in[tmp1], sub( L_FRAME, tmp1 ), sub( Q_exc, Q_hb_exc ) ); /* from Q_hb_exc -> Q_exc as expected */ + envelop_modify_fx( exc_diffQ, seed_tcx, last_bin, Ener_per_bd_iQ, *Q_exc, &Q_hb_exc ); + IF( GT_16( *Q_exc, Q_hb_exc ) ) + { + Scale_sig( exc_wo_nf, L_frame, sub( Q_hb_exc, *Q_exc ) ); + *Q_exc = Q_hb_exc; + move16(); + } + ELSE + { + Scale_sig( &exc_diffQ[tmp1], sub( L_FRAME, tmp1 ), sub( *Q_exc, Q_hb_exc ) ); + } + Copy( &exc_diffQ[tmp1], &exc_dct_in[tmp1], sub( L_FRAME, tmp1 ) ); /* from Q_hb_exc -> Q_exc as expected */ } IF( LT_16( nb_subfr, 4 ) ) diff --git a/lib_com/ivas_cov_smooth.c b/lib_com/ivas_cov_smooth.c index 00cd8c3f2b478f469f4324fa5f615f60e5622621..ebf4e1564716d36dc18a3edff674de35061dede1 100644 --- a/lib_com/ivas_cov_smooth.c +++ b/lib_com/ivas_cov_smooth.c @@ -537,7 +537,7 @@ static void ivas_compute_smooth_cov_fx( pCov_buf[i][j][k] = L_add( pCov_buf[i][j][k], L_tmp ); move32(); } - mvs2s( q_tmp, hCovState->q_cov_real_per_band[i][j], pFb->filterbank_num_bands ); + Copy( q_tmp, hCovState->q_cov_real_per_band[i][j], pFb->filterbank_num_bands ); } } FOR( i = 0; i < num_ch; i++ ) @@ -579,7 +579,7 @@ static void ivas_compute_smooth_cov_fx( pCov_buf[i][j][k] = L_add( pCov_buf[i][j][k], L_tmp ); move32(); } - mvs2s( q_tmp, hCovState->q_cov_real_per_band[i][j], pFb->filterbank_num_bands ); + Copy( q_tmp, hCovState->q_cov_real_per_band[i][j], pFb->filterbank_num_bands ); } } } diff --git a/lib_com/ivas_ism_com.c b/lib_com/ivas_ism_com.c index 8935bc904ec569c41a260f5658d81c6ef9dc6dee..c1980986f5fb0f2194ca2a880b4fb6545ecbee92 100644 --- a/lib_com/ivas_ism_com.c +++ b/lib_com/ivas_ism_com.c @@ -541,7 +541,7 @@ ivas_error ivas_ism_config_fx( v_sub_s( bits_element, nb_bits_metadata, bits_CoreCoder, n_ISms ); bitbudget_to_brate( bits_CoreCoder, total_brate, n_ISms ); - mvs2s( nb_bits_metadata, nb_bits_metadata, n_ISms ); + Copy( nb_bits_metadata, nb_bits_metadata, n_ISms ); } /* assign less CoreCoder bit-budget to inactive streams (at least one stream must be active) */ diff --git a/lib_com/ivas_pca_tools.c b/lib_com/ivas_pca_tools.c index 5966d9dc54f6c937184d63cca149ef7c6aea25cb..d831d0359b25327ad80b7ff6ce86dfe296bca227 100644 --- a/lib_com/ivas_pca_tools.c +++ b/lib_com/ivas_pca_tools.c @@ -1064,23 +1064,6 @@ static int16_t calc_n2( return n2; } -#ifdef IVAS_FLOAT_FIXED -static Word16 calc_n2_fx( - const Word16 ph1 ) -{ - Word16 n2; - Word32 temp; - temp = L_mult( 23040, getSinWord16( ph1 ) ); /* Q8 + Q15 + Q1 = Q24 */ - n2 = round_fx( temp ); /* Q24 -> Q8 */ - n2 = shr( n2, 8 ); - IF( s_and( n2, 1 ) == 0 ) - { - n2 = add( n2, 1 ); - } - - return n2; -} -#endif static int16_t calc_n3( const float ph1, @@ -1507,14 +1490,14 @@ void pca_dec_s3_fx( const Word32 index, Word16 *q_fx ) { - Word16 ph1_q_fx, ph2_q_fx, ph3_q_fx; + Word16 ph1_q_fx, ph2_q_fx, ph3_q_fx, num_fx; Word32 j; Word16 i; - Word16 n1, n2, n3; + Word16 n2, n3; Word16 index1, index2, index3; - Word16 d_fx; + Word16 d_fx, exp; j = index; move16(); @@ -1532,19 +1515,17 @@ void pca_dec_s3_fx( assert( index1 > -1 ); - n1 = IVAS_PCA_N1; + /* + n1 = IVAS_PCA_N1; + d = EVS_PI / ( n1 - 1 ); + ph1_q = index1 * d; + n2 = calc_n2( ph1_q ); + */ + ph1_q_fx = ph1_q_n2_tbl[index1][0]; move16(); - Word16 num_fx; - num_fx = 12868; + n2 = ph1_q_n2_tbl[index1][1]; move16(); - d_fx = idiv1616( num_fx, sub( n1, 1 ) ); // Q12 - ph1_q_fx = i_mult( index1, d_fx ); // Q12 - - ph1_q_fx = shl( ph1_q_fx, 1 ); /* Q12 -> Q13 */ - - n2 = calc_n2_fx( ph1_q_fx ); - j = L_sub( j, ivas_pca_offset_index1[index1] ); index2 = -1; move16(); @@ -1570,9 +1551,13 @@ void pca_dec_s3_fx( num_fx = 12868; move16(); - d_fx = idiv1616( num_fx, sub( n2, 1 ) ); // Q12 - ph2_q_fx = i_mult( index2, d_fx ); // Q12 - ph2_q_fx = shl( ph2_q_fx, 1 ); /* Q12 -> Q13 */ + + d_fx = BASOP_Util_Divide1616_Scale( num_fx, sub( n2, 1 ), &exp ); /* Q12 */ + exp = add( 3 - 15, exp ); + d_fx = shl( d_fx, sub( exp, 3 ) ); /* Q12 */ + + ph2_q_fx = i_mult( index2, d_fx ); // Q12 + ph2_q_fx = shl( ph2_q_fx, 1 ); /* Q12 -> Q13 */ } j = L_sub( j, ivas_pca_offset_index2[add( index2, get_pca_offset_n2_fx( index1 ) )] ); @@ -1588,7 +1573,6 @@ void pca_dec_s3_fx( } ELSE { - Word16 exp; num_fx = 25736; /* PI2 in Q12 */ move16(); d_fx = BASOP_Util_Divide1616_Scale( num_fx, n3, &exp ); /* Q12 */ diff --git a/lib_com/ivas_rom_com.c b/lib_com/ivas_rom_com.c index 1cda9e51e0555ed5169306323cec114559c68f3c..5018b001ad6208fcf6499271c6d1d82eb787478d 100644 --- a/lib_com/ivas_rom_com.c +++ b/lib_com/ivas_rom_com.c @@ -1835,6 +1835,102 @@ const int16_t ivas_pca_offset_n2[IVAS_PCA_N1] = 5216, 5236, 5254, 5268, 5278, 5286, 5290 }; +#ifdef IVAS_FLOAT_FIXED +const Word16 ph1_q_n2_tbl[IVAS_PCA_N1][2] = { /* ph1_q : Q13, n2 : Q0 */ + { 0, 1 }, + { 286, 3 }, + { 572, 7 }, + { 858, 9 }, + { 1144, 13 }, + { 1430, 17 }, + { 1716, 19 }, + { 2002, 23 }, + { 2288, 25 }, + { 2574, 29 }, + { 2860, 31 }, + { 3146, 35 }, + { 3431, 37 }, + { 3717, 39 }, + { 4003, 43 }, + { 4289, 45 }, + { 4575, 49 }, + { 4861, 51 }, + { 5147, 53 }, + { 5433, 55 }, + { 5719, 59 }, + { 6005, 61 }, + { 6291, 63 }, + { 6577, 65 }, + { 6863, 67 }, + { 7149, 69 }, + { 7435, 71 }, + { 7721, 73 }, + { 8007, 75 }, + { 8293, 77 }, + { 8579, 79 }, + { 8865, 79 }, + { 9151, 81 }, + { 9437, 83 }, + { 9722, 83 }, + { 10008, 85 }, + { 10294, 87 }, + { 10580, 87 }, + { 10866, 87 }, + { 11152, 89 }, + { 11438, 89 }, + { 11724, 89 }, + { 12010, 91 }, + { 12296, 91 }, + { 12582, 91 }, + { 12868, 91 }, + { 13154, 91 }, + { 13440, 91 }, + { 13726, 91 }, + { 14012, 89 }, + { 14298, 89 }, + { 14584, 89 }, + { 14870, 87 }, + { 15156, 87 }, + { 15442, 87 }, + { 15728, 85 }, + { 16013, 83 }, + { 16299, 83 }, + { 16585, 81 }, + { 16871, 79 }, + { 17157, 79 }, + { 17443, 77 }, + { 17729, 75 }, + { 18015, 73 }, + { 18301, 71 }, + { 18587, 69 }, + { 18873, 67 }, + { 19159, 65 }, + { 19445, 63 }, + { 19731, 61 }, + { 20017, 59 }, + { 20303, 55 }, + { 20589, 53 }, + { 20875, 51 }, + { 21161, 49 }, + { 21447, 45 }, + { 21733, 43 }, + { 22019, 39 }, + { 22304, 37 }, + { 22590, 35 }, + { 22876, 31 }, + { 23162, 29 }, + { 23448, 25 }, + { 23734, 23 }, + { 24020, 19 }, + { 24306, 17 }, + { 24592, 13 }, + { 24878, 9 }, + { 25164, 7 }, + { 25450, 3 }, + { 25736, 1 } +}; +#endif + /*----------------------------------------------------------------------------------* * Parametric MC ROM tables diff --git a/lib_com/ivas_rom_com.h b/lib_com/ivas_rom_com.h index 6c1f306465b3cd61a26ea36fdd529d60a6b3fdad..1a043780a2fa8b8ac3bc1440f65cfb91d9228116 100644 --- a/lib_com/ivas_rom_com.h +++ b/lib_com/ivas_rom_com.h @@ -212,6 +212,7 @@ extern const int16_t pr_pd_idx_pairs[3][3][2]; extern const int32_t ivas_pca_offset_index1[IVAS_PCA_N1 + 1]; extern const int16_t ivas_pca_offset_index2[2692]; extern const int16_t ivas_pca_offset_n2[IVAS_PCA_N1]; +extern const Word16 ph1_q_n2_tbl[IVAS_PCA_N1][2]; /*----------------------------------------------------------------------------------* diff --git a/lib_com/ivas_sns_com_fx.c b/lib_com/ivas_sns_com_fx.c index 76e67fb7d384e8f1561c1f10280bf2d7883cdc20..ed19a8613a498db06c3388e02f2a2a6340186dc5 100644 --- a/lib_com/ivas_sns_com_fx.c +++ b/lib_com/ivas_sns_com_fx.c @@ -124,8 +124,8 @@ void sns_compute_scf_fx( } exp = 15; move16(); - Word16 inv_bw = Invert16( bandLengths[i], &exp ); - inv_bw = shl( inv_bw, exp ); + + Word16 inv_bw = div_l( ONE_IN_Q16, bandLengths[i] ); // Q15 x[i] = Mpy_32_16_1( x[i], inv_bw ); move32(); } @@ -148,13 +148,13 @@ void sns_compute_scf_fx( SWITCH( L_frame ) { case L_FRAME16k: - pow_tilt = pow_tilt_16k; + pow_tilt = pow_tilt_16k; // Q7 BREAK; case L_FRAME25_6k: - pow_tilt = pow_tilt_25_6k; + pow_tilt = pow_tilt_25_6k; // Q7 BREAK; case L_FRAME32k: - pow_tilt = pow_tilt_32k; + pow_tilt = pow_tilt_32k; // Q7 BREAK; default: pow_tilt = NULL; diff --git a/lib_com/mslvq_com_fx.c b/lib_com/mslvq_com_fx.c index bb1913497c67e604b5682be7427085c692c7fe95..d2db655f13038748b26cf2f06a1a651b023665af 100644 --- a/lib_com/mslvq_com_fx.c +++ b/lib_com/mslvq_com_fx.c @@ -409,7 +409,7 @@ static Word16 decode_indexes_ivas_fx( { IF( index[i] < 0 ) { - set_s( x_lvq, 0, 2 * LATTICE_DIM ); + set16_fx( x_lvq, 0, 2 * LATTICE_DIM ); #ifdef MSAN_FIX scales_mslvq[0] = 0; move16(); @@ -451,7 +451,7 @@ static Word16 decode_indexes_ivas_fx( IF( GE_32( index1, (Word32) offset_scale1[MAX_NO_SCALES] ) ) { /* safety check in case of bit errors */ - set_s( x_lvq, 0, 2 * LATTICE_DIM ); + set16_fx( x_lvq, 0, 2 * LATTICE_DIM ); #ifdef MSAN_FIX scales_mslvq[0] = 0; move16(); diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 9cdf084bbe2cc54d51208a4023fd585b124a2bd6..88085ab79334bbf886ea8f0d1d3a16b39df386a7 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -1596,6 +1596,15 @@ void Comp_and_apply_gain_fx( Word16 Qexc_diff, Word16 Q_exc ); +void Comp_and_apply_gain_ivas_fx( + Word16 exc_diffQ[], /* i/o: Quantized excitation */ + Word16 Ener_per_bd_iQ[], /* i : Target ener per band Q13 */ + Word16 Ener_per_bd_yQ[], /* i/o : Ener per band for norm vector i->Q13/o->Q13 */ + Word16 Mbands_gn, /* i : number of bands */ + const Word16 ReUseGain, /* i : Reuse the gain in Ener_per_bd_yQ */ + Word16 Qexc_diff, + Word16 *Q_exc ); + // gs_preech.c void pre_echo_att_fx( Word32 *Last_frame_ener_fx, /* i/o: Energy of the last frame 2*Q_new+1*/ @@ -4636,7 +4645,7 @@ void highband_exc_dct_in_ivas_fx( Word16 bwidth, Word16 *exc_wo_nf, /* o : temporal excitation (in f domain) without noisefill */ Word16 Qexc_diffQ, - Word16 Q_exc, + Word16 *Q_exc, const Word16 GSC_noisy_speech, Word16 *lt_ener_per_band_fx, /* i/o: Average per band energy */ const Word16 L_frame, /* i : frame length */ @@ -6333,7 +6342,7 @@ void gsc_dec_ivas_fx( Word16 *last_bin, /* i : last bin of bit allocation */ const Word16 *lsf_new, /* i : ISFs at the end of the frame */ Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill */ - Word16 Q_exc ); + Word16 *Q_exc ); void GSC_dec_init( GSC_DEC_HANDLE hGSCDec /* i/o: GSC data handle */ diff --git a/lib_com/swb_tbe_com_fx.c b/lib_com/swb_tbe_com_fx.c index c1da0b8acfce1c652e54af11b9d11702f80f0b0c..235e704cc971a0a6aa72463c7cc5cb994055abd7 100644 --- a/lib_com/swb_tbe_com_fx.c +++ b/lib_com/swb_tbe_com_fx.c @@ -6375,6 +6375,13 @@ void prep_tbe_exc_ivas_fx( } ELSE { + Word16 shift = 8; + move16(); + if ( element_mode == EVS_MONO ) + { + shift = 4; + move16(); + } IF( gain_preQ_fx != 0 ) { FOR( i = 0; i < L_subfr; i++ ) @@ -6384,8 +6391,8 @@ void prep_tbe_exc_ivas_fx( Ltemp2 = L_mult( gain_preQ_fx, code_preQ_fx[i] ); /*Q2 * Q10 -> Q12 */ #ifdef BASOP_NOGLOB - Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ - Ltemp2 = L_shl_o( Ltemp2, add( Q_exc, 4 ) /*Q_exc+16-13*/, &Overflow ); /*Q_exc+16 */ + Ltemp1 = L_shl_o( Ltemp1, add( Q_exc, 6 ) /*Q_exc+16-19*/, &Overflow ); /*Q_exc+16 */ + Ltemp2 = L_shl_o( Ltemp2, add( Q_exc, shift ) /*Q_exc+ 2 + 6 (or) 10 - 13*/, &Overflow ); /*Q_exc+16 */ tmp_code_preInt_fx[i] = round_fx_o( L_add_o( Ltemp1, Ltemp2, &Overflow ), &Overflow ); /* Q_exc */ #else /* BASOP_NOGLOB */ diff --git a/lib_dec/FEC_fx.c b/lib_dec/FEC_fx.c index a7d1527ef065bd0ccd97a117fbbcaf1f2c3a1443..54a450eeeb47489f7813fa19a6d6e366a60e1853 100644 --- a/lib_dec/FEC_fx.c +++ b/lib_dec/FEC_fx.c @@ -542,7 +542,7 @@ void FEC_exc_estim_fx( } ELSE { - gsc_dec_ivas_fx( st_fx, exc_dct_in, hGSCDec->Last_GSC_pit_band_idx, Diff_len, 0, tmp, st_fx->last_coder_type, &last_bin_fx, lsf_new, NULL, st_fx->Q_exc ); + gsc_dec_ivas_fx( st_fx, exc_dct_in, hGSCDec->Last_GSC_pit_band_idx, Diff_len, 0, tmp, st_fx->last_coder_type, &last_bin_fx, lsf_new, NULL, &st_fx->Q_exc ); } *tmp_noise = shr_r( st_fx->lp_gainc_fx, 3 ); /*Q0*/ move16(); diff --git a/lib_dec/core_switching_dec.c b/lib_dec/core_switching_dec.c index d8cf5e5a8c94ba1b00c61ca9a3b15e94e484b5d8..4a6c372c67367f04a5eaa6fc33b930e889386c9b 100644 --- a/lib_dec/core_switching_dec.c +++ b/lib_dec/core_switching_dec.c @@ -2127,14 +2127,12 @@ void ivas_bw_switching_pre_proc_fx( test(); IF( EQ_16( st->last_bwidth, 0 ) && LE_16( st->extl, SWB_CNG ) ) { - // st->prev_ener_shb = 0.0f; st->prev_ener_shb_fx = 0; move16(); IF( st->hBWE_FD != NULL ) { - // set_f( st->hBWE_FD->prev_SWB_fenv, 0, SWB_FENV ); - set_s( st->prev_SWB_fenv_fx, 0, SWB_FENV ); + set16_fx( st->prev_SWB_fenv_fx, 0, SWB_FENV ); } } ELSE IF( ( ( EQ_16( st->core, ACELP_CORE ) && ( EQ_16( st->last_core, HQ_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) || EQ_16( st->last_core, TCX_20_CORE ) ) ) || ( EQ_16( st->core, st->last_core ) && NE_16( st->extl, st->last_extl ) ) ) && GE_16( st->last_bwidth, SWB ) ) diff --git a/lib_dec/core_switching_dec_fx.c b/lib_dec/core_switching_dec_fx.c index 383b3ca8714a58679ce01376425a976ad0d4baa3..4eaa564ea2956c1d91a06b5ffcdcdd5ad49de555 100644 --- a/lib_dec/core_switching_dec_fx.c +++ b/lib_dec/core_switching_dec_fx.c @@ -1711,7 +1711,9 @@ ivas_error core_switching_post_dec_ivas_fx( Word16 temp_buffer[L_FRAME48k]; Copy( st_fx->delay_buf_out_fx, temp_buffer, delay_comp ); - Copy( synth + sub( output_frame, delay_comp ), st_fx->delay_buf_out_fx, delay_comp ); + Copy_Scale_sig( synth + sub( output_frame, delay_comp ), st_fx->delay_buf_out_fx, delay_comp, negate( hHQ_core->Q_old_postdec ) ); + hHQ_core->Q_old_postdec = 0; + move16(); Copy( synth, synth + delay_comp, sub( output_frame, delay_comp ) ); Copy( temp_buffer, synth, delay_comp ); diff --git a/lib_dec/dec_gen_voic_fx.c b/lib_dec/dec_gen_voic_fx.c index 0be898ed2697bd19894f93fdefe499b16491d52c..524a554a1f4172409ee87a799fa78bb936f821b9 100644 --- a/lib_dec/dec_gen_voic_fx.c +++ b/lib_dec/dec_gen_voic_fx.c @@ -249,7 +249,14 @@ ivas_error decod_gen_voic_fx( IF( gain_preQ_fx != 0 ) { - tmp1_fx = add( 15 - Q_AVQ_OUT_DEC - 2, st_fx->Q_exc ); + IF( st_fx->element_mode == EVS_MONO ) + { + tmp1_fx = add( 15 - Q_AVQ_OUT_DEC - 2, st_fx->Q_exc ); + } + ELSE + { + tmp1_fx = add( 15 - Q_AVQ_OUT - 2, st_fx->Q_exc ); + } FOR( i = 0; i < L_SUBFR; i++ ) { Word32 Ltmp1; diff --git a/lib_dec/gs_dec_fx.c b/lib_dec/gs_dec_fx.c index 78f798e557d7a29b64db7551ebe02d97d1a79eaf..9a10f08621d72d5dae4b93022b2e7da410f6c072 100644 --- a/lib_dec/gs_dec_fx.c +++ b/lib_dec/gs_dec_fx.c @@ -1004,7 +1004,21 @@ void decod_audio_ivas_fx( } } #endif - gsc_dec_ivas_fx( st_fx, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st_fx->coder_type, &last_bin, lsf_new, exc_wo_nf, st_fx->Q_exc ); + Word16 Q_exc_old = st_fx->Q_exc; + move16(); + gsc_dec_ivas_fx( st_fx, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st_fx->coder_type, &last_bin, lsf_new, exc_wo_nf, &st_fx->Q_exc ); + IF( NE_16( Q_exc_old, st_fx->Q_exc ) ) + { + Q_exc_old = sub( Q_exc_old, st_fx->Q_exc ); + IF( st_fx->hGSCDec ) + { + Scale_sig( st_fx->hGSCDec->last_exc_dct_in_fx, L_FRAME16k, Q_exc_old ); + } + IF( bwe_exc ) + { + Scale_sig( bwe_exc - PIT16k_MAX * 2, ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2, Q_exc_old ); + } + } /*--------------------------------------------------------------------------------------* * iDCT transform *--------------------------------------------------------------------------------------*/ @@ -1408,7 +1422,7 @@ void gsc_dec_ivas_fx( Word16 *last_bin, /* i : last bin of bit allocation */ const Word16 *lsf_new, /* i : ISFs at the end of the frame */ Word16 *exc_wo_nf, /* o : excitation (in f domain) without noisefill */ - Word16 Q_exc ) + Word16 *Q_exc ) { Word16 i, j, bit, nb_subbands, pvq_len; #if 1 // def ADD_LRTD diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index c67e7c95af2c74dab5ccee843f6a76507805eba4..c7d5b067d610ded96208f30483713e9488b2c2ba 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -587,8 +587,19 @@ ivas_error ivas_mct_dec_fx( ivas_mdct_core_reconstruct_fx( hCPE, x_fx, synth_fx, fUseTns[cpe_id], 1, q_output, e_sig ); - Scale_sig( synth_fx[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX, sub( e_sig[0], 15 ) ); - Scale_sig( synth_fx[1], hCPE->hCoreCoder[1]->hTcxDec->L_frameTCX, sub( e_sig[1], 15 ) ); + IF( getScaleFactor16( synth_fx[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX ) != 0 ) + { + Scale_sig( synth_fx[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX, sub( e_sig[0], 15 ) ); + e_sig[0] = 15; + move16(); + } + + IF( getScaleFactor16( synth_fx[1], hCPE->hCoreCoder[1]->hTcxDec->L_frameTCX ) != 0 ) + { + Scale_sig( synth_fx[1], hCPE->hCoreCoder[1]->hTcxDec->L_frameTCX, sub( e_sig[1], 15 ) ); + e_sig[1] = 15; + move16(); + } FOR( n = 0; n < CPE_CHANNELS; n++ ) { @@ -639,7 +650,7 @@ ivas_error ivas_mct_dec_fx( set16_fx( output_mem_fx, 0, NS2SA( sts[n]->output_Fs, 3125000 ) ); } - Word16 Q_synth = 0; + Word16 Q_synth = sub( 15, e_sig[n] ); move16(); Word16 dirac_stereo_flag; diff --git a/lib_dec/ivas_range_uni_dec.c b/lib_dec/ivas_range_uni_dec.c index f2bbc1202fd08afb87200af3e5a6b39a8f1d8c19..424f7c42a2b16dd7c4cd75295d3f25a219f482f1 100644 --- a/lib_dec/ivas_range_uni_dec.c +++ b/lib_dec/ivas_range_uni_dec.c @@ -230,7 +230,6 @@ UWord16 rc_uni_dec_read_symbol_fastS_fx( move32(); range = rc_st_dec->rc_range; move32(); - // Not converted , to be rechecked(Value of range exceeds Word32) range = UL_lshr( range, tot_shift ); /* the cumulative value is val = low / range */ @@ -238,7 +237,7 @@ UWord16 rc_uni_dec_read_symbol_fastS_fx( /* in case of bitstream errors it is possible that val >= (1 << tot_shift) */ /*basop comment : unsigned integers are getting compared hence basops are not used*/ - IF( low >= UL_lshl( range, tot_shift ) ) + IF( GE_64( low, UL_lshl( range, tot_shift ) ) ) { rc_st_dec->bit_error_detected = 1; move16(); @@ -332,20 +331,24 @@ static void rc_uni_dec_update_fx( const UWord16 sym_freq /* i : Symbol frequency */ ) { - // Not adding basop because the value of rc_st_dec->rc_range exceeds Word32 - rc_st_dec->rc_low = UL_subNsD( rc_st_dec->rc_low, cum_freq * rc_st_dec->rc_range ); - rc_st_dec->rc_range *= sym_freq; - move16(); + rc_st_dec->rc_low = UL_subNsD( rc_st_dec->rc_low, UL_Mpy_32_32( cum_freq, rc_st_dec->rc_range ) ); + rc_st_dec->rc_range = UL_Mpy_32_32( rc_st_dec->rc_range, sym_freq ); + move32(); + move32(); /* rc_range was shifted right by up to 16, so at most two renormalizations are needed */ - IF( rc_st_dec->rc_range < 0x01000000 ) + IF( LT_64( rc_st_dec->rc_range, 0x01000000 ) ) { rc_st_dec->rc_low = UL_addNsD( UL_lshl( rc_st_dec->rc_low, 8 ), (UWord32) rc_uni_dec_read_fx( rc_st_dec ) ); rc_st_dec->rc_range = UL_lshl( rc_st_dec->rc_range, 8 ); - IF( rc_st_dec->rc_range < 0x01000000 ) + move32(); + move32(); + IF( LT_64( rc_st_dec->rc_range, 0x01000000 ) ) { rc_st_dec->rc_low = UL_addNsD( UL_lshl( rc_st_dec->rc_low, 8 ), (UWord32) rc_uni_dec_read_fx( rc_st_dec ) ); rc_st_dec->rc_range = UL_lshl( rc_st_dec->rc_range, 8 ); + move32(); + move32(); } } @@ -378,13 +381,13 @@ UWord16 rc_uni_dec_read_bit( val = 0; move32(); /*basop comment : comparision of unsigned integers hence basops are not used*/ - IF( low >= range ) + IF( GE_64( low, range ) ) { val = UL_addNsD( val, 1 ); low = UL_subNsD( low, range ); /* rc_range was already subtracted once from rc_low */ - IF( low >= range ) + IF( GE_64( low, range ) ) { rc_st_dec->bit_error_detected = 1; move16(); @@ -403,7 +406,7 @@ UWord16 rc_uni_dec_read_bit( /* rc_range was shifted right by 1, so at most one renormalization is needed */ /*basop comment : comparision of unsigned integers hence basops are not used*/ - IF( range < 0x01000000 ) + IF( LT_64( range, 0x01000000 ) ) { low = UL_addNsD( UL_lshl( low, 8 ), (UWord32) rc_uni_dec_read_fx( rc_st_dec ) ); range = UL_lshl( range, 8 ); @@ -494,7 +497,7 @@ UWord16 rc_uni_dec_read_bit_prob_fast( /* in case of bitstream errors it is possible that low >= (1 << tot_shift) * range */ /*basop comment : unsigned integers are getting compared hence basops are not used*/ - IF( low >= UL_lshl( range, tot_shift ) ) /* equivalent condition */ + IF( GE_64( low, UL_lshl( range, tot_shift ) ) ) /* equivalent condition */ { rc_st_dec->bit_error_detected = 1; move16(); @@ -517,23 +520,23 @@ UWord16 rc_uni_dec_read_bit_prob_fast( { val = UL_addNsD( val, 1 ); - low = UL_subNsD( low, range * freq0 ); + low = UL_subNsD( low, UL_Mpy_32_32( range, freq0 ) ); /*basop comment : multiplication of two unsigned integers and result is stored in unsigned hence basops are not used*/ - range *= UL_subNsD( UL_lshl( 1, tot_shift ), freq0 ); /* freq1 = (1 << tot_shift) - freq0 */ + range = UL_Mpy_32_32( range, UL_subNsD( UL_lshl( 1, tot_shift ), freq0 ) ); /* freq1 = (1 << tot_shift) - freq0 */ } ELSE { /* basop comment : multiplication of two unsigned integers and result is stored in unsigned integer hence basops are not used*/ - range *= freq0; + range = UL_Mpy_32_32( range, freq0 ); } /* rc_range was shifted right by up to 16, so at most two renormalizations are needed */ /*basop comment : comparision of unsigned integers hence basops are not used*/ - IF( range < 0x01000000 ) + IF( LT_64( range, 0x01000000 ) ) { low = UL_addNsD( UL_lshl( low, 8 ), (UWord32) rc_uni_dec_read_fx( rc_st_dec ) ); range = UL_lshl( range, 8 ); - IF( range < 0x01000000 ) + IF( LT_64( range, 0x01000000 ) ) { low = UL_addNsD( UL_lshl( low, 8 ), (UWord32) rc_uni_dec_read_fx( rc_st_dec ) ); range = UL_lshl( range, 8 ); diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index 3944dc926cc69d8f582dc4c58a5670950f137f68..729a2e49a95d79405eafd9e2aa4ed7146a5104b0 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -203,7 +203,7 @@ void stereo_dft_dec_reset_fx( hStereoDft->q_smoothed_nrg = 0; move16(); - set_s( hStereoDft->core_hist, ACELP_CORE, STEREO_DFT_CORE_HIST_MAX ); + set16_fx( hStereoDft->core_hist, ACELP_CORE, STEREO_DFT_CORE_HIST_MAX ); set32_fx( hStereoDft->hb_stefi_sig_fx, 0, L_FRAME48k + NS2SA( 48000, STEREO_DFT_TD_STEFI_DELAY_NS ) ); set32_fx( hStereoDft->hb_nrg_fx, 0, STEREO_DFT_CORE_HIST_MAX ); diff --git a/lib_dec/ivas_td_low_rate_dec.c b/lib_dec/ivas_td_low_rate_dec.c index bf3b6da3435be349ddac66cfb3ac33a1331cb5e2..b4d5796508cf33ad28f64edd2c3beecb36d21b32 100644 --- a/lib_dec/ivas_td_low_rate_dec.c +++ b/lib_dec/ivas_td_low_rate_dec.c @@ -305,7 +305,7 @@ void tdm_low_rate_dec_fx( tmp_nb_bits_tot = sub( tmp_nb_bits_tot, 1 ); } - gsc_dec_ivas_fx( st, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st->coder_type, &last_bin, lsf_new, exc_wo_nf_fx, st->Q_exc ); + gsc_dec_ivas_fx( st, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st->coder_type, &last_bin, lsf_new, exc_wo_nf_fx, &st->Q_exc ); /*--------------------------------------------------------------------------------------* * iDCT transform diff --git a/lib_dec/tonalMDCTconcealment.c b/lib_dec/tonalMDCTconcealment.c index 8a3ea526038c2274a3de24752ce226f79f5fca1c..41185a12638a84898e9e5ebece4f4d356db7f828 100644 --- a/lib_dec/tonalMDCTconcealment.c +++ b/lib_dec/tonalMDCTconcealment.c @@ -1507,7 +1507,7 @@ void TonalMdctConceal_whiten_noise_shape_ivas_fx( set32_fx( whitenend_noise_shape, 0, start_idx ); FOR( Word16 j = start_idx; j < stop_idx; j++ ) { - whitenend_noise_shape[j] = *noiseLevelPtr; + whitenend_noise_shape[j] = L_shr( *noiseLevelPtr, 3 ); move32(); noiseLevelPtr += inc; } @@ -1516,7 +1516,7 @@ void TonalMdctConceal_whiten_noise_shape_ivas_fx( { Word32 scf[SNS_NPTS]; - sns_compute_scf_fx( whitenend_noise_shape, psychParams, L_frame, scf, sub( 31, noiseLevelPtr_exp ) ); + sns_compute_scf_fx( whitenend_noise_shape, psychParams, L_frame, scf, sub( sub( 31, noiseLevelPtr_exp ), 3 ) ); sns_interpolate_scalefactors_fx( scfs_int, scf, ENC ); sns_interpolate_scalefactors_fx( scfs_bg, scf, DEC ); @@ -1530,7 +1530,7 @@ void TonalMdctConceal_whiten_noise_shape_ivas_fx( IF( sum32_sat( scfs_for_shaping, FDNS_NPTS ) > 0 ) { - q_wns = sub( 31, noiseLevelPtr_exp ); + q_wns = sub( sub( 31, noiseLevelPtr_exp ), 3 ); sns_shape_spectrum_fx( whitenend_noise_shape, &q_wns, psychParams, scfs_for_shaping, Q16, L_frame, NULL ); Copy32( whitenend_noise_shape + start_idx, hFdCngCom->cngNoiseLevel, sub( stop_idx, start_idx ) ); diff --git a/lib_rend/ivas_dirac_output_synthesis_dec.c b/lib_rend/ivas_dirac_output_synthesis_dec.c index 60299777727ce4108f021ff790623770b71e346f..3fca74b272a12ebeeb1dfefbe1d51ef308093b15 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec.c @@ -3090,7 +3090,7 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( q_target_power_y1 = sub( q_target_power_y1, 1 ); target_power_y = L_add( L_shl( target_power_y, sub( s_min( q_target_power_y1, q_target_power_y ), q_target_power_y ) ), L_shl( target_power_y1, sub( s_min( q_target_power_y1, q_target_power_y ), q_target_power_y1 ) ) ); - exp = s_min( sub( q_target_power_y1, 1 ), sub( q_target_power_y, 1 ) ); + exp = s_min( q_target_power_y1, q_target_power_y ); } ELSE { diff --git a/lib_rend/ivas_omasa_ana.c b/lib_rend/ivas_omasa_ana.c index c43a960e203e797d00361c6d0f5fc00287feaade..da163f570dc1b10b75ce094e84fc3a8aacc82508 100644 --- a/lib_rend/ivas_omasa_ana.c +++ b/lib_rend/ivas_omasa_ana.c @@ -121,7 +121,7 @@ ivas_error ivas_omasa_ana_open( move16(); /* Determine band grouping */ - mvs2s( MASA_band_grouping_24, hOMasa->band_grouping, 24 + 1 ); + Copy( MASA_band_grouping_24, hOMasa->band_grouping, 24 + 1 ); /* maxBin = (int16_t) ( input_Fs * INV_CLDFB_BANDWIDTH + 0.5f ); */ maxBin = extract_l( Mpy_32_32( input_Fs, 2684355 /* INV_CLDFB_BANDWIDTH in Q31 */ ) ); @@ -139,7 +139,7 @@ ivas_error ivas_omasa_ana_open( } /* Determine block grouping */ - mvs2s( DirAC_block_grouping, hOMasa->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); + Copy( DirAC_block_grouping, hOMasa->block_grouping, MAX_PARAM_SPATIAL_SUBFRAMES + 1 ); /* open/initialize CLDFB */ hOMasa->num_Cldfb_instances = numAnalysisChannels;