From 25951fd798b725cf4550bb8e2da77848ac93400a Mon Sep 17 00:00:00 2001 From: naghibza Date: Fri, 29 Aug 2025 17:06:16 +0200 Subject: [PATCH 1/7] improve precision of targetEnergy in ivas_ls_setup_conversion_process_mdct_fx() --- lib_com/options.h | 1 + lib_dec/ivas_out_setup_conversion_fx.c | 18 +++++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index a92e40a71..73cc4d291 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -81,6 +81,7 @@ #define FIX_1979_SAT_MISSING_IN_LSF_ENC /* VA: Proposal to fix 1979, saturation in lsf_enc, NOkia to review */ #define FIX_1946_CRASH_JBM_PROCESSING /* FhG: Increased guard bits of DFT_fx */ +#define FIX_1962_FORMAT_CONV_SPECTRAL_DIFF /* FhG: Improved precision of targetEnergy in ivas_ls_setup_conversion_process_mdct_fx() */ /* #################### Start BASOP porting switches ############################ */ #define NONBE_1244_FIX_SWB_BWE_MEMORY /* VA: issue 1244: fix to SWB BWE memory in case of switching from FB coding - pending a review by Huawei */ diff --git a/lib_dec/ivas_out_setup_conversion_fx.c b/lib_dec/ivas_out_setup_conversion_fx.c index fde543e96..3678f8bb8 100644 --- a/lib_dec/ivas_out_setup_conversion_fx.c +++ b/lib_dec/ivas_out_setup_conversion_fx.c @@ -876,18 +876,34 @@ void ivas_ls_setup_conversion_process_mdct_fx( move32(); } /* Step 3: Peform energy smoothing */ - +#ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF + Word16 pre_te_scale = getScaleFactor32( hLsSetUpConversion->targetEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt ); + scale_sig32( hLsSetUpConversion->targetEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt, pre_te_scale ); +#else Word16 te_scale = getScaleFactor32( hLsSetUpConversion->targetEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt ); scale_sig32( hLsSetUpConversion->targetEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt, te_scale ); +#endif Word16 dmx_sacle = getScaleFactor32( hLsSetUpConversion->dmxEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt ); scale_sig32( hLsSetUpConversion->dmxEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt, dmx_sacle ); +#ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF + Word16 te_scale = getScaleFactor32( targetEnergy, hLsSetUpConversion->sfbCnt ); + scale_sig32( targetEnergy, hLsSetUpConversion->sfbCnt, te_scale ); + Word16 targetEnergy_e = sub( sub( 40, shl( q_output, 1 ) ), te_scale ); + + Word16 te_max_e = s_max( targetEnergy_e, sub( hLsSetUpConversion->te_prev_exp[0], pre_te_scale ) ); +#else Word16 te_max_e = s_max( sub( 40, shl( q_output, 1 ) ), sub( hLsSetUpConversion->te_prev_exp[0], te_scale ) ); +#endif Word16 dmx_max_e = s_max( dmxEnergy_exp_temp, sub( hLsSetUpConversion->dmx_prev_exp[0], dmx_sacle ) ); FOR( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) { +#ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF + targetEnergy[bandIdx] = L_add( Mpy_32_32( LS_OUT_CONV_SMOOTHING_FACTOR_Q31, L_shr( targetEnergy[bandIdx], sub( te_max_e, targetEnergy_e ) ) ), Mpy_32_32( ( ONE_IN_Q31 - LS_OUT_CONV_SMOOTHING_FACTOR_Q31 ), L_shr( hLsSetUpConversion->targetEnergyPrev_fx[0][bandIdx], sub( te_max_e, sub( hLsSetUpConversion->te_prev_exp[0], pre_te_scale ) ) ) ) ); +#else targetEnergy[bandIdx] = L_add( Mpy_32_32( LS_OUT_CONV_SMOOTHING_FACTOR_Q31, L_shr( targetEnergy[bandIdx], sub( te_max_e, sub( 40, shl( q_output, 1 ) ) ) ) ), Mpy_32_32( ( ONE_IN_Q31 - LS_OUT_CONV_SMOOTHING_FACTOR_Q31 ), L_shr( hLsSetUpConversion->targetEnergyPrev_fx[0][bandIdx], sub( te_max_e, sub( hLsSetUpConversion->te_prev_exp[0], te_scale ) ) ) ) ); +#endif move32(); dmxEnergy[bandIdx] = L_add( Mpy_32_32( LS_OUT_CONV_SMOOTHING_FACTOR_Q31, L_shr( dmxEnergy[bandIdx], sub( dmx_max_e, dmxEnergy_exp_temp ) ) ), Mpy_32_32( ( ONE_IN_Q31 - LS_OUT_CONV_SMOOTHING_FACTOR_Q31 ), L_shr( hLsSetUpConversion->dmxEnergyPrev_fx[0][bandIdx], sub( dmx_max_e, sub( hLsSetUpConversion->dmx_prev_exp[0], dmx_sacle ) ) ) ) ); move32(); -- GitLab From 5591702e77d243855c5f77ea568a679fceb56c5c Mon Sep 17 00:00:00 2001 From: naghibza Date: Tue, 2 Sep 2025 11:22:52 +0200 Subject: [PATCH 2/7] improve precision of targetEnergy and dmxEnergy calculations in ivas_ls_setup_conversion_process_mdct_fx() --- lib_dec/ivas_out_setup_conversion_fx.c | 108 ++++++++++++++++++++----- 1 file changed, 89 insertions(+), 19 deletions(-) diff --git a/lib_dec/ivas_out_setup_conversion_fx.c b/lib_dec/ivas_out_setup_conversion_fx.c index 3678f8bb8..c2bacf2c8 100644 --- a/lib_dec/ivas_out_setup_conversion_fx.c +++ b/lib_dec/ivas_out_setup_conversion_fx.c @@ -662,8 +662,13 @@ void ivas_ls_setup_conversion_process_mdct_fx( Word16 inChannels, outChannels, num_CPE; Word16 transform_type[MAX_CICP_CHANNELS][2]; Word16 frameSize; +#ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF + Word64 targetEnergy64[MAX_SFB + 2], dmxEnergy64[MAX_SFB + 2]; + Word16 dmxEnergy_exp[MAX_SFB + 2], dmxEnergy_exp_temp, sf1, sf2; +#else Word32 targetEnergy[MAX_SFB + 2], dmxEnergy[MAX_SFB + 2]; Word16 dmxEnergy_exp[MAX_SFB + 2], dmxEnergy_exp_temp; +#endif Word32 dmxCoeff; Word32 dmxSignalReal[L_FRAME48k], dmxSignalImag[L_FRAME48k]; Word32 eqGain; @@ -748,12 +753,20 @@ void ivas_ls_setup_conversion_process_mdct_fx( /* set overall frequency resolution of (sub)frame to maximum of (sub)frame, requires conversion if both channels are not the same */ frameSize = hLsSetUpConversion->sfbOffset[hLsSetUpConversion->sfbCnt]; move16(); - +#ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF + set64_fx( targetEnergy64, 0, MAX_SFB + 2 ); + set64_fx( dmxEnergy64, 0, MAX_SFB + 2 ); + sf1 = 63; + sf2 = 63; + move16(); + move16(); +#else set32_fx( targetEnergy, 0, MAX_SFB + 2 ); set32_fx( dmxEnergy, 0, MAX_SFB + 2 ); set16_fx( dmxEnergy_exp, 0, MAX_SFB + 2 ); dmxEnergy_exp_temp = 0; move16(); +#endif FOR( chOutIdx = 0; chOutIdx < outChannels; chOutIdx++ ) { @@ -772,8 +785,12 @@ void ivas_ls_setup_conversion_process_mdct_fx( /* Step 1: Compute the target energy and DMX signal (possible since we have all signals in TCX20 resolution) */ IF( dmxCoeff ) { +#ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF + Word64 targetEne64; + Word32 tmpDMXSig; +#else Word32 tmpDMXSig, targetEne; - +#endif /* Convert the signal resolution to TCX20 */ /* initially, set pointers to input; if conversion occurs in (sub)frame, set to convertRes */ pTmp[0] = x[chInIdx][0]; // Q(q_output) @@ -816,8 +833,13 @@ void ivas_ls_setup_conversion_process_mdct_fx( stop = hLsSetUpConversion->sfbOffset[bandIdx + 1]; move16(); +#ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF + targetEne64 = 0; + move64(); +#else targetEne = 0; move32(); +#endif /* Loop over all the bins in the band */ FOR( binIdx = start; binIdx < stop; binIdx++ ) @@ -825,15 +847,27 @@ void ivas_ls_setup_conversion_process_mdct_fx( tmpDMXSig = Mpy_32_32( L_shl_sat( dmxCoeff, 1 ), sig[0][binIdx] ); dmxSignalReal[binIdx] = L_add( dmxSignalReal[binIdx], tmpDMXSig ); move32(); +#ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF + targetEne64 = W_mac_32_32( targetEne64, tmpDMXSig, tmpDMXSig ); +#else targetEne = L_add( targetEne, Mpy_32_32( tmpDMXSig, tmpDMXSig ) ); - +#endif tmpDMXSig = Mpy_32_32( L_shl_sat( dmxCoeff, 1 ), mdst[binIdx] ); dmxSignalImag[binIdx] = L_add( dmxSignalImag[binIdx], tmpDMXSig ); move32(); +#ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF + targetEne64 = W_mac_32_32( targetEne64, tmpDMXSig, tmpDMXSig ); +#else targetEne = L_add( targetEne, Mpy_32_32( tmpDMXSig, tmpDMXSig ) ); +#endif } +#ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF + targetEnergy64[bandIdx] = W_add( targetEnergy64[bandIdx], W_shr(targetEne64, 1 ) ); + sf1 = s_min( sf1, W_norm( targetEnergy64[bandIdx] ) ); +#else targetEnergy[bandIdx] = L_add( targetEnergy[bandIdx], targetEne ); move32(); +#endif } /* end of band loop */ } } @@ -841,57 +875,70 @@ void ivas_ls_setup_conversion_process_mdct_fx( FOR( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) { +#ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF + Word32 tmpReal, tmpImag; + Word64 DMXEne64; +#else Word32 tmpReal, tmpImag, DMXEne; Word16 DMXEne_exp; - +#endif start = hLsSetUpConversion->sfbOffset[bandIdx]; move16(); stop = hLsSetUpConversion->sfbOffset[bandIdx + 1]; move16(); /* Loop over all the bins in the band */ +#ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF + DMXEne64 = 0; + move64(); +#else DMXEne = 0; move32(); DMXEne_exp = 0; move16(); +#endif + FOR( binIdx = start; binIdx < stop; binIdx++ ) { tmpReal = dmxSignalReal[binIdx]; move32(); tmpImag = dmxSignalImag[binIdx]; move32(); - +#ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF + DMXEne64 = W_mac_32_32( DMXEne64, tmpReal, tmpReal ); + DMXEne64 = W_mac_32_32( DMXEne64, tmpImag, tmpImag ); +#else DMXEne = BASOP_Util_Add_Mant32Exp( DMXEne, DMXEne_exp, L_add( Mpy_32_32( tmpReal, tmpReal ), Mpy_32_32( tmpImag, tmpImag ) ), sub( 40, shl( q_output, 1 ) ), &DMXEne_exp ); +#endif } +#ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF + dmxEnergy64[bandIdx] = W_add( dmxEnergy64[bandIdx], W_shr( DMXEne64, 1 ) ); + sf2 = s_min( sf2, W_norm( dmxEnergy64[bandIdx] ) ); +#else dmxEnergy[bandIdx] = BASOP_Util_Add_Mant32Exp( dmxEnergy[bandIdx], dmxEnergy_exp[bandIdx], DMXEne, DMXEne_exp, &dmxEnergy_exp[bandIdx] ); move32(); dmxEnergy_exp_temp = s_max( dmxEnergy_exp_temp, dmxEnergy_exp[bandIdx] ); +#endif } } /* end of out channel loop */ - +#ifndef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF /* Scaling to common exponent */ FOR( bandIdx = 0; bandIdx < MAX_SFB + 2; bandIdx++ ) { dmxEnergy[bandIdx] = L_shl( dmxEnergy[bandIdx], sub( dmxEnergy_exp[bandIdx], dmxEnergy_exp_temp ) ); move32(); } +#endif /* Step 3: Peform energy smoothing */ -#ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF - Word16 pre_te_scale = getScaleFactor32( hLsSetUpConversion->targetEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt ); - scale_sig32( hLsSetUpConversion->targetEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt, pre_te_scale ); -#else Word16 te_scale = getScaleFactor32( hLsSetUpConversion->targetEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt ); scale_sig32( hLsSetUpConversion->targetEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt, te_scale ); -#endif Word16 dmx_sacle = getScaleFactor32( hLsSetUpConversion->dmxEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt ); scale_sig32( hLsSetUpConversion->dmxEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt, dmx_sacle ); #ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF - Word16 te_scale = getScaleFactor32( targetEnergy, hLsSetUpConversion->sfbCnt ); - scale_sig32( targetEnergy, hLsSetUpConversion->sfbCnt, te_scale ); - Word16 targetEnergy_e = sub( sub( 40, shl( q_output, 1 ) ), te_scale ); - - Word16 te_max_e = s_max( targetEnergy_e, sub( hLsSetUpConversion->te_prev_exp[0], pre_te_scale ) ); + Word16 targetEnergy_e = sub( add( sub( 40, shl( q_output, 1 ) ), 1 ), sf1 ); + Word16 te_max_e = s_max( targetEnergy_e, sub( hLsSetUpConversion->te_prev_exp[0], te_scale ) ); + dmxEnergy_exp_temp = sub( add( sub( 40, shl( q_output, 1 ) ), 1 ), sf2 ); #else Word16 te_max_e = s_max( sub( 40, shl( q_output, 1 ) ), sub( hLsSetUpConversion->te_prev_exp[0], te_scale ) ); #endif @@ -900,10 +947,21 @@ void ivas_ls_setup_conversion_process_mdct_fx( FOR( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) { #ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF - targetEnergy[bandIdx] = L_add( Mpy_32_32( LS_OUT_CONV_SMOOTHING_FACTOR_Q31, L_shr( targetEnergy[bandIdx], sub( te_max_e, targetEnergy_e ) ) ), Mpy_32_32( ( ONE_IN_Q31 - LS_OUT_CONV_SMOOTHING_FACTOR_Q31 ), L_shr( hLsSetUpConversion->targetEnergyPrev_fx[0][bandIdx], sub( te_max_e, sub( hLsSetUpConversion->te_prev_exp[0], pre_te_scale ) ) ) ) ); + Word32 targetEnergy, dmxEnergy; + + targetEnergy = W_extract_h( W_shl( targetEnergy64[bandIdx], sf1 ) ); + targetEnergy = L_add( Mpy_32_32( LS_OUT_CONV_SMOOTHING_FACTOR_Q31, L_shr( targetEnergy, sub( te_max_e, targetEnergy_e ) ) ), Mpy_32_32( ( ONE_IN_Q31 - LS_OUT_CONV_SMOOTHING_FACTOR_Q31 ), L_shr( hLsSetUpConversion->targetEnergyPrev_fx[0][bandIdx], sub( te_max_e, sub( hLsSetUpConversion->te_prev_exp[0], te_scale ) ) ) ) ); + move32(); + hLsSetUpConversion->targetEnergyPrev_fx[0][bandIdx] = targetEnergy; + move32(); + + dmxEnergy = W_extract_h( W_shl( dmxEnergy64[bandIdx], sf2 ) ); + dmxEnergy = L_add( Mpy_32_32( LS_OUT_CONV_SMOOTHING_FACTOR_Q31, L_shr( dmxEnergy, sub( dmx_max_e, dmxEnergy_exp_temp ) ) ), Mpy_32_32( ( ONE_IN_Q31 - LS_OUT_CONV_SMOOTHING_FACTOR_Q31 ), L_shr( hLsSetUpConversion->dmxEnergyPrev_fx[0][bandIdx], sub( dmx_max_e, sub( hLsSetUpConversion->dmx_prev_exp[0], dmx_sacle ) ) ) ) ); + move32(); + hLsSetUpConversion->dmxEnergyPrev_fx[0][bandIdx] = dmxEnergy; + move32(); #else targetEnergy[bandIdx] = L_add( Mpy_32_32( LS_OUT_CONV_SMOOTHING_FACTOR_Q31, L_shr( targetEnergy[bandIdx], sub( te_max_e, sub( 40, shl( q_output, 1 ) ) ) ) ), Mpy_32_32( ( ONE_IN_Q31 - LS_OUT_CONV_SMOOTHING_FACTOR_Q31 ), L_shr( hLsSetUpConversion->targetEnergyPrev_fx[0][bandIdx], sub( te_max_e, sub( hLsSetUpConversion->te_prev_exp[0], te_scale ) ) ) ) ); -#endif move32(); dmxEnergy[bandIdx] = L_add( Mpy_32_32( LS_OUT_CONV_SMOOTHING_FACTOR_Q31, L_shr( dmxEnergy[bandIdx], sub( dmx_max_e, dmxEnergy_exp_temp ) ) ), Mpy_32_32( ( ONE_IN_Q31 - LS_OUT_CONV_SMOOTHING_FACTOR_Q31 ), L_shr( hLsSetUpConversion->dmxEnergyPrev_fx[0][bandIdx], sub( dmx_max_e, sub( hLsSetUpConversion->dmx_prev_exp[0], dmx_sacle ) ) ) ) ); move32(); @@ -911,6 +969,7 @@ void ivas_ls_setup_conversion_process_mdct_fx( move32(); hLsSetUpConversion->dmxEnergyPrev_fx[0][bandIdx] = dmxEnergy[bandIdx]; /* dmx_prev_exp = 40 - 2*q_output */ move32(); +#endif } hLsSetUpConversion->te_prev_exp[0] = te_max_e; /* te_prev_exp = 40 - 2*q_output */ @@ -944,7 +1003,13 @@ void ivas_ls_setup_conversion_process_mdct_fx( move16(); /* Compute Eq gains */ +#ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF + ivas_lssetupconversion_computeEQFactor_fx( &hLsSetUpConversion->targetEnergyPrev_fx[0][bandIdx], hLsSetUpConversion->te_prev_exp[0], + &hLsSetUpConversion->dmxEnergyPrev_fx[0][bandIdx], hLsSetUpConversion->dmx_prev_exp[0], + &eqGain ); // Q(eqGain) = 30 +#else ivas_lssetupconversion_computeEQFactor_fx( &targetEnergy[bandIdx], hLsSetUpConversion->te_prev_exp[0], &dmxEnergy[bandIdx], hLsSetUpConversion->dmx_prev_exp[0], &eqGain ); // Q(eqGain) = 30 +#endif FOR( binIdx = start; binIdx < stop; binIdx++ ) { x[chInIdx][0][binIdx] = Mpy_32_32( L_shl( x[chInIdx][0][binIdx], 1 ), eqGain ); // Q - 1 @@ -964,8 +1029,13 @@ void ivas_ls_setup_conversion_process_mdct_fx( move16(); /* Compute Eq gains */ +#ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF + ivas_lssetupconversion_computeEQFactor_fx( &hLsSetUpConversion->targetEnergyPrev_fx[0][bandIdx], hLsSetUpConversion->te_prev_exp[0], + &hLsSetUpConversion->dmxEnergyPrev_fx[0][bandIdx], hLsSetUpConversion->dmx_prev_exp[0], + &eqGain ); +#else ivas_lssetupconversion_computeEQFactor_fx( &targetEnergy[bandIdx], hLsSetUpConversion->te_prev_exp[0], &dmxEnergy[bandIdx], hLsSetUpConversion->dmx_prev_exp[0], &eqGain ); - +#endif FOR( subFrameIdx = 0; subFrameIdx < NB_DIV; subFrameIdx++ ) { IF( EQ_16( transform_type[chInIdx][subFrameIdx], TCX_10 ) ) -- GitLab From d1e6474dc286061dce3b6a1deaa12c1917d6d334 Mon Sep 17 00:00:00 2001 From: naghibza Date: Tue, 2 Sep 2025 11:29:41 +0200 Subject: [PATCH 3/7] applied clang formatting patch --- lib_dec/ivas_out_setup_conversion_fx.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/lib_dec/ivas_out_setup_conversion_fx.c b/lib_dec/ivas_out_setup_conversion_fx.c index c2bacf2c8..9ab52c5ed 100644 --- a/lib_dec/ivas_out_setup_conversion_fx.c +++ b/lib_dec/ivas_out_setup_conversion_fx.c @@ -857,12 +857,12 @@ void ivas_ls_setup_conversion_process_mdct_fx( move32(); #ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF targetEne64 = W_mac_32_32( targetEne64, tmpDMXSig, tmpDMXSig ); -#else +#else targetEne = L_add( targetEne, Mpy_32_32( tmpDMXSig, tmpDMXSig ) ); #endif } #ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF - targetEnergy64[bandIdx] = W_add( targetEnergy64[bandIdx], W_shr(targetEne64, 1 ) ); + targetEnergy64[bandIdx] = W_add( targetEnergy64[bandIdx], W_shr( targetEne64, 1 ) ); sf1 = s_min( sf1, W_norm( targetEnergy64[bandIdx] ) ); #else targetEnergy[bandIdx] = L_add( targetEnergy[bandIdx], targetEne ); @@ -909,7 +909,7 @@ void ivas_ls_setup_conversion_process_mdct_fx( DMXEne64 = W_mac_32_32( DMXEne64, tmpImag, tmpImag ); #else DMXEne = BASOP_Util_Add_Mant32Exp( DMXEne, DMXEne_exp, L_add( Mpy_32_32( tmpReal, tmpReal ), Mpy_32_32( tmpImag, tmpImag ) ), sub( 40, shl( q_output, 1 ) ), &DMXEne_exp ); -#endif +#endif } #ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF dmxEnergy64[bandIdx] = W_add( dmxEnergy64[bandIdx], W_shr( DMXEne64, 1 ) ); @@ -928,7 +928,7 @@ void ivas_ls_setup_conversion_process_mdct_fx( dmxEnergy[bandIdx] = L_shl( dmxEnergy[bandIdx], sub( dmxEnergy_exp[bandIdx], dmxEnergy_exp_temp ) ); move32(); } -#endif +#endif /* Step 3: Peform energy smoothing */ Word16 te_scale = getScaleFactor32( hLsSetUpConversion->targetEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt ); scale_sig32( hLsSetUpConversion->targetEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt, te_scale ); @@ -949,7 +949,7 @@ void ivas_ls_setup_conversion_process_mdct_fx( #ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF Word32 targetEnergy, dmxEnergy; - targetEnergy = W_extract_h( W_shl( targetEnergy64[bandIdx], sf1 ) ); + targetEnergy = W_extract_h( W_shl( targetEnergy64[bandIdx], sf1 ) ); targetEnergy = L_add( Mpy_32_32( LS_OUT_CONV_SMOOTHING_FACTOR_Q31, L_shr( targetEnergy, sub( te_max_e, targetEnergy_e ) ) ), Mpy_32_32( ( ONE_IN_Q31 - LS_OUT_CONV_SMOOTHING_FACTOR_Q31 ), L_shr( hLsSetUpConversion->targetEnergyPrev_fx[0][bandIdx], sub( te_max_e, sub( hLsSetUpConversion->te_prev_exp[0], te_scale ) ) ) ) ); move32(); hLsSetUpConversion->targetEnergyPrev_fx[0][bandIdx] = targetEnergy; @@ -1003,7 +1003,7 @@ void ivas_ls_setup_conversion_process_mdct_fx( move16(); /* Compute Eq gains */ -#ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF +#ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF ivas_lssetupconversion_computeEQFactor_fx( &hLsSetUpConversion->targetEnergyPrev_fx[0][bandIdx], hLsSetUpConversion->te_prev_exp[0], &hLsSetUpConversion->dmxEnergyPrev_fx[0][bandIdx], hLsSetUpConversion->dmx_prev_exp[0], &eqGain ); // Q(eqGain) = 30 -- GitLab From 961bd058d85a1a698b47bffb21a60727d0fe9f7e Mon Sep 17 00:00:00 2001 From: naghibza Date: Tue, 2 Sep 2025 12:07:07 +0200 Subject: [PATCH 4/7] removed unused variable --- lib_dec/ivas_out_setup_conversion_fx.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/lib_dec/ivas_out_setup_conversion_fx.c b/lib_dec/ivas_out_setup_conversion_fx.c index 9ab52c5ed..f43bf9c18 100644 --- a/lib_dec/ivas_out_setup_conversion_fx.c +++ b/lib_dec/ivas_out_setup_conversion_fx.c @@ -664,7 +664,7 @@ void ivas_ls_setup_conversion_process_mdct_fx( Word16 frameSize; #ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF Word64 targetEnergy64[MAX_SFB + 2], dmxEnergy64[MAX_SFB + 2]; - Word16 dmxEnergy_exp[MAX_SFB + 2], dmxEnergy_exp_temp, sf1, sf2; + Word16 dmxEnergy_exp_temp, scf1, scf2; #else Word32 targetEnergy[MAX_SFB + 2], dmxEnergy[MAX_SFB + 2]; Word16 dmxEnergy_exp[MAX_SFB + 2], dmxEnergy_exp_temp; @@ -756,8 +756,8 @@ void ivas_ls_setup_conversion_process_mdct_fx( #ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF set64_fx( targetEnergy64, 0, MAX_SFB + 2 ); set64_fx( dmxEnergy64, 0, MAX_SFB + 2 ); - sf1 = 63; - sf2 = 63; + scf1 = 63; + scf2 = 63; move16(); move16(); #else @@ -863,7 +863,7 @@ void ivas_ls_setup_conversion_process_mdct_fx( } #ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF targetEnergy64[bandIdx] = W_add( targetEnergy64[bandIdx], W_shr( targetEne64, 1 ) ); - sf1 = s_min( sf1, W_norm( targetEnergy64[bandIdx] ) ); + scf1 = s_min( scf1, W_norm( targetEnergy64[bandIdx] ) ); #else targetEnergy[bandIdx] = L_add( targetEnergy[bandIdx], targetEne ); move32(); @@ -913,7 +913,7 @@ void ivas_ls_setup_conversion_process_mdct_fx( } #ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF dmxEnergy64[bandIdx] = W_add( dmxEnergy64[bandIdx], W_shr( DMXEne64, 1 ) ); - sf2 = s_min( sf2, W_norm( dmxEnergy64[bandIdx] ) ); + scf2 = s_min( scf2, W_norm( dmxEnergy64[bandIdx] ) ); #else dmxEnergy[bandIdx] = BASOP_Util_Add_Mant32Exp( dmxEnergy[bandIdx], dmxEnergy_exp[bandIdx], DMXEne, DMXEne_exp, &dmxEnergy_exp[bandIdx] ); move32(); @@ -936,9 +936,9 @@ void ivas_ls_setup_conversion_process_mdct_fx( scale_sig32( hLsSetUpConversion->dmxEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt, dmx_sacle ); #ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF - Word16 targetEnergy_e = sub( add( sub( 40, shl( q_output, 1 ) ), 1 ), sf1 ); + Word16 targetEnergy_e = sub( add( sub( 40, shl( q_output, 1 ) ), 1 ), scf1 ); Word16 te_max_e = s_max( targetEnergy_e, sub( hLsSetUpConversion->te_prev_exp[0], te_scale ) ); - dmxEnergy_exp_temp = sub( add( sub( 40, shl( q_output, 1 ) ), 1 ), sf2 ); + dmxEnergy_exp_temp = sub( add( sub( 40, shl( q_output, 1 ) ), 1 ), scf2 ); #else Word16 te_max_e = s_max( sub( 40, shl( q_output, 1 ) ), sub( hLsSetUpConversion->te_prev_exp[0], te_scale ) ); #endif @@ -949,13 +949,13 @@ void ivas_ls_setup_conversion_process_mdct_fx( #ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF Word32 targetEnergy, dmxEnergy; - targetEnergy = W_extract_h( W_shl( targetEnergy64[bandIdx], sf1 ) ); + targetEnergy = W_extract_h( W_shl( targetEnergy64[bandIdx], scf1 ) ); targetEnergy = L_add( Mpy_32_32( LS_OUT_CONV_SMOOTHING_FACTOR_Q31, L_shr( targetEnergy, sub( te_max_e, targetEnergy_e ) ) ), Mpy_32_32( ( ONE_IN_Q31 - LS_OUT_CONV_SMOOTHING_FACTOR_Q31 ), L_shr( hLsSetUpConversion->targetEnergyPrev_fx[0][bandIdx], sub( te_max_e, sub( hLsSetUpConversion->te_prev_exp[0], te_scale ) ) ) ) ); move32(); hLsSetUpConversion->targetEnergyPrev_fx[0][bandIdx] = targetEnergy; move32(); - dmxEnergy = W_extract_h( W_shl( dmxEnergy64[bandIdx], sf2 ) ); + dmxEnergy = W_extract_h( W_shl( dmxEnergy64[bandIdx], scf2 ) ); dmxEnergy = L_add( Mpy_32_32( LS_OUT_CONV_SMOOTHING_FACTOR_Q31, L_shr( dmxEnergy, sub( dmx_max_e, dmxEnergy_exp_temp ) ) ), Mpy_32_32( ( ONE_IN_Q31 - LS_OUT_CONV_SMOOTHING_FACTOR_Q31 ), L_shr( hLsSetUpConversion->dmxEnergyPrev_fx[0][bandIdx], sub( dmx_max_e, sub( hLsSetUpConversion->dmx_prev_exp[0], dmx_sacle ) ) ) ) ); move32(); hLsSetUpConversion->dmxEnergyPrev_fx[0][bandIdx] = dmxEnergy; -- GitLab From 3ecfd529d838882903cd0211c220e18fd9f166a8 Mon Sep 17 00:00:00 2001 From: naghibza Date: Tue, 2 Sep 2025 17:13:39 +0200 Subject: [PATCH 5/7] correct scaleFactor calculation in ivas_ls_setup_conversion_process_mdct_fx() --- lib_dec/ivas_out_setup_conversion_fx.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/lib_dec/ivas_out_setup_conversion_fx.c b/lib_dec/ivas_out_setup_conversion_fx.c index f43bf9c18..4ae96c618 100644 --- a/lib_dec/ivas_out_setup_conversion_fx.c +++ b/lib_dec/ivas_out_setup_conversion_fx.c @@ -863,7 +863,10 @@ void ivas_ls_setup_conversion_process_mdct_fx( } #ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF targetEnergy64[bandIdx] = W_add( targetEnergy64[bandIdx], W_shr( targetEne64, 1 ) ); - scf1 = s_min( scf1, W_norm( targetEnergy64[bandIdx] ) ); + if ( targetEnergy64[bandIdx] != 0 ) + { + scf1 = s_min( scf1, W_norm( targetEnergy64[bandIdx] ) ); + } #else targetEnergy[bandIdx] = L_add( targetEnergy[bandIdx], targetEne ); move32(); @@ -913,7 +916,10 @@ void ivas_ls_setup_conversion_process_mdct_fx( } #ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF dmxEnergy64[bandIdx] = W_add( dmxEnergy64[bandIdx], W_shr( DMXEne64, 1 ) ); - scf2 = s_min( scf2, W_norm( dmxEnergy64[bandIdx] ) ); + if ( dmxEnergy64[bandIdx] != 0 ) + { + scf2 = s_min( scf2, W_norm( dmxEnergy64[bandIdx] ) ); + } #else dmxEnergy[bandIdx] = BASOP_Util_Add_Mant32Exp( dmxEnergy[bandIdx], dmxEnergy_exp[bandIdx], DMXEne, DMXEne_exp, &dmxEnergy_exp[bandIdx] ); move32(); -- GitLab From 43a2ca2c252201328c611580f1e1251667da5e4a Mon Sep 17 00:00:00 2001 From: naghibza Date: Mon, 8 Sep 2025 11:19:54 +0200 Subject: [PATCH 6/7] minor code cleanup. --- lib_dec/ivas_mdct_core_dec_fx.c | 4 ---- lib_dec/ivas_out_setup_conversion_fx.c | 22 ++++++++++++++-------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/lib_dec/ivas_mdct_core_dec_fx.c b/lib_dec/ivas_mdct_core_dec_fx.c index 4744a906d..4b8fcebf7 100644 --- a/lib_dec/ivas_mdct_core_dec_fx.c +++ b/lib_dec/ivas_mdct_core_dec_fx.c @@ -1305,10 +1305,6 @@ void ivas_mdct_core_reconstruct_fx( Copy( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len ); // Q = st->hTcxDec->q_old_synth Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( st->hTcxDec->q_old_synth, st->Q_syn ) ); // Q = st->hTcxDec->q_old_synth - // Temporary workaround: con_tcx_ivas_fx() should be analyzed for potential issues. - // Scale_sig( synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, -2 ); - // Scale_sig( synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, +2 ); - /////////////////////////////////////////////////////////////////////////////////// assert( EQ_16( st->bfi, 1 ) ); /* PLC: [TCX: TD PLC] */ IF( MCT_flag != 0 ) diff --git a/lib_dec/ivas_out_setup_conversion_fx.c b/lib_dec/ivas_out_setup_conversion_fx.c index 4ae96c618..bfbb0ac76 100644 --- a/lib_dec/ivas_out_setup_conversion_fx.c +++ b/lib_dec/ivas_out_setup_conversion_fx.c @@ -664,7 +664,7 @@ void ivas_ls_setup_conversion_process_mdct_fx( Word16 frameSize; #ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF Word64 targetEnergy64[MAX_SFB + 2], dmxEnergy64[MAX_SFB + 2]; - Word16 dmxEnergy_exp_temp, scf1, scf2; + Word16 scf1, scf2; #else Word32 targetEnergy[MAX_SFB + 2], dmxEnergy[MAX_SFB + 2]; Word16 dmxEnergy_exp[MAX_SFB + 2], dmxEnergy_exp_temp; @@ -863,7 +863,7 @@ void ivas_ls_setup_conversion_process_mdct_fx( } #ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF targetEnergy64[bandIdx] = W_add( targetEnergy64[bandIdx], W_shr( targetEne64, 1 ) ); - if ( targetEnergy64[bandIdx] != 0 ) + if ( NE_64( targetEnergy64[bandIdx], 0 ) ) { scf1 = s_min( scf1, W_norm( targetEnergy64[bandIdx] ) ); } @@ -916,7 +916,7 @@ void ivas_ls_setup_conversion_process_mdct_fx( } #ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF dmxEnergy64[bandIdx] = W_add( dmxEnergy64[bandIdx], W_shr( DMXEne64, 1 ) ); - if ( dmxEnergy64[bandIdx] != 0 ) + if ( NE_64(dmxEnergy64[bandIdx], 0) ) { scf2 = s_min( scf2, W_norm( dmxEnergy64[bandIdx] ) ); } @@ -938,17 +938,23 @@ void ivas_ls_setup_conversion_process_mdct_fx( /* Step 3: Peform energy smoothing */ Word16 te_scale = getScaleFactor32( hLsSetUpConversion->targetEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt ); scale_sig32( hLsSetUpConversion->targetEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt, te_scale ); - Word16 dmx_sacle = getScaleFactor32( hLsSetUpConversion->dmxEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt ); - scale_sig32( hLsSetUpConversion->dmxEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt, dmx_sacle ); #ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF + Word16 dmx_scale = getScaleFactor32( hLsSetUpConversion->dmxEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt ); + scale_sig32( hLsSetUpConversion->dmxEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt, dmx_scale ); + Word16 targetEnergy_e = sub( add( sub( 40, shl( q_output, 1 ) ), 1 ), scf1 ); Word16 te_max_e = s_max( targetEnergy_e, sub( hLsSetUpConversion->te_prev_exp[0], te_scale ) ); - dmxEnergy_exp_temp = sub( add( sub( 40, shl( q_output, 1 ) ), 1 ), scf2 ); + + Word16 dmxEnergy_e = sub( add( sub( 40, shl( q_output, 1 ) ), 1 ), scf2 ); + Word16 dmx_max_e = s_max( dmxEnergy_e, sub( hLsSetUpConversion->dmx_prev_exp[0], dmx_scale ) ); #else + Word16 dmx_sacle = getScaleFactor32( hLsSetUpConversion->dmxEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt ); + scale_sig32( hLsSetUpConversion->dmxEnergyPrev_fx[0], hLsSetUpConversion->sfbCnt, dmx_sacle ); + Word16 te_max_e = s_max( sub( 40, shl( q_output, 1 ) ), sub( hLsSetUpConversion->te_prev_exp[0], te_scale ) ); -#endif Word16 dmx_max_e = s_max( dmxEnergy_exp_temp, sub( hLsSetUpConversion->dmx_prev_exp[0], dmx_sacle ) ); +#endif FOR( bandIdx = 0; bandIdx < hLsSetUpConversion->sfbCnt; bandIdx++ ) { @@ -962,7 +968,7 @@ void ivas_ls_setup_conversion_process_mdct_fx( move32(); dmxEnergy = W_extract_h( W_shl( dmxEnergy64[bandIdx], scf2 ) ); - dmxEnergy = L_add( Mpy_32_32( LS_OUT_CONV_SMOOTHING_FACTOR_Q31, L_shr( dmxEnergy, sub( dmx_max_e, dmxEnergy_exp_temp ) ) ), Mpy_32_32( ( ONE_IN_Q31 - LS_OUT_CONV_SMOOTHING_FACTOR_Q31 ), L_shr( hLsSetUpConversion->dmxEnergyPrev_fx[0][bandIdx], sub( dmx_max_e, sub( hLsSetUpConversion->dmx_prev_exp[0], dmx_sacle ) ) ) ) ); + dmxEnergy = L_add( Mpy_32_32( LS_OUT_CONV_SMOOTHING_FACTOR_Q31, L_shr( dmxEnergy, sub( dmx_max_e, dmxEnergy_e ) ) ), Mpy_32_32( ( ONE_IN_Q31 - LS_OUT_CONV_SMOOTHING_FACTOR_Q31 ), L_shr( hLsSetUpConversion->dmxEnergyPrev_fx[0][bandIdx], sub( dmx_max_e, sub( hLsSetUpConversion->dmx_prev_exp[0], dmx_scale ) ) ) ) ); move32(); hLsSetUpConversion->dmxEnergyPrev_fx[0][bandIdx] = dmxEnergy; move32(); -- GitLab From 09e8842fcdcc43b2da56c1237b673011595096b0 Mon Sep 17 00:00:00 2001 From: naghibza Date: Mon, 8 Sep 2025 11:29:49 +0200 Subject: [PATCH 7/7] applied clang formatting patch. --- lib_dec/ivas_out_setup_conversion_fx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib_dec/ivas_out_setup_conversion_fx.c b/lib_dec/ivas_out_setup_conversion_fx.c index bfbb0ac76..3842b0f6b 100644 --- a/lib_dec/ivas_out_setup_conversion_fx.c +++ b/lib_dec/ivas_out_setup_conversion_fx.c @@ -916,7 +916,7 @@ void ivas_ls_setup_conversion_process_mdct_fx( } #ifdef FIX_1962_FORMAT_CONV_SPECTRAL_DIFF dmxEnergy64[bandIdx] = W_add( dmxEnergy64[bandIdx], W_shr( DMXEne64, 1 ) ); - if ( NE_64(dmxEnergy64[bandIdx], 0) ) + if ( NE_64( dmxEnergy64[bandIdx], 0 ) ) { scf2 = s_min( scf2, W_norm( dmxEnergy64[bandIdx] ) ); } -- GitLab