From 46d4a890a9713c6287c1857024dd2bc0d311448f Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Sat, 17 Aug 2024 18:48:41 +0530 Subject: [PATCH] Improvements for high MLD cases [x] Q factor correction in ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric [x] Q_syn and Q_old_wtda handling updated in ivas_core_dec [x] Precision improvements in vbap_determine_gains_fx --- lib_dec/core_switching_dec_fx.c | 2 +- lib_dec/ivas_core_dec.c | 16 ++++++---------- lib_dec/ivas_mct_dec.c | 16 ++++++++++------ lib_dec/ivas_mdct_core_dec.c | 6 +++++- lib_rend/ivas_dirac_dec_binaural_functions.c | 2 +- lib_rend/ivas_vbap.c | 4 ++-- 6 files changed, 25 insertions(+), 21 deletions(-) diff --git a/lib_dec/core_switching_dec_fx.c b/lib_dec/core_switching_dec_fx.c index 4eaa564ea..3f6bb58e4 100644 --- a/lib_dec/core_switching_dec_fx.c +++ b/lib_dec/core_switching_dec_fx.c @@ -1694,7 +1694,7 @@ ivas_error core_switching_post_dec_ivas_fx( } /* delay HQ synthesis to synchronize with ACELP synthesis */ /* rescaling to the min exp of the 2 */ - if ( hHQ_core->Q_old_postdec ) + IF( hHQ_core->Q_old_postdec ) { Scale_sig( st_fx->delay_buf_out_fx, delay_comp, negate( hHQ_core->Q_old_postdec ) ); } diff --git a/lib_dec/ivas_core_dec.c b/lib_dec/ivas_core_dec.c index 7eeafc617..bcaffed63 100644 --- a/lib_dec/ivas_core_dec.c +++ b/lib_dec/ivas_core_dec.c @@ -744,11 +744,14 @@ ivas_error ivas_core_dec_fx( move16(); } #ifdef FIX_778_STEREO_BRATE_SWITCHING - st->Q_syn = 0; - move16(); + if ( NE_16( st->core, st->last_core ) ) + { + st->Q_syn = 0; + move16(); + } #endif - st->prev_Q_syn = st->Q_syn; + st->prev_Q_syn = st->Q_syn; move16(); Scale_sig( st->hHQ_core->old_out_LB_fx, L_FRAME32k, sub( st->Q_syn, st->hHQ_core->Q_old_wtda_LB ) ); @@ -879,13 +882,6 @@ ivas_error ivas_core_dec_fx( Scale_sig32( output_32_fx[n], L_FRAME48k, sub( Q4, Q11 ) ); - IF( st->hHQ_core != NULL ) - { - Scale_sig( st->hHQ_core->old_out_fx, L_FRAME48k, negate( st->hHQ_core->Q_old_wtda ) ); - st->hHQ_core->Q_old_wtda = 0; - move16(); - } - /*size of synth is choosen as delay comp to start with*/ /*-------------------cldfb-start-------------------------*/ diff --git a/lib_dec/ivas_mct_dec.c b/lib_dec/ivas_mct_dec.c index c7d5b067d..b2fdf5add 100644 --- a/lib_dec/ivas_mct_dec.c +++ b/lib_dec/ivas_mct_dec.c @@ -587,17 +587,21 @@ ivas_error ivas_mct_dec_fx( ivas_mdct_core_reconstruct_fx( hCPE, x_fx, synth_fx, fUseTns[cpe_id], 1, q_output, e_sig ); - IF( getScaleFactor16( synth_fx[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX ) != 0 ) + Word16 hdrm, sh; + hdrm = getScaleFactor16( synth_fx[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX ); + IF( hdrm != 0 ) { - Scale_sig( synth_fx[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX, sub( e_sig[0], 15 ) ); - e_sig[0] = 15; + sh = s_min( sub( e_sig[0], 15 ), hdrm ); + Scale_sig( synth_fx[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX, sh ); + e_sig[0] = sub( e_sig[0], sh ); move16(); } - IF( getScaleFactor16( synth_fx[1], hCPE->hCoreCoder[1]->hTcxDec->L_frameTCX ) != 0 ) + IF( hdrm != 0 ) { - Scale_sig( synth_fx[1], hCPE->hCoreCoder[1]->hTcxDec->L_frameTCX, sub( e_sig[1], 15 ) ); - e_sig[1] = 15; + sh = s_min( sub( e_sig[1], 15 ), hdrm ); + Scale_sig( synth_fx[1], hCPE->hCoreCoder[1]->hTcxDec->L_frameTCX, sh ); + e_sig[1] = sub( e_sig[1], sh ); move16(); } diff --git a/lib_dec/ivas_mdct_core_dec.c b/lib_dec/ivas_mdct_core_dec.c index 39ff9d1bd..7a9785b6f 100644 --- a/lib_dec/ivas_mdct_core_dec.c +++ b/lib_dec/ivas_mdct_core_dec.c @@ -2104,9 +2104,11 @@ void ivas_mdct_core_reconstruct_fx( decoder_tcx_post_ivas_fx( st, synth_fx, synthFB_fx, NULL, bfi, MCT_flag ); sf = getScaleFactor16( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ) ); - if ( LT_16( sf, 2 ) ) + IF( LT_16( sf, 2 ) ) { q_syn = sub( sf, 2 ); + st->Q_syn = q_syn; + move16(); } 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 ) ); @@ -2130,6 +2132,8 @@ void ivas_mdct_core_reconstruct_fx( Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), negate( q_syn ) ); Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), negate( q_syn ) ); q_syn = 0; + st->Q_syn = 0; + move16(); move16(); /* PLC: [TCX: TD PLC] */ IF( MCT_flag != 0 ) diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 415c6bbc9..70d24c2a2 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -2786,7 +2786,7 @@ static void ivas_dirac_dec_binaural_formulate_input_and_target_covariance_matric idx = s_min( bin, MASA_NUM_DEFINED_SUR_SPR_COH_ENE_BINS - 1 ); /* Apply target spectrum that emphasizes low frequencies when the sound is surround coherent */ - spectrumModVal = L_add( L_sub( ONE_IN_Q28, L_shl( surCoh_fx, 14 ) ), L_mult( surCoh_fx, surCohEne_fx[idx] ) ); // Q29 + spectrumModVal = L_add( L_sub( ONE_IN_Q29, L_shl( surCoh_fx, 14 ) ), L_mult( surCoh_fx, surCohEne_fx[idx] ) ); // Q29 diffEne_fx = Mpy_32_32( diffEne_fx, spectrumModVal ); // Q-2 q_diffEne = sub( q_diffEne, 2 ); /* Modify also the value for decorrelation reduction */ diff --git a/lib_rend/ivas_vbap.c b/lib_rend/ivas_vbap.c index ec9a7f450..c68ba03fc 100644 --- a/lib_rend/ivas_vbap.c +++ b/lib_rend/ivas_vbap.c @@ -896,8 +896,8 @@ void vbap_determine_gains_fx( } panning_wrap_angles_fixed( L_shl( azi_deg, 22 ), L_shl( ele_deg, 22 ), &azi_temp_fx, &ele_temp_fx ); - azi_norm = L_shr( Mpy_32_16_1( azi_temp_fx, 91 ), 7 ); - ele_norm = L_shr( Mpy_32_16_1( ele_temp_fx, 91 ), 7 ); + azi_norm = L_shr( Mpy_32_32( azi_temp_fx, 5965232 ), 7 ); + ele_norm = L_shr( Mpy_32_32( ele_temp_fx, 5965232 ), 7 ); panning_unit_vec_fx[0] = mult( getCosWord16R2( (Word16) azi_norm ), getCosWord16R2( (Word16) ele_norm ) ); panning_unit_vec_fx[1] = mult( getSineWord16R2( (Word16) azi_norm ), getCosWord16R2( (Word16) ele_norm ) ); -- GitLab