diff --git a/lib_com/options.h b/lib_com/options.h index a38e20b6162111658f3a4afd0dbfa6abc6c41a4d..55ea11a82ccd7f80ba4a651486b8c64e8647ae8a 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -110,6 +110,7 @@ #define FIX_2588_MISSING_CONDITIONS /* VA: Proposed fix to 2588, addition of a condition in lsf_dec */ #define FIX_BASOP_2442_MASA2TC_TO_MONO_AND_AMBI /* Nokia: BASOP issue 2442: Increase accuracy of computations and add additional gain clamp for low energy decorrelated signal rendering. */ #define FIX_FMSW_DEC_EXT /* float issue 1566: fix EXT output in format switching */ +#define FIX_ISSUE_2618_PLC_RES_ATT_SCALING /* FhG: BASOP #2618: residual PLC burst attenuation, apply divide/Sqrt32 exponent so fac tracks exponent correctly */ /* ##################### End NON-BE switches ########################### */ diff --git a/lib_dec/ivas_stereo_dft_plc_fx.c b/lib_dec/ivas_stereo_dft_plc_fx.c index 92cf02405391f2fa3ff97bd35579011e100c1603..f3517c6b304938efaf1f4638fa55b53acb5e8a86 100644 --- a/lib_dec/ivas_stereo_dft_plc_fx.c +++ b/lib_dec/ivas_stereo_dft_plc_fx.c @@ -738,22 +738,38 @@ void stereo_dft_res_ecu_burst_att_fx( ) { Word32 fac; +#ifndef FIX_ISSUE_2618_PLC_RES_ATT_SCALING Word16 q_fac; +#endif Word16 exponent; +#ifndef FIX_ISSUE_2618_PLC_RES_ATT_SCALING q_fac = 0; move16(); +#endif exponent = 0; move16(); /* attenuation of residual; follow attenuation of DMX */ IF( hStereoDft->core_hist[0] == ACELP_CORE ) { +#ifdef FIX_ISSUE_2618_PLC_RES_ATT_SCALING + fac = L_deposit_h( BASOP_Util_Divide3232_Scale( dmx_nrg, hStereoDft->past_dmx_nrg_fx, &exponent ) ); + fac = Sqrt32( fac, &exponent ); + fac = Mpy_32_16_1( fac, (Word16) ( 0x0CCD ) ); /* * 0.1f (Q15) */ + fac = L_shl_sat( fac, exponent ); /* Q31 */ +#else + fac = Mpy_32_16_1( Sqrt32( L_deposit_h( BASOP_Util_Divide3232_Scale( dmx_nrg, hStereoDft->past_dmx_nrg_fx, &q_fac ) ), &exponent ), (Word16) ( 0x0CCD ) ); /* Q0 */ +#endif } ELSE { +#ifdef FIX_ISSUE_2618_PLC_RES_ATT_SCALING + fac = L_sub( MAX_32, L_deposit_h( BASOP_Util_Divide3232_Scale( L_sub( hStereoDft->time_offs, L_ana ), L_add( hStereoDft->time_offs, L_ana ), &exponent ) ) ); /* Q0 */ +#else fac = L_sub( MAX_32, L_deposit_h( BASOP_Util_Divide3232_Scale( L_sub( hStereoDft->time_offs, L_ana ), L_add( hStereoDft->time_offs, L_ana ), &q_fac ) ) ); /* Q0 */ +#endif } v_multc_fx( pDFT_RES, fac, pDFT_RES, shl( L_res, 1 ) );