diff --git a/lib_com/options.h b/lib_com/options.h index cce0aff4601d055c7f111b7ef353d7739ee978c7..97d2a966f8f8b8b4603300a0c439085c15bf77b9 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -138,7 +138,8 @@ #ifdef LSF_RE_USE_SECONDARY_CHANNEL /*#define LSF_RE_USE_SECONDARY_CHANNEL_REUSEMODE */ /* switch to isolate the reuse mode case */ #endif -#define DISABLE_ADAP_RES_COD_TMP /* temporary fix for IVAS-403, disables adaptive residual coding */ +/*#define DISABLE_ADAP_RES_COD_TMP */ /* temporary fix for IVAS-403, disables adaptive residual coding */ +#define ADAP_OPT /* Issue 69: optimized the adap algorithm */ /*#define ITD_WINNER_GAIN_MODIFY */ /* ITD optimization - WORK IN PROGRESS */ /*#define FIX_I4_OL_PITCH*/ /* fix open-loop pitch used for EVS core switching */ #define FIX_103_RA_PARAMS_PARAM_BIN_REND /* Issue 103: Digest room acoustics parameters for Parametric Binaural Renderer*/ diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 6638a8948893cd39c5278f7d59122448c75a1237..5d89d3dab583d377b991a382fbf02d62407ac2b9 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -270,6 +270,9 @@ typedef struct stereo_dft_enc_data_struct float res_cod_NRG_S[STEREO_DFT_BAND_MAX]; float res_cod_SNR_M[STEREO_DFT_BAND_MAX]; float old_snr; +#ifdef ADAP_OPT + int16_t first_frm_flag; /* ADAP first frame flag */ +#endif /* flags and data for adaptive wideband residual coding */ float res_dmx_ratio_lt; /* long term energy ratio between RES and DMX */ diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index ab4844ab944067f4a519135e05b06574f6d460f5..b5be17f09fe10a4ec554249b8428e23e6c25fa04 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -520,6 +520,10 @@ void stereo_dft_enc_reset( hStereoDft->hItd->prev_itd1 = 0; hStereoDft->hItd->prev_itd2 = 0; +#ifdef ADAP_OPT + hStereoDft->first_frm_flag = 1; +#endif + #ifdef DEBUG_MODE_DFT hStereoDft->verbose = 1; #endif @@ -1657,8 +1661,11 @@ void stereo_dft_enc_process( if ( hStereoDft->NFFT == STEREO_DFT_N_16k_ENC && hStereoDft->hConfig->ada_wb_res_cod_mode ) { stereo_dft_enc_get_res_cod_mode_flag( hStereoDft, res_nrg_all_curr, dmx_nrg_all_curr, &res_dmx_ratio, &frame_nrg_ratio ); - +#ifdef ADAP_OPT + if (hStereoDft->res_cod_sw_flag) +#else if ( hStereoDft->res_cod_mode[k_offset] == STEREO_DFT_RES_COD_OFF || hStereoDft->res_cod_sw_flag ) +#endif { int16_t res_cod_band_max; @@ -1759,6 +1766,16 @@ static void stereo_dft_enc_get_res_cod_mode_flag( } /* Calculate long term energy ratio between residual signal and downmix signal */ +#ifdef ADAP_OPT + if (fast_update_flag) + { + hStereoDft->res_dmx_ratio_lt = *res_dmx_ratio * 0.2f + hStereoDft->res_dmx_ratio_lt * 0.8f; + } + else + { + hStereoDft->res_dmx_ratio_lt = *res_dmx_ratio * 0.05f + hStereoDft->res_dmx_ratio_lt * 0.95f; + } +#else if ( fast_update_flag ) { hStereoDft->res_dmx_ratio_lt = *res_dmx_ratio * 0.5f + hStereoDft->res_dmx_ratio_lt * 0.5f; @@ -1767,9 +1784,13 @@ static void stereo_dft_enc_get_res_cod_mode_flag( { hStereoDft->res_dmx_ratio_lt = *res_dmx_ratio * 0.1f + hStereoDft->res_dmx_ratio_lt * 0.9f; } - +#endif /*Get the residual signal coding initial flag */ +#ifdef ADAP_OPT + if (hStereoDft->res_dmx_ratio_lt > 0.01f) +#else if ( hStereoDft->res_dmx_ratio_lt > 0.075f ) +#endif { res_cod_mode_flag = 1; } @@ -1779,12 +1800,28 @@ static void stereo_dft_enc_get_res_cod_mode_flag( } /* Get the residual signal coding flag */ +#ifdef ADAP_OPT + if ( hStereoDft->first_frm_flag ) + { + prev_res_cod_mode_flag = res_cod_mode_flag; + hStereoDft->first_frm_flag = 0; + } + else + { + prev_res_cod_mode_flag = hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1]; + } +#else prev_res_cod_mode_flag = hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1]; +#endif if ( res_cod_mode_flag != prev_res_cod_mode_flag ) { if ( prev_res_cod_mode_flag == 1 ) { +#ifdef ADAP_OPT + if (hStereoDft->hangover_cnt0 < 5 && hStereoDft->last_res_cod_mode_modify_flag == 0 && fast_update_flag == 0) +#else if ( hStereoDft->hangover_cnt0 < 3 && hStereoDft->last_res_cod_mode_modify_flag == 0 && fast_update_flag == 0 ) +#endif { res_cod_mode_flag = prev_res_cod_mode_flag; hStereoDft->hangover_cnt0++; @@ -1804,7 +1841,11 @@ static void stereo_dft_enc_get_res_cod_mode_flag( } else { +#ifdef ADAP_OPT + if (hStereoDft->hangover_cnt1 < 5) +#else if ( hStereoDft->hangover_cnt1 < 3 ) +#endif { res_cod_mode_flag = prev_res_cod_mode_flag; hStereoDft->hangover_cnt1++;