diff --git a/lib_com/options.h b/lib_com/options.h index fdd446d31694e74a651790cdc85f28dd6ca2f519..5390fd919b424d1cbb634d663986f69f38f87b69 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -127,6 +127,7 @@ #define FIX_BASOP_2517_CLICK_IN_OMASA_LTV /* FhG: BASOP #2517: preserve precision by removing one-bit headroom from Q_min and allowing saturation during buffer scaling */ #define NONBE_FIX_ISSUE_2518 /* FhG: Fix issue 2518, noise during ACELP switching from 16KHz to 12k8Hz by improving Q_new calculation. */ #define NONBE_FIX_ISSUE_2518_TRANSENC_SAT_FIX /* FhG: Fix issue 2518, fix wrong amplitude because of saturation of x_tran in transf_cdbk_enc_fx() for transient signals. */ +#define NONBE_FIX_ISSUE_2569 /* FhG: Fix issue 2569, overflow of mem_preemph16k_fx in LTV test. */ #define FIX_BASOP_2559_Q_SYNTH_HISTORY_RESET /* FhG: BASOP issue 2559: reset hTcxDec->q_synth_history_fx in allocate_CoreCoder_TCX_fx() */ #define FIX_FLOAT_1578_OMASA_REND_SPIKES /* Nokia: Float issue 1578: Fix spikes and collapsed perception in OMASA/MASA rendering to FOA/HOA */ #define FIX_1521_SBA_LOUDNESS_STEREO /* FhG: issue 1521: Fix loudness for SBA to stereo rendering */ diff --git a/lib_enc/ivas_core_pre_proc_front_fx.c b/lib_enc/ivas_core_pre_proc_front_fx.c index 77be7fe6ddeffe3b78136ebc404aa9a0beaa302b..92f753704dee43cdf59c331724bbab92b1d68383 100644 --- a/lib_enc/ivas_core_pre_proc_front_fx.c +++ b/lib_enc/ivas_core_pre_proc_front_fx.c @@ -755,6 +755,9 @@ void pre_proc_front_ivas_fx( /* Avoid saturation of resampling/delay decimation buffer. */ shift = s_min( shift, st->q_mem_decim16k_fx ); +#ifdef NONBE_FIX_ISSUE_2569 + shift = s_min( shift, add( -1, norm_arr( &st->mem_preemph16k_fx, 1 ) ) ); +#endif /* Limit Q_new here to st->q_inp because inside ivas_compute_core_buffers_fx() st->input is rescaled to Q_new */ shift = s_min( shift, st->q_inp ); diff --git a/lib_enc/ivas_core_pre_proc_fx.c b/lib_enc/ivas_core_pre_proc_fx.c index 014ea9ea7c2b3780433f285da1ba9c87073d770e..f315da04b8cc46d89150d9d7fd496f135da4563b 100644 --- a/lib_enc/ivas_core_pre_proc_fx.c +++ b/lib_enc/ivas_core_pre_proc_fx.c @@ -706,7 +706,11 @@ void pre_proc_ivas_fx( #ifdef NONBE_FIX_ISSUE_2206 // L_FRAME16k + L_SUBFR + L_FRAME16k + L_NEXT_MAX_16k + 320 ); tmp = add( norm_arr( wsp_fx, L_FRAME + L_LOOK_12k8 ), sub( Q15, e_old_wsp ) ); +#ifdef NONBE_FIX_ISSUE_2569 + tmp = s_min( tmp, add( norm_arr( &st->mem_wsp_enc, 1 ), sub( Q15, st->exp_buf_wspeech_enc ) ) ); +#else tmp = s_min( tmp, add( norm_s( st->mem_wsp_enc ), sub( Q15, st->exp_buf_wspeech_enc ) ) ); +#endif tmp = s_min( tmp, add( norm_arr( st->buf_wspeech_enc, (Word16) ( st->wspeech_enc - st->buf_wspeech_enc ) ), sub( Q15, st->exp_buf_wspeech_enc ) ) ); tmp = s_min( tmp, add( norm_arr( st->wspeech_enc + L_FRAME + L_LOOK_12k8, /* L_NEXT_MAX_16k + */ 320 ), sub( Q15, st->exp_buf_wspeech_enc ) ) ); tmp = s_min( Q15, tmp ); @@ -1271,7 +1275,19 @@ void ivas_compute_core_buffers_fx( IF( EQ_16( st->L_frame, L_FRAME16k ) ) { #ifdef NONBE_FIX_ISSUE_2206 +#ifdef NONBE_FIX_ISSUE_2569 + Word16 buf_speech_enc_q; + + buf_speech_enc_q = s_min( sub( Q15, st->exp_buf_speech_enc ), Q_old_inp_16k ); + Copy_Scale_sig_nosat( new_inp_16k_fx - lMemRecalc_16k, st->buf_speech_enc + sub( L_FRAME16k - L_FILT16k, lMemRecalc_16k ), add( lMemRecalc_16k, L_FRAME16k + L_FILT16k ), sub( buf_speech_enc_q, Q_old_inp_16k ) ); + // L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k + scale_sig( st->buf_speech_enc, sub( L_FRAME16k - L_FILT16k, lMemRecalc_16k ), sub( buf_speech_enc_q, sub( Q15, st->exp_buf_speech_enc ) ) ); + scale_sig( st->buf_speech_enc + L_FRAME16k + L_FRAME16k, L_PAST_MAX_32k + L_NEXT_MAX_32k, sub( buf_speech_enc_q, sub( Q15, st->exp_buf_speech_enc ) ) ); + st->exp_buf_speech_enc = sub( Q15, buf_speech_enc_q ); + move16(); +#else Copy_Scale_sig_nosat( new_inp_16k_fx - lMemRecalc_16k, st->buf_speech_enc + sub( L_FRAME16k - L_FILT16k, lMemRecalc_16k ), add( lMemRecalc_16k, L_FRAME16k + L_FILT16k ), sub( sub( Q15, st->exp_buf_speech_enc ), Q_old_inp_16k ) ); /* Q_new - 1 */ +#endif #else Copy( new_inp_16k_fx - lMemRecalc_16k, st->buf_speech_enc + sub( L_FRAME16k - L_FILT16k, lMemRecalc_16k ), add( lMemRecalc_16k, L_FRAME16k + L_FILT16k ) ); /* Q_new - 1 */ #endif @@ -1320,8 +1336,10 @@ void ivas_compute_core_buffers_fx( shift = s_min( shift, norm_arr( old_inp_16k_fx, (Word16) ( preemp_start_idx - old_inp_16k_fx ) ) ); shift = add( shift, Q_old_inp_16k ); +#ifndef NONBE_FIX_ISSUE_2569 /* Avoid saturation of resampling/delay decimation buffer. */ shift = s_min( shift, add( st->q_mem_decim16k_fx, 1 ) ); +#endif IF( st->hLPDmem != NULL ) { diff --git a/lib_enc/updt_enc_fx.c b/lib_enc/updt_enc_fx.c index 9224b1081343fb5b130dae255ec461b4ddb0670d..bc48bfb7b3c6fd4978051ec12d50fb5cb4b148b1 100644 --- a/lib_enc/updt_enc_fx.c +++ b/lib_enc/updt_enc_fx.c @@ -55,9 +55,12 @@ void updt_enc_fx( tmp = s_min( tmp, norm_arr( hLPDmem->mem_syn2, M ) ); tmp = s_min( tmp, norm_arr( hLPDmem->mem_syn3, M ) ); tmp = s_min( tmp, norm_arr( hLPDmem->mem_syn_r, L_SYN_MEM ) ); +#ifdef NONBE_FIX_ISSUE_2569 + tmp = s_min( tmp, norm_arr( &hLPDmem->mem_w0, 1 ) ); +#else tmp = s_min( tmp, norm_s( hLPDmem->mem_w0 ) ); +#endif tmp = s_min( tmp, sub( 15, hLPDmem->q_mem_syn ) ); - // tmp = sub( tmp, 1 ); scale_sig( hLPDmem->mem_syn, M, tmp ); scale_sig( hLPDmem->mem_syn1_fx, M, tmp ); scale_sig( hLPDmem->mem_syn2, M, tmp );