diff --git a/lib_com/ivas_spar_com.c b/lib_com/ivas_spar_com.c index 2a29c60740faa3f6efef218431b67ca0645a28a4..b4f3eee06b24b82d8a095cdaf8fb5e9d80dca4a0 100644 --- a/lib_com/ivas_spar_com.c +++ b/lib_com/ivas_spar_com.c @@ -3531,7 +3531,7 @@ void ivas_get_spar_md_from_dirac_fx( /*SPAR from DirAC*/ set32_fx( response_avg_fx, 0, MAX_OUTPUT_CHANNELS ); - IF( GE_16( n_ts, 1 ) ) + IF( GT_16( n_ts, 1 ) ) { ivas_dirac_dec_get_response_fx( extract_l( L_shr( azi_dirac_fx[band][i_ts], Q22 ) ), extract_l( L_shr( ele_dirac_fx[band][i_ts], Q22 ) ), response_avg_fx, order, Q30 ); } diff --git a/lib_dec/FEC_HQ_phase_ecu_fx.c b/lib_dec/FEC_HQ_phase_ecu_fx.c index 0b79c49a1196db07582355b6b3463384d92fc111..25c963e97cff2f2ea0ea1eb65a5fd76bc88c8cd8 100644 --- a/lib_dec/FEC_HQ_phase_ecu_fx.c +++ b/lib_dec/FEC_HQ_phase_ecu_fx.c @@ -143,10 +143,11 @@ static Word16 ivas_imax2_jacobsen_mag_fx( const Word16 *pY; Word16 y_m1_re, y_0_re, y_p1_re; Word16 y_m1_im, y_0_im, y_p1_im; - Word16 N_re, N_im; - Word16 D_re, D_im; + Word32 N_re, N_im; + Word32 D_re, D_im; Word16 tmp, tmp_e; Word32 numer, denom; + Word64 tmp_64_n, tmp_64_d; /* Jacobsen estimates peak offset relative y_0 using * X_m1 - X_p1 @@ -176,19 +177,20 @@ static Word16 ivas_imax2_jacobsen_mag_fx( move16(); /* prepare numerator real and imaginary parts*/ - N_re = sub( y_m1_re, y_p1_re ); - N_im = sub( y_m1_im, y_p1_im ); + N_re = L_sub( y_m1_re, y_p1_re ); + N_im = L_sub( y_m1_im, y_p1_im ); /* prepare denominator real and imaginary parts */ - /* D_re = 2 * y_0_re - y_m1_re - y_p1_re */ - D_re = add( sub( y_0_re, y_m1_re ), sub( y_0_re, y_p1_re ) ); - /* D_im = 2 * y_0_im - y_m1_im - y_p1_im */ - D_im = add( sub( y_0_im, y_m1_im ), sub( y_0_im, y_p1_im ) ); + D_re = L_sub( L_sub( L_shl( y_0_re, 1 ), y_m1_re ), y_p1_re ); + D_im = L_sub( L_sub( L_shl( y_0_im, 1 ), y_m1_im ), y_p1_im ); /* REAL part of complex division */ - numer = L_add( L_mult0( N_re, D_re ), L_mult0( N_im, D_im ) ); - denom = L_add( L_mult0( D_re, D_re ), L_mult0( D_im, D_im ) ); + tmp_64_n = W_mac_32_32( W_mult_32_32( N_re, D_re ), N_im, D_im ); + tmp_64_d = W_mac_32_32( W_mult_32_32( D_re, D_re ), D_im, D_im ); + tmp_e = s_min( W_norm( tmp_64_n ), W_norm( tmp_64_d ) ); + numer = W_extract_h( W_shl( tmp_64_n, tmp_e ) ); + denom = W_extract_h( W_shl( tmp_64_d, tmp_e ) ); test(); IF( numer != 0 && denom != 0 ) diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index fa84e2d15f1c5c4d6dea475fb79e3bd4d39e3446..50c5b6a8454687f490af94bffe9ea05f4531b973 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -4705,12 +4705,19 @@ void decoder_tcx_noisefilling_fx( IF( ( frame_cnt == 0 ) && ( EQ_16( L_frameTCX, shr( hTcxDec->L_frameTCX, 1 ) ) ) && ( st->tcxonly ) && ( !st->tonal_mdct_plc_active ) && ( EQ_16( st->nbLostCmpt, 1 ) ) && ( NE_16( hTcxCfg->tcx_last_overlap_mode, FULL_OVERLAP ) ) && ( NE_16( hTcxCfg->tcx_curr_overlap_mode, FULL_OVERLAP ) ) ) { Word16 exp1, exp2; + exp1 = 0; + exp2 = 0; Word32 E_2ndlast, E_last; + E_2ndlast = E_last = EPSILON_FX; + move16(); + move16(); + move32(); + move32(); Word16 tmp_len; IF( st->element_mode > EVS_MONO ) { - tmp_len = L_frame; + tmp_len = L_frameTCX; move16(); } ELSE @@ -4719,21 +4726,25 @@ void decoder_tcx_noisefilling_fx( move16(); } - E_2ndlast = CalculateAbsEnergy_fx( 1, &( st->hTonalMDCTConc->lastBlockData.spectralData[0] ), tmp_len, &exp2 ); - E_last = CalculateAbsEnergy_fx( 1, &( st->hTonalMDCTConc->lastBlockData.spectralData[1] ), tmp_len, &exp1 ); + FOR( i = 0; i < tmp_len; i = i + 2 ) + { + E_2ndlast = BASOP_Util_Add_Mant32Exp( E_2ndlast, exp2, L_mult0( st->hTonalMDCTConc->lastBlockData.spectralData[i], st->hTonalMDCTConc->lastBlockData.spectralData[i] ), 29, &exp2 ); + E_last = BASOP_Util_Add_Mant32Exp( E_last, exp1, L_mult0( st->hTonalMDCTConc->lastBlockData.spectralData[i + 1], st->hTonalMDCTConc->lastBlockData.spectralData[i + 1] ), 29, &exp1 ); + } - BASOP_Util_Divide_MantExp( extract_h( E_2ndlast ), exp2, extract_h( E_last ), exp1, &tmp1, &tmp2 ); + tmp1 = BASOP_Util_Divide3232_Scale( E_2ndlast, E_last, &tmp2 ); + tmp2 = add( tmp2, sub( exp2, exp1 ) ); - tmp1 = shr( tmp1, 2 ); /*Q13*/ #ifdef BASOP_NOGLOB - tmp1 = shl_sat( tmp1, tmp2 ); + tmp1 = shl_sat( tmp1, sub( tmp2, 2 ) ); #else tmp1 = shl( tmp1, tmp2 ); #endif + /* replace higher energy TCX5 frame by lower one to avoid energy fluctuation */ IF( st->element_mode > EVS_MONO ) { - tmp_len = L_frame; + tmp_len = L_frameTCX; move16(); } ELSE diff --git a/lib_dec/er_dec_tcx_fx.c b/lib_dec/er_dec_tcx_fx.c index 04545e3fcfe6fd503447238ffd0f78a24538b2fa..bcd91a65f6a1519185c87c820c5ce19b533451c4 100644 --- a/lib_dec/er_dec_tcx_fx.c +++ b/lib_dec/er_dec_tcx_fx.c @@ -1852,8 +1852,9 @@ void con_tcx_ivas_fx( /*gain_inov = 1.0f / (float)sqrt( dot_product( pt_exc, pt_exc, L_frame ) / L_frame + 0.01f );*/ /* normalize energy */ L_tmp = Dot_productSq16HQ( 0, pt_exc /*Q0,15+1*/, L_frame, &tmp_e ) /*Q31,tmp_e+16+16*/; + tmp_e = sub( add( tmp_e, shl( noise_e, 1 ) ), 1 ); // actual multiplier! L_tmp = Mpy_32_16_1( L_tmp, getInvFrameLen( L_frame ) /*W16Q21*/ ) /*W32Q37,tmp_e+16+16*/ /*Q5,tmp_e*/; - tmp_e = add( tmp_e, 31 - 5 ); /*-->Q31*/ + tmp_e = add( tmp_e, 31 - 6 ); /*-->Q31*/ gain_inov = 0; move16(); gain_inov_e = 0; diff --git a/lib_dec/ivas_core_dec.c b/lib_dec/ivas_core_dec.c index 6397898f5919375bcbc1b4bd75c78ac5f5dd233c..4948c487b88e0e2652189e9daa308a21c43f0373 100644 --- a/lib_dec/ivas_core_dec.c +++ b/lib_dec/ivas_core_dec.c @@ -746,6 +746,10 @@ ivas_error ivas_core_dec_fx( #ifdef FIX_778_STEREO_BRATE_SWITCHING if ( NE_16( st->core, st->last_core ) ) { + IF( st->hTcxDec ) + { + Scale_sig( st->hTcxDec->syn_OverlFB, L_FRAME_MAX / 2, negate( st->Q_syn ) ); + } st->Q_syn = 0; move16(); } diff --git a/lib_dec/ivas_mdct_core_dec.c b/lib_dec/ivas_mdct_core_dec.c index 684f941168b470a67838cbbc6cfe554516d1d532..15e15795150cfc84b8772266bee2e62e484e6727 100644 --- a/lib_dec/ivas_mdct_core_dec.c +++ b/lib_dec/ivas_mdct_core_dec.c @@ -2110,6 +2110,11 @@ void ivas_mdct_core_reconstruct_fx( st->Q_syn = q_syn; move16(); } + sf = getScaleFactor16( st->hHQ_core->old_out_fx, L_FRAME48k ); + IF( LT_16( sf, sub( st->Q_syn, q_win ) ) ) + { + st->Q_syn = add( q_win, sf ); + } Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( sub( -1, st->Q_syn ), q_win ) ); Scale_sig( st->hTcxDec->syn_Overl_TDAC, L_FRAME32k / 2, sub( sub( -1, st->Q_syn ), q_win ) ); Scale_sig( st->hTcxDec->old_syn_Overl, L_FRAME32k / 2, sub( sub( -1, st->Q_syn ), q_win ) ); diff --git a/lib_dec/ivas_spar_md_dec.c b/lib_dec/ivas_spar_md_dec.c index 3db0ce5290f180297240197ad38e522f9b23e758..80705648bca50f38d7e7658cb4f95a44701f0c37 100644 --- a/lib_dec/ivas_spar_md_dec.c +++ b/lib_dec/ivas_spar_md_dec.c @@ -2368,7 +2368,7 @@ static void ivas_get_spar_matrices_fx( if ( EQ_16( bw, IVAS_RED_BAND_FACT ) ) { - num_bands = shl( num_bands, 1 ); + num_bands = shr( num_bands, 1 ); } test(); @@ -2401,7 +2401,7 @@ static void ivas_get_spar_matrices_fx( set32_fx( &hMdDec->spar_coeffs.P_re_fx[i][j][i_mult( i_ts, IVAS_MAX_NUM_BANDS )], 0, IVAS_MAX_NUM_BANDS ); } } - num_bands = min( num_bands, nB ); + num_bands = s_min( num_bands, nB ); move16(); FOR( b = 0; b < num_bands; b++ ) @@ -2452,7 +2452,7 @@ static void ivas_get_spar_matrices_fx( IF( EQ_16( dyn_active_w_flag, 1 ) ) { - tmp_dm_re_fx[0][0] = L_shl( Mpy_32_32( tmp_dm_re_fx[0][0], IVAS_SPAR_DYN_ACTIVEW_THRESH_FX ), Q9 ); // Q13 *Q31 =Q13 << Q9=Q.22 + tmp_dm_re_fx[0][0] = Mpy_32_32( tmp_dm_re_fx[0][0], IVAS_SPAR_DYN_ACTIVEW_THRESH_FX ); // Q22 * Q31 = Q22 move32(); } diff --git a/lib_rend/ivas_orient_trk.c b/lib_rend/ivas_orient_trk.c index 7ef937cc3f0641769267d4be21f5b93aef13c90e..7cc330e679b106da5dafff11e8fb875b500068e5 100644 --- a/lib_rend/ivas_orient_trk.c +++ b/lib_rend/ivas_orient_trk.c @@ -504,7 +504,6 @@ static Word32 QuaternionAngle_fx( const IVAS_QUATERNION q2 ) { IVAS_QUATERNION q12; - Word32 angle = 0; QuaternionConjugate_fx( q1, &q12 ); QuaternionProduct_fx( q12, q2, &q12 ); // q12:Q25, q2:Q29, q1: Q27// @@ -528,8 +527,6 @@ static Word32 QuaternionAngle_fx( Word16 tan_result = BASOP_util_atan2( result, q12.w_fx, sub( result_e, sub( 31, q12.q_fact ) ) ); result = L_deposit_h( tan_result ); // Q29 return result; - - return angle; } #endif