diff --git a/lib_com/options.h b/lib_com/options.h index b23661f4d59d466450a70650f8192553fcf05588..89b70e7b1a7882762f49b60276f60dc4578d43c1 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -156,10 +156,9 @@ #define FIX_FIX_I59 /* Issue 59: small fix concerning LFE delay rounding */ #define FIX_I59_CREND /* Issue 59: Fixes for gcc compiler warnings in ivas_crend_utest_utils.c */ #define LOW_RATE_TRANS /* Eri: Contribution 20: low rate encoding of transients */ - - - #define MC_BITRATE_SWITCHING /* Issue 116: support bitrate switching in MC format */ +#define SIMPLIFY_TD_BWE_RESET /* Issue 250: Resolve "TB-BWE state memories reset simplification" */ + /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_com/prot.h b/lib_com/prot.h index 5f48ddc8250f564d658f3be88ee1614203e56124..c48cdcd912239ece419d6fc3ae28119186464e4e 100755 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -2623,6 +2623,13 @@ void InitSWBencBuffer( TD_BWE_ENC_HANDLE hBWE_TD /* i/o: TD BWE data handle */ ); +#ifdef SIMPLIFY_TD_BWE_RESET +void InitSWBencBufferStates( + TD_BWE_ENC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ + float *shb_speech /* o : SHB target signal (6-14kHz) at 16kHz */ +); +#endif + void swb_tbe_enc( Encoder_State *st, /* i/o: encoder state structure */ STEREO_ICBWE_ENC_HANDLE hStereoICBWE, /* i/o: IC-BWE state structure */ diff --git a/lib_enc/core_switching_enc.c b/lib_enc/core_switching_enc.c index 6102bd5f6755e9bbd2a7e0e5d6b0bddd13afba4a..8eba36afc15044cfef70e8250fc828030ebf61ed 100644 --- a/lib_enc/core_switching_enc.c +++ b/lib_enc/core_switching_enc.c @@ -401,6 +401,9 @@ void core_switching_post_enc( ( st->last_core == HQ_CORE || st->L_frame != st->last_L_frame || ( st->last_extl != SWB_TBE && st->last_extl != FB_TBE && st->last_core != TCX_20_CORE && st->last_core != TCX_10_CORE ) ) ) { set_f( st->hBWE_TD->state_ana_filt_shb, 0.0f, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) ); +#ifdef SIMPLIFY_TD_BWE_RESET + InitSWBencBufferStates( st->hBWE_TD, NULL ); +#else set_f( st->hBWE_TD->old_speech_shb, 0.0f, L_LOOK_16k + L_SUBFR16k ); set_f( st->hBWE_TD->mem_shb_res, 0.0f, MAX_LEN_MA_FILTER ); set_f( st->hBWE_TD->old_EnvSHBres, 0.0f, L_FRAME4k ); @@ -410,6 +413,7 @@ void core_switching_post_enc( st->hBWE_TD->prev_pow_exc16kWhtnd = 1.0f; st->hBWE_TD->prev_mix_factor = 1.0f; st->hBWE_TD->prev_Env_error = 0.0f; +#endif swb_tbe_reset( st->hBWE_TD->mem_csfilt, st->hBWE_TD->mem_genSHBexc_filt_down_shb, st->hBWE_TD->state_lpc_syn, st->hBWE_TD->syn_overlap, st->hBWE_TD->state_syn_shbexc, &( st->hBWE_TD->tbe_demph ), &( st->hBWE_TD->tbe_premph ), st->hBWE_TD->mem_stp_swb, &( st->hBWE_TD->gain_prec_swb ) ); diff --git a/lib_enc/evs_enc.c b/lib_enc/evs_enc.c index 8eb9bd9623162cbb6029c69a6f47c0771213b3dd..2a9e05f205920b115407bb6228b2d8faaf06ec21 100644 --- a/lib_enc/evs_enc.c +++ b/lib_enc/evs_enc.c @@ -163,6 +163,7 @@ ivas_error evs_enc( if ( st->last_core == AMR_WB_CORE ) { updt_IO_switch_enc( st, input_frame ); +#ifndef SIMPLIFY_TD_BWE_RESET set_f( st->hBWE_TD->old_speech_shb, 0, L_LOOK_16k + L_SUBFR16k ); set_f( st->hBWE_TD->mem_shb_res, 0.0f, MAX_LEN_MA_FILTER ); set_f( st->hBWE_TD->old_EnvSHBres, 0.0f, L_FRAME4k ); @@ -174,6 +175,7 @@ ivas_error evs_enc( st->hBWE_TD->prev_Env_error = 0.0f; cldfb_reset_memory( st->cldfbAnaEnc ); cldfb_reset_memory( st->cldfbSynTd ); +#endif } /*---------------------------------------------------------------------* @@ -426,6 +428,9 @@ ivas_error evs_enc( } else if ( st->input_Fs >= 32000 ) { +#ifdef SIMPLIFY_TD_BWE_RESET + InitSWBencBufferStates( st->hBWE_TD, shb_speech ); +#else set_f( st->hBWE_TD->old_speech_shb, 0.0f, L_LOOK_16k + L_SUBFR16k ); set_f( shb_speech, 0.0f, L_FRAME16k ); set_f( st->hBWE_TD->mem_shb_res, 0.0f, MAX_LEN_MA_FILTER ); @@ -436,6 +441,7 @@ ivas_error evs_enc( st->hBWE_TD->prev_pow_exc16kWhtnd = 1.0f; st->hBWE_TD->prev_mix_factor = 1.0f; st->hBWE_TD->prev_Env_error = 0.0f; +#endif } /* SWB TBE encoder */ diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c index edef26a6c2db2382e3bb3e11555dccb92baa3bce..3f600dc6e7d09edfcdbd3aebfa0a67cfc70912b8 100644 --- a/lib_enc/ivas_core_enc.c +++ b/lib_enc/ivas_core_enc.c @@ -343,6 +343,9 @@ ivas_error ivas_core_enc( { if ( st->hBWE_TD != NULL ) { +#ifdef SIMPLIFY_TD_BWE_RESET + InitSWBencBufferStates( st->hBWE_TD, shb_speech ); +#else set_f( st->hBWE_TD->old_speech_shb, 0.0f, L_LOOK_16k + L_SUBFR16k ); set_f( shb_speech, 0.0f, L_FRAME16k ); set_f( st->hBWE_TD->mem_shb_res, 0.0f, MAX_LEN_MA_FILTER ); @@ -353,6 +356,7 @@ ivas_error ivas_core_enc( st->hBWE_TD->prev_pow_exc16kWhtnd = 1.0f; st->hBWE_TD->prev_mix_factor = 1.0f; st->hBWE_TD->prev_Env_error = 0.0f; +#endif } } diff --git a/lib_enc/swb_pre_proc.c b/lib_enc/swb_pre_proc.c index 4d6eaf7836788e2484075243fa30722c18fe72f0..83b0deab6c769ba2d0f7d14120ca6169182aa4e0 100644 --- a/lib_enc/swb_pre_proc.c +++ b/lib_enc/swb_pre_proc.c @@ -677,6 +677,9 @@ void swb_pre_proc( { if ( ( st->bwidth == FB || st->core == ACELP_CORE ) && ( st->element_mode == EVS_MONO ) ) { +#ifdef SIMPLIFY_TD_BWE_RESET + InitSWBencBufferStates( st->hBWE_TD, shb_speech ); +#else set_f( hBWE_TD->old_speech_shb, 0, L_LOOK_16k + L_SUBFR16k ); set_f( shb_speech, 0, L_FRAME16k ); /* shb_speech for FB/SWB BWE_HIGHRATE is not used at 64kbps */ set_f( st->hBWE_TD->mem_shb_res, 0.0f, MAX_LEN_MA_FILTER ); @@ -687,6 +690,7 @@ void swb_pre_proc( st->hBWE_TD->prev_pow_exc16kWhtnd = 1.0f; st->hBWE_TD->prev_mix_factor = 1.0f; st->hBWE_TD->prev_Env_error = 0.0f; +#endif } else { diff --git a/lib_enc/swb_tbe_enc.c b/lib_enc/swb_tbe_enc.c index 036611efb314f51a2361109701b45942b669c53b..cf2470ed8bacfeb090e51c4ee5d5fcb2044db3a4 100644 --- a/lib_enc/swb_tbe_enc.c +++ b/lib_enc/swb_tbe_enc.c @@ -76,9 +76,9 @@ static void gainFrSmooth_En( TD_BWE_ENC_HANDLE hBWE_TD, const int16_t last_extl, static void Quant_BWE_LSF( BSTR_ENC_HANDLE hBstr, TD_BWE_ENC_HANDLE hBWE_TD, const int16_t codec_mode, const float lsp_shb[], float Q_lsfs[], const int32_t extl_brate ); static void Quant_shb_ener_sf( Encoder_State *st, float *shb_ener_sf ); static void Quant_shb_res_gshape( Encoder_State *st, float *shb_res_gshape ); - static void LVQQuant_BWE_LSF( BSTR_ENC_HANDLE hBstr, const float lsf_shb[], float Q_lsfs[], int16_t nbits ); + /*-------------------------------------------------------------------* * InitSWBencBuffer() * @@ -108,6 +108,10 @@ void InitSWBencBuffer( set_f( hBWE_TD->old_speech_shb, 0.0f, L_LOOK_16k + L_SUBFR16k ); set_f( hBWE_TD->old_speech_wb, 0.0f, ( L_LOOK_12k8 + L_SUBFR ) * 5 / 16 ); set_f( hBWE_TD->old_input_fhb, 0.0f, NS2SA( 48000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_12k8_NS + DELAY_FIR_RESAMPL_NS ) - L_FRAME48k / 2 ); + +#ifdef SIMPLIFY_TD_BWE_RESET + InitSWBencBufferStates( hBWE_TD, NULL ); +#else set_f( hBWE_TD->mem_shb_res, 0.0f, MAX_LEN_MA_FILTER ); set_f( hBWE_TD->old_EnvSHBres, 0.0f, L_FRAME4k ); hBWE_TD->old_mean_EnvSHBres = 0.0f; @@ -116,6 +120,7 @@ void InitSWBencBuffer( hBWE_TD->prev_pow_exc16kWhtnd = 1.0f; hBWE_TD->prev_mix_factor = 1.0f; hBWE_TD->prev_Env_error = 0.0f; +#endif for ( i = 0; i < LPC_SHB_ORDER; i++ ) { @@ -156,6 +161,38 @@ void InitSWBencBuffer( } +#ifdef SIMPLIFY_TD_BWE_RESET +/*-------------------------------------------------------------------* + * InitSWBencBufferStates() + * + * Initialize SWB buffer states + *-------------------------------------------------------------------*/ + +void InitSWBencBufferStates( + TD_BWE_ENC_HANDLE hBWE_TD, /* i/o: TD BWE data handle */ + float *shb_speech /* o : SHB target signal (6-14kHz) at 16kHz */ +) +{ + if ( shb_speech != NULL ) + { + set_f( shb_speech, 0.0f, L_FRAME16k ); + } + + set_f( hBWE_TD->old_speech_shb, 0.0f, L_LOOK_16k + L_SUBFR16k ); + set_f( hBWE_TD->mem_shb_res, 0.0f, MAX_LEN_MA_FILTER ); + set_f( hBWE_TD->old_EnvSHBres, 0.0f, L_FRAME4k ); + hBWE_TD->old_mean_EnvSHBres = 0.0f; + hBWE_TD->prev_enr_EnvSHBres = 1.0f; + hBWE_TD->prev_shb_env_tilt = 0.0f; + hBWE_TD->prev_pow_exc16kWhtnd = 1.0f; + hBWE_TD->prev_mix_factor = 1.0f; + hBWE_TD->prev_Env_error = 0.0f; + + return; +} +#endif + + /*-------------------------------------------------------------------* * ResetSHBbuffer_Enc() * diff --git a/lib_enc/updt_enc.c b/lib_enc/updt_enc.c index 37f50c8cefe9dd351c770b1057e879080ef851c6..16af04550e656246835d1a84defc36f2ae6bb452 100644 --- a/lib_enc/updt_enc.c +++ b/lib_enc/updt_enc.c @@ -188,10 +188,15 @@ void updt_IO_switch_enc( preemph( st->old_inp_16k, PREEMPH_FAC_16k, L_INP_MEM, &( st->mem_preemph16k ) ); /* reset TD BWE buffers */ +#ifndef SIMPLIFY_TD_BWE_RESET set_f( st->hBWE_TD->old_speech_shb, 0.0f, L_LOOK_16k + L_SUBFR16k ); +#endif set_f( st->hBWE_TD->old_speech_wb, 0.0f, ( L_LOOK_12k8 + L_SUBFR ) * 5 / 16 ); set_f( st->hBWE_TD->old_bwe_exc, 0.0f, PIT16k_MAX * 2 ); set_f( st->hBWE_TD->old_bwe_exc_extended, 0.0f, NL_BUFF_OFFSET ); +#ifdef SIMPLIFY_TD_BWE_RESET + InitSWBencBufferStates( st->hBWE_TD, NULL ); +#else set_f( st->hBWE_TD->mem_shb_res, 0.0f, MAX_LEN_MA_FILTER ); set_f( st->hBWE_TD->old_EnvSHBres, 0.0f, L_FRAME4k ); st->hBWE_TD->old_mean_EnvSHBres = 0.0f; @@ -199,6 +204,7 @@ void updt_IO_switch_enc( st->hBWE_TD->prev_pow_exc16kWhtnd = 1.0f; st->hBWE_TD->prev_mix_factor = 1.0f; st->hBWE_TD->prev_Env_error = 0.0f; +#endif st->hBWE_TD->bwe_non_lin_prev_scale = 0.0; set_f( st->hBWE_TD->decim_state1, 0.0f, ( 2 * ALLPASSSECTIONS_STEEP + 1 ) );