diff --git a/lib_com/options.h b/lib_com/options.h index c98dce78ecfbead8832d7dec4d6fbcbce284b257..8977a4d1e89b840bfcdeb0cba117008ef6a93c3f 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -105,9 +105,9 @@ #define REUSE_EVS_BE_GAINQ_LBR // BE by adding one condition, but could be harmonized in a non-BE way. There is a small difference in how Etot is computed #endif -#define FIX_ISSUE_1817_REPLACE_CARRY_OVERFLOW /* FhG: bit-exact, replace carry and overflow operations by 64-bit operations, MR 1931 */ -#define FIX_1844_MISSING_FREE /* FhG: add missing free in ivas_binRenderer_convModuleClose_fx() */ - +#define FIX_ISSUE_1817_REPLACE_CARRY_OVERFLOW /* FhG: bit-exact, replace carry and overflow operations by 64-bit operations, MR 1931 */ +#define FIX_1844_MISSING_FREE /* FhG: add missing free in ivas_binRenderer_convModuleClose_fx() */ +#define FIX_1942_ASSERTION_LOWSHELF /* FhG: Modified the target_gains_db_fx calculation in compute_t60_coeffs_fx() */ /* #################### Start BASOP porting switches ############################ */ #define FIX_1372_ISAR_POST_REND diff --git a/lib_rend/ivas_reverb_fx.c b/lib_rend/ivas_reverb_fx.c index ddcd6ef15f9fc5cdb0947df6c57dbe7988be13f1..92f428884be5109f5b3ebc7bf449966a01916abe 100644 --- a/lib_rend/ivas_reverb_fx.c +++ b/lib_rend/ivas_reverb_fx.c @@ -106,6 +106,11 @@ static Word16 wrap_rad_fixed( #define MAX_NR_OUTPUTS ( 2 ) +#ifdef FIX_1942_ASSERTION_LOWSHELF +#define M60Q9 ( -30720 ) //-60 in Q9 +#define M120Q8 ( -30720 ) //-120 in Q8 +#endif + const Word16 init_loop_delay[IVAS_REV_MAX_NR_BRANCHES] = { 37, 31, 29, 23, 19, 17, 13, 11 }; const Word16 default_loop_delay_48k[IVAS_REV_MAX_NR_BRANCHES] = { 2309, 1861, 1523, 1259, 1069, 919, 809, 719 }; const Word16 default_loop_delay_32k[IVAS_REV_MAX_NR_BRANCHES] = { 1531, 1237, 1013, 839, 709, 613, 541, 479 }; @@ -658,15 +663,19 @@ static ivas_error compute_t60_coeffs_fx( { Word16 bin_idx, loop_idx, tf_T60_len, len; ivas_error error; - +#ifdef FIX_1942_ASSERTION_LOWSHELF + Word16 loop_delay_sec_fx, tmp, tmp_e; +#else Word16 loop_delay_sec_fx, tmp; +#endif Word32 freq_Nyquist_fx = L_shr( output_Fs, 1 ); Word16 target_gains_db_fx[RV_LENGTH_NR_FC]; // Q8 Word16 norm_f_fx[RV_LENGTH_NR_FC]; Word16 *pCoeffs_a_fx, *pCoeffs_b_fx; Word16 e; +#ifndef FIX_1942_ASSERTION_LOWSHELF const Word16 min120q8 = -30720; // -120 in Q8 - +#endif error = IVAS_ERR_OK; move32(); tf_T60_len = nr_fc_fft_filter; @@ -692,11 +701,47 @@ static ivas_error compute_t60_coeffs_fx( IF( EQ_32( pParams->pRt60_fx[bin_idx], 0 ) ) { // If RT60 is 0, target gain is -120dB +#ifdef FIX_1942_ASSERTION_LOWSHELF + target_gains_db_fx[bin_idx] = M120Q8; + move16(); +#else target_gains_db_fx[bin_idx] = min120q8; +#endif } ELSE { tmp = BASOP_Util_Divide3232_Scale( L_deposit_h( loop_delay_sec_fx ), pParams->pRt60_fx[bin_idx], &e ); +#ifdef FIX_1942_ASSERTION_LOWSHELF + tmp_e = add( e, sub( 0, 5 ) ); // L_deposit_h( loop_delay_sec_fx ):Q0.31, pParams->pRt60_fx[bin_idx]:Q5.26 + + tmp_e = add( tmp_e, 6 ); // + Q6.9(M60Q9) + target_gains_db_fx[bin_idx] = mult( M60Q9, tmp ); + + // gain < - 120 ? -120: gain + tmp_e = sub( tmp_e, 7 ); // - Q7.8(M120Q8) + IF( GT_16( tmp_e, 0 ) ) + { + IF( LT_16( target_gains_db_fx[bin_idx], shr( M120Q8, tmp_e ) ) ) + { + target_gains_db_fx[bin_idx] = M120Q8; // Q8 + move16(); + } + ELSE + { + target_gains_db_fx[bin_idx] = shl_r( target_gains_db_fx[bin_idx], tmp_e ); // Q8, gain must be less than 128 + } + } + ELSE + { + target_gains_db_fx[bin_idx] = shl_r( target_gains_db_fx[bin_idx], tmp_e ); // Q8, gain must be less than 128 + IF( LT_16( target_gains_db_fx[bin_idx], M120Q8 ) ) + { + target_gains_db_fx[bin_idx] = M120Q8; // Q8 + move16(); + } + } + } +#else IF( LT_16( e, -1 ) ) { target_gains_db_fx[bin_idx] = min120q8; @@ -713,6 +758,7 @@ static ivas_error compute_t60_coeffs_fx( target_gains_db_fx[bin_idx] = -30720; move16(); } +#endif } pCoeffs_a_fx = &pParams->pT60_filter_coeff_fx[add( shl( i_mult( len, loop_idx ), 1 ), len )]; // Q14 @@ -996,6 +1042,13 @@ static ivas_error calc_jot_t60_coeffs_fx( L_tmp = BASOP_util_Pow2( L_deposit_h( tmp_fx ), exph, &e ); lin_gain_hf_fx = extract_l( L_shr( L_tmp, sub( 16, e ) ) ); +#ifdef FIX_1942_ASSERTION_LOWSHELF + IF( EQ_16( lin_gain_hf_fx, 0 ) ) + { + lin_gain_hf_fx = 1; + move16(); + } +#endif /* call low-pass iir shelf */ calc_low_shelf_first_order_filter_fx( pCoeffB_fx, pCoeffA_fx, f0_fx, lin_gain_lf_fx, lin_gain_hf_fx ); return IVAS_ERR_OK; @@ -1414,11 +1467,11 @@ static ivas_error setup_FDN_branches_fx( * Allocate and initialize FDN reverberation handle *------------------------------------------------------------------------*/ #else - /*------------------------------------------------------------------------- - * ivas_reverb_open_fx() - * - * Allocate and initialize Crend reverberation handle - *------------------------------------------------------------------------*/ +/*------------------------------------------------------------------------- + * ivas_reverb_open_fx() + * + * Allocate and initialize Crend reverberation handle + *------------------------------------------------------------------------*/ #endif ivas_error ivas_reverb_open_fx( REVERB_HANDLE *hReverb, /* i/o: Reverberator handle */