From de4b0bd4eeff68553d53096f29d05479b6f4ee89 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 12 Aug 2024 19:25:56 +0530 Subject: [PATCH 1/3] Renderer updates, high MLD fixes [x] Renderer fixes for dirac dec path [x] Fix for reverb signal scaling [x] Stab_fac_fx calculation fix in updt_dec_common [x] Updates in pca_tools for SBA high MLD cases. --- lib_com/ivas_pca_tools.c | 120 ++++++++++++------- lib_dec/ivas_stereo_switching_dec.c | 2 + lib_dec/updt_dec_fx.c | 2 +- lib_rend/ivas_dirac_dec_binaural_functions.c | 7 +- lib_rend/ivas_dirac_output_synthesis_dec.c | 9 +- lib_rend/ivas_objectRenderer.c | 6 +- lib_rend/lib_rend.c | 4 +- lib_util/masa_file_reader.c | 4 + 8 files changed, 101 insertions(+), 53 deletions(-) diff --git a/lib_com/ivas_pca_tools.c b/lib_com/ivas_pca_tools.c index 9ee54da4f..64f46435b 100644 --- a/lib_com/ivas_pca_tools.c +++ b/lib_com/ivas_pca_tools.c @@ -560,6 +560,22 @@ void dquat2mat( return; } +static Word16 check_bound( Word32 tmp ) +{ + IF( GT_32( tmp, MAX16B ) ) + { + return MAX16B; + } + ELSE IF( LT_32( tmp, MIN16B ) ) + { + return MIN16B; + } + ELSE + { + return extract_l( tmp ); + } +} + #ifdef IVAS_FLOAT_FIXED void dquat2mat_fx( const Word16 *ql, @@ -605,37 +621,37 @@ void dquat2mat_fx( dx = mult( d, x ); dy = mult( d, y ); dz = mult( d, z ); - m[0] = sub( sub( aw, bx ), add( cy, dz ) ); + m[0] = check_bound( L_sub( L_sub( aw, bx ), L_add( cy, dz ) ) ); move16(); - m[1] = sub( sub( cz, dy ), add( ax, bw ) ); + m[1] = check_bound( L_sub( L_sub( cz, dy ), L_add( ax, bw ) ) ); move16(); - m[2] = add( sub( sub( negate( ay ), bz ), cw ), dx ); + m[2] = check_bound( L_add( L_sub( L_sub( negate( ay ), bz ), cw ), dx ) ); move16(); - m[3] = sub( sub( by, az ), add( cx, dw ) ); + m[3] = check_bound( L_sub( L_sub( by, az ), L_add( cx, dw ) ) ); move16(); - m[4] = add( sub( add( bw, ax ), dy ), cz ); + m[4] = check_bound( L_add( L_sub( L_add( bw, ax ), dy ), cz ) ); move16(); - m[5] = add( add( add( negate( bx ), aw ), dz ), cy ); + m[5] = check_bound( L_add( L_add( L_add( negate( bx ), aw ), dz ), cy ) ); move16(); - m[6] = sub( sub( add( negate( by ), az ), dw ), cx ); + m[6] = check_bound( L_sub( L_sub( L_add( negate( by ), az ), dw ), cx ) ); move16(); - m[7] = add( sub( sub( negate( bz ), ay ), dx ), cw ); + m[7] = check_bound( L_add( L_sub( L_sub( negate( bz ), ay ), dx ), cw ) ); move16(); - m[8] = sub( add( add( cw, dx ), ay ), bz ); + m[8] = check_bound( L_sub( L_add( L_add( cw, dx ), ay ), bz ) ); move16(); - m[9] = sub( sub( add( negate( cx ), dw ), az ), by ); + m[9] = check_bound( L_sub( L_sub( L_add( negate( cx ), dw ), az ), by ) ); move16(); - m[10] = add( add( add( negate( cy ), dz ), aw ), bx ); + m[10] = check_bound( L_add( L_add( L_add( negate( cy ), dz ), aw ), bx ) ); move16(); - m[11] = sub( add( sub( negate( cz ), dy ), ax ), bw ); + m[11] = check_bound( L_sub( L_add( L_sub( negate( cz ), dy ), ax ), bw ) ); move16(); - m[12] = add( add( sub( dw, cx ), by ), az ); + m[12] = check_bound( L_add( L_add( L_sub( dw, cx ), by ), az ) ); move16(); - m[13] = add( sub( sub( negate( dx ), cw ), bz ), ay ); + m[13] = check_bound( L_add( L_sub( L_sub( negate( dx ), cw ), bz ), ay ) ); move16(); - m[14] = sub( add( sub( negate( dy ), cz ), bw ), ax ); + m[14] = check_bound( L_sub( L_add( L_sub( negate( dy ), cz ), bw ), ax ) ); move16(); - m[15] = add( add( add( negate( dz ), cy ), bx ), aw ); + m[15] = check_bound( L_add( L_add( L_add( negate( dz ), cy ), bx ), aw ) ); move16(); return; @@ -828,11 +844,11 @@ static void norm_quat_fx( move16(); norm_q = dotp_fx( q, q, IVAS_PCA_INTERP, &exp1 ); exp1 = sub( 31, add( exp1, 2 ) ); - norm_q = ISqrt32( norm_q, &exp1 ); /*q(15 - exp)*/ + norm_q = ISqrt32( norm_q, &exp1 ); /*Q(31 - exp)*/ FOR( i = 0; i < IVAS_PCA_INTERP; i++ ) { - q[i] = mult( q[i], extract_l( L_shr( norm_q, 15 ) ) ); // todo : recheck + q[i] = round_fx( L_shl( Mpy_32_16_1( norm_q, q[i] ), exp1 ) ); /* Q(15) */ move16(); } @@ -922,7 +938,7 @@ void pca_interp_preproc_fx( { Word16 alpha; Word16 j; - Word16 tmp, tmp2, tmp3; + Word16 tmp, tmp2, tmp3, tmp_e; FOR( j = 0; j < len; j++ ) { tmp = sub( len, 1 ); @@ -933,11 +949,12 @@ void pca_interp_preproc_fx( } ELSE { - alpha = idiv1616( j, tmp ); // the increment can be updated by simple delta //q15 + alpha = BASOP_Util_Divide1616_Scale( j, tmp, &tmp_e ); // the increment can be updated by simple delta + alpha = shl_sat( alpha, tmp_e ); /* Q15 */ } - tmp2 = mult( EVS_PI_FX, alpha ); // q13 - tmp3 = getCosWord16( tmp2 ); // q14 - alpha = shr( sub( ONE_IN_Q14, tmp3 ), 1 ); // q15 + tmp2 = mult( EVS_PI_FX, alpha ); /* Q13 */ + tmp3 = getCosWord16( tmp2 ); /* Q14 */ + alpha = sub_sat( ONE_IN_Q14, tmp3 ); /* Q15 */ alpha = sub( MAX_16, alpha ); quat_nlerp_preproc_fx( prev_ql, ql, alpha, &ql_interp[j * IVAS_PCA_INTERP] ); quat_nlerp_preproc_fx( prev_qr, qr, alpha, &qr_interp[j * IVAS_PCA_INTERP] ); @@ -986,16 +1003,30 @@ static void sp2cart_fx( Word16 *q ) { Word16 s1, s2, s1s2; - s1 = getSinWord16( ph1 ); // q15 - s2 = getSinWord16( ph2 ); // q15 - s1s2 = mult( s1, s2 ); // q15 - q[3] = mult( getSinWord16( ph3 ), s1s2 ); // q15 + Word16 sin_ph3, cos_ph3; + + sin_ph3 = cos_ph3 = ph3; move16(); - q[2] = mult( getCosWord16( ph3 ), s1s2 ); // q15 move16(); - q[1] = mult( getCosWord16( ph2 ), s1 ); // q15 + + IF( GT_16( ph3, 12868 /* PI in Q12 */ ) ) + { + sin_ph3 = sub( 12868, ph3 ); /* sin(x) = sin(PI - x) */ + cos_ph3 = sub( 25736, ph3 ); /* cos(x) = cos(2*PI - x) */ + } + sin_ph3 = shl( sin_ph3, 1 ); /* Q12 -> Q13 */ + cos_ph3 = shl( cos_ph3, 1 ); /* Q12 -> Q13 */ + + s1 = getSinWord16( ph1 ); /* Q15 */ + s2 = getSinWord16( ph2 ); /* Q15 */ + s1s2 = mult( s1, s2 ); /* Q15 */ + q[3] = mult( getSinWord16( sin_ph3 ), s1s2 ); /* Q15 */ + move16(); + q[2] = shl_sat( mult( getCosWord16( cos_ph3 ), s1s2 ), 1 ); /* Q15 */ move16(); - q[0] = shl_sat( getCosWord16( ph1 ), 1 ); // q15 + q[1] = shl_sat( mult( getCosWord16( ph2 ), s1 ), 1 ); /* Q15 */ + move16(); + q[0] = shl_sat( getCosWord16( ph1 ), 1 ); /* Q15 */ move16(); return; @@ -1021,9 +1052,9 @@ static Word16 calc_n2_fx( { Word16 n2; Word32 temp; - temp = L_mult( 23040, getSinWord16( ph1 ) ); // q8 - n2 = round_fx( temp ); - n2 = shr( n2, 7 ); + 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 ); @@ -1061,10 +1092,10 @@ static Word16 calc_n3_fx( const Word16 ph2 ) { Word16 n3; - Word16 temp1 = mult( getSinWord16( ph2 ), getSinWord16( ph1 ) ); // q7 + q15 - q15 - n3 = round_fx( L_mult( temp1, getSinWord16( ph2 ) ) ); // q7 + q15 - q15 + Word16 temp1 = mult( getSinWord16( ph2 ), getSinWord16( ph1 ) ); /* Q15 */ + n3 = round_fx( L_mult( temp1, 23040 /* 180.0f in Q7 */ ) ); /* Q15 + Q7 + Q1 - Q16 -> Q7*/ - n3 = shr( n3, 8 ); + n3 = shr( n3, 7 ); IF( n3 == 0 ) { @@ -1489,8 +1520,10 @@ void pca_dec_s3_fx( num_fx = 12868; move16(); - d_fx = idiv1616( num_fx, n1 ); // Q12 - ph1_q_fx = i_mult( index1, d_fx ); // Q12 + 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 ); @@ -1521,6 +1554,7 @@ void pca_dec_s3_fx( 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 */ } j = L_sub( j, ivas_pca_offset_index2[add( index2, get_pca_offset_n2_fx( index1 ) )] ); @@ -1536,11 +1570,13 @@ void pca_dec_s3_fx( } ELSE { - num_fx = 6434; + Word16 exp; + num_fx = 25736; /* PI2 in Q12 */ move16(); - d_fx = idiv1616( num_fx, n3 ); // Q10 - ph3_q_fx = round_fx( L_mult( index3, d_fx ) ); // Q10 - // ph3_q_fx = shl(ph3_q_fx, 2); + d_fx = BASOP_Util_Divide1616_Scale( num_fx, n3, &exp ); /* Q12 */ + exp = add( 3 - 15, exp ); + d_fx = shl( d_fx, sub( exp, 3 ) ); /* Q12 */ + ph3_q_fx = i_mult( index3, d_fx ); /* Q12 */ } sp2cart_fx( ph1_q_fx, ph2_q_fx, ph3_q_fx, q_fx ); diff --git a/lib_dec/ivas_stereo_switching_dec.c b/lib_dec/ivas_stereo_switching_dec.c index eb231f065..4caadd0fd 100644 --- a/lib_dec/ivas_stereo_switching_dec.c +++ b/lib_dec/ivas_stereo_switching_dec.c @@ -151,6 +151,8 @@ static ivas_error allocate_CoreCoder_TCX_fx( // st->hTcxDec->CngLevelBackgroundTrace_bfi = 0; //initializing to avoid garbage overflow; set16_fx( st->hTcxDec->syn_OverlFB, 0, L_FRAME48k / 2 ); set16_fx( st->hTcxDec->old_synth, 0, OLD_SYNTH_INTERNAL_DEC ); + st->hTcxDec->q_old_synth = 0; + move16(); set16_fx( st->hTcxDec->synth_history_fx, 0, L_PROT48k + L_FRAME48k ); } diff --git a/lib_dec/updt_dec_fx.c b/lib_dec/updt_dec_fx.c index 519f50a2e..107aea626 100644 --- a/lib_dec/updt_dec_fx.c +++ b/lib_dec/updt_dec_fx.c @@ -1007,7 +1007,7 @@ void ivas_updt_dec_common_fx( IF( EQ_16( st_fx->core, HQ_CORE ) ) { - st_fx->stab_fac_fx = extract_l( L_min( MAX_16, L_add( L_shr( STAB_FAC_EST1_FX, Q15 ), Madd_32_32( L_shr( Mpy_32_16_1( STAB_FAC_EST2_FX, st_fx->hHQ_core->mem_env_delta ), Q15 ), STAB_FAC_EST3_FX, st_fx->log_energy_diff_lt_fx ) ) ) ); + st_fx->stab_fac_fx = extract_l( L_min( MAX_16, L_add( L_shr( STAB_FAC_EST1_FX, Q15 ), Madd_32_32( Mpy_32_16_1( STAB_FAC_EST2_FX, st_fx->hHQ_core->mem_env_delta ), STAB_FAC_EST3_FX, st_fx->log_energy_diff_lt_fx ) ) ) ); st_fx->stab_fac_fx = s_max( 0, st_fx->stab_fac_fx ); } st_fx->stab_fac_smooth_lt_fx = extract_h( L_add( L_mult( ENV_SMOOTH_FAC_FX, st_fx->stab_fac_fx ), diff --git a/lib_rend/ivas_dirac_dec_binaural_functions.c b/lib_rend/ivas_dirac_dec_binaural_functions.c index 9d1f6720c..415c6bbc9 100644 --- a/lib_rend/ivas_dirac_dec_binaural_functions.c +++ b/lib_rend/ivas_dirac_dec_binaural_functions.c @@ -7805,7 +7805,6 @@ static void ivas_masa_ext_rend_parambin_internal_fx( /* CLDFB Analysis of input */ - Word16 q_cldfb = Q11; FOR( slot = 0; slot < hSpatParamRendCom->subframe_nbslots[subframe]; slot++ ) { FOR( ch = 0; ch < numInChannels; ch++ ) @@ -7813,6 +7812,8 @@ static void ivas_masa_ext_rend_parambin_internal_fx( test(); IF( ch == 0 || EQ_16( nchan_transport, 2 ) ) { + Word16 q_cldfb = Q11; + move16(); cldfbAnalysis_ts_fx_fixed_q( &( output_fx[ch][nBins * slot] ), Cldfb_RealBuffer_in_fx[ch][slot], @@ -7823,8 +7824,8 @@ static void ivas_masa_ext_rend_parambin_internal_fx( { /* At mono input duplicate the channel to dual-mono, and apply gain correction to ensure same overall level as in stereo mode */ - v_multc_fixed( Cldfb_RealBuffer_in_fx[0][slot], 151800249 /* INV_SQRT_2 in Q31 */, Cldfb_RealBuffer_in_fx[0][slot], nBins ); - v_multc_fixed( Cldfb_ImagBuffer_in_fx[0][slot], 151800249 /* INV_SQRT_2 in Q31 */, Cldfb_ImagBuffer_in_fx[0][slot], nBins ); + v_multc_fixed( Cldfb_RealBuffer_in_fx[0][slot], 1518500224 /* INV_SQRT_2 in Q31 */, Cldfb_RealBuffer_in_fx[0][slot], nBins ); + v_multc_fixed( Cldfb_ImagBuffer_in_fx[0][slot], 1518500224 /* INV_SQRT_2 in Q31 */, Cldfb_ImagBuffer_in_fx[0][slot], nBins ); Copy32( Cldfb_RealBuffer_in_fx[0][slot], Cldfb_RealBuffer_in_fx[1][slot], nBins ); Copy32( Cldfb_ImagBuffer_in_fx[0][slot], Cldfb_ImagBuffer_in_fx[1][slot], nBins ); diff --git a/lib_rend/ivas_dirac_output_synthesis_dec.c b/lib_rend/ivas_dirac_output_synthesis_dec.c index 2eae9eb94..602997777 100644 --- a/lib_rend/ivas_dirac_output_synthesis_dec.c +++ b/lib_rend/ivas_dirac_output_synthesis_dec.c @@ -3483,6 +3483,11 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( /*-----------------------------------------------------------------* * gain interpolation and output streams *-----------------------------------------------------------------*/ + Word16 q_align = sub( h_dirac_output_synthesis_state->proto_direct_buffer_f_q, h_dirac_output_synthesis_state->proto_power_diff_smooth_q ); + if ( h_dirac_output_synthesis_params->max_band_decorr != 0 ) + { + q_align = sub( h_dirac_output_synthesis_state->proto_direct_buffer_f_q, h_dirac_output_synthesis_state->proto_diffuse_buffer_f_q ); + } FOR( buf_idx = 0; buf_idx < nbslots; ++buf_idx ) { @@ -3521,10 +3526,10 @@ void ivas_dirac_dec_output_synthesis_process_subframe_psd_ls_fx( { g = L_add( Mpy_32_32( g1, *( p_gain_1++ ) ), Mpy_32_32( g2, *( p_gain_2++ ) ) ); // (Q31, gains_diff_prev_q) -> gains_diff_prev_q RealBuffer[k][buf_idx][l] = L_add( L_shr( RealBuffer[k][buf_idx][l], Q1 ), - L_shr( Mpy_32_32( g, ( *( p_power_smooth_diff++ ) ) ), Q1 ) ); // (gains_diff_prev_q, q_proto_direct_buffer) >> Q1 -> gains_diff_prev_q + q_proto_direct_buffer - 32 + L_shr( Mpy_32_32( g, ( *( p_power_smooth_diff++ ) ) ), sub( Q1, q_align ) ) ); // (gains_diff_prev_q, q_proto_direct_buffer) >> Q1 -> gains_diff_prev_q + q_proto_direct_buffer - 32 move32(); ImagBuffer[k][buf_idx][l] = L_add( L_shr( ImagBuffer[k][buf_idx][l], Q1 ), - L_shr( Mpy_32_32( g, ( *( p_power_smooth_diff++ ) ) ), Q1 ) ); // (gains_diff_prev_q, q_proto_direct_buffer) >> Q1 -> gains_diff_prev_q + q_proto_direct_buffer - 32 + L_shr( Mpy_32_32( g, ( *( p_power_smooth_diff++ ) ) ), sub( Q1, q_align ) ) ); // (gains_diff_prev_q, q_proto_direct_buffer) >> Q1 -> gains_diff_prev_q + q_proto_direct_buffer - 32 move32(); } diff --git a/lib_rend/ivas_objectRenderer.c b/lib_rend/ivas_objectRenderer.c index fca18ac05..1f230806b 100644 --- a/lib_rend/ivas_objectRenderer.c +++ b/lib_rend/ivas_objectRenderer.c @@ -609,7 +609,7 @@ ivas_error ivas_td_binaural_renderer_unwrap_fx( FOR( i = 0; i < MAX_OUTPUT_CHANNELS; ++i ) { - Scale_sig32( output_fx[i], L_FRAME48k, -4 ); + scale_sig32( output_fx[i], L_FRAME48k, -4 ); } IF( NE_32( ( error = ivas_reverb_process_fx( hReverb, transport_config, 0, output_fx, p_reverb_signal_fx, subframe_idx ) ), IVAS_ERR_OK ) ) @@ -619,12 +619,12 @@ ivas_error ivas_td_binaural_renderer_unwrap_fx( FOR( i = 0; i < MAX_OUTPUT_CHANNELS; ++i ) { - Scale_sig32( output_fx[i], L_FRAME48k, 4 ); + scale_sig32( output_fx[i], L_FRAME48k, 4 ); } FOR( i = 0; i < BINAURAL_CHANNELS; ++i ) { - Scale_sig32( p_reverb_signal_fx[i] + subframe_idx * hReverb->full_block_size, hReverb->full_block_size, 2 ); + scale_sig32( p_reverb_signal_fx[i] + subframe_idx * hReverb->full_block_size, hReverb->full_block_size, 2 + 4 ); } } diff --git a/lib_rend/lib_rend.c b/lib_rend/lib_rend.c index 55dfd9808..22465911a 100644 --- a/lib_rend/lib_rend.c +++ b/lib_rend/lib_rend.c @@ -12623,8 +12623,8 @@ static ivas_error renderInputMasa( FOR( ch = 0; ch < masaInput->hMasaExtRend->hDirACRend->hOutSetup.nchan_out_woLFE + masaInput->hMasaExtRend->hDirACRend->hOutSetup.num_lfe; ch++ ) { - scale_sig32( masaInput->hMasaExtRend->cldfbSynRend[ch]->cldfb_state_fx, masaInput->hMasaExtRend->cldfbSynRend[ch]->cldfb_size, sub( Q11, masaInput->hMasaExtRend->cldfbAnaRend[0]->Q_cldfb_state ) ); - masaInput->hMasaExtRend->cldfbAnaRend[0]->Q_cldfb_state = Q11; + scale_sig32( masaInput->hMasaExtRend->cldfbSynRend[ch]->cldfb_state_fx, masaInput->hMasaExtRend->cldfbSynRend[ch]->cldfb_size, sub( Q11, masaInput->hMasaExtRend->cldfbSynRend[ch]->Q_cldfb_state ) ); + masaInput->hMasaExtRend->cldfbSynRend[ch]->Q_cldfb_state = Q11; } intermidiate_ext_dirac_render( masaInput->hMasaExtRend, 0 ); diff --git a/lib_util/masa_file_reader.c b/lib_util/masa_file_reader.c index 653149eb0..11178d54c 100644 --- a/lib_util/masa_file_reader.c +++ b/lib_util/masa_file_reader.c @@ -253,6 +253,10 @@ ivas_error MasaFileReader_readNextFrame( for ( b = 0; b < MASA_FREQUENCY_BANDS; b++ ) { hMeta->common_meta.surround_coherence[j][b] = ( (float) readOther[b] ) / UINT8_MAX; +#ifdef IVAS_FLOAT_FIXED + hMeta->common_meta.surround_coherence_fx[j][b] = shl( (Word16) readOther[b], 7 ); // Q8->Q15 + move16(); +#endif } /* Remainder-to-total ratio */ -- GitLab From eeb2eb409f7214b8b2c7fcda37d9228029154637 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 12 Aug 2024 21:19:17 +0530 Subject: [PATCH 2/3] Revert pca tools changes --- lib_com/ivas_pca_tools.c | 120 ++++++++++++++------------------------- 1 file changed, 42 insertions(+), 78 deletions(-) diff --git a/lib_com/ivas_pca_tools.c b/lib_com/ivas_pca_tools.c index 64f46435b..9ee54da4f 100644 --- a/lib_com/ivas_pca_tools.c +++ b/lib_com/ivas_pca_tools.c @@ -560,22 +560,6 @@ void dquat2mat( return; } -static Word16 check_bound( Word32 tmp ) -{ - IF( GT_32( tmp, MAX16B ) ) - { - return MAX16B; - } - ELSE IF( LT_32( tmp, MIN16B ) ) - { - return MIN16B; - } - ELSE - { - return extract_l( tmp ); - } -} - #ifdef IVAS_FLOAT_FIXED void dquat2mat_fx( const Word16 *ql, @@ -621,37 +605,37 @@ void dquat2mat_fx( dx = mult( d, x ); dy = mult( d, y ); dz = mult( d, z ); - m[0] = check_bound( L_sub( L_sub( aw, bx ), L_add( cy, dz ) ) ); + m[0] = sub( sub( aw, bx ), add( cy, dz ) ); move16(); - m[1] = check_bound( L_sub( L_sub( cz, dy ), L_add( ax, bw ) ) ); + m[1] = sub( sub( cz, dy ), add( ax, bw ) ); move16(); - m[2] = check_bound( L_add( L_sub( L_sub( negate( ay ), bz ), cw ), dx ) ); + m[2] = add( sub( sub( negate( ay ), bz ), cw ), dx ); move16(); - m[3] = check_bound( L_sub( L_sub( by, az ), L_add( cx, dw ) ) ); + m[3] = sub( sub( by, az ), add( cx, dw ) ); move16(); - m[4] = check_bound( L_add( L_sub( L_add( bw, ax ), dy ), cz ) ); + m[4] = add( sub( add( bw, ax ), dy ), cz ); move16(); - m[5] = check_bound( L_add( L_add( L_add( negate( bx ), aw ), dz ), cy ) ); + m[5] = add( add( add( negate( bx ), aw ), dz ), cy ); move16(); - m[6] = check_bound( L_sub( L_sub( L_add( negate( by ), az ), dw ), cx ) ); + m[6] = sub( sub( add( negate( by ), az ), dw ), cx ); move16(); - m[7] = check_bound( L_add( L_sub( L_sub( negate( bz ), ay ), dx ), cw ) ); + m[7] = add( sub( sub( negate( bz ), ay ), dx ), cw ); move16(); - m[8] = check_bound( L_sub( L_add( L_add( cw, dx ), ay ), bz ) ); + m[8] = sub( add( add( cw, dx ), ay ), bz ); move16(); - m[9] = check_bound( L_sub( L_sub( L_add( negate( cx ), dw ), az ), by ) ); + m[9] = sub( sub( add( negate( cx ), dw ), az ), by ); move16(); - m[10] = check_bound( L_add( L_add( L_add( negate( cy ), dz ), aw ), bx ) ); + m[10] = add( add( add( negate( cy ), dz ), aw ), bx ); move16(); - m[11] = check_bound( L_sub( L_add( L_sub( negate( cz ), dy ), ax ), bw ) ); + m[11] = sub( add( sub( negate( cz ), dy ), ax ), bw ); move16(); - m[12] = check_bound( L_add( L_add( L_sub( dw, cx ), by ), az ) ); + m[12] = add( add( sub( dw, cx ), by ), az ); move16(); - m[13] = check_bound( L_add( L_sub( L_sub( negate( dx ), cw ), bz ), ay ) ); + m[13] = add( sub( sub( negate( dx ), cw ), bz ), ay ); move16(); - m[14] = check_bound( L_sub( L_add( L_sub( negate( dy ), cz ), bw ), ax ) ); + m[14] = sub( add( sub( negate( dy ), cz ), bw ), ax ); move16(); - m[15] = check_bound( L_add( L_add( L_add( negate( dz ), cy ), bx ), aw ) ); + m[15] = add( add( add( negate( dz ), cy ), bx ), aw ); move16(); return; @@ -844,11 +828,11 @@ static void norm_quat_fx( move16(); norm_q = dotp_fx( q, q, IVAS_PCA_INTERP, &exp1 ); exp1 = sub( 31, add( exp1, 2 ) ); - norm_q = ISqrt32( norm_q, &exp1 ); /*Q(31 - exp)*/ + norm_q = ISqrt32( norm_q, &exp1 ); /*q(15 - exp)*/ FOR( i = 0; i < IVAS_PCA_INTERP; i++ ) { - q[i] = round_fx( L_shl( Mpy_32_16_1( norm_q, q[i] ), exp1 ) ); /* Q(15) */ + q[i] = mult( q[i], extract_l( L_shr( norm_q, 15 ) ) ); // todo : recheck move16(); } @@ -938,7 +922,7 @@ void pca_interp_preproc_fx( { Word16 alpha; Word16 j; - Word16 tmp, tmp2, tmp3, tmp_e; + Word16 tmp, tmp2, tmp3; FOR( j = 0; j < len; j++ ) { tmp = sub( len, 1 ); @@ -949,12 +933,11 @@ void pca_interp_preproc_fx( } ELSE { - alpha = BASOP_Util_Divide1616_Scale( j, tmp, &tmp_e ); // the increment can be updated by simple delta - alpha = shl_sat( alpha, tmp_e ); /* Q15 */ + alpha = idiv1616( j, tmp ); // the increment can be updated by simple delta //q15 } - tmp2 = mult( EVS_PI_FX, alpha ); /* Q13 */ - tmp3 = getCosWord16( tmp2 ); /* Q14 */ - alpha = sub_sat( ONE_IN_Q14, tmp3 ); /* Q15 */ + tmp2 = mult( EVS_PI_FX, alpha ); // q13 + tmp3 = getCosWord16( tmp2 ); // q14 + alpha = shr( sub( ONE_IN_Q14, tmp3 ), 1 ); // q15 alpha = sub( MAX_16, alpha ); quat_nlerp_preproc_fx( prev_ql, ql, alpha, &ql_interp[j * IVAS_PCA_INTERP] ); quat_nlerp_preproc_fx( prev_qr, qr, alpha, &qr_interp[j * IVAS_PCA_INTERP] ); @@ -1003,30 +986,16 @@ static void sp2cart_fx( Word16 *q ) { Word16 s1, s2, s1s2; - Word16 sin_ph3, cos_ph3; - - sin_ph3 = cos_ph3 = ph3; + s1 = getSinWord16( ph1 ); // q15 + s2 = getSinWord16( ph2 ); // q15 + s1s2 = mult( s1, s2 ); // q15 + q[3] = mult( getSinWord16( ph3 ), s1s2 ); // q15 move16(); + q[2] = mult( getCosWord16( ph3 ), s1s2 ); // q15 move16(); - - IF( GT_16( ph3, 12868 /* PI in Q12 */ ) ) - { - sin_ph3 = sub( 12868, ph3 ); /* sin(x) = sin(PI - x) */ - cos_ph3 = sub( 25736, ph3 ); /* cos(x) = cos(2*PI - x) */ - } - sin_ph3 = shl( sin_ph3, 1 ); /* Q12 -> Q13 */ - cos_ph3 = shl( cos_ph3, 1 ); /* Q12 -> Q13 */ - - s1 = getSinWord16( ph1 ); /* Q15 */ - s2 = getSinWord16( ph2 ); /* Q15 */ - s1s2 = mult( s1, s2 ); /* Q15 */ - q[3] = mult( getSinWord16( sin_ph3 ), s1s2 ); /* Q15 */ - move16(); - q[2] = shl_sat( mult( getCosWord16( cos_ph3 ), s1s2 ), 1 ); /* Q15 */ + q[1] = mult( getCosWord16( ph2 ), s1 ); // q15 move16(); - q[1] = shl_sat( mult( getCosWord16( ph2 ), s1 ), 1 ); /* Q15 */ - move16(); - q[0] = shl_sat( getCosWord16( ph1 ), 1 ); /* Q15 */ + q[0] = shl_sat( getCosWord16( ph1 ), 1 ); // q15 move16(); return; @@ -1052,9 +1021,9 @@ static Word16 calc_n2_fx( { Word16 n2; Word32 temp; - temp = L_mult( 23040, getSinWord16( ph1 ) ); /* Q8 + Q15 + Q1 = Q24 */ - n2 = round_fx( temp ); /* Q24 -> Q8 */ - n2 = shr( n2, 8 ); + temp = L_mult( 23040, getSinWord16( ph1 ) ); // q8 + n2 = round_fx( temp ); + n2 = shr( n2, 7 ); IF( s_and( n2, 1 ) == 0 ) { n2 = add( n2, 1 ); @@ -1092,10 +1061,10 @@ static Word16 calc_n3_fx( const Word16 ph2 ) { Word16 n3; - Word16 temp1 = mult( getSinWord16( ph2 ), getSinWord16( ph1 ) ); /* Q15 */ - n3 = round_fx( L_mult( temp1, 23040 /* 180.0f in Q7 */ ) ); /* Q15 + Q7 + Q1 - Q16 -> Q7*/ + Word16 temp1 = mult( getSinWord16( ph2 ), getSinWord16( ph1 ) ); // q7 + q15 - q15 + n3 = round_fx( L_mult( temp1, getSinWord16( ph2 ) ) ); // q7 + q15 - q15 - n3 = shr( n3, 7 ); + n3 = shr( n3, 8 ); IF( n3 == 0 ) { @@ -1520,10 +1489,8 @@ void pca_dec_s3_fx( num_fx = 12868; 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 */ + d_fx = idiv1616( num_fx, n1 ); // Q12 + ph1_q_fx = i_mult( index1, d_fx ); // Q12 n2 = calc_n2_fx( ph1_q_fx ); @@ -1554,7 +1521,6 @@ void pca_dec_s3_fx( 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 */ } j = L_sub( j, ivas_pca_offset_index2[add( index2, get_pca_offset_n2_fx( index1 ) )] ); @@ -1570,13 +1536,11 @@ void pca_dec_s3_fx( } ELSE { - Word16 exp; - num_fx = 25736; /* PI2 in Q12 */ + num_fx = 6434; move16(); - d_fx = BASOP_Util_Divide1616_Scale( num_fx, n3, &exp ); /* Q12 */ - exp = add( 3 - 15, exp ); - d_fx = shl( d_fx, sub( exp, 3 ) ); /* Q12 */ - ph3_q_fx = i_mult( index3, d_fx ); /* Q12 */ + d_fx = idiv1616( num_fx, n3 ); // Q10 + ph3_q_fx = round_fx( L_mult( index3, d_fx ) ); // Q10 + // ph3_q_fx = shl(ph3_q_fx, 2); } sp2cart_fx( ph1_q_fx, ph2_q_fx, ph3_q_fx, q_fx ); -- GitLab From 7fc39792ade01c84b3bdfe4ab7f974bde1c98ee3 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 12 Aug 2024 21:24:23 +0530 Subject: [PATCH 3/3] computeMixingMatricesResidual_fx function updates for MC path --- lib_com/options.h | 1 + lib_dec/ivas_dirac_output_synthesis_cov.c | 21 +++++++++++++++++++++ lib_dec/ivas_svd_dec.c | 8 ++++++++ 3 files changed, 30 insertions(+) diff --git a/lib_com/options.h b/lib_com/options.h index 4abd6c6cc..740587161 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -110,6 +110,7 @@ #define MSAN_FIX #define FIX_818_COMPLEXITY_IMPROV /* Fix for issue 818 */ #define FIX_805_VERIFICATION /* Fix for issue 805 */ +#define FIX_827_HIGH_MLD /* Fix for issue 827 */ #endif #define ISM_DISABLE #define FIX_TMP_714 diff --git a/lib_dec/ivas_dirac_output_synthesis_cov.c b/lib_dec/ivas_dirac_output_synthesis_cov.c index 994954f09..2d158a705 100644 --- a/lib_dec/ivas_dirac_output_synthesis_cov.c +++ b/lib_dec/ivas_dirac_output_synthesis_cov.c @@ -1722,7 +1722,11 @@ Word16 computeMixingMatrices_fx( matrix_product_mant_exp_fx( Q_fx, Q_e, lengthCy, lengthCx, 0, Cx_fx, Cx_fx_e, lengthCx, lengthCx, 0, Q_Cx_fx, &Q_Cx_e ); Word16 guard_bits; +#ifdef FIX_827_HIGH_MLD + guard_bits = find_guarded_bits_fx( lengthCx ); +#else guard_bits = find_guarded_bits_fx( lengthCx + 1 ); +#endif FOR( i = 0; i < lengthCy * lengthCx; ++i ) { @@ -1760,11 +1764,18 @@ Word16 computeMixingMatrices_fx( move16(); } +#ifndef FIX_827_HIGH_MLD L_tmp = Mpy_32_32( limit_fx, reg_ghat_fx ); limit_fx = L_add( L_tmp, EPSILON_FX ); limit_e = add( limit_e, reg_ghat_e ); move16(); +#endif } +#ifdef FIX_827_HIGH_MLD + L_tmp = Mpy_32_32( limit_fx, reg_ghat_fx ); + limit_fx = L_add( L_tmp, EPSILON_FX ); + limit_e = add( limit_e, reg_ghat_e ); +#endif FOR( i = 0; i < lengthCy; ++i ) @@ -2532,8 +2543,13 @@ Word16 computeMixingMatricesResidual_fx( FOR( j = 0; j < num_outputs; j++ ) { +#ifdef FIX_827_HIGH_MLD + L_tmp = Mpy_32_32( mat_mult_buffer1_fx[add( j, imult1616( i, extract_l( num_outputs ) ) )], fac_fx ); + mixing_matrix_fx[add( j, imult1616( i, extract_l( num_outputs ) ) )] = L_tmp; +#else L_tmp = Mpy_32_32( mat_mult_buffer1_fx[add( j, imult1616( j, extract_l( num_outputs ) ) )], fac_fx ); mixing_matrix_fx[add( j, imult1616( j, extract_l( num_outputs ) ) )] = L_tmp; +#endif move32(); mixing_matrix_e = add( mat_mult_buffer1_e, Kx_reg_inv_fx_e ); move16(); @@ -2548,7 +2564,12 @@ Word16 computeMixingMatricesResidual_fx( matrix_diag_product_fx( mixing_matrix_fx, mixing_matrix_e, lengthCy, lengthCx, 0, Cx_fx, Cx_e, lengthCx, mat_mult_buffer1_fx, &mat_mult_buffer1_e ); +#ifdef FIX_827_HIGH_MLD + Word16 guard_bits; + guard_bits = find_guarded_bits_fx( lengthCx ); +#else Word16 guard_bits = find_guarded_bits_fx( lengthCx + 1 ); +#endif FOR( i = 0; i < lengthCy * lengthCx; ++i ) { diff --git a/lib_dec/ivas_svd_dec.c b/lib_dec/ivas_svd_dec.c index 9156aa718..6a07d026c 100644 --- a/lib_dec/ivas_svd_dec.c +++ b/lib_dec/ivas_svd_dec.c @@ -714,7 +714,11 @@ static Word16 BidagonalDiagonalisation_fx( } ELSE { +#ifdef FIX_827_HIGH_MLD + IF( GE_16( iteration, SVD_MAX_NUM_ITERATION ) ) +#else IF( GT_16( iteration, SVD_MAX_NUM_ITERATION ) ) +#endif { IF( LT_32( singularValues_fx[iCh], 0 ) ) { @@ -1416,7 +1420,11 @@ IF( LT_16( currChannel, nChannelsL ) ) /* i <= m */ } r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( ( *g ), singularVectors[currChannel][idx] ), sing_exp[currChannel], -norm_x, norm_x_e, &r_e ); +#ifdef FIX_827_HIGH_MLD + singularVectors[currChannel][idx] = BASOP_Util_Add_Mant32Exp( singularVectors[currChannel][idx], sing_exp[currChannel], -( *g ), 0, &sing_exp[currChannel] ); +#else singularVectors[currChannel][idx] = BASOP_Util_Add_Mant32Exp( singularVectors[currChannel][idx], sing_exp[idx], -( *g ), 0, &sing_exp[currChannel] ); +#endif move32(); FOR( iCh = currChannel + 1; iCh < nChannelsC; iCh++ ) /* nChannelsC */ -- GitLab