From e0f3d16ff3bde201f3ee8828964a8ba2a9a2d1ff Mon Sep 17 00:00:00 2001 From: vaclav Date: Thu, 15 Dec 2022 17:19:19 +0100 Subject: [PATCH] fix Issue 250: Resolve "TB-BWE state memories reset simplification" ; under SIMPLIFY_TD_BWE_RESET --- lib_com/options.h | 2 ++ lib_com/prot.h | 7 +++++++ lib_enc/core_switching_enc.c | 4 ++++ lib_enc/evs_enc.c | 6 ++++++ lib_enc/ivas_core_enc.c | 4 ++++ lib_enc/swb_pre_proc.c | 4 ++++ lib_enc/swb_tbe_enc.c | 39 +++++++++++++++++++++++++++++++++++- lib_enc/updt_enc.c | 6 ++++++ 8 files changed, 71 insertions(+), 1 deletion(-) diff --git a/lib_com/options.h b/lib_com/options.h index e46be24d68..18a1aa4d73 100755 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -163,6 +163,8 @@ #define FIX_ISM_INACTIVE_BITS /* Issue 230: fix bitbudget distribution in inactive frames in ISM format */ #define IMPROVE_CMDLINE_ROBUSTNESS /* Issue 233: Improve robustness of command-line parameters */ #define FIX_MDCT_AND_MC_MONO_ISSUES /* Issue 242: Fix some issues with TCX-LTP and delay alignement for mono output */ +#define SIMPLIFY_TD_BWE_RESET /* Issue 250: Resolve "TB-BWE state memories reset simplification" */ + /* ################## End DEVELOPMENT switches ######################### */ /* clang-format on */ diff --git a/lib_com/prot.h b/lib_com/prot.h index 973f15ef5a..fb595ec27f 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -2619,6 +2619,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 6102bd5f67..8eba36afc1 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 29b610db79..043e3fdbb9 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 dc3247cbfb..6509432e87 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 4d6eaf7836..83b0deab6c 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 036611efb3..cf2470ed8b 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 c6663895e0..8cd10a493f 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 ) ); -- GitLab