From 78a637ffc07ec19448558d94b82fe2846dfb0067 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 22 Nov 2024 15:54:14 +0530 Subject: [PATCH] Encoder float code cleanup and ltv crash fixes --- lib_com/ivas_prot.h | 6 +- lib_com/ivas_prot_fx.h | 7 +- lib_com/preemph_fx.c | 35 ++++ lib_com/prot.h | 20 +- lib_com/prot_fx.h | 11 +- lib_enc/acelp_core_enc.c | 74 ++------ lib_enc/core_switching_enc.c | 13 +- lib_enc/corr_xh_fx.c | 6 +- lib_enc/enc_ppp_fx.c | 187 ++++++++++++++++++ lib_enc/enc_tran_fx.c | 4 +- lib_enc/enc_uv_fx.c | 4 +- lib_enc/gain_enc_fx.c | 4 +- lib_enc/inov_enc_fx.c | 15 +- lib_enc/ivas_core_enc.c | 70 ++++--- lib_enc/ivas_core_pre_proc.c | 291 ++++++++++++++++++++++++----- lib_enc/ivas_core_pre_proc_front.c | 2 +- lib_enc/ivas_cpe_enc.c | 12 +- lib_enc/ivas_ism_enc.c | 13 +- lib_enc/ivas_mc_param_enc.c | 14 +- lib_enc/ivas_sce_enc.c | 6 +- lib_enc/ivas_tcx_core_enc.c | 29 +-- lib_enc/ivas_td_low_rate_enc.c | 2 +- lib_enc/prot_fx_enc.h | 14 ++ lib_enc/stat_enc.h | 2 +- 24 files changed, 633 insertions(+), 208 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 1ccd0b332..893defd4e 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -311,7 +311,8 @@ ivas_error pre_proc_ivas( Word16 e_enerBuffer, Word16 fft_buff_fx[2 * L_FFT], Word32 cor_map_sum_fx, - Word16 exp_cor_map_sum + Word16 exp_cor_map_sum, + Word16 *Q_new #endif ); @@ -622,7 +623,8 @@ void stereo_tcx_core_enc( float lsp_mid[], /* i : LSPs in the middle of the frame, Q15 */ Word16 pitch_buf_fx[NB_SUBFR16k], /* o : pitch for each subframe, Q6 */ const Word16 last_element_mode, /* i : last element mode, Q0 */ - const Word16 vad_hover_flag /* i : VAD hangover flag, Q0 */ + const Word16 vad_hover_flag, /* i : VAD hangover flag, Q0 */ + Word16 Q_new ); #endif diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 0189a0862..b4ff332f5 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -3089,8 +3089,8 @@ void stereo_tcx_core_enc( Word16 lsp_mid_fx[], /* i : LSPs in the middle of the frame, Q15 */ Word16 pitch_buf_fx[NB_SUBFR16k], /* o : pitch for each subframe, Q6 */ const Word16 last_element_mode, /* i : last element mode, Q0 */ - const Word16 vad_hover_flag /* i : VAD hangover flag, Q0 */ -); + const Word16 vad_hover_flag, /* i : VAD hangover flag, Q0 */ + Word16 Q_new ); Word16 transient_analysis_ivas_fx( @@ -5846,7 +5846,8 @@ ivas_error ivas_compute_core_buffers_fx( Word16 lsp_new_fx[M], /* i/o: LSPs at the end of the frame */ Word16 lsp_mid_fx[M], /* i/o: LSPs in the middle of the frame */ Word16 Q_old_inp_16k, - Word16 Q_r[2] ); + Word16 Q_r[2], + Word16 *Q_new ); ivas_error ivas_enc_fx( Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */ diff --git a/lib_com/preemph_fx.c b/lib_com/preemph_fx.c index ee0379fdb..0864323b4 100644 --- a/lib_com/preemph_fx.c +++ b/lib_com/preemph_fx.c @@ -44,6 +44,41 @@ void preemph_copy_fx( move16(); } +void preemph_copy_32fx( + const Word16 x[], /* i : input signal Qx */ + Word32 y[], /* o : output signal Qx */ + const Word16 mu, /* i : preemphasis coefficient Q15 */ + const Word16 lg, /* i : vector size Q0 */ + Word16 *mem /* i/o: memory (x[-1]) Qx */ +) +{ + Word16 i, temp; +#ifdef BASOP_NOGLOB_DECLARE_LOCAL + Flag Overflow = 0; + move32(); +#endif + temp = x[lg - 1]; /* Qx */ + move16(); + FOR( i = lg - 1; i > 0; i-- ) + { +#ifdef BASOP_NOGLOB + y[i] = L_msu_o( L_deposit_h( x[i] ), x[i - 1], mu, &Overflow ); /* Qx+16 */ +#else + y[i] = L_msu( L_deposit_h( x[i] ), x[i - 1], mu ); +#endif + move16(); + } +#ifdef BASOP_NOGLOB + y[0] = L_msu_o( L_deposit_h( x[0] ), *mem, mu, &Overflow ); /* Qx+16 */ +#else + y[0] = L_msu( L_deposit_h( x[0] ), *mem, mu ); +#endif + move16(); + + *mem = temp; /* Qx */ + move16(); +} + /* * E_UTIL_f_preemph2 * diff --git a/lib_com/prot.h b/lib_com/prot.h index 895ab0336..9bc20ad2d 100644 --- a/lib_com/prot.h +++ b/lib_com/prot.h @@ -2399,7 +2399,7 @@ ivas_error acelp_core_enc( float lsp_mid[M], /* i : LSPs in the middle of the frame */ const int16_t vad_hover_flag, /* i : VAD hangover flag */ const int16_t attack_flag, /* i : attack flag (GSC or TC) */ - float bwe_exc_extended[], /* i/o: bandwidth extended excitation */ + Word32 bwe_exc_extended_fx[], /* i/o: bandwidth extended excitation 2*Q_new */ #ifndef IVAS_FLOAT_FIXED float *voice_factors, /* o : voicing factors */ #else @@ -2409,8 +2409,8 @@ ivas_error acelp_core_enc( float pitch_buf[NB_SUBFR16k], /* o : floating pitch for each subframe */ int16_t *unbits, /* o : number of unused bits */ STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ - float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ -); + float tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel */ + Word16 Q_new ); #endif ivas_error acelp_core_switch_dec_bfi( @@ -6006,7 +6006,7 @@ void core_switching_pre_enc( const int16_t active_cnt, /* i : Active frame counter */ const int16_t last_element_mode /* i : last_element_mode */ ); - +#ifndef IVAS_FLOAT_FIXED void core_switching_post_enc( Encoder_State *st, /* i/o: encoder state structure */ // const float *old_inp_12k8, /* i : old input signal @12.8kHz */ @@ -6016,7 +6016,17 @@ void core_switching_post_enc( // const float A[] /* i : unquant. LP filter coefs. */ float A[] /* i : unquant. LP filter coefs. */ ); - +#else +void core_switching_post_enc( + Encoder_State *st, /* i/o: encoder state structure */ + // const float *old_inp_12k8, /* i : old input signal @12.8kHz */ + float *old_inp_12k8, /* i : old input signal @12.8kHz */ + // const float *old_inp_16k, /* i : old input signal @16kHz */ + float *old_inp_16k, /* i : old input signal @16kHz */ + // const float A[] /* i : unquant. LP filter coefs. */ + float A[], /* i : unquant. LP filter coefs. */ + Word16 Q_new ); +#endif ivas_error core_switching_post_dec( Decoder_State *st, /* i/o: decoder state structure */ float *synth, /* i/o: output synthesis */ diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 7c75943f8..efb1ff681 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -2617,7 +2617,8 @@ void lag_wind_32( ); // preemp_fx.c -#define PREEMPH_FX( signal, mu, L, mem ) preemph_copy_fx( ( signal ), ( signal ), ( mu ), ( L ), ( mem ) ) +#define PREEMPH_FX( signal, mu, L, mem ) preemph_copy_fx( ( signal ), ( signal ), ( mu ), ( L ), ( mem ) ) +#define PREEMPH_32FX( signal, signal_out, mu, L, mem ) preemph_copy_32fx( ( signal ), ( signal_out ), ( mu ), ( L ), ( mem ) ) void preemph_copy_fx( const Word16 x[], /* i : i signal Qx */ @@ -2627,6 +2628,14 @@ void preemph_copy_fx( Word16 *mem /* i/o: memory (x[-1]) Qx */ ); +void preemph_copy_32fx( + const Word16 x[], /* i : i signal Qx */ + Word32 y[], /* o : output signal Qx */ + const Word16 mu, /* i : preemphasis coefficient Q15 */ + const Word16 lg, /* i : vector size Q0 */ + Word16 *mem /* i/o: memory (x[-1]) Qx */ +); + void E_UTIL_f_preemph2( Word16 shift, /* Q0 */ Word16 *signal, /* Qx */ diff --git a/lib_enc/acelp_core_enc.c b/lib_enc/acelp_core_enc.c index 08aa6619b..c2b32022f 100644 --- a/lib_enc/acelp_core_enc.c +++ b/lib_enc/acelp_core_enc.c @@ -72,7 +72,7 @@ ivas_error acelp_core_enc( float lsp_mid[M], /* i : LSPs in the middle of the frame */ const int16_t vad_hover_flag, /* i : VAD hangover flag */ const int16_t attack_flag, /* i : attack flag (GSC or TC) */ - float bwe_exc_extended[], /* i/o: bandwidth extended excitation */ + Word32 bwe_exc_extended_fx[], /* i/o: bandwidth extended excitation */ #ifndef IVAS_FLOAT_FIXED float *voice_factors, /* o : voicing factors */ #else @@ -82,8 +82,8 @@ ivas_error acelp_core_enc( float pitch_buf[NB_SUBFR16k], /* o : floating pitch for each subframe */ int16_t *unbits, /* o : number of unused bits */ STEREO_TD_ENC_DATA_HANDLE hStereoTD, /* i/o: TD stereo encoder handle */ - float tdm_lsfQ_PCh[M] /* i : Q LSFs for primary channel */ -) + float tdm_lsfQ_PCh[M], /* i : Q LSFs for primary channel */ + Word16 Q_new ) { Word16 i, nBits; /* reserved bits */ LPD_state_HANDLE hLPDmem; /* i/o: acelp memories */ @@ -103,9 +103,7 @@ ivas_error acelp_core_enc( float exc2[L_FRAME16k]; /* enhanced excitation */ float Es_pred; /* predicited scaled innovation energy */ // float tmp_noise; /* NB post-filter long-term noise energy*/ - Word16 tc_subfr; /* TC sub-frame indication */ - float old_bwe_exc[( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2]; /* excitation buffer */ - float *bwe_exc; /* excitation for SWB TBE */ + Word16 tc_subfr; /* TC sub-frame indication */ Word16 allow_cn_step; Word32 int_fs; Word16 nb_bits; /* parameters handling */ @@ -143,9 +141,9 @@ ivas_error acelp_core_enc( Word16 tmp_noise_fx; /* NB post-filter long-term noise energy*/ // Word16 tc_subfr_fx; /* TC sub-frame indication */ - Word16 old_bwe_exc_fx[( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2]; /* excitation buffer */ + Word16 old_bwe_exc_fx[( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2]; /* excitation buffer Q_new */ // Word16 Q_old_bwe_exc; - Word16 *bwe_exc_fx; /* excitation for SWB TBE */ + Word16 *bwe_exc_fx; /* excitation for SWB TBE Q_new */ // Word16 allow_cn_step_fx; // Word16 int_fs_fx; // Word32 L_epsP[2]; @@ -160,7 +158,6 @@ ivas_error acelp_core_enc( // Word16 enr; #ifdef MSAN_FIX - set_zero( old_bwe_exc, ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 ); set16_fx( old_bwe_exc_fx, 0, ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 ); set16_fx( old_exc_fx, 0, L_EXC ); set16_fx( Aq_fx, 0, NB_SUBFR16k * ( M + 1 ) ); @@ -189,7 +186,6 @@ ivas_error acelp_core_enc( #ifdef IVAS_FLOAT_FIXED_CONVERSIONS Word16 pitch_buf_fx[NB_SUBFR16k] = { 0 }; /* To be removed once this is taken as input arg of function */ Word16 tmp; - set_zero( old_bwe_exc, 1380 ); for ( i = 0; i < NB_SUBFR16k; i++ ) { // Array is getting modified in chunks of 17 inside. @@ -202,32 +198,18 @@ ivas_error acelp_core_enc( Word16 inp_buff[L_FRAME16k + M + 1]; Word16 *inp_fx; inp_fx = &inp_buff[M + 1]; - Word16 q_comm_Bin, Q_new /* Q_new will be later passed from parent function as arg */; - q_comm_Bin = min( Q_factor_arrL( st->Bin_E_old, 128 ), Q_factor_arrL( st->Bin_E, 256 ) ); - Q_new = Q_factor_arr( &inp[-M - 1], L_FRAME16k + M + 1 ); - Q_new = min( Q_new, q_comm_Bin - ( QSCALE - 2 ) ); - Q_new = min( Q_new, 5 ); - IF( st->hBWE_TD ) - { - Q_new = min( Q_new, Q_factor_arrL( st->hBWE_TD->old_bwe_exc, PIT16k_MAX * 2 ) ); - } + Word16 q_comm_Bin /*, Q_new*/ /* Q_new will be later passed from parent function as arg */; + q_comm_Bin = Q_new + QSCALE - 2; + IF( st->hLPDmem ) { - Q_new = min( Q_new, Q_factor_arrL( &st->hLPDmem->old_exc_flt[-M - 1], L_EXC_MEM + M + 1 ) ); floatToFixed_arr( &st->hLPDmem->old_exc_flt[-M - 1], &st->hLPDmem->old_exc[-M - 1], Q_new, L_EXC_MEM + M + 1 ); - Word16 Q_temp = s_min( Q_factor_arr( st->hLPDmem->mem_syn_flt, 16 ), - s_min( Q_factor_arr( st->hLPDmem->mem_syn1_flt, 16 ), - s_min( Q_factor_arr( st->hLPDmem->mem_syn2_flt, 16 ), - s_min( Q_factor_arr( st->hLPDmem->mem_syn3_flt, 16 ), Q_factor_arr( st->hLPDmem->mem_syn_r_flt, 60 ) ) ) ) ); - Q_new = min( Q_temp, Q_new ); - // st->hLPDmem->mem_syn_q = Q_new; floatToFixed_arr( st->hLPDmem->mem_syn_flt, st->hLPDmem->mem_syn, Q_new - 1, 16 ); floatToFixed_arr( st->hLPDmem->mem_syn1_flt, st->hLPDmem->mem_syn1_fx, Q_new - 1, 16 ); floatToFixed_arr( st->hLPDmem->mem_syn2_flt, st->hLPDmem->mem_syn2, Q_new - 1, 16 ); floatToFixed_arr( st->hLPDmem->mem_syn3_flt, st->hLPDmem->mem_syn3, Q_new - 1, 16 ); floatToFixed_arr( st->hLPDmem->mem_syn_r_flt, st->hLPDmem->mem_syn_r, Q_new - 1, 60 ); } - // Q_new = Q_new - 3; //guard bits IF( st->hBWE_TD ) { floatToFixed_arr( st->hBWE_TD->old_bwe_exc, st->hBWE_TD->old_bwe_exc_fx, Q_new, PIT16k_MAX * 2 ); @@ -267,14 +249,11 @@ ivas_error acelp_core_enc( IF( st->hBWE_TD != NULL ) { - bwe_exc = old_bwe_exc + PIT16k_MAX * 2; /* pointer to BWE excitation signal in the current frame */ - mvr2r( st->hBWE_TD->old_bwe_exc, old_bwe_exc, PIT16k_MAX * 2 ); bwe_exc_fx = old_bwe_exc_fx + PIT16k_MAX * 2; /* pointer to BWE excitation signal in the current frame */ Copy( st->hBWE_TD->old_bwe_exc_fx, old_bwe_exc_fx, PIT16k_MAX * 2 ); } ELSE { - bwe_exc = NULL; bwe_exc_fx = NULL; } @@ -528,7 +507,6 @@ ivas_error acelp_core_enc( fixedToFloat_arr( exc_fx, exc, Q_new - 1, st->L_frame ); fixedToFloat_arr( exc2_fx, exc2, Q_new - 1, st->L_frame ); fixedToFloat_arr( exc3_fx, exc3, Q_new - 1, st->L_frame ); - fixedToFloat_arr( bwe_exc_fx, bwe_exc, Q_new - 1, st->L_frame ); #endif } else @@ -581,10 +559,6 @@ ivas_error acelp_core_enc( fixedToFloat_arr( exc_fx, exc, Q_new, st->L_frame ); fixedToFloat_arr( exc2_fx, exc2, Q_new, st->L_frame ); - IF( st->hBWE_TD != NULL ) - { - fixedToFloat_arr( bwe_exc_fx, bwe_exc, Q_new, st->L_frame ); - } #endif mvr2r( exc2, exc3, st->L_frame ); @@ -734,7 +708,6 @@ ivas_error acelp_core_enc( IF( tdm_lsfQ_PCh ) tdm_lsfQ_PCh_fx[idx] = (Word16) ( tdm_lsfQ_PCh[idx] * 2.56f ); } - floatToFixed_arr( old_bwe_exc, old_bwe_exc_fx, Q_new, 1380 ); floatToFixed_arr( &hLPDmem->old_exc_flt[-M - 1], &hLPDmem->old_exc[-M - 1], Q_new, L_EXC_MEM + M + 1 ); floatToFixed_arr( old_exc_flt, old_exc_fx, Q_new, st->L_frame ); @@ -948,7 +921,7 @@ ivas_error acelp_core_enc( ELSE IF( ppp_mode ) { /* SC-VBR - PPP frames */ - IF( ( error = encod_ppp_fx( st, inp_fx, Aw_fx, Aq_fx, res_fx, syn_fx, exc_fx, exc2_fx, pitch_buf_fx, voice_factors_fx, bwe_exc_fx, Q_new, shift ) ) != IVAS_ERR_OK ) + IF( ( error = encod_ppp_ivas_fx( st, inp_fx, Aw_fx, Aq_fx, res_fx, syn_fx, exc_fx, exc2_fx, pitch_buf_fx, voice_factors_fx, bwe_exc_fx, Q_new, shift ) ) != IVAS_ERR_OK ) { return error; } @@ -1010,7 +983,6 @@ ivas_error acelp_core_enc( } fixedToFloat_arr( old_exc_fx, old_exc_flt, Q_new, st->L_frame ); fixedToFloat_arr( &hLPDmem->old_exc[-M - 1], &hLPDmem->old_exc_flt[-M - 1], Q_new, L_EXC_MEM + M + 1 ); - fixedToFloat_arr( old_bwe_exc_fx, old_bwe_exc, Q_new, 1380 ); fixedToFloat_arr( res_fx, res, Q_new, st->L_frame ); Es_pred = fix16_to_float( Es_pred_fx, Q8 ); @@ -1018,8 +990,6 @@ ivas_error acelp_core_enc( st->hLPDmem->mem_w0_flt = fixedToFloat( st->hLPDmem->mem_w0, Q_new - 1 ); fixedToFloat_arr( exc_fx, exc, Q_new, L_FRAME16k + 1 ); fixedToFloat_arr( exc2_fx, exc2, Q_new, L_FRAME16k ); - if ( st->hBWE_TD ) - fixedToFloat_arr( bwe_exc_fx, bwe_exc, Q_new, L_FRAME32k ); me2f_buf_16( st->hGSCEnc->last_exc_dct_in_fx, Q15 - st->hGSCEnc->Q_last_exc_dct_in, st->hGSCEnc->last_exc_dct_in, L_FRAME16k ); fixedToFloat_arr( syn_fx, syn, Q_new - 1, L_FRAME16k ); fixedToFloat_arr( pitch_buf_fx, pitch_buf, Q6, NB_SUBFR16k ); @@ -1199,20 +1169,11 @@ ivas_error acelp_core_enc( { /* Apply a non linearity to the SHB excitation */ #ifdef IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - Word32 bwe_exc_extended_fx[L_FRAME32k + NL_BUFF_OFFSET]; - Word16 q_bwe_exc = sub( st->prev_Q_bwe_exc, 16 ) / 2; - q_bwe_exc = min( q_bwe_exc, Q_factor_arr( bwe_exc, ( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 ) - PIT16k_MAX * 2 ) ); - floatToFixed_arr16( bwe_exc, bwe_exc_fx, q_bwe_exc, ( ( PIT16k_MAX + ( L_FRAME16k + 1 ) + L_SUBFR16k ) * 2 ) - PIT16k_MAX * 2 ); - -#endif // IVAS_FLOAT_FIXED_CONVERSIONS - Copy_Scale_sig_16_32( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( q_bwe_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc - non_linearity_ivas_fx( bwe_exc_fx, bwe_exc_extended_fx + NL_BUFF_OFFSET, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, q_bwe_exc, st->coder_type, voice_factors_fx, st->L_frame ); + Copy_Scale_sig_16_32( st->hBWE_TD->old_bwe_exc_extended_fx, bwe_exc_extended_fx, NL_BUFF_OFFSET, ( sub( shl( Q_new, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc + non_linearity_ivas_fx( bwe_exc_fx, bwe_exc_extended_fx + NL_BUFF_OFFSET, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale_fx, Q_new, st->coder_type, voice_factors_fx, st->L_frame ); // Q bwe_exc_extended_fx = 2 * Q bwe_exc_fx = 2 * q_bwe_exc - Copy_Scale_sig_32_16( bwe_exc_extended_fx + L_FRAME32k, st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET, negate( sub( shl( q_bwe_exc, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - fixedToFloat_arrL( bwe_exc_extended_fx, bwe_exc_extended, 2 * q_bwe_exc, L_FRAME32k + NL_BUFF_OFFSET ); -#endif // IVAS_FLOAT_FIXED_CONVERSIONS + Copy_Scale_sig_32_16( bwe_exc_extended_fx + L_FRAME32k, st->hBWE_TD->old_bwe_exc_extended_fx, NL_BUFF_OFFSET, negate( sub( shl( Q_new, 1 ), sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // prev_Q_bwe_exc + #else non_linearity( bwe_exc, bwe_exc_extended, st->hBWE_TD->old_bwe_exc_extended, L_FRAME32k, &st->hBWE_TD->bwe_non_lin_prev_scale, st->coder_type, voice_factors, st->L_frame ); #endif // IVAS_FLOAT_FIXED @@ -1246,12 +1207,9 @@ ivas_error acelp_core_enc( floatToFixed_arr( old_exc_flt, old_exc_fx, Q_new, L_EXC ); - Word16 q_old_bwe_exc = 0; IF( st->hBWE_TD != NULL ) { - q_old_bwe_exc = Q_factor_arr( &old_bwe_exc[L_FRAME32k], PIT16k_MAX * 2 ); - floatToFixed_arr16( &old_bwe_exc[L_FRAME32k], &old_bwe_exc_fx[L_FRAME32k], q_old_bwe_exc, PIT16k_MAX * 2 ); - st->Q_exc = q_old_bwe_exc; + st->Q_exc = Q_new; } #endif // IVAS_FLOAT_FIXED_CONVERSIONS @@ -1261,7 +1219,7 @@ ivas_error acelp_core_enc( fixedToFloat_arr( st->hLPDmem->old_exc, st->hLPDmem->old_exc_flt, Q_new, L_EXC_MEM ); IF( !st->Opt_AMR_WB && st->hBWE_TD != NULL ) { - fixedToFloat_arr( st->hBWE_TD->old_bwe_exc_fx, st->hBWE_TD->old_bwe_exc, q_old_bwe_exc, PIT16k_MAX * 2 ); + fixedToFloat_arr( st->hBWE_TD->old_bwe_exc_fx, st->hBWE_TD->old_bwe_exc, Q_new, PIT16k_MAX * 2 ); } fixedToFloat_arr( st->old_Aq_12_8_fx, st->old_Aq_12_8, Q12, M + 1 ); // Q12 #endif diff --git a/lib_enc/core_switching_enc.c b/lib_enc/core_switching_enc.c index 234ed82b2..a92e8660a 100644 --- a/lib_enc/core_switching_enc.c +++ b/lib_enc/core_switching_enc.c @@ -871,7 +871,10 @@ void core_switching_post_enc( // const float *old_inp_16k, /* i : old input signal @16kHz */ float *old_inp_16k, /* i : old input signal @16kHz */ // const float A[] /* i : unquant. LP filter coefs. */ - float A[] /* i : unquant. LP filter coefs. */ + float A[], /* i : unquant. LP filter coefs. */ +#ifdef IVAS_FLOAT_FIXED + Word16 Q_new +#endif ) { if ( st->core == HQ_CORE ) @@ -885,21 +888,19 @@ void core_switching_post_enc( #else #ifdef IVAS_FLOAT_FIXED_CONVERSIONS // conv params from float to fix - Word16 Q_new; - Q_new = Q_factor_arr( old_inp_12k8, L_INP_12k8 ); Word16 old_inp_12k8_fx[L_INP_12k8]; Word16 old_inp_16k_fx[L_INP]; Word16 A_fx[NB_SUBFR16k * ( M + 1 )]; floatToFixed_arr( st->old_input_signal, st->old_input_signal_fx, 0, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ); - floatToFixed_arr( old_inp_12k8, old_inp_12k8_fx, Q_new, L_INP_12k8 ); - floatToFixed_arr( old_inp_16k, old_inp_16k_fx, Q_new, L_INP ); + floatToFixed_arr( old_inp_12k8, old_inp_12k8_fx, Q_new - 1, L_INP_12k8 ); + floatToFixed_arr( old_inp_16k, old_inp_16k_fx, Q_new - 1, L_INP ); floatToFixed_arr( A, A_fx, 12, NB_SUBFR16k * ( M + 1 ) ); floatToFixed_arr( st->old_Aq_12_8, st->old_Aq_12_8_fx, 12, M + 1 ); st->hLPDmem->mem_w0 = float_to_fix16( st->hLPDmem->mem_w0_flt, Q_new - 1 ); floatToFixed_arr( st->hLPDmem->mem_syn_flt, st->hLPDmem->mem_syn, Q_new - 1, M ); #endif - acelp_core_switch_enc_ivas_fx( st, old_inp_12k8_fx + L_INP_MEM - NS2SA( INT_FS_12k8, ACELP_LOOK_NS ), old_inp_16k_fx + L_INP_MEM - NS2SA( INT_FS_16k, ACELP_LOOK_NS ), A_fx, 0, Q_new ); + acelp_core_switch_enc_ivas_fx( st, old_inp_12k8_fx + L_INP_MEM - NS2SA( INT_FS_12k8, ACELP_LOOK_NS ), old_inp_16k_fx + L_INP_MEM - NS2SA( INT_FS_16k, ACELP_LOOK_NS ), A_fx, 0, sub( Q_new, 1 ) ); #ifdef IVAS_FLOAT_FIXED_CONVERSIONS // conv params from fix to float fixedToFloat_arr( st->old_input_signal_fx, st->old_input_signal, 0, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ); diff --git a/lib_enc/corr_xh_fx.c b/lib_enc/corr_xh_fx.c index 5c209460d..984c669dd 100644 --- a/lib_enc/corr_xh_fx.c +++ b/lib_enc/corr_xh_fx.c @@ -104,11 +104,11 @@ void corr_hh_ivas_fx( L_maxloc = L_deposit_l( 0 ); FOR( i = k; i < L_subfr; i += STEP ) { - L_tmp = L_mac( 1L, h[i], h[0] ); /* 1 -> to avoid null dn[] */ // 2*(15 - norm_s(h[0])) - 1 + L_tmp = L_mac( 1L, shr( h[i], 3 ), shr( h[0], 3 ) ); /* 1 -> to avoid null dn[] */ // 2*(15 - norm_s(h[0]) -3) - 1 FOR( j = i; j < L_subfr - 1; j++ ) { #ifdef BASOP_NOGLOB - L_tmp = L_mac_o( L_tmp, h[j + 1], h[j + 1 - i], &Overflow ); // 2*(15 - norm_s(h[0])) - 1 + L_tmp = L_mac_o( L_tmp, shr( h[j + 1], 3 ), shr( h[j + 1 - i], 3 ), &Overflow ); // 2*(15 - norm_s(h[0]) -3) - 1 #else L_tmp = L_mac( L_tmp, x[j + 1], h[j + 1 - i] ); #endif @@ -141,7 +141,7 @@ void corr_hh_ivas_fx( move16(); } - *Qy = sub( add( shl( sub( 15, norm_s( h[0] ) ), 1 ), j ), 17 ); + *Qy = sub( add( shl( sub( 15 - 3, norm_s( h[0] ) ), 1 ), j ), 17 ); // h scaled down by 3 to avoid saturation while accumulating Ltmp move16(); return; } diff --git a/lib_enc/enc_ppp_fx.c b/lib_enc/enc_ppp_fx.c index 1070bcc49..775a863d3 100644 --- a/lib_enc/enc_ppp_fx.c +++ b/lib_enc/enc_ppp_fx.c @@ -236,3 +236,190 @@ ivas_error encod_ppp_fx( return error; } + +ivas_error encod_ppp_ivas_fx( + Encoder_State *st_fx, /* i/o: state structure */ + const Word16 speech_fx[], /* i : input speech Q_new*/ + const Word16 Aw_fx[], /* i : weighted A(z) unquantized for subframes */ + const Word16 Aq_fx[], /* i : 12k8 Lp coefficient */ + Word16 *res_fx, /* i : residual signal Q_new*/ + Word16 *synth_fx, /* o : core synthesis Q-1*/ + Word16 *exc_fx, /* i/o: current non-enhanced excitation Q_new*/ + Word16 *exc2_fx, /* o : current enhanced excitation Q0*/ + Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe Q6*/ + Word16 *voice_factors, /* o : voicing factors */ + Word16 *bwe_exc, /* o : excitation for SWB TBE */ + Word16 Q_new, + Word16 shift ) +{ + Word16 xn_fx[L_SUBFR]; /* Target vector for pitch search */ + Word16 h1_fx[L_SUBFR + ( M + 1 )]; /* Impulse response vector */ + Word16 i_subfr; /* tmp variables */ + const Word16 *p_Aw_fx, *p_Aq_fx; /* pointer to LP filter coeff. vector*/ + + Word16 k; + Word16 p_Aq_old_fx[M + 1], excQ_ppp_fx[L_FRAME], p_Aq_curr_fx[M], pitch_fx[NB_SUBFR]; + Word16 LPC_de_old_fx[M + 1], LPC_de_curr_fx[M + 1]; + Word16 shift_wsp = add( Q_new, shift ); + Word16 rate_ctrl_fx; + Word16 saved_Q_new = Q_new; + move16(); + LPD_state_HANDLE hLPDmem = st_fx->hLPDmem; + SC_VBR_ENC_HANDLE hSC_VBR = st_fx->hSC_VBR; + BSTR_ENC_HANDLE hBstr = st_fx->hBstr; + ivas_error error; + + error = IVAS_ERR_OK; + move16(); + rate_ctrl_fx = hSC_VBR->rate_control; + move16(); + + /*------------------------------------------------------------------* + * ACELP subframe loop + *------------------------------------------------------------------*/ + p_Aw_fx = Aw_fx; + p_Aq_fx = Aq_fx; + FOR( i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR ) + { + /*----------------------------------------------------------------* + * Bandwidth expansion of A(z) filter coefficients + * Find the the excitation search target "xn" and innovation + * target in residual domain "cn" + * Compute impulse response, h1[], of weighted synthesis filter + *----------------------------------------------------------------*/ + + Copy( &res_fx[i_subfr], &exc_fx[i_subfr], L_SUBFR ); + + find_targets_ivas_fx( speech_fx, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq_fx, + res_fx, L_SUBFR, p_Aw_fx, TILT_FAC_FX, xn_fx, NULL, h1_fx ); + + /* scale xn[] and h1[] to avoid overflow in dot_product12() */ + Scale_sig( xn_fx, L_SUBFR, shift ); /* scaling of xn[] to limit dynamic at 12 bits */ + + /* call voiced encoder at this point */ + IF( i_subfr == 0 ) /* generate the L_FRAME exc */ + { + FOR( k = 0; k < M; k++ ) + { + p_Aq_curr_fx[k] = p_Aq_fx[k + ( 3 * ( M + 1 ) ) + 1]; + move16(); + } + + E_LPC_f_lsp_a_conversion( st_fx->lsp_old_fx, p_Aq_old_fx, M ); + deemph_lpc_fx( p_Aq_curr_fx, p_Aq_old_fx, LPC_de_curr_fx, LPC_de_old_fx, 1 ); + /* both outputs LPC_de_curr_fx and LPC_de_old_fx are in Q12 */ + + + /* last frame-end lpc and curr frame-end lpc */ + IF( ( error = ppp_voiced_encoder_fx( hBstr, hSC_VBR, st_fx->bwidth, st_fx->last_coder_type_raw, st_fx->old_pitch_buf_fx, res_fx, + excQ_ppp_fx, st_fx->pitch[1], LPC_de_old_fx, LPC_de_curr_fx, exc_fx, pitch_fx, Q_new ) ) != IVAS_ERR_OK ) + { + return error; + } + + Scale_sig( exc_fx, L_FRAME, sub( saved_Q_new, Q_new ) ); + if ( EQ_16( hSC_VBR->bump_up, 1 ) ) + { + i_subfr = L_FRAME; + move16(); + } + } + + IF( NE_16( hSC_VBR->bump_up, 1 ) ) + { + /*-----------------------------------------------------------------* + * Gain clipping test to avoid unstable synthesis on frame erasure + * or in case of floating point encoder & fixed p. decoder + *-----------------------------------------------------------------*/ + gp_clip_fx( st_fx->element_mode, st_fx->core_brate, st_fx->voicing_fx, i_subfr, st_fx->coder_type, xn_fx, st_fx->clip_var_fx, sub( shift_wsp, 1 ) ); + + + /* run the above to maintain gain clipping memories */ + gp_clip_test_gain_pit_fx( st_fx->element_mode, st_fx->core_brate, hSC_VBR->prev_ppp_gain_pit_fx, st_fx->clip_var_fx ); + + + /*-----------------------------------------------------------------* + * Synthesize speech to update mem_syn[]. + * Update A(z) filters + *-----------------------------------------------------------------*/ + + Syn_filt_s( 1, p_Aq_fx, M, &excQ_ppp_fx[i_subfr], &synth_fx[i_subfr], L_SUBFR, hLPDmem->mem_syn, 1 ); + + + p_Aw_fx += ( M + 1 ); + p_Aq_fx += ( M + 1 ); + } + + } /* end of subframe loop */ + + IF( hSC_VBR->bump_up ) + { + /* PPP failed, bump up */ + hSC_VBR->ppp_mode = 0; + move16(); + st_fx->core_brate = ACELP_7k20; + move16(); + hSC_VBR->pppcountE = 0; + move16(); + + IF( hSC_VBR->set_ppp_generic ) + { + st_fx->coder_type = GENERIC; + move16(); + } + ELSE + { + st_fx->coder_type = VOICED; + move16(); + } + + /* We write signalling indices again only in case of bump_up */ + /* delete previous indices */ +#ifndef IVAS_CODE_BITSTREAM + reset_indices_enc_fx( hBstr ); +#else + reset_indices_enc_fx( hBstr, hBstr->nb_ind_tot ); +#endif + + /* signalling matrix (writing of signalling bits) */ + signalling_enc_fx( st_fx ); + } + ELSE + { + Copy( excQ_ppp_fx, exc_fx, L_FRAME ); + + /*-----------------------------------------------------------------* + * Updates: last value of new target is stored in mem_w0 + *-----------------------------------------------------------------*/ + + hLPDmem->mem_w0 = sub( shr( xn_fx[L_SUBFR - 1], shift ), shr( exc_fx[L_FRAME - 1], 1 ) ); /*Q_new-1 */ + + Copy( exc_fx, exc2_fx, L_FRAME ); + + hLPDmem->dm_fx.prev_state = 2; + move16(); /*Q0 dispMem index 0 */ + hLPDmem->dm_fx.prev_gain_pit[0] = hSC_VBR->prev_ppp_gain_pit_fx; + move16(); /*Q14 dispMem index 2 */ + + FOR( k = 1; k < 5; k++ ) + { + hLPDmem->dm_fx.prev_gain_pit[k] = hLPDmem->dm_fx.prev_gain_pit[k - 1]; + move16(); + } + + hLPDmem->tilt_code = hSC_VBR->prev_tilt_code_fx; + move16(); + Copy( pitch_fx, pitch_buf_fx, NB_SUBFR ); + pitch_buf_fx[NB_SUBFR16k - 1] = pitch_fx[NB_SUBFR - 1]; + + interp_code_5over2_fx( exc2_fx, bwe_exc, L_FRAME ); + set16_fx( voice_factors, 0, NB_SUBFR16k ); + } + + hSC_VBR->rate_control = rate_ctrl_fx; + move16(); + + set16_fx( hSC_VBR->nelp_lp_fit_mem, 0, NELP_LP_ORDER * 2 ); + + return error; +} diff --git a/lib_enc/enc_tran_fx.c b/lib_enc/enc_tran_fx.c index 395a73d20..c7f7bcd51 100644 --- a/lib_enc/enc_tran_fx.c +++ b/lib_enc/enc_tran_fx.c @@ -561,8 +561,8 @@ Word16 encod_tran_ivas_fx( Copy( &res_fx[i_subfr], &exc_fx[i_subfr], L_SUBFR ); - find_targets_fx( speech_fx, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, - res_fx, L_SUBFR, p_Aw, st_fx->preemph_fac, xn, cn, h1 ); + find_targets_ivas_fx( speech_fx, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, + res_fx, L_SUBFR, p_Aw, st_fx->preemph_fac, xn, cn, h1 ); Copy_Scale_sig( h1, h2_fx, L_SUBFR, -2 ); Scale_sig( h1, L_SUBFR, add( 1, shift ) ); /* set h1[] in Q14 with scaling for convolution */ diff --git a/lib_enc/enc_uv_fx.c b/lib_enc/enc_uv_fx.c index 54b5fabe8..70a63105d 100644 --- a/lib_enc/enc_uv_fx.c +++ b/lib_enc/enc_uv_fx.c @@ -98,8 +98,8 @@ void encod_unvoiced_fx( i_subfr_idx = shr( i_subfr, 6 ); Copy( &res_fx[i_subfr], &exc_fx[i_subfr], L_SUBFR ); - find_targets_fx( speech_fx, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq_fx, - res_fx, L_SUBFR, p_Aw_fx, st_fx->preemph_fac, xn_fx, cn_fx, h1_fx ); + find_targets_ivas_fx( speech_fx, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq_fx, + res_fx, L_SUBFR, p_Aw_fx, st_fx->preemph_fac, xn_fx, cn_fx, h1_fx ); /*Copy_Scale_sig(h1_fx, h2_fx, L_SUBFR, -2);*/ Scale_sig( h1_fx, L_SUBFR, add( 1, shift ) ); /* set h1[] in Q14 with scaling for convolution */ diff --git a/lib_enc/gain_enc_fx.c b/lib_enc/gain_enc_fx.c index 630dd5aeb..c17dc9245 100644 --- a/lib_enc/gain_enc_fx.c +++ b/lib_enc/gain_enc_fx.c @@ -676,10 +676,10 @@ void gain_enc_mless_ivas_fx( = ((-0.5*g_corr[3]*g_corr[0]) - (-0.25*g_corr[1]*g_corr[4]))/tmp1; = ((0.25*g_corr[1]*g_corr[4]) - (0.5*g_corr[0]*g_corr[3]))/tmp1; */ - L_tmp1 = L_mult( coeff[0], coeff[2] ); /*Q31*/ + L_tmp1 = L_mult_sat( coeff[0], coeff[2] ); /*Q31 added saturation for -32768*-32768*/ exp1 = add( exp_coeff[0], exp_coeff[2] ); - L_tmp2 = L_shr( L_mult( coeff[4], coeff[4] ), 2 ); /*Q31*/ + L_tmp2 = L_shr( L_mult_sat( coeff[4], coeff[4] ), 2 ); /*Q31 added saturation for -32768*-32768*/ exp2 = add( exp_coeff[4], exp_coeff[4] ); IF( GT_16( exp1, exp2 ) ) diff --git a/lib_enc/inov_enc_fx.c b/lib_enc/inov_enc_fx.c index 30288b0dc..4016ecb4f 100644 --- a/lib_enc/inov_enc_fx.c +++ b/lib_enc/inov_enc_fx.c @@ -457,7 +457,7 @@ Word16 inov_encode_ivas_fx( Word16 acelpautoc; BSTR_ENC_HANDLE hBstr = st_fx->hBstr; Word16 i, k; - Word16 Qxn, Rw_q, j; + Word16 Qxn, Rw_q, j, max_xn2; stack_pulses = 0; move16(); @@ -476,7 +476,16 @@ Word16 inov_encode_ivas_fx( move16(); } - Qxn = add( sub( Q_new, 1 ), shift ); + maximum_abs_16_fx( xn2, L_subfr, &max_xn2 ); + IF( max_xn2 ) + { + Qxn = add( sub( Q_new, 1 ), shift ); + } + ELSE + { + Qxn = 0; + move16(); + } /*----------------------------------------------------------------* * Update target vector for codebook search in residual domain @@ -723,7 +732,7 @@ Word16 inov_encode_ivas_fx( { FOR( k = 0; k < L_SUBFR - i; k++ ) { - y2[i + k] = add( y2[i + k], round_fx( L_shl( L_mult( code[i], h2[k] ), sh ) ) ); // Q9 + y2[i + k] = add_sat( y2[i + k], round_fx( L_shl( L_mult( code[i], h2[k] ), sh ) ) ); // Q9 Added saturation: needs to be rechecked move16(); } } diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c index 747e255f5..e7c55494d 100644 --- a/lib_enc/ivas_core_enc.c +++ b/lib_enc/ivas_core_enc.c @@ -96,8 +96,7 @@ ivas_error ivas_core_enc( float hb_speech[L_FRAME16k / 4]; float *new_swb_speech; float new_swb_speech_buffer[L_FRAME48k + STEREO_DFT_OVL_MAX]; - float bwe_exc_extended[CPE_CHANNELS][L_FRAME32k + NL_BUFF_OFFSET]; - Word16 Q_new[CPE_CHANNELS]; + Word16 Q_new[CPE_CHANNELS] = { 0 }; #ifndef IVAS_FLOAT_FIXED float voice_factors[CPE_CHANNELS][NB_SUBFR16k]; #else @@ -148,7 +147,7 @@ ivas_error ivas_core_enc( #ifdef MSAN_FIX FOR( i = 0; i < CPE_CHANNELS; i++ ) { - set_zero( bwe_exc_extended[i], L_FRAME32k + NL_BUFF_OFFSET ); + set_zero_fx( bwe_exc_extended_fx[i], L_FRAME32k + NL_BUFF_OFFSET ); } #endif @@ -268,7 +267,8 @@ ivas_error ivas_core_enc( e_enerBuffer, fft_buff_fx, cor_map_sum_fx, - exp_cor_map_sum + exp_cor_map_sum, + &Q_new[n] #endif ) ) != IVAS_ERR_OK ) { @@ -381,7 +381,7 @@ ivas_error ivas_core_enc( #ifndef IVAS_FLOAT_FIXED if ( ( error = acelp_core_enc( st, inp[n], /*ener[n],*/ A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], vad_hover_flag[0], attack_flag[n], bwe_exc_extended[n], voice_factors[n], old_syn_12k8_16k[n], pitch_buf[n], &unbits[n], hStereoTD, tdm_lsfQ_PCh ) ) != IVAS_ERR_OK ) #else - if ( ( error = acelp_core_enc( st, inp[n], /*ener[n],*/ A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], vad_hover_flag[0], attack_flag[n], bwe_exc_extended[n], voice_factors_fx[n], old_syn_12k8_16k[n], pitch_buf[n], &unbits[n], hStereoTD, tdm_lsfQ_PCh ) ) != IVAS_ERR_OK ) + if ( ( error = acelp_core_enc( st, inp[n], /*ener[n],*/ A[n], Aw[n], epsP[n], lsp_new[n], lsp_mid[n], vad_hover_flag[0], attack_flag[n], bwe_exc_extended_fx[n], voice_factors_fx[n], old_syn_12k8_16k[n], pitch_buf[n], &unbits[n], hStereoTD, tdm_lsfQ_PCh, Q_new[n] ) ) != IVAS_ERR_OK ) #endif { return error; @@ -428,15 +428,15 @@ ivas_error ivas_core_enc( floatToFixed_arr( lsp_mid[n], lsp_mid_fx[n], Q15, M ); #endif #ifdef IVAS_FLOAT_FIXED_CONVERSIONS - q_old_inp_12k8_fx = Q_factor_arr( old_inp_12k8[n], L_INP_12k8 ); - q_old_inp_16k_fx = Q_factor_arr( old_inp_16k[n], L_INP ); + // q_old_inp_12k8_fx = Q_factor_arr( old_inp_12k8[n], L_INP_12k8 ); + // q_old_inp_16k_fx = Q_factor_arr( old_inp_16k[n], L_INP ); - floatToFixed_arr16( old_inp_12k8[n], old_inp_12k8_fx, q_old_inp_12k8_fx, L_INP_12k8 ); - floatToFixed_arr16( old_inp_16k[n], old_inp_16k_fx, q_old_inp_16k_fx, L_INP ); + floatToFixed_arr( old_inp_12k8[n], old_inp_12k8_fx, 0, L_INP_12k8 ); + floatToFixed_arr( old_inp_16k[n], old_inp_16k_fx, 0, L_INP ); #endif /* TCX core encoder */ - stereo_tcx_core_enc( st, old_inp_12k8_fx + L_INP_MEM, old_inp_16k_fx + L_INP_MEM, Aw_fx[n], lsp_new_fx[n], lsp_mid_fx[n], pitch_buf_fx[n], last_element_mode, vad_hover_flag[0] ); + stereo_tcx_core_enc( st, old_inp_12k8_fx + L_INP_MEM, old_inp_16k_fx + L_INP_MEM, Aw_fx[n], lsp_new_fx[n], lsp_mid_fx[n], pitch_buf_fx[n], last_element_mode, vad_hover_flag[0], 0 ); #ifdef IVAS_FLOAT_FIXED_CONVERSIONS fixedToFloat_arr( lsp_new_fx[n], lsp_new[n], Q15, M ); @@ -710,7 +710,7 @@ ivas_error ivas_core_enc( * Postprocessing for ACELP/HQ core switching *---------------------------------------------------------------------*/ - core_switching_post_enc( st, old_inp_12k8[n], old_inp_16k[n], A[n] ); + core_switching_post_enc( st, old_inp_12k8[n], old_inp_16k[n], A[n], Q_new[n] ); /*---------------------------------------------------------------------* * WB TBE encoding @@ -720,12 +720,11 @@ ivas_error ivas_core_enc( #ifdef IVAS_FLOAT_FIXED #ifdef IVAS_FLOAT_FIXED_CONVERSIONS /* Temporarily calculating variable Q. Will get Q values from core processing */ - Q_new[n] = Q_factor_arrL( bwe_exc_extended[n], L_FRAME32k + NL_BUFF_OFFSET ); - Q_new[n] = Q_new[n] / 2; + // Q_new[n] = Q_factor_arrL( bwe_exc_extended[n], L_FRAME32k + NL_BUFF_OFFSET ); + // Q_new[n] = Q_new[n] / 2; floatToFixed_arr16( new_inp_resamp16k[n], new_inp_resamp16k_fx[n], -1, L_FRAME16k ); floatToFixed_arr( pitch_buf[n], pitch_buf_fx[n], Q6, NB_SUBFR16k ); // Saturation Conversion used as last values have garbage values even in float - floatToFixed_arr32( bwe_exc_extended[n], bwe_exc_extended_fx[n], 2 * Q_new[n], L_FRAME32k + NL_BUFF_OFFSET ); // prev_lsp_wb_temp_fx, prev_lsp_wb_fx and prev_lpc_wb_fx in Q15. No float counterparts if ( st->hBWE_FD != NULL ) @@ -757,7 +756,6 @@ ivas_error ivas_core_enc( #ifdef IVAS_FLOAT_FIXED_CONVERSIONS fixedToFloat_arr( hb_speech_fx, hb_speech, -1, L_FRAME16k / 4 ); fixedToFloat_arr( pitch_buf_fx[n], pitch_buf[n], Q6, NB_SUBFR16k ); - fixedToFloat_arrL( bwe_exc_extended_fx[n], bwe_exc_extended[n], 2 * Q_new[n], L_FRAME32k + NL_BUFF_OFFSET ); if ( st->hBWE_FD != NULL ) { @@ -877,10 +875,8 @@ ivas_error ivas_core_enc( Word16 Q_fb_exc; /* Temporarily calculating variable Q. Will get Q values from core processing */ - Q_new[n] = Q_factor_arrL( bwe_exc_extended[n], L_FRAME32k + NL_BUFF_OFFSET ); - Q_new[n] = Q_new[n] / 2; - - floatToFixed_arr32( bwe_exc_extended[n], bwe_exc_extended_fx[n], 2 * Q_new[n], L_FRAME32k + NL_BUFF_OFFSET ); + // Q_new[n] = Q_factor_arrL( bwe_exc_extended[n], L_FRAME32k + NL_BUFF_OFFSET ); + // Q_new[n] = Q_new[n] / 2; // prev_lsp_wb_temp_fx, prev_lsp_wb_fx and prev_lpc_wb_fx in Q15. No float counterparts floatToFixed_arr( shb_speech, shb_speech_fx, Q_shb_spch, L_FRAME16k ); @@ -900,34 +896,34 @@ ivas_error ivas_core_enc( { #ifdef IVAS_FLOAT_FIXED_CONVERSIONS Word16 old_inp_12k8_fx[L_INP_12k8], old_inp_16k_fx[L_INP]; - Word16 q_val; - Word16 q_old_inp_16k_fx, q_old_syn_12k8_16k_fx, q_old_input_lp; - Word16 q_old_inp_12k8_fx, q_shb_speech_fx, q_new_input_hp; + // Word16 q_val; + // Word16 q_old_inp_16k_fx, q_old_syn_12k8_16k_fx, q_old_input_lp; + // Word16 q_old_inp_12k8_fx, q_shb_speech_fx, q_new_input_hp; - q_old_inp_12k8_fx = Q_factor_arr( old_inp_12k8[n], L_INP_12k8 ); + /*q_old_inp_12k8_fx = Q_factor_arr( old_inp_12k8[n], L_INP_12k8 ); q_old_inp_16k_fx = Q_factor_arr( old_inp_16k[n], L_INP ); q_old_syn_12k8_16k_fx = Q_factor_arr( old_syn_12k8_16k[n], L_FRAME16k ); - q_shb_speech_fx = Q_factor_arr( shb_speech, L_FRAME16k ); + q_shb_speech_fx = Q_factor_arr( shb_speech, L_FRAME16k );*/ - q_val = s_min( q_old_inp_12k8_fx, q_old_inp_16k_fx ); - q_val = s_min( q_val, q_old_syn_12k8_16k_fx ); + // q_val = s_min( q_old_inp_12k8_fx, q_old_inp_16k_fx ); + // q_val = s_min( q_val, q_old_syn_12k8_16k_fx ); if ( st->hBWE_FD != NULL ) { - q_old_input_lp = Q_factor_arr( st->hBWE_FD->old_input_lp, NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS ) ); + /*q_old_input_lp = Q_factor_arr( st->hBWE_FD->old_input_lp, NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS ) ); q_val = s_min( q_val, q_old_input_lp ); q_new_input_hp = Q_factor_arr( st->hBWE_FD->new_input_hp, NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS ) ); - q_shb_speech_fx = s_min( q_shb_speech_fx, q_new_input_hp ); + q_shb_speech_fx = s_min( q_shb_speech_fx, q_new_input_hp );*/ st->Q_old_wtda = Q_factor_arr( st->hBWE_FD->old_wtda_swb, L_FRAME48k ); - floatToFixed_arr16( st->hBWE_FD->old_input_lp, st->hBWE_FD->old_input_lp_fx, q_val, NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS ) ); - floatToFixed_arr16( st->hBWE_FD->new_input_hp, st->hBWE_FD->new_input_hp_fx, q_shb_speech_fx, NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS ) ); + floatToFixed_arr16( st->hBWE_FD->old_input_lp, st->hBWE_FD->old_input_lp_fx, Q_new[n] - 1, NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS ) ); + floatToFixed_arr16( st->hBWE_FD->new_input_hp, st->hBWE_FD->new_input_hp_fx, Q_shb_spch, NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS ) ); floatToFixed_arr16( st->hBWE_FD->old_wtda_swb, st->hBWE_FD->L_old_wtda_swb_fx, st->Q_old_wtda, L_FRAME48k ); } - floatToFixed_arr16( old_inp_12k8[n], old_inp_12k8_fx, q_val, L_INP_12k8 ); - floatToFixed_arr16( old_inp_16k[n], old_inp_16k_fx, q_val, L_INP ); - floatToFixed_arr16( old_syn_12k8_16k[n], old_syn_12k8_16k_fx[n], q_val, L_FRAME16k ); - floatToFixed_arr16( shb_speech, shb_speech_fx, q_shb_speech_fx, L_FRAME16k ); + floatToFixed_arr16( old_inp_12k8[n], old_inp_12k8_fx, Q_new[n] - 1, L_INP_12k8 ); + floatToFixed_arr16( old_inp_16k[n], old_inp_16k_fx, Q_new[n] - 1, L_INP ); + floatToFixed_arr( old_syn_12k8_16k[n], old_syn_12k8_16k_fx[n], Q_new[n] - 1, L_FRAME16k ); + floatToFixed_arr16( shb_speech, shb_speech_fx, Q_shb_spch, L_FRAME16k ); for ( int ii = 0; ii < L_FRAME48k + STEREO_DFT_OVL_MAX; ii++ ) { @@ -939,12 +935,12 @@ ivas_error ivas_core_enc( } #endif /* SWB(FB) BWE encoder */ - swb_bwe_enc_ivas_fx( st, last_element_mode, old_inp_12k8_fx, old_inp_16k_fx, old_syn_12k8_16k_fx[n], new_swb_speech_fx_16, shb_speech_fx, q_shb_speech_fx, q_val ); + swb_bwe_enc_ivas_fx( st, last_element_mode, old_inp_12k8_fx, old_inp_16k_fx, old_syn_12k8_16k_fx[n], new_swb_speech_fx_16, shb_speech_fx, Q_shb_spch, sub( Q_new[n], 1 ) ); #ifdef IVAS_FLOAT_FIXED_CONVERSIONS if ( st->hBWE_FD != NULL ) { - fixedToFloat_arr( st->hBWE_FD->old_input_lp_fx, st->hBWE_FD->old_input_lp, q_val, NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS ) ); - fixedToFloat_arr( st->hBWE_FD->new_input_hp_fx, st->hBWE_FD->new_input_hp, q_shb_speech_fx, NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS ) ); + fixedToFloat_arr( st->hBWE_FD->old_input_lp_fx, st->hBWE_FD->old_input_lp, Q_new[n] - 1, NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS ) ); + fixedToFloat_arr( st->hBWE_FD->new_input_hp_fx, st->hBWE_FD->new_input_hp, Q_shb_spch, NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS - DELAY_CLDFB_NS ) ); fixedToFloat_arr( st->hBWE_FD->L_old_wtda_swb_fx, st->hBWE_FD->old_wtda_swb, st->Q_old_wtda, L_FRAME48k ); } for ( int ii = 0; ii < NS2SA( 48000, DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS ); ii++ ) diff --git a/lib_enc/ivas_core_pre_proc.c b/lib_enc/ivas_core_pre_proc.c index d8742856c..170ce6704 100644 --- a/lib_enc/ivas_core_pre_proc.c +++ b/lib_enc/ivas_core_pre_proc.c @@ -81,7 +81,8 @@ ivas_error pre_proc_ivas( Word16 e_enerBuffer, Word16 fft_buff_fx[2 * L_FFT], Word32 cor_map_sum_fx, - Word16 exp_cor_map_sum + Word16 exp_cor_map_sum, + Word16 *Q_new #endif ) { @@ -595,13 +596,14 @@ ivas_error pre_proc_ivas( error = ivas_compute_core_buffers_fx( st, &inp_16k_fx, old_inp_16k_fx, new_inp_resamp16k_fx, input_frame, last_element_mode, sr_core_tmp, &ener_fx, A_fx, Aw_fx, epsP_fx, - lsp_new_fx, lsp_mid_fx, Q_old_inp_16k, Q_r ); + lsp_new_fx, lsp_mid_fx, Q_old_inp_16k, Q_r, Q_new ); IF( NE_32( error, IVAS_ERR_OK ) ) { return error; } } test(); + Scale_sig( old_inp_12k8_fx, L_INP_12k8, *Q_new ); // Q_new-1 IF( !( EQ_16( st->L_frame, L_FRAME16k ) && NE_16( element_mode, IVAS_CPE_MDCT ) ) ) { /* update signal buffers */ @@ -654,16 +656,16 @@ ivas_error pre_proc_ivas( *ener = fixedToFloat( ener_fx, Q_r[0] + 1 ); } - fixedToFloat_arr( old_inp_16k_fx, old_inp_16k, Q_old_inp_16k, L_INP ); + fixedToFloat_arr( old_inp_16k_fx, old_inp_16k, *Q_new - 1, L_INP ); fixedToFloat_arr( new_inp_resamp16k_fx, new_inp_resamp16k, Q_old_inp_16k, L_FRAME16k ); fixedToFloat_arr( st->input_fx, st->input, -1, 960 ); fixedToFloat_arr( st->old_wsp_fx, st->old_wsp, 15 - st->exp_old_wsp, L_WSP_MEM ); - fixedToFloat_arr( st->old_inp_16k_fx, st->old_inp_16k, Q_old_inp_16k, L_INP_MEM ); + fixedToFloat_arr( st->old_inp_16k_fx, st->old_inp_16k, *Q_new - 1, L_INP_MEM ); fixedToFloat_arr( st->mem_decim16k_fx, st->mem_decim16k, Q_old_inp_16k, 2 * L_FILT_MAX ); fixedToFloat_arr( st->inp_16k_mem_stereo_sw_fx, st->inp_16k_mem_stereo_sw, Q_old_inp_16k, STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ); fixedToFloat_arr( st->buf_speech_enc, st->buf_speech_enc_flt, Q_old_inp_16k, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k ); - fixedToFloat_arr( st->buf_speech_enc_pe, st->buf_speech_enc_pe_flt, Q_old_inp_16k, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k ); // Should take care of st->speech_enc_pe as wel + fixedToFloat_arr( st->buf_speech_enc_pe, st->buf_speech_enc_pe_flt, *Q_new - 1, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k ); // Should take care of st->speech_enc_pe as wel fixedToFloat_arr( st->buf_wspeech_enc, st->buf_wspeech_enc_flt, Q_old_inp_16k, L_FRAME16k + L_SUBFR + L_FRAME16k + L_NEXT_MAX_16k + 320 ); // Should take care of st->wspeech_enc if ( st->hBWE_FD != NULL ) @@ -744,7 +746,8 @@ ivas_error ivas_compute_core_buffers_fx( Word16 lsp_new_fx[M], /* i/o: LSPs at the end of the frame */ Word16 lsp_mid_fx[M], /* i/o: LSPs in the middle of the frame */ Word16 Q_old_inp_16k, - Word16 Q_r[2] ) + Word16 Q_r[2], + Word16 *Q_new ) { Word16 *inp_16k_fx, *new_inp_16k_fx; Word16 delay, element_mode; @@ -758,6 +761,14 @@ ivas_error ivas_compute_core_buffers_fx( Word16 Q_tmp, mem_decim16k_size, size_modified; Word16 epsP_h[M + 1]; Word16 epsP_l[M + 1]; + + Word16 headroom = 1, preemp_len = 0, inp_max = 0; + move16(); + move16(); + move16(); + Word16 *preemp_start_idx = NULL; + Word32 sig_out[960], max_32; + /*Word16 Q_exp, Q_wsp_exp*/; #ifdef MSAN_FIX set16_fx( new_inp_resamp16k_fx, 0, L_FRAME16k ); #endif @@ -963,64 +974,258 @@ ivas_error ivas_compute_core_buffers_fx( test(); test(); - IF( GT_32( input_Fs, 8000 ) && EQ_32( sr_core, INT_FS_16k ) && NE_16( element_mode, IVAS_CPE_MDCT ) ) + IF( Q_new ) { - IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) + *Q_new = 0; + move16(); + set32_fx( sig_out, 0, 960 ); + test(); + test(); + if ( ( ( EQ_16( st->bwidth, NB ) ) || ( EQ_16( st->max_bwidth, NB ) ) ) && ( GT_32( st->input_Fs, 8000 ) ) ) + { + headroom = add( headroom, 1 ); + } + test(); + test(); + IF( GT_32( input_Fs, 8000 ) && EQ_32( sr_core, INT_FS_16k ) && NE_16( element_mode, IVAS_CPE_MDCT ) ) { - Copy( new_inp_16k_fx - STEREO_DFT_OVL_16k + L_FRAME16k, st->inp_16k_mem_stereo_sw_fx, STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ); /* update for TD/DFT stereo switching */ + IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) + { + Copy( new_inp_16k_fx - STEREO_DFT_OVL_16k + L_FRAME16k, st->inp_16k_mem_stereo_sw_fx, STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ); /* update for TD/DFT stereo switching */ - st->mem_preemph16k_fx = st->mem_preemph16k_DFT_fx; - move16(); - st->mem_preemph16k_DFT_fx = old_inp_16k_fx[L_INP_MEM - STEREO_DFT_OVL_16k + L_FRAME16k - 1]; - move16(); + st->mem_preemph16k_fx = st->mem_preemph16k_DFT_fx; + move16(); + st->mem_preemph16k_DFT_fx = old_inp_16k_fx[L_INP_MEM - STEREO_DFT_OVL_16k + L_FRAME16k - 1]; + move16(); + + IF( EQ_16( st->L_frame, L_FRAME16k ) ) + { + Copy( new_inp_16k_fx - STEREO_DFT_OVL_16k, st->buf_speech_enc + L_FRAME16k - STEREO_DFT_OVL_16k, L_FRAME16k + STEREO_DFT_OVL_16k ); + } + // PREEMPH_FX(new_inp_16k_fx - STEREO_DFT_OVL_16k, PREEMPH_FAC_16k, L_FRAME16k, &(st->mem_preemph16k_fx)); + PREEMPH_32FX( new_inp_16k_fx - STEREO_DFT_OVL_16k, sig_out, PREEMPH_FAC_16k, L_FRAME16k, &( st->mem_preemph16k_fx ) ); + tmp_fx = st->mem_preemph16k_fx; + move16(); + + // PREEMPH_FX(new_inp_16k_fx - STEREO_DFT_OVL_16k + L_FRAME16k, PREEMPH_FAC_16k, STEREO_DFT_OVL_16k, &tmp_fx); + PREEMPH_32FX( new_inp_16k_fx - STEREO_DFT_OVL_16k + L_FRAME16k, sig_out + L_FRAME16k, PREEMPH_FAC_16k, STEREO_DFT_OVL_16k, &tmp_fx ); + preemp_start_idx = new_inp_16k_fx - STEREO_DFT_OVL_16k; + move16(); + preemp_len = STEREO_DFT_OVL_16k + L_FRAME16k; + move16(); + } + ELSE IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) + { + IF( EQ_16( last_element_mode, IVAS_CPE_DFT ) ) + { + st->mem_preemph16k_fx = st->mem_preemph16k_DFT_fx; + move16(); + Copy( st->inp_16k_mem_stereo_sw_fx, new_inp_16k_fx - L_MEM_RECALC_16K - ( STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ), STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ); + // PREEMPH_FX(new_inp_16k_fx - L_MEM_RECALC_16K - (STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k), PREEMPH_FAC_16k, STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k, &st->mem_preemph16k_fx); + PREEMPH_32FX( new_inp_16k_fx - L_MEM_RECALC_16K - ( STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ), sig_out, PREEMPH_FAC_16k, STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k, &st->mem_preemph16k_fx ); + preemp_start_idx = new_inp_16k_fx - L_MEM_RECALC_16K - ( STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ); + move16(); + preemp_len = STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k; + move16(); + } + + st->mem_preemph16k_DFT_fx = old_inp_16k_fx[L_INP_MEM - STEREO_DFT_OVL_16k + L_FRAME16k - 1]; + move16(); - IF( EQ_16( st->L_frame, L_FRAME16k ) ) + /* preemphasise past segment of input signal when switching from MDCT stereo */ + IF( EQ_16( last_element_mode, IVAS_CPE_MDCT ) ) + { + Word16 length_16k = NS2SA( INT_FS_16k, L_MEM_RECALC_SCH_NS - DELAY_FIR_RESAMPL_NS ); + move16(); + + // PREEMPH_FX(new_inp_16k_fx - lMemRecalc_16k - length_16k, PREEMPH_FAC, length_16k, &st->mem_preemph16k_fx); + PREEMPH_32FX( new_inp_16k_fx - lMemRecalc_16k - length_16k, sig_out, PREEMPH_FAC, length_16k, &st->mem_preemph16k_fx ); + preemp_start_idx = new_inp_16k_fx - lMemRecalc_16k - length_16k; + preemp_len = length_16k; + move16(); + } + + IF( EQ_16( st->L_frame, L_FRAME16k ) ) + { + 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 ) ); + } + // PREEMPH_FX(new_inp_16k_fx - lMemRecalc_16k, PREEMPH_FAC_16k, L_FRAME16k, &(st->mem_preemph16k_fx)); + PREEMPH_32FX( new_inp_16k_fx - lMemRecalc_16k, sig_out + preemp_len, PREEMPH_FAC_16k, L_FRAME16k, &( st->mem_preemph16k_fx ) ); + tmp_fx = st->mem_preemph16k_fx; + move16(); + // PREEMPH_FX(new_inp_16k_fx - lMemRecalc_16k + L_FRAME16k, PREEMPH_FAC_16k, lMemRecalc_16k + L_FILT16k, &tmp_fx); + PREEMPH_32FX( new_inp_16k_fx - lMemRecalc_16k + L_FRAME16k, sig_out + preemp_len + L_FRAME16k, PREEMPH_FAC_16k, lMemRecalc_16k + L_FILT16k, &tmp_fx ); + IF( preemp_start_idx && preemp_len ) + { + preemp_len = add( preemp_len, add( L_FRAME16k + L_FILT16k, lMemRecalc_16k ) ); + move16(); + } + ELSE + { + preemp_start_idx = new_inp_16k_fx - lMemRecalc_16k; + preemp_len = add( L_FRAME16k + L_FILT16k, lMemRecalc_16k ); + move16(); + } + } + ELSE IF( EQ_16( element_mode, IVAS_SCE ) ) { - Copy( new_inp_16k_fx - STEREO_DFT_OVL_16k, st->buf_speech_enc + L_FRAME16k - STEREO_DFT_OVL_16k, L_FRAME16k + STEREO_DFT_OVL_16k ); + // PREEMPH_FX(new_inp_16k_fx, PREEMPH_FAC_16k, L_FRAME16k, &(st->mem_preemph16k_fx)); + PREEMPH_32FX( new_inp_16k_fx, sig_out, PREEMPH_FAC_16k, L_FRAME16k, &( st->mem_preemph16k_fx ) ); + tmp_fx = st->mem_preemph16k_fx; + move16(); + // PREEMPH_FX(new_inp_16k_fx + L_FRAME16k, PREEMPH_FAC_16k, L_FILT16k, &tmp_fx); + PREEMPH_32FX( new_inp_16k_fx + L_FRAME16k, sig_out + L_FRAME16k, PREEMPH_FAC_16k, L_FILT16k, &tmp_fx ); + preemp_start_idx = new_inp_16k_fx; + preemp_len = L_FRAME16k + L_FILT16k; + move16(); } - PREEMPH_FX( new_inp_16k_fx - STEREO_DFT_OVL_16k, PREEMPH_FAC_16k, L_FRAME16k, &( st->mem_preemph16k_fx ) ); - tmp_fx = st->mem_preemph16k_fx; + maximum_abs_32_fx( sig_out, preemp_len, &max_32 ); + inp_max = s_max( extract_h( max_32 ), 1 ); + + Word16 shift = sub( norm_s( inp_max ), headroom ); + Word16 Q_min, i; + shift = s_max( shift, 0 ); + shift = s_min( shift, Q_MAX ); + minimum_fx( st->Q_max, L_Q_MEM, &Q_min ); + *Q_new = s_min( shift, Q_min ); move16(); + IF( inp_max == 0 ) + { + IF( NE_16( st->last_coder_type, UNVOICED ) ) + { + *Q_new = s_min( *Q_new, 1 ); + move16(); + } + } - PREEMPH_FX( new_inp_16k_fx - STEREO_DFT_OVL_16k + L_FRAME16k, PREEMPH_FAC_16k, STEREO_DFT_OVL_16k, &tmp_fx ); - } - ELSE IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) - { - IF( EQ_16( last_element_mode, IVAS_CPE_DFT ) ) + FOR( i = L_Q_MEM - 1; i > 0; i-- ) { - st->mem_preemph16k_fx = st->mem_preemph16k_DFT_fx; + st->Q_max[i] = st->Q_max[i - 1]; move16(); - Copy( st->inp_16k_mem_stereo_sw_fx, new_inp_16k_fx - L_MEM_RECALC_16K - ( STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ), STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ); - PREEMPH_FX( new_inp_16k_fx - L_MEM_RECALC_16K - ( STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ), PREEMPH_FAC_16k, STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k, &st->mem_preemph16k_fx ); } + st->Q_max[i] = shift; + move16(); + + Copy_Scale_sig32_16( sig_out, preemp_start_idx, preemp_len, *Q_new ); - st->mem_preemph16k_DFT_fx = old_inp_16k_fx[L_INP_MEM - STEREO_DFT_OVL_16k + L_FRAME16k - 1]; +#if 0 + Q_exp = sub(*Q_new, st->Q_old); + st->prev_Q_old = st->Q_old; + move16(); + st->Q_old = *Q_new; move16(); - /* preemphasise past segment of input signal when switching from MDCT stereo */ - IF( EQ_16( last_element_mode, IVAS_CPE_MDCT ) ) + /*------------------------------------------------------------------* + * Scaling of memories + *-----------------------------------------------------------------*/ + + Le_min_scaled = Scale_mem_pre_proc(st->ini_frame, Q_exp, Q_new, old_inp_12k8, &(st->mem_wsp_fx), hNoiseEst->enrO_fx, hNoiseEst->bckr_fx, + hNoiseEst->ave_enr_fx, hNoiseEst->ave_enr2_fx, hNoiseEst->fr_bands1_fx, hNoiseEst->fr_bands2_fx, st->Bin_E_old_fx); +#else + // Q_exp = sub(*Q_new, st->prev_Q_new); + // move16(); + // Q_wsp_exp = add(Q_exp, shift_exp); + + Scale_sig( old_inp_16k_fx, (Word16) ( preemp_start_idx - old_inp_16k_fx ), *Q_new ); + /*if (st->hLPDmem) { + Scale_mem_enc(Q_exp, old_inp_16k_fx, st->hLPDmem->old_exc, st->hBWE_TD == NULL ? NULL : st->hBWE_TD->old_bwe_exc_fx, &(st->hLPDmem->mem_w0), st->hLPDmem->mem_syn, + st->hLPDmem->mem_syn2, &st->mem_deemp_preQ_fx, st->hGSCEnc == NULL ? NULL : st->hGSCEnc->last_exc_dct_in_fx, st->hBWE_FD == NULL ? NULL : st->hBWE_FD->old_input_lp_fx); + } + else { + Scale_mem_enc(Q_exp, old_inp_16k_fx, NULL, st->hBWE_TD == NULL ? NULL : st->hBWE_TD->old_bwe_exc_fx, NULL, NULL, + NULL, &st->mem_deemp_preQ_fx, st->hGSCEnc == NULL ? NULL : st->hGSCEnc->last_exc_dct_in_fx, st->hBWE_FD == NULL ? NULL : st->hBWE_FD->old_input_lp_fx); + }*/ +#endif + } + ELSE IF( GT_32( input_Fs, 8000 ) ) /* keep memory up-to-date in case of bitrate switching */ + { + IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) { - Word16 length_16k = NS2SA( INT_FS_16k, L_MEM_RECALC_SCH_NS - DELAY_FIR_RESAMPL_NS ); + st->mem_preemph16k_fx = new_inp_16k_fx[L_frame_tmp - STEREO_DFT_OVL_16k - 1]; move16(); - - PREEMPH_FX( new_inp_16k_fx - lMemRecalc_16k - length_16k, PREEMPH_FAC, length_16k, &st->mem_preemph16k_fx ); } - - IF( EQ_16( st->L_frame, L_FRAME16k ) ) + ELSE IF( EQ_16( element_mode, IVAS_CPE_TD ) ) + { + st->mem_preemph16k_fx = new_inp_16k_fx[L_frame_tmp - lMemRecalc_16k - 1]; + move16(); + } + ELSE IF( EQ_16( element_mode, IVAS_CPE_MDCT ) ) + { + st->mem_preemph16k_fx = 0; + move16(); + } + ELSE /* SCE */ { - Copy( new_inp_16k_fx - lMemRecalc_16k, st->buf_speech_enc + L_FRAME16k - lMemRecalc_16k - L_FILT16k, L_FRAME16k + lMemRecalc_16k + L_FILT16k ); + st->mem_preemph16k_fx = new_inp_16k_fx[L_frame_tmp - 1]; + move16(); } - PREEMPH_FX( new_inp_16k_fx - lMemRecalc_16k, PREEMPH_FAC_16k, L_FRAME16k, &( st->mem_preemph16k_fx ) ); - tmp_fx = st->mem_preemph16k_fx; + st->mem_preemph16k_DFT_fx = st->mem_preemph16k_fx; move16(); - PREEMPH_FX( new_inp_16k_fx - lMemRecalc_16k + L_FRAME16k, PREEMPH_FAC_16k, lMemRecalc_16k + L_FILT16k, &tmp_fx ); } - ELSE IF( EQ_16( element_mode, IVAS_SCE ) ) + } + ELSE + { + test(); + test(); + IF( GT_32( input_Fs, 8000 ) && EQ_32( sr_core, INT_FS_16k ) && NE_16( element_mode, IVAS_CPE_MDCT ) ) { - PREEMPH_FX( new_inp_16k_fx, PREEMPH_FAC_16k, L_FRAME16k, &( st->mem_preemph16k_fx ) ); - tmp_fx = st->mem_preemph16k_fx; - move16(); - PREEMPH_FX( new_inp_16k_fx + L_FRAME16k, PREEMPH_FAC_16k, L_FILT16k, &tmp_fx ); + IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) + { + Copy( new_inp_16k_fx - STEREO_DFT_OVL_16k + L_FRAME16k, st->inp_16k_mem_stereo_sw_fx, STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ); /* update for TD/DFT stereo switching */ + + st->mem_preemph16k_fx = st->mem_preemph16k_DFT_fx; + move16(); + st->mem_preemph16k_DFT_fx = old_inp_16k_fx[L_INP_MEM - STEREO_DFT_OVL_16k + L_FRAME16k - 1]; + move16(); + + IF( EQ_16( st->L_frame, L_FRAME16k ) ) + { + Copy( new_inp_16k_fx - STEREO_DFT_OVL_16k, st->buf_speech_enc + L_FRAME16k - STEREO_DFT_OVL_16k, L_FRAME16k + STEREO_DFT_OVL_16k ); + } + PREEMPH_FX( new_inp_16k_fx - STEREO_DFT_OVL_16k, PREEMPH_FAC_16k, L_FRAME16k, &( st->mem_preemph16k_fx ) ); + tmp_fx = st->mem_preemph16k_fx; + move16(); + + PREEMPH_FX( new_inp_16k_fx - STEREO_DFT_OVL_16k + L_FRAME16k, PREEMPH_FAC_16k, STEREO_DFT_OVL_16k, &tmp_fx ); + } + ELSE IF( EQ_16( st->element_mode, IVAS_CPE_TD ) ) + { + IF( EQ_16( last_element_mode, IVAS_CPE_DFT ) ) + { + st->mem_preemph16k_fx = st->mem_preemph16k_DFT_fx; + move16(); + Copy( st->inp_16k_mem_stereo_sw_fx, new_inp_16k_fx - L_MEM_RECALC_16K - ( STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ), STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ); + PREEMPH_FX( new_inp_16k_fx - L_MEM_RECALC_16K - ( STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k ), PREEMPH_FAC_16k, STEREO_DFT_OVL_16k - L_MEM_RECALC_16K - L_FILT16k, &st->mem_preemph16k_fx ); + } + + st->mem_preemph16k_DFT_fx = old_inp_16k_fx[L_INP_MEM - STEREO_DFT_OVL_16k + L_FRAME16k - 1]; + move16(); + + /* preemphasise past segment of input signal when switching from MDCT stereo */ + IF( EQ_16( last_element_mode, IVAS_CPE_MDCT ) ) + { + Word16 length_16k = NS2SA( INT_FS_16k, L_MEM_RECALC_SCH_NS - DELAY_FIR_RESAMPL_NS ); + move16(); + + PREEMPH_FX( new_inp_16k_fx - add( lMemRecalc_16k, length_16k ), PREEMPH_FAC, length_16k, &st->mem_preemph16k_fx ); + } + + IF( EQ_16( st->L_frame, L_FRAME16k ) ) + { + 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 ) ); + } + PREEMPH_FX( new_inp_16k_fx - lMemRecalc_16k, PREEMPH_FAC_16k, L_FRAME16k, &( st->mem_preemph16k_fx ) ); + tmp_fx = st->mem_preemph16k_fx; + move16(); + PREEMPH_FX( new_inp_16k_fx - lMemRecalc_16k + L_FRAME16k, PREEMPH_FAC_16k, add( lMemRecalc_16k, L_FILT16k ), &tmp_fx ); + } + ELSE IF( EQ_16( element_mode, IVAS_SCE ) ) + { + PREEMPH_FX( new_inp_16k_fx, PREEMPH_FAC_16k, L_FRAME16k, &( st->mem_preemph16k_fx ) ); + tmp_fx = st->mem_preemph16k_fx; + move16(); + PREEMPH_FX( new_inp_16k_fx + L_FRAME16k, PREEMPH_FAC_16k, L_FILT16k, &tmp_fx ); + } } ELSE IF( GT_32( input_Fs, 8000 ) ) /* keep memory up-to-date in case of bitrate switching */ { @@ -1082,7 +1287,7 @@ ivas_error ivas_compute_core_buffers_fx( Copy( st->lsp_old1_fx, st->lspold_enc_fx, M ); } - analy_lp_ivas_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, 0, Q_old_inp_16k, Q_r ); + analy_lp_ivas_fx( inp_16k_fx, L_FRAME16k, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lspold_enc_fx, st->pitch, st->voicing_fx, INT_FS_16k, 0, Q_new ? *Q_new : 0, Q_r ); /*--------------------------------------------------------------* * Compute Weighted Input diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index 0d5528c20..6f4116f23 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -2491,7 +2491,7 @@ ivas_error pre_proc_front_ivas_fx( error = ivas_compute_core_buffers_fx( st, NULL, old_inp_16k_fx, NULL, input_frame, IVAS_SCE /*last_element_mode*/, INT_FS_16k /*sr_core_tmp*/, &ener_fx, A_fx, Aw_fx, epsP_fx, - lsp_new_fx, lsp_mid_fx, Q_old_inp_16k, Q_r ); + lsp_new_fx, lsp_mid_fx, Q_old_inp_16k, Q_r, NULL ); if ( error != IVAS_ERR_OK ) { return error; diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index c8537b825..8d6c8003a 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -672,11 +672,11 @@ ivas_error ivas_cpe_enc_fx( #ifdef IVAS_FLOAT_FIXED #ifdef IVAS_FLOAT_FIXED_CONVERSIONS Word16 input_fx[2][L_FRAME48k]; - Word16 tmpppp; - tmpppp = s_min( Q_factor_arr( sts[1]->input, input_frame ), Q_factor_arr( sts[0]->input, input_frame ) ); + // Word16 tmpppp;// to be checked:dynamic q leading to crash + // tmpppp = s_min( Q_factor_arr( sts[1]->input, input_frame ), Q_factor_arr( sts[0]->input, input_frame ) ); - floatToFixed_arr16( sts[1]->input, input_fx[1], tmpppp, input_frame ); - floatToFixed_arr16( sts[0]->input, input_fx[0], tmpppp, input_frame ); + floatToFixed_arr16( sts[1]->input, input_fx[1], 0, input_frame ); + floatToFixed_arr16( sts[0]->input, input_fx[0], 0, input_frame ); #endif Word16 tdm_SM_flag; IF( hCPE->hStereoTD->tdm_LRTD_flag == 0 ) @@ -692,8 +692,8 @@ ivas_error ivas_cpe_enc_fx( stereo_tdm_downmix_ivas_fx( hCPE->hStereoTD, input_fx[0], input_fx[1], input_frame, tdm_ratio_idx, tdm_SM_flag, tdm_ratio_idx_SM ); #ifdef IVAS_FLOAT_FIXED_CONVERSIONS - fixedToFloat_arr( input_fx[0], sts[0]->input, tmpppp, input_frame ); - fixedToFloat_arr( input_fx[1], sts[1]->input, tmpppp, input_frame ); + fixedToFloat_arr( input_fx[0], sts[0]->input, 0, input_frame ); + fixedToFloat_arr( input_fx[1], sts[1]->input, 0, input_frame ); #endif #else stereo_tdm_downmix( hCPE->hStereoTD, sts[0]->input, sts[1]->input, input_frame, tdm_ratio_idx, ( ( hCPE->hStereoTD->tdm_LRTD_flag == 0 ) ? tdm_SM_or_LRTD_Pri : 0 ), tdm_ratio_idx_SM ); diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 3ef3cbb66..708b5e88b 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -488,6 +488,7 @@ ivas_error ivas_ism_enc_fx( Encoder_State *prev_st = NULL; Word32 ism_total_brate_ref, ism_total_brate; Word16 i, nchan_transport_ism; + Word16 q_st_inp_16; ivas_error error; push_wmops( "ivas_ism_enc" ); @@ -537,8 +538,10 @@ ivas_error ivas_ism_enc_fx( /*------------------------------------------------------------------* * Initialization - general *-----------------------------------------------------------------*/ - Copy32( data[sce_id], st->input32_fx, input_frame ); // Q(q_data) - Copy_Scale_sig32_16( st->input32_fx, st->input_fx, input_frame, sub( Q16 - 1, q_data ) ); // Q(q_data) -> Q(-1) + Copy32( data[sce_id], st->input32_fx, input_frame ); // Q(q_data) + q_st_inp_16 = sub( L_norm_arr( st->input32_fx, input_frame ), 16 ); + Copy_Scale_sig_32_16( st->input32_fx, st->input_fx, input_frame, q_st_inp_16 ); // q_data -> Q(q_inp + q_data) + q_st_inp_16 = add( q_st_inp_16, q_data ); st->element_mode = IVAS_SCE; move16(); @@ -573,11 +576,7 @@ ivas_error ivas_ism_enc_fx( #ifdef IVAS_FLOAT_FIXED_CONVERSIONS fixedToFloat_arrL( st->input32_fx, st->input, q_data, input_frame ); #endif - RunTransientDetection_ivas_fx( st->input_fx, input_frame, st->hTranDet, -1 ); - st->hTranDet->subblockEnergies.subblockNrg_e = 31 - Q7; - st->hTranDet->subblockEnergies.accSubblockNrg_e = 31 - Q7; - move16(); - move16(); + RunTransientDetection_ivas_fx( st->input_fx, input_frame, st->hTranDet, q_st_inp_16 ); currFlatness_fx[0] = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) st->hTranDet, NSUBBLOCKS, 0 ); // Q4 move16(); diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c index 22de8cfe6..d5add6745 100644 --- a/lib_enc/ivas_mc_param_enc.c +++ b/lib_enc/ivas_mc_param_enc.c @@ -877,6 +877,7 @@ void ivas_param_mc_enc_fx( case 2: case 4: { + Word16 q_data_dmx_fx16; Word16 bAttackPresent[PARAM_MC_MAX_TRANSPORT_CHANS]; Word16 attackIdx[PARAM_MC_MAX_TRANSPORT_CHANS]; @@ -887,12 +888,11 @@ void ivas_param_mc_enc_fx( { Word16 cpe_idx = shr( ch, 1 ); -#ifndef MSAN_FIX - Copy_Scale_sig_32_16( data_dmx_fx[ch], data_dmx_fx16[ch], -Q1 - Q11, input_frame ); // Q11 -> Q(-1) -#else - Copy_Scale_sig_32_16( data_dmx_fx[ch], data_dmx_fx16[ch], input_frame, -Q1 - Q11 ); // Q11 -> Q(-1) -#endif - RunTransientDetection_ivas_fx( data_dmx_fx16[ch], input_frame, st_ivas->hCPE[cpe_idx]->hCoreCoder[ch - cpe_idx * CPE_CHANNELS]->hTranDet, -1 ); + q_data_dmx_fx16 = sub( L_norm_arr( data_dmx_fx[ch], input_frame ), 16 ); + Copy_Scale_sig_32_16( data_dmx_fx[ch], data_dmx_fx16[ch], input_frame, q_data_dmx_fx16 ); // Q11 -> Q(q_data_dmx_fx16 + 11) + q_data_dmx_fx16 = add( q_data_dmx_fx16, Q11 ); + + RunTransientDetection_ivas_fx( data_dmx_fx16[ch], input_frame, st_ivas->hCPE[cpe_idx]->hCoreCoder[ch - cpe_idx * CPE_CHANNELS]->hTranDet, q_data_dmx_fx16 ); ivas_param_mc_transient_detection_fx( hParamMC, st_ivas->hCPE[cpe_idx]->hCoreCoder[ch - cpe_idx * CPE_CHANNELS]->hTranDet, &bAttackPresent[ch], &attackIdx[ch] ); } @@ -984,7 +984,7 @@ void ivas_param_mc_enc_fx( set32_fx( data_f_fx[ch], 0, input_frame ); set16_fx( data_f_fx16, 0, input_frame ); - RunTransientDetection_ivas_fx( data_f_fx16, input_frame, st_ivas->hCPE[cpe_idx]->hCoreCoder[ch - cpe_idx * CPE_CHANNELS]->hTranDet, -1 ); + RunTransientDetection_ivas_fx( data_f_fx16, input_frame, st_ivas->hCPE[cpe_idx]->hCoreCoder[ch - cpe_idx * CPE_CHANNELS]->hTranDet, 0 ); } } diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index 5e1e6c428..61515b6fd 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -133,11 +133,7 @@ ivas_error ivas_sce_enc_fx( *-----------------------------------------------------------------*/ Copy32( data_fx, st->input32_fx, input_frame ); // Q(q_data_fx) q_input = sub( add( L_norm_arr( st->input32_fx, input_frame ), q_data_fx ), 16 ); - if ( GE_16( q_input, -1 ) ) - { - q_input = -1; - move16(); - } + Copy_Scale_sig32_16( st->input32_fx, st->input_fx, input_frame, sub( add( Q16, q_input ), q_data_fx ) ); // Q(q_data_fx) -> Q(q_input) #ifdef IVAS_FLOAT_FIXED_CONVERSIONS diff --git a/lib_enc/ivas_tcx_core_enc.c b/lib_enc/ivas_tcx_core_enc.c index 8b809acac..574d753ac 100644 --- a/lib_enc/ivas_tcx_core_enc.c +++ b/lib_enc/ivas_tcx_core_enc.c @@ -236,8 +236,8 @@ void stereo_tcx_core_enc( Word16 lsp_mid_fx[], /* i : LSPs in the middle of the frame, Q15 */ Word16 pitch_buf_fx[NB_SUBFR16k], /* o : pitch for each subframe, Q6 */ const Word16 last_element_mode, /* i : last element mode, Q0 */ - const Word16 vad_hover_flag /* i : VAD hangover flag, Q0 */ -) + const Word16 vad_hover_flag, /* i : VAD hangover flag, Q0 */ + Word16 Q_new ) { TCX_ENC_HANDLE hTcxEnc; Word16 i, n; @@ -305,7 +305,7 @@ void stereo_tcx_core_enc( hTcxEnc = st->hTcxEnc; #ifdef IVAS_FLOAT_FIXED_CONVERSIONS - Word16 Q_new, Q_exc, q_comm_Bin; + Word16 /*Q_new, */ Q_exc, q_comm_Bin; #endif /*--------------------------------------------------------------* @@ -472,8 +472,9 @@ void stereo_tcx_core_enc( } #ifdef IVAS_FLOAT_FIXED_CONVERSIONS - q_comm_Bin = s_min( Q_factor_arrL( st->Bin_E_old, 128 ), Q_factor_arrL( st->Bin_E, 256 ) ); - Q_new = q_comm_Bin - ( QSCALE - 2 ); + /*q_comm_Bin = s_min( Q_factor_arrL( st->Bin_E_old, 128 ), Q_factor_arrL( st->Bin_E, 256 ) ); + Q_new = q_comm_Bin - ( QSCALE - 2 );*/ + q_comm_Bin = Q_new + Q_SCALE - 2; const Word16 Q_ener = Q_new + Q_SCALE - 2; // Q_new + Q_SCALE -2 #endif @@ -514,11 +515,12 @@ void stereo_tcx_core_enc( #endif #ifdef IVAS_FLOAT_FIXED_CONVERSIONS - Q_new = 0; + // Q_new = 0; - Word16 exp_exc; - f2me_buf_16( st->hLPDmem->old_exc_flt, st->hLPDmem->old_exc, &exp_exc, L_EXC_MEM ); - Q_exc = 15 - exp_exc; + // Word16 exp_exc; + // f2me_buf_16( st->hLPDmem->old_exc_flt, st->hLPDmem->old_exc, &exp_exc, L_EXC_MEM ); + floatToFixed_arr( st->hLPDmem->old_exc_flt, st->hLPDmem->old_exc, Q_new, L_EXC_MEM ); + Q_exc = Q_new; st->prev_Q_new = Q_exc; if ( st->hTdCngEnc != NULL ) { @@ -526,11 +528,12 @@ void stereo_tcx_core_enc( } #endif #ifdef IVAS_FLOAT_FIXED_CONVERSIONS - floatToFixed_arr( st->synth_flt, st->synth, Q_new, st->L_frame ); - floatToFixed_arr( st->hLPDmem->syn_flt, st->hLPDmem->syn, Q_new, M + 1 ); + floatToFixed_arr( st->synth_flt, st->synth, st->Q_syn, st->L_frame ); + floatToFixed_arr( st->hLPDmem->syn_flt, st->hLPDmem->syn, st->Q_syn, M + 1 ); + if ( st->tcxonly == 0 ) { - st->wspeech_enc[st->L_frame - 1] = (Word16) floatToFixed( st->wspeech_enc_flt[st->L_frame - 1], Q_new ); + st->wspeech_enc[st->L_frame - 1] = (Word16) floatToFixed( st->wspeech_enc_flt[st->L_frame - 1], st->Q_syn ); } #endif // IVAS_FLOAT_FIXED_CONVERSIONS @@ -830,7 +833,7 @@ void stereo_tcx_core_enc( fixedToFloat_arr( st->hLPDmem->mem_syn, st->hLPDmem->mem_syn_flt, Q_new + ( Q_new - 1 ), M ); fixedToFloat_arr( st->hLPDmem->mem_syn2, st->hLPDmem->mem_syn2_flt, Q_new + ( Q_new - 1 ), M ); fixedToFloat_arr( st->hLPDmem->syn, st->hLPDmem->syn_flt, Q_new, M + 1 ); - fixedToFloat_arr( st->hLPDmem->old_exc, st->hLPDmem->old_exc_flt, Q_exc, L_EXC_MEM ); + fixedToFloat_arr( st->hLPDmem->old_exc, st->hLPDmem->old_exc_flt, Q_new, L_EXC_MEM ); st->hLPDmem->mem_w0_flt = fixedToFloat_16( st->hLPDmem->mem_w0, Q_new ); fixedToFloat_arrL( st->Bin_E_old_fx, st->Bin_E_old, q_comm_Bin, 128 ); diff --git a/lib_enc/ivas_td_low_rate_enc.c b/lib_enc/ivas_td_low_rate_enc.c index 22e3fcc2e..14c47ac7a 100644 --- a/lib_enc/ivas_td_low_rate_enc.c +++ b/lib_enc/ivas_td_low_rate_enc.c @@ -563,7 +563,7 @@ void encod_gen_2sbfr( // Scale_sig( &hLPDmem->mem_w0, M + 1, sub( add( *Q_new, hLPDmem->e_mem_syn ), Q16 ) ); // M + 1 to sync mem_syn exponent with mem_w0 exponent // hLPDmem->e_mem_syn = sub( Q16, *Q_new ); - find_targets_ivas_fx( speech, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, res, 2 * L_SUBFR, p_Aw, st->preemph_fac, xn, cn, h1 ); + find_targets_fx( speech, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, res, 2 * L_SUBFR, p_Aw, st->preemph_fac, xn, cn, h1 ); /*------------------------------------------------------------------------* * Close-loop pitch search on the 1st and 3rd subfr only and quantization diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index b4c01abe8..43096d171 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -2021,6 +2021,20 @@ ivas_error encod_ppp_fx( Word16 *bwe_exc, /* o : excitation for SWB TBE */ Word16 Q_new, Word16 shift ); +ivas_error encod_ppp_ivas_fx( + Encoder_State *st_fx, /* i/o: state structure */ + const Word16 speech_fx[], /* i : input speech Q_new*/ + const Word16 Aw_fx[], /* i : weighted A(z) unquantized for subframes */ + const Word16 Aq_fx[], /* i : 12k8 Lp coefficient */ + Word16 *res_fx, /* i : residual signal Q_new*/ + Word16 *synth_fx, /* o : core synthesis Q-1*/ + Word16 *exc_fx, /* i/o: current non-enhanced excitation Q_new*/ + Word16 *exc2_fx, /* o : current enhanced excitation Q0*/ + Word16 *pitch_buf_fx, /* o : floating pitch values for each subframe Q6*/ + Word16 *voice_factors, /* o : voicing factors */ + Word16 *bwe_exc, /* o : excitation for SWB TBE */ + Word16 Q_new, + Word16 shift ); void encod_gen_voic_fx( Encoder_State *st_fx, /* i/o: state structure */ const Word16 speech_fx[], /* i : i speech */ diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 1fd85ab27..6578311d2 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -2055,7 +2055,7 @@ typedef struct enc_core_structure float mem_AR[M]; /* AR memory of LSF quantizer (past quantized LSFs without mean) */ float mem_MA[M]; /* MA memory of LSF quantizer (past quantized residual) (used also in AMR-WB IO mode) */ #else - Word16 clip_var_fx[6]; /* pitch gain clipping memory */ + Word16 clip_var_fx[6]; /* pitch gain clipping memory [2.56x,Q14,Q8,Q0,Q14,Q14] */ Word16 mem_AR_fx[M]; /* AR memory of LSF quantizer (past quantized LSFs without mean) Qlog2(2.56) */ Word16 mem_MA_fx[M]; /* MA memory of LSF quantizer (past quantized residual) (used also in AMR-WB IO mode) Qlog2(2.56) */ #endif -- GitLab