From dbfff24f50d85e27e8b3c012ba1389e15983ccfd Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 27 Nov 2024 22:19:13 +0530 Subject: [PATCH 1/2] Encoder clean up in core-coder functions --- lib_com/ivas_prot.h | 29 +- lib_enc/core_enc_init.c | 4 +- lib_enc/ivas_core_enc.c | 64 +- lib_enc/ivas_core_pre_proc_front.c | 27 - lib_enc/ivas_cpe_enc.c | 2 +- lib_enc/ivas_ism_enc.c | 2 +- lib_enc/ivas_mc_param_enc.c | 40 +- lib_enc/ivas_mdct_core_enc.c | 1622 +++++++++++++++------------ lib_enc/ivas_sce_enc.c | 2 +- lib_enc/ivas_stereo_mdct_core_enc.c | 76 +- lib_enc/ivas_tcx_core_enc.c | 8 +- lib_enc/stat_enc.h | 6 +- lib_enc/swb_bwe_enc_fx.c | 10 +- lib_enc/tcx_ltp_enc_fx.c | 24 +- lib_enc/transient_detection_fx.c | 26 +- 15 files changed, 1098 insertions(+), 844 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 48ea0c2b2..caa307e44 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -3223,22 +3223,41 @@ int16_t read_GR0( /*----------------------------------------------------------------------------------* * MCT prototypes *----------------------------------------------------------------------------------*/ - +#ifdef IVAS_FLOAT_FIXED +void ivas_mdct_core_whitening_enc_fx( + CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ + Word16 new_samples_fx[CPE_CHANNELS][L_INP], /* i : new samples */ + Word16 old_wsp_fx[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP */ + Word16 pitch_buf[CPE_CHANNELS][NB_SUBFR16k], /* o : floating pitch for each subframe */ + Word32 *mdst_spectrum_long[CPE_CHANNELS], /* o : buffer for MDST spectrum */ + int16_t tnsBits[CPE_CHANNELS][NB_DIV], /* o : buffer TNS bits */ + Word32 *orig_spectrum_long[CPE_CHANNELS], /* o : origingal spectrum w/o whitening */ + int16_t tnsSize[CPE_CHANNELS][NB_DIV], /* o : size of TNS */ + int16_t p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to parameter array */ + BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ + const int16_t mct_on, /* i : flag mct block (1) or stereo (0) */ + const int16_t nChannels, /* i : total number of coded channels */ +Word16 mdst_spectrum_e[CPE_CHANNELS][NB_DIV], +Word16 orig_spectrum_e[CPE_CHANNELS][NB_DIV] +); +#else void ivas_mdct_core_whitening_enc( CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ Word16 new_samples_fx[CPE_CHANNELS][L_INP], /* i : new samples */ Word16 old_wsp_fx[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP */ Word16 pitch_buf[CPE_CHANNELS][NB_SUBFR16k], /* o : floating pitch for each subframe */ - float *mdst_spectrum_long[CPE_CHANNELS], /* o : buffer for MDST spectrum */ + Word32 *mdst_spectrum_long[CPE_CHANNELS], /* o : buffer for MDST spectrum */ int16_t tnsBits[CPE_CHANNELS][NB_DIV], /* o : buffer TNS bits */ - float *orig_spectrum_long[CPE_CHANNELS], /* o : origingal spectrum w/o whitening */ + Word32 *orig_spectrum_long[CPE_CHANNELS], /* o : origingal spectrum w/o whitening */ int16_t tnsSize[CPE_CHANNELS][NB_DIV], /* o : size of TNS */ int16_t p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to parameter array */ BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ const int16_t mct_on, /* i : flag mct block (1) or stereo (0) */ - const int16_t nChannels /* i : total number of coded channels */ + const int16_t nChannels, /* i : total number of coded channels */ +Word16 mdst_spectrum_e[CPE_CHANNELS][NB_DIV], +Word16 orig_spectrum_e[CPE_CHANNELS][NB_DIV] ); - +#endif void ivas_mct_core_enc( const IVAS_FORMAT ivas_format, /* i : IVAS format */ MCT_ENC_HANDLE hMCT, /* i/o: MCT encoder structure */ diff --git a/lib_enc/core_enc_init.c b/lib_enc/core_enc_init.c index c8ddd7ccd..5c6a8e065 100644 --- a/lib_enc/core_enc_init.c +++ b/lib_enc/core_enc_init.c @@ -156,7 +156,7 @@ void init_coder_ace_plus_ivas_fx( { st->acelpFramesCount = 0; move16(); - st->prevTempFlatness_fx = 16 /*1.0f Q4*/; + st->prevTempFlatness_fx = 128 /*1.0f Q7*/; move16(); } @@ -405,7 +405,7 @@ void init_coder_ace_plus( #endif #ifdef IVAS_FLOAT_FIXED #ifdef MSAN_FIX - st->prevTempFlatness_fx = 16; // Q4 + st->prevTempFlatness_fx = 128; // Q7 #endif #endif } diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c index 9eac0ac78..34efdb144 100644 --- a/lib_enc/ivas_core_enc.c +++ b/lib_enc/ivas_core_enc.c @@ -478,22 +478,80 @@ ivas_error ivas_core_enc( { IF( MCT_flag ) { + Word16 mdst_spectrum_e[CPE_CHANNELS][NB_DIV]; + Word16 orig_spectrum_e[CPE_CHANNELS][NB_DIV]; #ifdef IVAS_FLOAT_FIXED_CONVERSIONS Word16 old_inp_16k_fx[CPE_CHANNELS][L_INP]; - Word16 old_wsp_fx[CPE_CHANNELS][L_WSP], q_fac[CPE_CHANNELS]; + Word16 old_wsp_fx[CPE_CHANNELS][L_WSP], q_fac[CPE_CHANNELS], q_fac1 = Q15; Word16 pitch_buf_fx_new[CPE_CHANNELS][NB_SUBFR16k]; /* Q6 */ for ( i = 0; i < CPE_CHANNELS; i++ ) { + Encoder_State *st1 = sts[i]; + TCX_ENC_HANDLE hTcxEncCh = st1->hTcxEnc; + Word16 nSubframes = ( st1->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + for ( n = 0; n < nSubframes; n++ ) + { + Word16 nl = (Word16) ( (float) ( hTcxEncCh->L_frameTCX / nSubframes ) * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); + floatToFixed_arr( &hTcxEncCh->new_speech_TCX_flt[nl - ( hTcxEncCh->L_frameTCX / nSubframes )], + &hTcxEncCh->new_speech_TCX[nl - ( hTcxEncCh->L_frameTCX / nSubframes )], + 0, + 2 * hTcxEncCh->L_frameTCX / nSubframes ); + + IF( n == 0 ) + { + floatToFixed_arr( &hTcxEncCh->speech_TCX_flt[-( sts[0]->hTcxCfg->tcx_mdct_window_min_lengthFB - 0 )], + &hTcxEncCh->speech_TCX[-( sts[0]->hTcxCfg->tcx_mdct_window_min_lengthFB - 0 )], + 0, + sts[0]->hTcxCfg->tcx_mdct_window_min_lengthFB ); + } + } + floatToFixed_arr( old_inp_16k[i], old_inp_16k_fx[i], 0, L_INP ); q_fac[i] = Q_factor_arr( old_wsp[i], L_WSP ); floatToFixed_arr( old_wsp[i], old_wsp_fx[i], q_fac[i], L_WSP ); + if ( st1->element_mode == IVAS_CPE_DFT ) + { + q_fac1 = Q_factor_arr( st1->buf_wspeech_enc_flt, L_FRAME16k + L_SUBFR + L_FRAME16k + L_NEXT_MAX_16k + 320 ); + floatToFixed_arr( st1->buf_wspeech_enc_flt, st1->buf_wspeech_enc, q_fac1, L_FRAME16k + L_SUBFR + L_FRAME16k + L_NEXT_MAX_16k + 320 ); + st1->exp_buf_wspeech_enc = 15 - q_fac1; + } + else if ( st1->element_mode != IVAS_CPE_MDCT ) + { + q_fac1 = Q_factor_arr( st1->buf_speech_enc_flt, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k ); + floatToFixed_arr( st1->buf_speech_enc_flt, st1->buf_speech_enc, q_fac1, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k ); + st1->exp_buf_speech_enc = 15 - q_fac1; + floatToFixed_arr( st1->hTcxEnc->buf_speech_ltp_flt, st1->hTcxEnc->buf_speech_ltp, q_fac1, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k ); + st1->hTcxEnc->exp_buf_speech_ltp = 15 - q_fac1; + } + floatToFixed_arr( st1->input_buff, st1->input_buff_fx, 0, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ); } #endif - ivas_mdct_core_whitening_enc( hCPE, old_inp_16k_fx, old_wsp_fx, pitch_buf_fx_new, hMCT->p_mdst_spectrum_long[cpe_id], hMCT->tnsBits[cpe_id], hMCT->p_orig_spectrum_long[cpe_id], - hMCT->tnsSize[cpe_id], hMCT->p_param[cpe_id], hMCT->hBstr, 1, hMCT->nchan_out_woLFE ); + ivas_mdct_core_whitening_enc_fx( hCPE, old_inp_16k_fx, old_wsp_fx, pitch_buf_fx_new, hMCT->p_mdst_spectrum_long_fx[cpe_id], hMCT->tnsBits[cpe_id], hMCT->p_orig_spectrum_long_fx[cpe_id], + hMCT->tnsSize[cpe_id], hMCT->p_param[cpe_id], hMCT->hBstr, 1, hMCT->nchan_out_woLFE, mdst_spectrum_e, orig_spectrum_e ); #ifdef IVAS_FLOAT_FIXED_CONVERSIONS for ( i = 0; i < CPE_CHANNELS; i++ ) { + Encoder_State *st1 = sts[i]; + Word16 nSubframes = ( st1->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + if ( st1->element_mode == IVAS_CPE_DFT ) + { + fixedToFloat_arr( st1->buf_wspeech_enc, st1->buf_wspeech_enc_flt, q_fac1, L_FRAME16k + L_SUBFR + L_FRAME16k + L_NEXT_MAX_16k + 320 ); + } + else if ( st1->element_mode != IVAS_CPE_MDCT ) + { + fixedToFloat_arr( st1->hTcxEnc->buf_speech_ltp, st1->hTcxEnc->buf_speech_ltp_flt, q_fac1, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k ); + } + fixedToFloat_arr( st1->input_buff_fx, st1->input_buff, 0, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ); + + fixedToFloat_arrL( st1->hTcxEnc->spectrum_fx[0], st1->hTcxEnc->spectrum[0], 31 - st1->hTcxEnc->spectrum_e[0], st1->hTcxEnc->L_frameTCX / nSubframes ); + fixedToFloat_arrL( hMCT->p_orig_spectrum_long_fx[cpe_id][i], hMCT->p_orig_spectrum_long[cpe_id][i], 31 - orig_spectrum_e[i][0], N_TCX10_MAX ); + fixedToFloat_arrL( hMCT->p_mdst_spectrum_long_fx[cpe_id][i], hMCT->p_mdst_spectrum_long[cpe_id][i], 31 - mdst_spectrum_e[i][0], N_TCX10_MAX ); + if ( nSubframes == NB_DIV ) + { + fixedToFloat_arrL( st1->hTcxEnc->spectrum_fx[1], st1->hTcxEnc->spectrum[1], 31 - st1->hTcxEnc->spectrum_e[1], st1->hTcxEnc->L_frameTCX / nSubframes ); + fixedToFloat_arrL( hMCT->p_orig_spectrum_long_fx[cpe_id][i] + N_TCX10_MAX, hMCT->p_orig_spectrum_long[cpe_id][i] + N_TCX10_MAX, 31 - orig_spectrum_e[i][1], N_TCX10_MAX ); + fixedToFloat_arrL( hMCT->p_mdst_spectrum_long_fx[cpe_id][i] + N_TCX10_MAX, hMCT->p_mdst_spectrum_long[cpe_id][i] + N_TCX10_MAX, 31 - mdst_spectrum_e[i][1], N_TCX10_MAX ); + } fixedToFloat_arr( old_wsp_fx[i], old_wsp[i], q_fac[i], L_WSP ); } #endif diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index f01635fab..bb9d4631a 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -2588,33 +2588,6 @@ ivas_error pre_proc_front_ivas_fx( /* Switch to ACELP for non-harmonic transient signals */ else if ( ( ( element_mode >= IVAS_CPE_DFT && element_brate <= IVAS_16k4 ) || ( element_mode == IVAS_SCE && element_brate < SCE_SMC_THR ) ) && ( loc_harm[0] != 1 ) && smc_dec == MUSIC ) { -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - IF( EQ_16( element_mode, IVAS_SCE ) ) - { - Word16 q1 = Q7; - Word16 q2 = Q7; - st->hTranDet->subblockEnergies.subblockNrg_e = sub( 31, q1 ); - st->hTranDet->subblockEnergies.accSubblockNrg_e = sub( 31, q2 ); - move16(); - move16(); - move16(); - move16(); - } - ELSE IF( EQ_16( element_mode, IVAS_CPE_DFT ) ) - { - FOR( i = 0; i < CPE_CHANNELS; i++ ) - { - Word16 q1 = Q7; - Word16 q2 = Q7; - hCPE->hCoreCoder[i]->hTranDet->subblockEnergies.subblockNrg_e = sub( 31, q1 ); - hCPE->hCoreCoder[i]->hTranDet->subblockEnergies.accSubblockNrg_e = sub( 31, q2 ); - move16(); - move16(); - move16(); - move16(); - } - } -#endif IF( EQ_16( element_mode, IVAS_SCE ) ) { if ( transient_analysis_ivas_fx( st->hTranDet, st->hNoiseEst->cor_map_fx, Q15, st->hNoiseEst->multi_harm_limit_fx, Q9 ) ) diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 291d412d8..4c7b9bff2 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -459,7 +459,7 @@ ivas_error ivas_cpe_enc_fx( RunTransientDetection_ivas_fx( sts[n]->input_fx, input_frame, sts[n]->hTranDet, q_inp ); // Note q of sts[n]->input_fx changes inside function } - currFlatness_fx[n] = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) sts[n]->hTranDet, NSUBBLOCKS, 0 ); // Q4 + currFlatness_fx[n] = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) sts[n]->hTranDet, NSUBBLOCKS, 0 ); // Q7 move16(); } diff --git a/lib_enc/ivas_ism_enc.c b/lib_enc/ivas_ism_enc.c index 0d67347fd..7886ace65 100644 --- a/lib_enc/ivas_ism_enc.c +++ b/lib_enc/ivas_ism_enc.c @@ -565,7 +565,7 @@ ivas_error ivas_ism_enc_fx( #endif 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 + currFlatness_fx[0] = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) st->hTranDet, NSUBBLOCKS, 0 ); // Q7 move16(); /*----------------------------------------------------------------* diff --git a/lib_enc/ivas_mc_param_enc.c b/lib_enc/ivas_mc_param_enc.c index d5add6745..1fbfa6ae0 100644 --- a/lib_enc/ivas_mc_param_enc.c +++ b/lib_enc/ivas_mc_param_enc.c @@ -805,7 +805,7 @@ void ivas_param_mc_enc_fx( const Word16 input_frame /* i : input frame length */ ) { - Word16 i, k; + Word16 k; Word16 ILD_idx[PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_SZ_ILD_MAP]; Word16 ICC_idx[PARAM_MC_MAX_PARAMETER_BANDS * PARAM_MC_SZ_ICC_MAP]; UWord16 bit_buffer[PARAM_MC_MAX_BITS]; @@ -826,17 +826,6 @@ void ivas_param_mc_enc_fx( push_wmops( "param_mc_enc" ); -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - for ( ch = 0; ch < st_ivas->nchan_transport; ch++ ) - { - Word16 cpe_idx = shr( ch, 1 ); - st_ivas->hCPE[cpe_idx]->hCoreCoder[ch - cpe_idx * CPE_CHANNELS]->hTranDet->subblockEnergies.subblockNrg_e = 31 - Q7; - st_ivas->hCPE[cpe_idx]->hCoreCoder[ch - cpe_idx * CPE_CHANNELS]->hTranDet->subblockEnergies.accSubblockNrg_e = 31 - Q7; - move16(); - move16(); - } -#endif - /* initializations */ hParamMC = st_ivas->hParamMC; bit_pos = 0; @@ -998,21 +987,6 @@ void ivas_param_mc_enc_fx( hParamMC->hMetadataPMC.last_coded_bwidth = hParamMC->hMetadataPMC.coded_bwidth; move16(); - FOR( ch = 0; ch < st_ivas->nchan_transport; ch++ ) - { - Word16 cpe_idx = shr( ch, 1 ); - FOR( i = 0; i < NSUBBLOCKS + MAX_TD_DELAY; i++ ) - { - st_ivas->hCPE[cpe_idx]->hCoreCoder[ch - cpe_idx * CPE_CHANNELS]->hTranDet->subblockEnergies.subblockNrg_e = 31 - Q7; - move16(); - } - FOR( i = 0; i < NSUBBLOCKS + MAX_TD_DELAY + 1; i++ ) - { - st_ivas->hCPE[cpe_idx]->hCoreCoder[ch - cpe_idx * CPE_CHANNELS]->hTranDet->subblockEnergies.accSubblockNrg_e = 31 - Q7; - move16(); - } - } - pop_wmops(); return; @@ -3333,20 +3307,14 @@ static void ivas_param_mc_transient_detection_fx( Word16 i; Word16 bIsAttackPresent, attackIndex; Word32 *pSubblockNrg_fx; - Word16 pSubblockNrg_e; Word32 *pAccSubblockNrg_fx; - Word16 pAccSubblockNrg_e; Word16 attackRatioThreshold_fx; push_wmops( "param_mc_trn_det" ); attackRatioThreshold_fx = hTranDet->transientDetector.attackRatioThreshold; pSubblockNrg_fx = &hTranDet->subblockEnergies.subblockNrg[hParamMC->transient_detector_delay]; - pSubblockNrg_e = hTranDet->subblockEnergies.subblockNrg_e; - move16(); pAccSubblockNrg_fx = &hTranDet->subblockEnergies.accSubblockNrg[hParamMC->transient_detector_delay]; - pAccSubblockNrg_e = hTranDet->subblockEnergies.accSubblockNrg_e; - move16(); bIsAttackPresent = FALSE; move16(); @@ -3357,8 +3325,8 @@ static void ivas_param_mc_transient_detection_fx( * if we had an attack very late in the last frame, * make the current frame also a transient one... */ test(); - IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( pSubblockNrg_fx[-1], pSubblockNrg_e, Mpy_32_16_1( pAccSubblockNrg_fx[-1], attackRatioThreshold_fx ), add( pAccSubblockNrg_e, ATTACKTHRESHOLD_E ) ), 1 ) || - EQ_16( BASOP_Util_Cmp_Mant32Exp( pSubblockNrg_fx[-2], pSubblockNrg_e, Mpy_32_16_1( pAccSubblockNrg_fx[-2], attackRatioThreshold_fx ), add( pAccSubblockNrg_e, ATTACKTHRESHOLD_E ) ), 1 ) ) + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( pSubblockNrg_fx[-1], 31, Mpy_32_16_1( pAccSubblockNrg_fx[-1], attackRatioThreshold_fx ), ( 31 + ATTACKTHRESHOLD_E ) ), 1 ) || + EQ_16( BASOP_Util_Cmp_Mant32Exp( pSubblockNrg_fx[-2], 31, Mpy_32_16_1( pAccSubblockNrg_fx[-2], attackRatioThreshold_fx ), ( 31 + ATTACKTHRESHOLD_E ) ), 1 ) ) { bIsAttackPresent = TRUE; move16(); @@ -3367,7 +3335,7 @@ static void ivas_param_mc_transient_detection_fx( } FOR( i = 0; i < NSUBBLOCKS; i++ ){ - IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( pSubblockNrg_fx[i], pSubblockNrg_e, Mpy_32_16_1( pAccSubblockNrg_fx[i], attackRatioThreshold_fx ), add( pAccSubblockNrg_e, ATTACKTHRESHOLD_E ) ), 1 ) ){ + IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( pSubblockNrg_fx[i], 31, Mpy_32_16_1( pAccSubblockNrg_fx[i], attackRatioThreshold_fx ), ( 31 + ATTACKTHRESHOLD_E ) ), 1 ) ){ bIsAttackPresent = TRUE; move16(); attackIndex = i; diff --git a/lib_enc/ivas_mdct_core_enc.c b/lib_enc/ivas_mdct_core_enc.c index 44f6853ca..0bb673f6c 100644 --- a/lib_enc/ivas_mdct_core_enc.c +++ b/lib_enc/ivas_mdct_core_enc.c @@ -52,10 +52,11 @@ * Local constants *---------------------------------------------------------------*/ -#define MAX_STE_PRE_NRG 0.875f -#define MAX_STE_PRE_NRG_Q15 28672 -#define MIN_STE_PRE_LEN 36 -#define SILENT_CHANNEL_THRES 100 +#define MAX_STE_PRE_NRG 0.875f +#define MAX_STE_PRE_NRG_Q15 28672 +#define MIN_STE_PRE_LEN 36 +#define SILENT_CHANNEL_THRES 100 +#define SILENT_CHANNEL_THRES_FX 1677721600 // Q24 #ifdef IVAS_FLOAT_FIXED @@ -884,8 +885,8 @@ static void applyStereoPreProcessingCplx( Word32 *mdstSample1_fx, // q_com Word32 *mdstSample2_fx, // q_com Word16 q_com, - const Word32 factIn_fx, // Q20 - const Word32 factDe_fx, // Q20 + const Word32 factIn_fx, // Q22 + const Word32 factDe_fx, // Q22 const Word16 sign, // Q0 Word16 *mdct_exp1, Word16 *mdst_exp1, @@ -908,17 +909,17 @@ static void applyStereoPreProcessingCplx( absR2_fx = L_abs( valR2_fx ); IF( sign < 0 ) { - dmxR1_fx = L_sub( Mpy_32_32( valR1_fx, factDe_fx ), Mpy_32_32( valR2_fx, factIn_fx ) ); /* cross */ // Q = q_com + Q20 - 31 - dmxR2_fx = L_sub( Mpy_32_32( valR2_fx, factDe_fx ), Mpy_32_32( valR1_fx, factIn_fx ) ); /* -talk */ // Q = q_com + Q20 - 31 + dmxR1_fx = L_sub( Mpy_32_32( valR1_fx, factDe_fx ), Mpy_32_32( valR2_fx, factIn_fx ) ); /* cross */ // Q = q_com + Q22 - 31 + dmxR2_fx = L_sub( Mpy_32_32( valR2_fx, factDe_fx ), Mpy_32_32( valR1_fx, factIn_fx ) ); /* -talk */ // Q = q_com + Q22 - 31 } ELSE { - dmxR1_fx = L_add( Mpy_32_32( valR1_fx, factDe_fx ), Mpy_32_32( valR2_fx, factIn_fx ) ); /* cross */ // Q = q_com + Q20 - 31 - dmxR2_fx = L_add( Mpy_32_32( valR2_fx, factDe_fx ), Mpy_32_32( valR1_fx, factIn_fx ) ); /* -talk */ // Q = q_com + Q20 - 31 + dmxR1_fx = L_add( Mpy_32_32( valR1_fx, factDe_fx ), Mpy_32_32( valR2_fx, factIn_fx ) ); /* cross */ // Q = q_com + Q22 - 31 + dmxR2_fx = L_add( Mpy_32_32( valR2_fx, factDe_fx ), Mpy_32_32( valR1_fx, factIn_fx ) ); /* -talk */ // Q = q_com + Q22 - 31 } - dmx_q = sub( q_com, 11 ); + dmx_q = sub( q_com, 9 ); - IF( LT_32( L_abs( dmxR1_fx ), L_shr( L_add( absR1_fx, absR2_fx ), 11 ) ) ) /* avoid destructive summations */ + IF( LT_32( L_abs( dmxR1_fx ), L_shr( L_add( absR1_fx, absR2_fx ), 9 ) ) ) /* avoid destructive summations */ { IF( Mpy_32_32( absR1_fx, factDe_fx ) < Mpy_32_32( absR2_fx, factIn_fx ) ) { @@ -959,7 +960,7 @@ static void applyStereoPreProcessingCplx( } } - IF( LT_32( L_abs( dmxR2_fx ), L_shr( L_add( absR1_fx, absR2_fx ), 11 ) ) ) /* avoid destructive summations */ + IF( LT_32( L_abs( dmxR2_fx ), L_shr( L_add( absR1_fx, absR2_fx ), 9 ) ) ) /* avoid destructive summations */ { IF( Mpy_32_32( absR1_fx, factIn_fx ) < Mpy_32_32( absR2_fx, factDe_fx ) ) { @@ -1216,15 +1217,15 @@ static uint16_t enc_ste_pre_mdct( maxSqrValue_fx = L_mult0( shl( preproLen, 3 ), preproLen ); // Q - 21 IF( limitWeight > 0 ) { - stepWeightI_fx = ONE_IN_Q20; // Q20 + stepWeightI_fx = ONE_IN_Q22; // Q22 } ELSE { - stepWeightI_fx = ONE_IN_Q21; // Q21 + stepWeightI_fx = ONE_IN_Q23; // Q22, 2.0f in Q22 } move16(); - stepWeightD_fx = L_sub( ONE_IN_Q22, stepWeightI_fx ); // Q20 + stepWeightD_fx = L_sub( ONE_IN_Q24, stepWeightI_fx ); // Q22, 4.f - stepWeightI corr_fx = 0, sumL_fx = 0, sumR_fx = 0; move32(); move32(); @@ -1321,9 +1322,9 @@ static uint16_t enc_ste_pre_mdct( test(); IF( ( GT_32( L_shl( corr_fx, sub( corr_e, s_max( corr_e, 0 ) ) ), L_shl( 1610612736, sub( 0, s_max( corr_e, 0 ) ) ) ) && corrIdxPrev == 0 ) || ( LE_32( L_shl( corr_fx, sub( corr_e, s_max( corr_e, 0 ) ) ), L_shl( 1610612736, sub( 0, s_max( corr_e, 0 ) ) ) ) && corrIdxPrev > 0 ) ) { - stepWeightI_fx = ONE_IN_Q20; + stepWeightI_fx = ONE_IN_Q22; move32(); - stepWeightD_fx = L_sub( ONE_IN_Q22, stepWeightI_fx ); + stepWeightD_fx = L_sub( ONE_IN_Q24, stepWeightI_fx ); } test(); IF( LE_32( L_shl( corr_fx, sub( corr_e, s_max( corr_e, 0 ) ) ), L_shl( 1610612736, sub( 0, s_max( corr_e, 0 ) ) ) ) && corrIdxPrev == 0 ) /* bypass all processing, just return */ @@ -1336,8 +1337,8 @@ static uint16_t enc_ste_pre_mdct( sigI0_fx += add( fadeInOff, 1 ); sigI1_fx += add( fadeInOff, 1 ); tmp = add( fadeInOff, 1 ); - xTalkI_fx = stepWeightI_fx; - xTalkD_fx = imult3216( stepWeightD_fx, sub( shl( fadeInLen, 1 ), 1 ) ); + xTalkI_fx = stepWeightI_fx; // Q22 + xTalkD_fx = imult3216( stepWeightD_fx, sub( shl( fadeInLen, 1 ), 1 ) ); // Q22 for ( s = sub( fadeInLen, 1 ); s > 0; s--, sigR0_fx++, sigR1_fx++, sigI0_fx++, sigI1_fx++, tmp++ ) { @@ -1599,88 +1600,74 @@ void enc_prm_igf_mdct( *-------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED -void ivas_mdct_core_whitening_enc( +void ivas_mdct_core_whitening_enc_fx( CPE_ENC_HANDLE hCPE, /* i/o: CPE encoder structure */ Word16 new_samples_fx[CPE_CHANNELS][L_INP], /* i : new samples */ Word16 old_wsp_fx[CPE_CHANNELS][L_WSP], /* i : 12.8kHz weighted speech (for LTP */ Word16 pitch_buf_fx[CPE_CHANNELS][NB_SUBFR16k], /* o : floating pitch for each subframe */ - float *mdst_spectrum_long[CPE_CHANNELS], /* o : buffer for MDST spectrum */ - int16_t tnsBits[CPE_CHANNELS][NB_DIV], /* o : buffer TNS bits */ - float *orig_spectrum_long[CPE_CHANNELS], /* o : origingal spectrum w/o whitening */ - int16_t tnsSize[CPE_CHANNELS][NB_DIV], /* o : number of tns parameters put into prm */ - int16_t p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to the parameter table */ + Word32 *mdst_spectrum_long_fx[CPE_CHANNELS], /* o : buffer for MDST spectrum */ + Word16 tnsBits[CPE_CHANNELS][NB_DIV], /* o : buffer TNS bits */ + Word32 *orig_spectrum_long[CPE_CHANNELS], /* o : origingal spectrum w/o whitening */ + Word16 tnsSize[CPE_CHANNELS][NB_DIV], /* o : number of tns parameters put into prm */ + Word16 p_param[CPE_CHANNELS][NB_DIV], /* o : pointer to the parameter table */ BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */ - const int16_t mct_on, /* i : flag mct block (1) or stereo (0) */ - const int16_t nChannels /* i : total number of coded channels */ -) + const Word16 mct_on, /* i : flag mct block (1) or stereo (0) */ + const Word16 nChannels, /* i : total number of coded channels */ + Word16 mdst_spectrum_e[CPE_CHANNELS][NB_DIV], + Word16 orig_spectrum_e[CPE_CHANNELS][NB_DIV] ) { - int16_t n, ch, nSubframes, L_subframe, L_subframeTCX, tcx_subframe_coded_lines; + Word16 n, ch, nSubframes, L_subframe, L_subframeTCX, tcx_subframe_coded_lines; Word16 A_q_fx[CPE_CHANNELS][NB_DIV][M + 1]; - int16_t sns_vq_indices[CPE_CHANNELS * NB_DIV * SNS_MSVQ_NSTAGES_TCX10]; - int16_t sns_stereo_mode[NB_DIV]; - int16_t idx; - int16_t param_lpc[CPE_CHANNELS][NPRM_LPC_NEW]; - int16_t param_core[CPE_CHANNELS][2 * NPRM_DIV]; - int16_t ltpBits[CPE_CHANNELS]; - int16_t i, T_op[CPE_CHANNELS][3]; - float *orig_spectrum[CPE_CHANNELS][NB_DIV]; /* Pointers to MDCT output for a short block (L/R) */ + Word16 sns_vq_indices[CPE_CHANNELS * NB_DIV * SNS_MSVQ_NSTAGES_TCX10]; + Word16 sns_stereo_mode[NB_DIV]; + Word16 idx; + Word16 param_lpc[CPE_CHANNELS][NPRM_LPC_NEW]; + Word16 param_core[CPE_CHANNELS][2 * NPRM_DIV]; + Word16 ltpBits[CPE_CHANNELS]; + Word16 i, T_op[CPE_CHANNELS][3]; + Word32 *orig_spectrum[CPE_CHANNELS][NB_DIV]; /* Pointers to MDCT output for a short block (L/R) */ Word32 temp_buffer[15 * L_FRAME48k / 8]; Word32 *windowedSignal_fx[CPE_CHANNELS]; - float *powerSpec = orig_spectrum_long[0]; -#ifdef IVAS_FLOAT_FIXED - Word32 powerSpec_fx[N_MAX]; -#endif - float *mdst_spectrum[CPE_CHANNELS][NB_DIV]; -#ifndef IVAS_FLOAT_FIXED - float nrg; -#else + Word32 *powerSpec_fx = orig_spectrum_long[0]; + Word64 powerSpec_fx64[N_MAX]; Word16 nrg_fx; /* Q15 */ -#endif Encoder_State *st, **sts; -#ifdef IVAS_FLOAT_FIXED - Word16 q_fac = 0; - move16(); Word32 scf_fx[CPE_CHANNELS][NB_DIV][M]; Word32 scf_q_fx[CPE_CHANNELS][NB_DIV][M]; -#ifdef MSAN_FIX - FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - FOR( i = 0; i < NB_DIV; i++ ) - { - set32_fx( scf_fx[ch][i], 0, M ); - set32_fx( scf_q_fx[ch][i], 0, M ); - } - } -#endif -#endif - float chE[2], chE_tot; - int8_t sns_low_br_mode; - int16_t nbits_start_sns; - int16_t num_sns; - int8_t skipped_first_channel; - int16_t zero_side_flag[NB_DIV]; -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - Word16 q_com; + Word64 chE_fx[2], chE_tot_fx; + Word8 sns_low_br_mode; + Word16 nbits_start_sns; + Word16 num_sns; + Word8 skipped_first_channel; + Word16 zero_side_flag[NB_DIV]; + Word16 q_com, q_min; Word32 *mdst_spectrum_fx[CPE_CHANNELS][NB_DIV]; - Word32 mdst_spectrum_long_fx[CPE_CHANNELS][2 * L_FRAME48k]; - Word16 mdst_spectrum_e[CPE_CHANNELS][NB_DIV]; -#endif -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS Word16 Q_new; Word16 q_windowedSignal[CPE_CHANNELS]; - Word32 L_tmpbuf[NB_DIV * L_FRAME48k + 4], L_tmpbuf1[NB_DIV * L_FRAME48k + 4]; -#endif + Word16 shift = 0; /* 0 for one subframe and 1 for two subframes*/ + Word16 *speech; push_wmops( "mdct_core_whitening" ); #ifdef MSAN_FIX FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { + FOR( i = 0; i < NB_DIV; i++ ) + { + set32_fx( scf_fx[ch][i], 0, M ); + set32_fx( scf_q_fx[ch][i], 0, M ); + } set16_fx( A_q_fx[ch][0], 0, M + 1 ); set16_fx( A_q_fx[ch][1], 0, M + 1 ); + set16_fx( mdst_spectrum_e[ch], 0, NB_DIV ); + set16_fx( orig_spectrum_e[ch], 0, NB_DIV ); } - set16_fx( q_windowedSignal, 0, CPE_CHANNELS ); + set16_fx( q_windowedSignal, Q31, CPE_CHANNELS ); #endif + q_com = Q31; + q_min = 0; + move16(); + move16(); /*--------------------------------------------------------------* * Initialization @@ -1688,300 +1675,158 @@ void ivas_mdct_core_whitening_enc( sts = hCPE->hCoreCoder; - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { -#ifdef IVAS_FLOAT_FIXED stereo_tcx_init_enc_fx( sts[ch] ); -#else - stereo_tcx_init_enc( sts[ch] ); -#endif - set_s( tnsSize[ch], 0, 2 ); set_s( tnsBits[ch], 0, 2 ); ltpBits[ch] = 0; + move16(); - for ( i = 0; i < 3; i++ ) + FOR( i = 0; i < 3; i++ ) { T_op[ch][i] = sts[ch]->pitch[i]; + move16(); /* check minimum pitch for quantization */ - if ( T_op[ch][i] < PIT_MIN_SHORTER ) + IF( LT_16( T_op[ch][i], PIT_MIN_SHORTER ) ) { - T_op[ch][i] *= 2; + T_op[ch][i] = shl( T_op[ch][i], 1 ); + move16(); } } } - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { orig_spectrum[ch][0] = orig_spectrum_long[ch]; orig_spectrum[ch][1] = orig_spectrum_long[ch] + N_TCX10_MAX; - mdst_spectrum[ch][0] = mdst_spectrum_long[ch]; - mdst_spectrum[ch][1] = mdst_spectrum_long[ch] + N_TCX10_MAX; -#ifdef IVAS_FLOAT_FIXED - set32_fx( mdst_spectrum_long_fx[ch], 0, 1920 ); mdst_spectrum_fx[ch][0] = mdst_spectrum_long_fx[ch]; mdst_spectrum_fx[ch][1] = mdst_spectrum_long_fx[ch] + N_TCX10_MAX; #ifdef MSAN_FIX set32_fx( temp_buffer, 0, 15 * L_FRAME48k / 8 ); -#endif #endif } - windowedSignal_fx[0] = L_tmpbuf; - windowedSignal_fx[1] = L_tmpbuf1; + windowedSignal_fx[0] = orig_spectrum_long[0]; /* NOTE temporarily available */ + windowedSignal_fx[1] = temp_buffer; /* orig_spectrum_long isn't long enough */ /*--------------------------------------------------------------* * TCX20/TCX10 switching decision *---------------------------------------------------------------*/ - if ( mct_on ) + IF( mct_on ) { -#ifndef IVAS_FLOAT_FIXED - sts[0]->hTcxEnc->tfm_mem = sts[1]->hTcxEnc->tfm_mem = sqrtf( 0.5f * ( sts[0]->hTcxEnc->tfm_mem * sts[0]->hTcxEnc->tfm_mem + sts[1]->hTcxEnc->tfm_mem * sts[1]->hTcxEnc->tfm_mem ) ); /* RMS */ - sts[0]->hTcxEnc->tcxltp_norm_corr_past_flt = sts[1]->hTcxEnc->tcxltp_norm_corr_past_flt = 0.5f * ( sts[0]->hTcxEnc->tcxltp_norm_corr_past_flt + sts[1]->hTcxEnc->tcxltp_norm_corr_past_flt ); -#else + Word32 L_tmp; Word16 tmp_e = 0; move16(); - Word32 L_tmp; + L_tmp = Sqrt32( L_add( L_shr( Mpy_32_32( sts[0]->hTcxEnc->tfm_mem_fx, sts[0]->hTcxEnc->tfm_mem_fx ), 1 ), L_shr( Mpy_32_32( sts[1]->hTcxEnc->tfm_mem_fx, sts[1]->hTcxEnc->tfm_mem_fx ), 1 ) ), &tmp_e ); /* RMS */ sts[0]->hTcxEnc->tfm_mem_fx = sts[1]->hTcxEnc->tfm_mem_fx = L_shl( L_tmp, tmp_e ); /* Q31 */ move32(); move32(); + sts[0]->hTcxEnc->tcxltp_norm_corr_past = sts[1]->hTcxEnc->tcxltp_norm_corr_past = extract_l( L_shr( L_add( sts[0]->hTcxEnc->tcxltp_norm_corr_past, sts[1]->hTcxEnc->tcxltp_norm_corr_past ), 1 ) ); move16(); move16(); -#endif - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; -#ifdef IVAS_FLOAT_FIXED SetTCXModeInfo_ivas_fx( st, st->hTranDet, &st->hTcxCfg->tcx_curr_overlap_mode ); -#else - SetTCXModeInfo( st, st->hTranDet, &st->hTcxCfg->tcx_curr_overlap_mode ); -#endif } } sts[0]->core = sts[0]->hTcxEnc->tcxMode; + move16(); sts[1]->core = sts[1]->hTcxEnc->tcxMode; + move16(); /*--------------------------------------------------------------* * Core Signal Analysis: MDCT, TNS *---------------------------------------------------------------*/ - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; - if ( ( hCPE->cpe_id * CPE_CHANNELS + ch ) >= nChannels ) + IF( GE_16( add( imult1616( hCPE->cpe_id, CPE_CHANNELS ), ch ), nChannels ) ) { - continue; + CONTINUE; } SetCurrentPsychParams( st->core, 0, st->hTcxCfg ); /* tcx ltp analysis on the 12.8kHz weighted speech, saves preproc resampling to sr_core */ -#ifdef IVAS_FLOAT_FIXED - TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; tcx_ltp_encode_ivas_fx( st, st->hTcxEnc->tcxMode, L_FRAME, old_wsp_fx[ch] + L_WSP_MEM + L_LOOK_12k8, NULL, old_wsp_fx[ch] + L_WSP_MEM + L_LOOK_12k8, T_op[ch], ¶m_core[ch][1 + NOISE_FILL_RANGES], <pBits[ch], NULL, 0, IVAS_CPE_MDCT ); -#else - tcx_ltp_encode( st, st->hTcxEnc->tcxMode, L_FRAME, old_wsp[ch] + L_WSP_MEM + L_LOOK_12k8, NULL, old_wsp[ch] + L_WSP_MEM + L_LOOK_12k8, T_op[ch], ¶m_core[ch][1 + NOISE_FILL_RANGES], <pBits[ch], NULL, 0, IVAS_CPE_MDCT ); -#endif - -#ifdef IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - IF( EQ_16( hTcxEnc->tcxMode, TCX_20 ) ) - { - nSubframes = 1; - } - ELSE - { - nSubframes = 2; - } -#endif -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS_ - Word16 offset; - IF( ( EQ_16( transform_type[0], TCX_20 ) ) && ( NE_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) ) - { - Word16 nl = (int16_t) ( (float) hTcxEnc->L_frameTCX * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); - floatToFixed_arr( &hTcxEnc->new_speech_TCX_flt[nl - hTcxEnc->L_frameTCX], - &hTcxEnc->new_speech_TCX[nl - hTcxEnc->L_frameTCX], - 0, - 2 * hTcxEnc->L_frameTCX ); - windowedSignal_fx[ch][0] = (Word16) windowedSignal[ch][0]; - windowedSignal_fx[ch][1] = (Word16) windowedSignal[ch][1]; - } - ELSE - { - tcx_get_windows( st->hTcxCfg, overlap_mode[0], overlap_mode[1], &leftOverlap, &left_win, &rightOverlap, &right_win, 1 ); - len_windowSignal = ( st->hTcxEnc->L_frameTCX / nSubframes ) + ( leftOverlap + rightOverlap ) / 2; - offset = st->hTcxCfg->tcx_offsetFB; - IF( EQ_16( overlap_mode[0], TRANSITION_OVERLAP ) ) - { - len_windowSignal += st->hTcxCfg->tcx5SizeFB; - /* Increase frame size for 5ms */ - offset = negate( shr( st->hTcxCfg->tcx_mdct_window_trans_lengthFB, 1 ) ); - } - floatToFixed_arr( &hTcxEnc->speech_TCX_flt[-( leftOverlap / 2 ) + offset], - &hTcxEnc->speech_TCX[-( leftOverlap / 2 ) + offset], - 0, - len_windowSignal ); - windowedSignal_fx[ch][0] = (Word16) windowedSignal[ch][0]; - windowedSignal_fx[ch][1] = (Word16) windowedSignal[ch][1]; - floatToFixed_arrL32( windowedSignal[ch] + 2, windowedSignal_fx[ch] + 2, 0, len_windowSignal ); - } - IF( NE_16( hTcxEnc->tcxMode, TCX_20 ) ) - { - IF( ( EQ_16( transform_type[1], TCX_20 ) ) && ( NE_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) ) - { - Word16 nl = (int16_t) ( (float) hTcxEnc->L_frameTCX * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); - floatToFixed_arr( &hTcxEnc->new_speech_TCX_flt[nl - hTcxEnc->L_frameTCX], - &hTcxEnc->new_speech_TCX[nl - hTcxEnc->L_frameTCX], - 0, - 2 * hTcxEnc->L_frameTCX ); - windowedSignal_fx[ch][L_FRAME48k + 0] = (Word16) windowedSignal[ch][L_FRAME_MAX + 0]; - windowedSignal_fx[ch][L_FRAME48k + 1] = (Word16) windowedSignal[ch][L_FRAME_MAX + 1]; - } - ELSE - { - tcx_get_windows( st->hTcxCfg, overlap_mode[1], overlap_mode[2], &leftOverlap, &left_win, &rightOverlap, &right_win, 1 ); - len_windowSignal = ( st->hTcxEnc->L_frameTCX / nSubframes ) + ( leftOverlap + rightOverlap ) / 2; - offset = st->hTcxCfg->tcx_offsetFB; - IF( EQ_16( overlap_mode[1], TRANSITION_OVERLAP ) ) - { - len_windowSignal += st->hTcxCfg->tcx5SizeFB; - /* Increase frame size for 5ms */ - offset = negate( shr( st->hTcxCfg->tcx_mdct_window_trans_lengthFB, 1 ) ); - } - floatToFixed_arr( &hTcxEnc->speech_TCX_flt[( 2 * st->hTcxCfg->tcx5SizeFB ) - ( leftOverlap / 2 ) + offset], - &hTcxEnc->speech_TCX[( 2 * st->hTcxCfg->tcx5SizeFB ) - ( leftOverlap / 2 ) + offset], - 0, - len_windowSignal ); - windowedSignal_fx[ch][L_FRAME48k + 0] = (Word16) windowedSignal[ch][L_FRAME_MAX + 0]; - windowedSignal_fx[ch][L_FRAME48k + 1] = (Word16) windowedSignal[ch][L_FRAME_MAX + 1]; - floatToFixed_arrL32( windowedSignal[ch] + L_FRAME48k + 2, windowedSignal_fx[ch] + L_FRAME48k + 2, 0, len_windowSignal ); - } - } -#endif -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - - if ( st->element_mode == IVAS_CPE_DFT ) - { - q_fac = Q_factor_arr( st->buf_wspeech_enc_flt, L_FRAME16k + L_SUBFR + L_FRAME16k + L_NEXT_MAX_16k + 320 ); - floatToFixed_arr( st->buf_wspeech_enc_flt, st->buf_wspeech_enc, q_fac, L_FRAME16k + L_SUBFR + L_FRAME16k + L_NEXT_MAX_16k + 320 ); - st->exp_buf_wspeech_enc = 15 - q_fac; - } - else if ( st->element_mode != IVAS_CPE_MDCT ) - { - q_fac = Q_factor_arr( st->buf_speech_enc_flt, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k ); - floatToFixed_arr( st->buf_speech_enc_flt, st->buf_speech_enc, q_fac, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k ); - st->exp_buf_speech_enc = 15 - q_fac; - floatToFixed_arr( st->hTcxEnc->buf_speech_ltp_flt, st->hTcxEnc->buf_speech_ltp, q_fac, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k ); - st->hTcxEnc->exp_buf_speech_ltp = 15 - q_fac; - } - - floatToFixed_arr( st->input_buff, st->input_buff_fx, 0, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ); Q_new = 0; -#endif + move16(); + core_signal_analysis_high_bitrate_ivas_fx( new_samples_fx[ch] + L_INP_MEM, T_op[ch], NULL, NULL, st, tnsSize[ch], tnsBits[ch], param_core[ch], <pBits[ch], windowedSignal_fx[ch], st->L_frame, st->hTcxEnc->L_frameTCX, hCPE->last_element_mode, 0, mdst_spectrum_fx[ch], mdst_spectrum_e[ch], &Q_new, &q_windowedSignal[ch] ); -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - fixedToFloat_arr( st->input_buff_fx, st->input_buff, 0, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ); - IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) + /* BWD in MDCT domain */ + IF( NE_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) { - IF( st->hTcxEnc->fUseTns[0] || st->hTcxEnc->fUseTns[1] ) + nSubframes = NB_DIV; + move16(); + if ( EQ_16( st->hTcxEnc->tcxMode, TCX_20 ) ) { - if ( st->hTcxCfg->fIsTNSAllowed ) - { - st->hTranDet->transientDetector.pSubblockEnergies->subblockNrg_e = 31 - Q7; - move16(); - } + nSubframes = 1; + move16(); } - } - if ( st->element_mode == IVAS_CPE_DFT ) - { - fixedToFloat_arr( st->buf_wspeech_enc, st->buf_wspeech_enc_flt, q_fac, L_FRAME16k + L_SUBFR + L_FRAME16k + L_NEXT_MAX_16k + 320 ); - } - else if ( st->element_mode != IVAS_CPE_MDCT ) - { - fixedToFloat_arr( st->hTcxEnc->buf_speech_ltp, st->hTcxEnc->buf_speech_ltp_flt, q_fac, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k ); - } + FOR( n = 0; n < nSubframes; n++ ) + { + Word16 spect_fx[L_FRAME48k]; + Word16 q_spectrum = L_norm_arr( st->hTcxEnc->spectrum_fx[n], shr( st->hTcxEnc->L_frameTCX, n ) ); - fixedToFloat_arrL32( hTcxEnc->spectrum_fx[0], hTcxEnc->spectrum[0], sub( Q31, hTcxEnc->spectrum_e[0] ), st->hTcxEnc->L_frameTCX / nSubframes ); - IF( hTcxEnc->tcxMode != TCX_20 ) - { - fixedToFloat_arrL32( hTcxEnc->spectrum_fx[1], hTcxEnc->spectrum[1], sub( Q31, hTcxEnc->spectrum_e[1] ), st->hTcxEnc->L_frameTCX / nSubframes ); - } - fixedToFloat_arrL32( mdst_spectrum_fx[ch][0], mdst_spectrum[ch][0], sub( Q31, mdst_spectrum_e[ch][0] ), st->hTcxEnc->L_frameTCX / nSubframes ); - IF( hTcxEnc->tcxMode != TCX_20 ) - { - fixedToFloat_arrL32( mdst_spectrum_fx[ch][1], mdst_spectrum[ch][1], sub( Q31, mdst_spectrum_e[ch][1] ), st->hTcxEnc->L_frameTCX / nSubframes ); - } -#endif -#else - core_signal_analysis_high_bitrate( new_samples[ch] + L_INP_MEM, T_op[ch], NULL, NULL, st, mdst_spectrum[ch], tnsSize[ch], tnsBits[ch], param_core[ch], <pBits[ch], windowedSignal[ch], st->L_frame, st->hTcxEnc->L_frameTCX, hCPE->last_element_mode, 0 ); -#endif -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - int size = 960; - Word16 *spect_fx[2]; - // Allocate memory for both spect_fx[0] and spect_fx[1] - spect_fx[0] = (Word16 *) malloc( size * sizeof( Word16 ) ); - spect_fx[1] = (Word16 *) malloc( size * sizeof( Word16 ) ); -#endif - /* BWD in MDCT domain */ - if ( st->hTcxCfg->tcx_last_overlap_mode != TRANSITION_OVERLAP ) - { - nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + Copy_Scale_sig32_16( st->hTcxEnc->spectrum_fx[n], spect_fx, shr( st->hTcxEnc->L_frameTCX, n ), q_spectrum ); + bw_detect_fx( st, NULL, spect_fx, NULL, NULL, MC_FORMAT /*just cannot be ISM_FORMAT*/, mct_on ); - for ( n = 0; n < nSubframes; n++ ) - { -#ifndef IVAS_FLOAT_FIXED - bw_detect( st, NULL, st->hTcxEnc->spectrum[n], NULL, MC_FORMAT /*just cannot be ISM_FORMAT*/, mct_on ); -#else -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS -#ifdef MSAN_FIX - Word16 q_spectrum = L_norm_arr( st->hTcxEnc->spectrum_fx[n], st->hTcxEnc->L_frameTCX / ( n + 1 ) ); - Copy_Scale_sig32_16( st->hTcxEnc->spectrum_fx[n], spect_fx[n], st->hTcxEnc->L_frameTCX / ( n + 1 ), q_spectrum ); -#else - Word16 l_frame = (int16_t) ( st->input_Fs / FRAMES_PER_SEC ); - q_spectrum = Q_factor_arr( st->hTcxEnc->spectrum[n], l_frame ); - floatToFixed_arr( st->hTcxEnc->spectrum[n], spect_fx[n], q_spectrum, l_frame ); -#endif -#endif - bw_detect_fx( st, NULL, spect_fx[n], NULL, NULL, MC_FORMAT /*just cannot be ISM_FORMAT*/, mct_on ); -#endif - if ( nSubframes == NB_DIV && n == 0 ) + test(); + if ( EQ_16( nSubframes, NB_DIV ) && n == 0 ) { st->last_input_bwidth = st->input_bwidth; + move16(); } } } -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - free( spect_fx[0] ); - free( spect_fx[1] ); -#endif - if ( st->last_core == ACELP_CORE ) /* reset past kernel info */ + + IF( st->last_core == ACELP_CORE ) /* reset past kernel info */ { st->hTcxEnc->kernel_switch_corr_past = 0; + move16(); st->hTcxEnc->kernel_symmetry_past = 0; + move32(); } } - /*--------------------------------------------------------------* * Transform Kernel Switching, Stereo Pre-Processing, and TNS *---------------------------------------------------------------*/ sts[0]->hTcxEnc->fUseTns[1] = 0; + move16(); - if ( sts[0]->element_brate < IVAS_80k && sts[0]->core == sts[1]->core && sts[0]->element_mode == IVAS_CPE_MDCT && !mct_on && !hCPE->hStereoMdct->isSBAStereoMode ) + test(); + test(); + test(); + test(); + + IF( LT_32( sts[0]->element_brate, IVAS_80k ) && EQ_16( sts[0]->core, sts[1]->core ) && EQ_16( sts[0]->element_mode, IVAS_CPE_MDCT ) && !mct_on && !hCPE->hStereoMdct->isSBAStereoMode ) { - int16_t nSampCore; - int32_t totalRate; + Word16 nSampCore; + Word32 totalRate; TCX_ENC_HANDLE hTcxEnc0, hTcxEnc1; - nSampCore = ( sts[0]->igf ) ? max( sts[0]->hIGFEnc->infoStartLine, sts[1]->hIGFEnc->infoStartLine ) : 0; + nSampCore = 0; + move16(); + + IF( sts[0]->igf ) + { + nSampCore = s_max( sts[0]->hIGFEnc->infoStartLine, sts[1]->hIGFEnc->infoStartLine ); + } + totalRate = sts[0]->element_brate; + move32(); hTcxEnc0 = sts[0]->hTcxEnc; hTcxEnc1 = sts[1]->hTcxEnc; @@ -1990,443 +1835,697 @@ void ivas_mdct_core_whitening_enc( if ( nSampCore == 0 ) { nSampCore = tcx_subframe_coded_lines; + move16(); } nrg_fx = extract_l( L_shr( L_add( L_add( L_add( hTcxEnc0->tcxltp_norm_corr_past, hTcxEnc0->tcxltp_norm_corr_mem ), hTcxEnc1->tcxltp_norm_corr_past ), hTcxEnc1->tcxltp_norm_corr_mem ), 2 ) ); /* normalized correlation of the current frame */ + L_subframe = s_max( 512, L_subframe ); - L_subframe = max( 512, L_subframe ); - nSubframes = ( hTcxEnc0->tcxMode == TCX_20 ) ? 1 : NB_DIV; + nSubframes = 1; + move16(); + shift = 0; + move16(); + IF( NE_16( hTcxEnc0->tcxMode, TCX_20 ) ) + { + nSubframes = NB_DIV; + move16(); + shift = 1; + move16(); + } - for ( n = 0; n < nSubframes; n++ ) + FOR( n = 0; n < nSubframes; n++ ) { - if ( hTcxEnc0->transform_type[n] == hTcxEnc1->transform_type[n] ) + IF( EQ_16( hTcxEnc0->transform_type[n], hTcxEnc1->transform_type[n] ) ) { -#ifdef IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - q_com = L_get_q_buf1( hTcxEnc0->spectrum[n], hTcxEnc0->L_frameTCX / nSubframes ); - q_com = s_min( q_com, L_get_q_buf1( hTcxEnc1->spectrum[n], hTcxEnc1->L_frameTCX / nSubframes ) ); - q_com = s_min( q_com, L_get_q_buf1( mdst_spectrum[0][n], hTcxEnc0->L_frameTCX / nSubframes ) ); - q_com = s_min( q_com, L_get_q_buf1( mdst_spectrum[1][n], hTcxEnc1->L_frameTCX / nSubframes ) ); - - floatToFixed_arrL32( hTcxEnc0->spectrum[n], hTcxEnc0->spectrum_fx[n], q_com, hTcxEnc0->L_frameTCX / nSubframes ); - floatToFixed_arrL32( hTcxEnc1->spectrum[n], hTcxEnc1->spectrum_fx[n], q_com, hTcxEnc1->L_frameTCX / nSubframes ); - floatToFixed_arrL32( mdst_spectrum[0][n], mdst_spectrum_fx[0][n], q_com, hTcxEnc0->L_frameTCX / nSubframes ); - floatToFixed_arrL32( mdst_spectrum[1][n], mdst_spectrum_fx[1][n], q_com, hTcxEnc1->L_frameTCX / nSubframes ); -#endif + q_min = s_max( hTcxEnc0->spectrum_e[n], hTcxEnc1->spectrum_e[n] ); + q_min = s_max( q_min, mdst_spectrum_e[0][n] ); + q_min = s_max( q_min, mdst_spectrum_e[1][n] ); + + q_min = sub( Q31, q_min ); + + q_com = s_min( L_norm_arr( hTcxEnc1->spectrum_fx[n], shr( hTcxEnc1->L_frameTCX, shift ) ), L_norm_arr( hTcxEnc0->spectrum_fx[n], shr( hTcxEnc0->L_frameTCX, shift ) ) ); + q_com = s_min( q_com, L_norm_arr( mdst_spectrum_fx[0][n], shr( hTcxEnc0->L_frameTCX, shift ) ) ); + q_com = s_min( q_com, L_norm_arr( mdst_spectrum_fx[1][n], shr( hTcxEnc1->L_frameTCX, shift ) ) ); + + q_com = s_min( Q31, add( q_min, q_com ) ); + + Scale_sig32( hTcxEnc0->spectrum_fx[n], shr( hTcxEnc0->L_frameTCX, shift ), sub( q_com, sub( Q31, hTcxEnc0->spectrum_e[n] ) ) ); + Scale_sig32( hTcxEnc1->spectrum_fx[n], shr( hTcxEnc1->L_frameTCX, shift ), sub( q_com, sub( Q31, hTcxEnc1->spectrum_e[n] ) ) ); + Scale_sig32( mdst_spectrum_fx[0][n], shr( hTcxEnc0->L_frameTCX, shift ), sub( q_com, sub( Q31, mdst_spectrum_e[0][n] ) ) ); + Scale_sig32( mdst_spectrum_fx[1][n], shr( hTcxEnc1->L_frameTCX, shift ), sub( q_com, sub( Q31, mdst_spectrum_e[1][n] ) ) ); + const Word16 switchKernel = /* these 4 transform types can be applied: 0 = MDCT-IV, 1 = MDST-II, 2 = MDCT-II, 3 = MDST-IV */ kernel_switch_detect_fx( hTcxEnc0->spectrum_fx[n], hTcxEnc1->spectrum_fx[n], mdst_spectrum_fx[0][n], mdst_spectrum_fx[1][n], q_com, nSampCore / nSubframes, - L_subframeTCX / nSubframes, hTcxEnc0->transform_type[n], &hTcxEnc0->kernel_switch_corr_past, ( totalRate * L_subframe ) / nSubframes ); -#else - const int16_t switchKernel = /* these 4 transform types can be applied: 0 = MDCT-IV, 1 = MDST-II, 2 = MDCT-II, 3 = MDST-IV */ - kernel_switch_detect( hTcxEnc0->spectrum[n], hTcxEnc1->spectrum[n], mdst_spectrum[0][n], mdst_spectrum[1][n], nSampCore / nSubframes, - L_subframeTCX / nSubframes, hTcxEnc0->transform_type[n], &hTcxEnc0->kernel_switch_corr_past_flt, ( totalRate * L_subframe ) / nSubframes ); -#endif - if ( switchKernel ) /* apply MDST-IV coding in one of the channels */ + shr( L_subframeTCX, shift ), hTcxEnc0->transform_type[n], &hTcxEnc0->kernel_switch_corr_past, L_shr( imult3216( totalRate, L_subframe ), shift ) ); + + mdst_spectrum_e[0][n] = sub( Q31, q_com ); + mdst_spectrum_e[1][n] = sub( Q31, q_com ); + hTcxEnc0->spectrum_e[n] = sub( Q31, q_com ); + hTcxEnc1->spectrum_e[n] = sub( Q31, q_com ); + move16(); + move16(); + move16(); + move16(); + + IF( switchKernel ) /* apply MDST-IV coding in one of the channels */ { - hTcxEnc0->kernel_type[n] = ( hTcxEnc0->kernel_symmetry_past ? 3 : 1 ) - max( 0, switchKernel ); - hTcxEnc1->kernel_type[n] = ( hTcxEnc1->kernel_symmetry_past ? 2 : 0 ) + max( 0, switchKernel ); + Word16 temp; + temp = 1; + move16(); + if ( hTcxEnc0->kernel_symmetry_past ) + { + temp = 3; + move16(); + } + + hTcxEnc0->kernel_type[n] = sub( temp, s_max( 0, switchKernel ) ); + move16(); + + temp = 0; + move16(); + IF( hTcxEnc1->kernel_symmetry_past ) + { + temp = 2; + move16(); + } + + hTcxEnc1->kernel_type[n] = add( temp, s_max( 0, switchKernel ) ); + move16(); } - else /* switchKernel == 0, switch back to MDCT-IV in both channels */ + ELSE /* switchKernel == 0, switch back to MDCT-IV in both channels */ { - hTcxEnc0->kernel_type[n] = ( hTcxEnc0->kernel_symmetry_past ? 2 : 0 ); - hTcxEnc1->kernel_type[n] = ( hTcxEnc1->kernel_symmetry_past ? 2 : 0 ); + hTcxEnc0->kernel_type[n] = 0; + move16(); + if ( hTcxEnc0->kernel_symmetry_past ) + { + hTcxEnc0->kernel_type[n] = 2; + move16(); + } + + hTcxEnc1->kernel_type[n] = 0; + move16(); + if ( hTcxEnc1->kernel_symmetry_past ) + { + hTcxEnc1->kernel_type[n] = 2; + move16(); + } } } - else + ELSE { hTcxEnc0->kernel_switch_corr_past = 0; /* don't update the kernel switching state, postpone it to when data is available */ - hTcxEnc0->kernel_type[n] = ( hTcxEnc0->kernel_symmetry_past ? 3 : 0 ); - hTcxEnc1->kernel_type[n] = ( hTcxEnc1->kernel_symmetry_past ? 3 : 0 ); - } - hTcxEnc0->kernel_symmetry_past = hTcxEnc0->kernel_type[n] & 1; - hTcxEnc1->kernel_symmetry_past = hTcxEnc1->kernel_type[n] & 1; - -#ifdef IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - q_com = L_get_q_buf1( hTcxEnc0->spectrum[n], hTcxEnc0->L_frameTCX / nSubframes ); - q_com = s_min( q_com, L_get_q_buf1( mdst_spectrum[0][n], hTcxEnc0->L_frameTCX / nSubframes ) ); - floatToFixed_arrL32( hTcxEnc0->spectrum[n], hTcxEnc0->spectrum_fx[n], q_com, hTcxEnc0->L_frameTCX / nSubframes ); - floatToFixed_arrL32( mdst_spectrum[0][n], mdst_spectrum_fx[0][n], q_com, hTcxEnc0->L_frameTCX / nSubframes ); + move16(); - Word16 nl = (int16_t) ( (float) ( hTcxEnc0->L_frameTCX / nSubframes ) * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); - floatToFixed_arr( &hTcxEnc0->new_speech_TCX_flt[nl - ( hTcxEnc0->L_frameTCX / nSubframes )], - &hTcxEnc0->new_speech_TCX[nl - ( hTcxEnc0->L_frameTCX / nSubframes )], - 0, - 2 * hTcxEnc0->L_frameTCX / nSubframes ); + hTcxEnc0->kernel_type[n] = 0; + move16(); + if ( hTcxEnc0->kernel_symmetry_past ) + { + hTcxEnc0->kernel_type[n] = 3; + move16(); + } - if ( n == 0 ) - { - floatToFixed_arr( &hTcxEnc0->speech_TCX_flt[-( sts[0]->hTcxCfg->tcx_mdct_window_min_lengthFB - 0 )], - &hTcxEnc0->speech_TCX[-( sts[0]->hTcxCfg->tcx_mdct_window_min_lengthFB - 0 )], - 0, - sts[0]->hTcxCfg->tcx_mdct_window_min_lengthFB ); + hTcxEnc1->kernel_type[n] = 0; + move16(); + if ( hTcxEnc1->kernel_symmetry_past ) + { + hTcxEnc1->kernel_type[n] = 3; + move16(); + } + } + hTcxEnc0->kernel_symmetry_past = s_and( hTcxEnc0->kernel_type[n], 1 ); + move16(); + hTcxEnc1->kernel_symmetry_past = s_and( hTcxEnc1->kernel_type[n], 1 ); + move16(); + + q_min = s_max( mdst_spectrum_e[0][n], hTcxEnc0->spectrum_e[n] ); + q_min = sub( Q31, q_min ); + + q_com = s_min( L_norm_arr( hTcxEnc0->spectrum_fx[n], shr( hTcxEnc0->L_frameTCX, shift ) ), L_norm_arr( mdst_spectrum_fx[0][n], shr( hTcxEnc0->L_frameTCX, shift ) ) ); + q_com = s_min( Q31, add( q_min, q_com ) ); + + Scale_sig32( hTcxEnc0->spectrum_fx[n], shr( hTcxEnc0->L_frameTCX, shift ), sub( q_com, sub( Q31, hTcxEnc0->spectrum_e[n] ) ) ); + Scale_sig32( mdst_spectrum_fx[0][n], shr( hTcxEnc0->L_frameTCX, shift ), sub( q_com, sub( Q31, mdst_spectrum_e[0][n] ) ) ); + + speech = NULL; + if ( NE_16( n, 1 ) ) + { + speech = hTcxEnc0->speech_TCX; } -#endif kernel_switch_update_transforms_fx( hTcxEnc0->spectrum_fx[n], mdst_spectrum_fx[0][n], &q_com, hTcxEnc0->transform_type[n], sts[0]->hTcxCfg, sts[0]->bwidth_sw_cnt, hTcxEnc0->kernel_type[n], - hTcxEnc0->new_speech_TCX, ( n == 1 ? NULL : hTcxEnc0->speech_TCX ), windowedSignal_fx[0] + n * L_FRAME48k, &q_windowedSignal[0], L_subframeTCX / nSubframes ); -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - fixedToFloat_arrL32( hTcxEnc0->spectrum_fx[n], hTcxEnc0->spectrum[n], q_com, hTcxEnc0->L_frameTCX / nSubframes ); - fixedToFloat_arrL32( mdst_spectrum_fx[0][n], mdst_spectrum[0][n], q_com, hTcxEnc0->L_frameTCX / nSubframes ); -#endif -#else - kernel_switch_update_transforms( hTcxEnc0->spectrum[n], mdst_spectrum[0][n], hTcxEnc0->transform_type[n], sts[0]->hTcxCfg, sts[0]->bwidth_sw_cnt, hTcxEnc0->kernel_type[n], - hTcxEnc0->new_speech_TCX_flt, ( n == 1 ? NULL : hTcxEnc0->speech_TCX_flt ), windowedSignal[0] + n * L_FRAME48k, L_subframeTCX / nSubframes ); -#endif -#ifdef IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - q_com = L_get_q_buf1( hTcxEnc1->spectrum[n], hTcxEnc1->L_frameTCX / nSubframes ); - q_com = s_min( q_com, L_get_q_buf1( mdst_spectrum[1][n], hTcxEnc1->L_frameTCX / nSubframes ) ); - floatToFixed_arrL32( hTcxEnc1->spectrum[n], hTcxEnc1->spectrum_fx[n], q_com, hTcxEnc1->L_frameTCX / nSubframes ); - floatToFixed_arrL32( mdst_spectrum[1][n], mdst_spectrum_fx[1][n], q_com, hTcxEnc1->L_frameTCX / nSubframes ); + hTcxEnc0->new_speech_TCX, speech, windowedSignal_fx[0] + i_mult( n, L_FRAME48k ), &q_windowedSignal[0], shr( L_subframeTCX, shift ) ); + mdst_spectrum_e[0][n] = sub( Q31, q_com ); + hTcxEnc0->spectrum_e[n] = sub( Q31, q_com ); + move16(); + move16(); - nl = (int16_t) ( (float) ( hTcxEnc1->L_frameTCX / nSubframes ) * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); - floatToFixed_arr( &hTcxEnc1->new_speech_TCX_flt[nl - ( hTcxEnc1->L_frameTCX / nSubframes )], - &hTcxEnc1->new_speech_TCX[nl - ( hTcxEnc1->L_frameTCX / nSubframes )], - 0, - 2 * hTcxEnc1->L_frameTCX / nSubframes ); + q_min = s_max( mdst_spectrum_e[1][n], hTcxEnc1->spectrum_e[n] ); + q_min = sub( Q31, q_min ); - if ( n == 0 ) + q_com = s_min( L_norm_arr( hTcxEnc1->spectrum_fx[n], shr( hTcxEnc1->L_frameTCX, shift ) ), L_norm_arr( mdst_spectrum_fx[1][n], shr( hTcxEnc1->L_frameTCX, shift ) ) ); + q_com = s_min( Q31, add( q_min, q_com ) ); + + Scale_sig32( hTcxEnc1->spectrum_fx[n], shr( hTcxEnc1->L_frameTCX, shift ), sub( q_com, sub( Q31, hTcxEnc1->spectrum_e[n] ) ) ); + Scale_sig32( mdst_spectrum_fx[1][n], shr( hTcxEnc1->L_frameTCX, shift ), sub( q_com, sub( Q31, mdst_spectrum_e[1][n] ) ) ); + + speech = NULL; + if ( NE_16( n, 1 ) ) { - floatToFixed_arr( &hTcxEnc1->speech_TCX_flt[-( sts[1]->hTcxCfg->tcx_mdct_window_min_lengthFB - 0 )], - &hTcxEnc1->speech_TCX[-( sts[1]->hTcxCfg->tcx_mdct_window_min_lengthFB - 0 )], - 0, - sts[1]->hTcxCfg->tcx_mdct_window_min_lengthFB ); + speech = hTcxEnc1->speech_TCX; } -#endif kernel_switch_update_transforms_fx( hTcxEnc1->spectrum_fx[n], mdst_spectrum_fx[1][n], &q_com, hTcxEnc1->transform_type[n], sts[1]->hTcxCfg, sts[1]->bwidth_sw_cnt, hTcxEnc1->kernel_type[n], - hTcxEnc1->new_speech_TCX, ( n == 1 ? NULL : hTcxEnc1->speech_TCX ), windowedSignal_fx[1] + n * L_FRAME48k, &q_windowedSignal[1], L_subframeTCX / nSubframes ); -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - fixedToFloat_arrL32( hTcxEnc1->spectrum_fx[n], hTcxEnc1->spectrum[n], q_com, hTcxEnc1->L_frameTCX / nSubframes ); - fixedToFloat_arrL32( mdst_spectrum_fx[1][n], mdst_spectrum[1][n], q_com, hTcxEnc1->L_frameTCX / nSubframes ); -#endif -#else - kernel_switch_update_transforms( hTcxEnc1->spectrum[n], mdst_spectrum[1][n], hTcxEnc1->transform_type[n], sts[1]->hTcxCfg, sts[1]->bwidth_sw_cnt, hTcxEnc1->kernel_type[n], - hTcxEnc1->new_speech_TCX_flt, ( n == 1 ? NULL : hTcxEnc1->speech_TCX_flt ), windowedSignal[1] + n * L_FRAME48k, L_subframeTCX / nSubframes ); -#endif + hTcxEnc1->new_speech_TCX, speech, windowedSignal_fx[1] + i_mult( n, L_FRAME48k ), &q_windowedSignal[1], shr( L_subframeTCX, shift ) ); + mdst_spectrum_e[1][n] = sub( Q31, q_com ); + hTcxEnc1->spectrum_e[n] = sub( Q31, q_com ); + move16(); + move16(); } - for ( n = 0; n < nSubframes; n++ ) + FOR( n = 0; n < nSubframes; n++ ) { - if ( hTcxEnc0->transform_type[n] == hTcxEnc1->transform_type[n] && /* do not combine TCX-5 and TCX-10 as this causes artifacts */ - sts[0]->hTcxCfg->tcx_curr_overlap_mode == sts[1]->hTcxCfg->tcx_curr_overlap_mode && - sts[0]->hTcxCfg->tcx_last_overlap_mode == sts[1]->hTcxCfg->tcx_last_overlap_mode ) + test(); + test(); + IF( EQ_16( hTcxEnc0->transform_type[n], hTcxEnc1->transform_type[n] ) && /* do not combine TCX-5 and TCX-10 as this causes artifacts */ + EQ_16( sts[0]->hTcxCfg->tcx_curr_overlap_mode, sts[1]->hTcxCfg->tcx_curr_overlap_mode ) && + EQ_16( sts[0]->hTcxCfg->tcx_last_overlap_mode, sts[1]->hTcxCfg->tcx_last_overlap_mode ) ) { - -#ifdef IVAS_FLOAT_FIXED // nrg > MAX_STE_PRE_NRG ? 1 : 0 - Word16 tmp = 0; + Word16 tmp = 0, exp_com; move16(); - if ( GT_16( nrg_fx, MAX_STE_PRE_NRG_Q15 ) ) + IF( GT_16( nrg_fx, MAX_STE_PRE_NRG_Q15 ) ) { tmp = 1; move16(); } -#endif - - if ( hTcxEnc0->transform_type[n] == TCX_5 ) + IF( EQ_16( hTcxEnc0->transform_type[n], TCX_5 ) ) { - const int16_t tcx5SizeFB = sts[1]->hTcxCfg->tcx5SizeFB; -#ifdef IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS Word16 length; - length = max( nSampCore / ( 2 * NB_DIV ), L_subframeTCX / ( 2 * NB_DIV ) ); - q_com = L_get_q_buf1( hTcxEnc0->spectrum[n], length ); - q_com = s_min( q_com, L_get_q_buf1( hTcxEnc1->spectrum[n], length ) ); - q_com = s_min( q_com, L_get_q_buf1( mdst_spectrum[0][n], length ) ); - q_com = s_min( q_com, L_get_q_buf1( mdst_spectrum[1][n], length ) ) - 6; - - floatToFixed_arrL32( hTcxEnc0->spectrum[n], hTcxEnc0->spectrum_fx[n], q_com, length ); - floatToFixed_arrL32( hTcxEnc1->spectrum[n], hTcxEnc1->spectrum_fx[n], q_com, length ); - floatToFixed_arrL32( mdst_spectrum[0][n], mdst_spectrum_fx[0][n], q_com, length ); - floatToFixed_arrL32( mdst_spectrum[1][n], mdst_spectrum_fx[1][n], q_com, length ); -#endif + const Word16 tcx5SizeFB = sts[1]->hTcxCfg->tcx5SizeFB; + move16(); + /* length = max(nSampCore / (2 * NB_DIV), L_subframeTCX / (2 * NB_DIV), NB_DIV = 2 */ + length = shr( s_max( nSampCore, L_subframeTCX ), 2 ); + q_min = s_max( hTcxEnc0->spectrum_e[n], hTcxEnc1->spectrum_e[n] ); + q_min = s_max( q_min, mdst_spectrum_e[0][n] ); + q_min = s_max( q_min, mdst_spectrum_e[1][n] ); + q_min = sub( Q31, q_min ); + + // calculate the headroom available + q_com = s_min( L_norm_arr( hTcxEnc1->spectrum_fx[n], length ), L_norm_arr( hTcxEnc0->spectrum_fx[n], length ) ); + q_com = s_min( q_com, L_norm_arr( mdst_spectrum_fx[0][n], length ) ); + q_com = s_min( q_com, L_norm_arr( mdst_spectrum_fx[1][n], length ) ); + + q_com = sub( s_min( Q31, add( q_min, q_com ) ), 6 ); // 6 guarded bits + exp_com = sub( Q31, q_com ); + + Scale_sig32( hTcxEnc0->spectrum_fx[n], shr( hTcxEnc0->L_frameTCX, shift ), sub( hTcxEnc0->spectrum_e[n], exp_com ) ); + Scale_sig32( hTcxEnc1->spectrum_fx[n], shr( hTcxEnc1->L_frameTCX, shift ), sub( hTcxEnc1->spectrum_e[n], exp_com ) ); + Scale_sig32( mdst_spectrum_fx[0][n], shr( hTcxEnc0->L_frameTCX, shift ), sub( mdst_spectrum_e[0][n], exp_com ) ); + Scale_sig32( mdst_spectrum_fx[1][n], shr( hTcxEnc1->L_frameTCX, shift ), sub( mdst_spectrum_e[1][n], exp_com ) ); + + Word16 q_com_orig = q_com; + move16(); + Word16 offset1 = add( tcx5SizeFB, length ); + Word16 offset2 = sub( idiv1616( hTcxEnc0->L_frameTCX, nSubframes ), length ); hTcxEnc0->enc_ste_pre_corr_past = - enc_ste_pre_mdct( hTcxEnc0->spectrum_fx[n], hTcxEnc1->spectrum_fx[n], mdst_spectrum_fx[0][n], mdst_spectrum_fx[1][n], &q_com, nSampCore / ( 2 * NB_DIV ), - L_subframeTCX / ( 2 * NB_DIV ), tmp, hTcxEnc0->enc_ste_pre_corr_past, ( totalRate * L_subframe ) / ( 2 * NB_DIV ) ); + enc_ste_pre_mdct( hTcxEnc0->spectrum_fx[n], hTcxEnc1->spectrum_fx[n], mdst_spectrum_fx[0][n], mdst_spectrum_fx[1][n], &q_com, shr( nSampCore, NB_DIV ), + shr( L_subframeTCX, NB_DIV ), tmp, hTcxEnc0->enc_ste_pre_corr_past, L_shr( imult3216( totalRate, L_subframe ), NB_DIV ) ); // 2 * NB_DIV = 4 (shl(1, NB_DIV))*/ + move32(); -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - fixedToFloat_arrL( hTcxEnc0->spectrum_fx[n], hTcxEnc0->spectrum[n], q_com, length ); - fixedToFloat_arrL( hTcxEnc1->spectrum_fx[n], hTcxEnc1->spectrum[n], q_com, length ); - fixedToFloat_arrL( mdst_spectrum_fx[0][n], mdst_spectrum[0][n], q_com, length ); - fixedToFloat_arrL( mdst_spectrum_fx[1][n], mdst_spectrum[1][n], q_com, length ); + IF( NE_16( q_com_orig, q_com ) ) + { + Word16 scale = sub( q_com, q_com_orig ); + Scale_sig32( hTcxEnc0->spectrum_fx[n] + length, offset2, scale ); + Scale_sig32( hTcxEnc1->spectrum_fx[n] + length, offset2, scale ); + Scale_sig32( mdst_spectrum_fx[0][n] + length, offset2, scale ); + Scale_sig32( mdst_spectrum_fx[1][n] + length, offset2, scale ); + } - q_com = L_get_q_buf1( hTcxEnc0->spectrum[n] + tcx5SizeFB, length ); - q_com = s_min( q_com, L_get_q_buf1( hTcxEnc1->spectrum[n] + tcx5SizeFB, length ) ); - q_com = s_min( q_com, L_get_q_buf1( mdst_spectrum[0][n] + tcx5SizeFB, length ) ); - q_com = s_min( q_com, L_get_q_buf1( mdst_spectrum[1][n] + tcx5SizeFB, length ) ) - 6; + mdst_spectrum_e[0][n] = sub( Q31, q_com ); + mdst_spectrum_e[1][n] = sub( Q31, q_com ); + hTcxEnc0->spectrum_e[n] = sub( Q31, q_com ); + hTcxEnc1->spectrum_e[n] = sub( Q31, q_com ); + move16(); + move16(); + move16(); + move16(); - floatToFixed_arrL32( hTcxEnc0->spectrum[n] + tcx5SizeFB, hTcxEnc0->spectrum_fx[n] + tcx5SizeFB, q_com, length ); - floatToFixed_arrL32( hTcxEnc1->spectrum[n] + tcx5SizeFB, hTcxEnc1->spectrum_fx[n] + tcx5SizeFB, q_com, length ); - floatToFixed_arrL32( mdst_spectrum[0][n] + tcx5SizeFB, mdst_spectrum_fx[0][n] + tcx5SizeFB, q_com, length ); - floatToFixed_arrL32( mdst_spectrum[1][n] + tcx5SizeFB, mdst_spectrum_fx[1][n] + tcx5SizeFB, q_com, length ); + q_min = s_max( hTcxEnc0->spectrum_e[n], hTcxEnc1->spectrum_e[n] ); + q_min = s_max( q_min, mdst_spectrum_e[0][n] ); + q_min = s_max( q_min, mdst_spectrum_e[1][n] ); -#endif + q_min = sub( Q31, q_min ); - hTcxEnc0->enc_ste_pre_corr_past = - enc_ste_pre_mdct( hTcxEnc0->spectrum_fx[n] + tcx5SizeFB, hTcxEnc1->spectrum_fx[n] + tcx5SizeFB, mdst_spectrum_fx[0][n] + tcx5SizeFB, mdst_spectrum_fx[1][n] + tcx5SizeFB, &q_com, nSampCore / ( 2 * NB_DIV ), - L_subframeTCX / ( 2 * NB_DIV ), tmp, hTcxEnc0->enc_ste_pre_corr_past, ( totalRate * L_subframe ) / ( 2 * NB_DIV ) ); - -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - fixedToFloat_arrL( hTcxEnc0->spectrum_fx[n] + tcx5SizeFB, hTcxEnc0->spectrum[n] + tcx5SizeFB, q_com, length ); - fixedToFloat_arrL( hTcxEnc1->spectrum_fx[n] + tcx5SizeFB, hTcxEnc1->spectrum[n] + tcx5SizeFB, q_com, length ); - fixedToFloat_arrL( mdst_spectrum_fx[0][n] + tcx5SizeFB, mdst_spectrum[0][n] + tcx5SizeFB, q_com, length ); - fixedToFloat_arrL( mdst_spectrum_fx[1][n] + tcx5SizeFB, mdst_spectrum[1][n] + tcx5SizeFB, q_com, length ); -#endif -#else - hTcxEnc0->enc_ste_pre_corr_past = - enc_ste_pre_mdct( hTcxEnc0->spectrum[n], hTcxEnc1->spectrum[n], mdst_spectrum[0][n], mdst_spectrum[1][n], nSampCore / ( 2 * NB_DIV ), - L_subframeTCX / ( 2 * NB_DIV ), ( nrg > MAX_STE_PRE_NRG ? 1 : 0 ), hTcxEnc0->enc_ste_pre_corr_past, ( totalRate * L_subframe ) / ( 2 * NB_DIV ) ); + q_com = s_min( L_norm_arr( hTcxEnc1->spectrum_fx[n], shr( hTcxEnc1->L_frameTCX, shift ) ), L_norm_arr( hTcxEnc0->spectrum_fx[n], shr( hTcxEnc0->L_frameTCX, shift ) ) ); + q_com = s_min( q_com, L_norm_arr( mdst_spectrum_fx[0][n], shr( hTcxEnc0->L_frameTCX, shift ) ) ); + q_com = s_min( q_com, L_norm_arr( mdst_spectrum_fx[1][n], shr( hTcxEnc0->L_frameTCX, shift ) ) ); + + q_com = sub( s_min( Q31, add( q_min, q_com ) ), 6 ); + exp_com = sub( Q31, q_com ); + + Scale_sig32( hTcxEnc0->spectrum_fx[n], shr( hTcxEnc0->L_frameTCX, shift ), sub( hTcxEnc0->spectrum_e[n], exp_com ) ); + Scale_sig32( hTcxEnc1->spectrum_fx[n], shr( hTcxEnc1->L_frameTCX, shift ), sub( hTcxEnc1->spectrum_e[n], exp_com ) ); + Scale_sig32( mdst_spectrum_fx[0][n], shr( hTcxEnc0->L_frameTCX, shift ), sub( mdst_spectrum_e[0][n], exp_com ) ); + Scale_sig32( mdst_spectrum_fx[1][n], shr( hTcxEnc1->L_frameTCX, shift ), sub( mdst_spectrum_e[1][n], exp_com ) ); + + q_com_orig = q_com; + move16(); hTcxEnc0->enc_ste_pre_corr_past = - enc_ste_pre_mdct( hTcxEnc0->spectrum[n] + tcx5SizeFB, hTcxEnc1->spectrum[n] + tcx5SizeFB, mdst_spectrum[0][n] + tcx5SizeFB, mdst_spectrum[1][n] + tcx5SizeFB, nSampCore / ( 2 * NB_DIV ), - L_subframeTCX / ( 2 * NB_DIV ), ( nrg > MAX_STE_PRE_NRG ? 1 : 0 ), hTcxEnc0->enc_ste_pre_corr_past, ( totalRate * L_subframe ) / ( 2 * NB_DIV ) ); -#endif + enc_ste_pre_mdct( hTcxEnc0->spectrum_fx[n] + tcx5SizeFB, hTcxEnc1->spectrum_fx[n] + tcx5SizeFB, mdst_spectrum_fx[0][n] + tcx5SizeFB, mdst_spectrum_fx[1][n] + tcx5SizeFB, &q_com, shr( nSampCore, NB_DIV ), + shr( L_subframeTCX, NB_DIV ), tmp, hTcxEnc0->enc_ste_pre_corr_past, L_shr( imult3216( totalRate, L_subframe ), NB_DIV ) ); + move32(); + IF( NE_16( q_com_orig, q_com ) ) + { + Word16 scale = sub( q_com, q_com_orig ); + Scale_sig32( hTcxEnc0->spectrum_fx[n], tcx5SizeFB, scale ); + Scale_sig32( hTcxEnc1->spectrum_fx[n], tcx5SizeFB, scale ); + Scale_sig32( mdst_spectrum_fx[0][n], tcx5SizeFB, scale ); + Scale_sig32( mdst_spectrum_fx[1][n], tcx5SizeFB, scale ); + + Scale_sig32( hTcxEnc0->spectrum_fx[n] + offset1, offset2, scale ); + Scale_sig32( hTcxEnc1->spectrum_fx[n] + offset1, offset2, scale ); + Scale_sig32( mdst_spectrum_fx[0][n] + offset1, offset2, scale ); + Scale_sig32( mdst_spectrum_fx[1][n] + offset1, offset2, scale ); + } + mdst_spectrum_e[0][n] = sub( Q31, q_com ); + hTcxEnc0->spectrum_e[n] = sub( Q31, q_com ); + mdst_spectrum_e[1][n] = sub( Q31, q_com ); + hTcxEnc1->spectrum_e[n] = sub( Q31, q_com ); + move16(); + move16(); + move16(); + move16(); } - else + ELSE { -#ifdef IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS Word16 length; - length = max( nSampCore / nSubframes, L_subframeTCX / nSubframes ); - q_com = L_get_q_buf1( hTcxEnc0->spectrum[n], length ); - q_com = s_min( q_com, L_get_q_buf1( hTcxEnc1->spectrum[n], length ) ); - q_com = s_min( q_com, L_get_q_buf1( mdst_spectrum[0][n], length ) ); - q_com = s_min( q_com, L_get_q_buf1( mdst_spectrum[1][n], length ) ) - 6; - - floatToFixed_arrL32( hTcxEnc0->spectrum[n], hTcxEnc0->spectrum_fx[n], q_com, length ); - floatToFixed_arrL32( hTcxEnc1->spectrum[n], hTcxEnc1->spectrum_fx[n], q_com, length ); - floatToFixed_arrL32( mdst_spectrum[0][n], mdst_spectrum_fx[0][n], q_com, length ); - floatToFixed_arrL32( mdst_spectrum[1][n], mdst_spectrum_fx[1][n], q_com, length ); -#endif - hTcxEnc0->enc_ste_pre_corr_past = - enc_ste_pre_mdct( hTcxEnc0->spectrum_fx[n], hTcxEnc1->spectrum_fx[n], mdst_spectrum_fx[0][n], mdst_spectrum_fx[1][n], &q_com, nSampCore / nSubframes, - L_subframeTCX / nSubframes, tmp, hTcxEnc0->enc_ste_pre_corr_past, ( totalRate * L_subframe ) / nSubframes ); -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - fixedToFloat_arrL( hTcxEnc0->spectrum_fx[n], hTcxEnc0->spectrum[n], q_com, length ); - fixedToFloat_arrL( hTcxEnc1->spectrum_fx[n], hTcxEnc1->spectrum[n], q_com, length ); - fixedToFloat_arrL( mdst_spectrum_fx[0][n], mdst_spectrum[0][n], q_com, length ); - fixedToFloat_arrL( mdst_spectrum_fx[1][n], mdst_spectrum[1][n], q_com, length ); -#endif -#else + length = shr( s_max( nSampCore, L_subframeTCX ), shift ); + Word16 offset2 = sub( shr( hTcxEnc0->L_frameTCX, shift ), length ); + q_min = s_max( hTcxEnc0->spectrum_e[n], hTcxEnc1->spectrum_e[n] ); + q_min = s_max( q_min, mdst_spectrum_e[0][n] ); + q_min = s_max( q_min, mdst_spectrum_e[1][n] ); + + q_min = sub( Q31, q_min ); + + q_com = s_min( L_norm_arr( hTcxEnc1->spectrum_fx[n], shr( hTcxEnc1->L_frameTCX, shift ) ), L_norm_arr( hTcxEnc0->spectrum_fx[n], shr( hTcxEnc0->L_frameTCX, shift ) ) ); + q_com = s_min( q_com, L_norm_arr( mdst_spectrum_fx[0][n], shr( hTcxEnc0->L_frameTCX, shift ) ) ); + q_com = s_min( q_com, L_norm_arr( mdst_spectrum_fx[1][n], shr( hTcxEnc0->L_frameTCX, shift ) ) ); + + q_com = sub( s_min( Q31, add( q_min, q_com ) ), 6 ); + exp_com = sub( Q31, q_com ); + + Scale_sig32( hTcxEnc0->spectrum_fx[n], shr( hTcxEnc0->L_frameTCX, shift ), sub( hTcxEnc0->spectrum_e[n], exp_com ) ); + Scale_sig32( hTcxEnc1->spectrum_fx[n], shr( hTcxEnc1->L_frameTCX, shift ), sub( hTcxEnc1->spectrum_e[n], exp_com ) ); + Scale_sig32( mdst_spectrum_fx[0][n], shr( hTcxEnc0->L_frameTCX, shift ), sub( mdst_spectrum_e[0][n], exp_com ) ); + Scale_sig32( mdst_spectrum_fx[1][n], shr( hTcxEnc1->L_frameTCX, shift ), sub( mdst_spectrum_e[1][n], exp_com ) ); + + Word16 q_com_orig = q_com; + move16(); hTcxEnc0->enc_ste_pre_corr_past = - enc_ste_pre_mdct( hTcxEnc0->spectrum[n], hTcxEnc1->spectrum[n], mdst_spectrum[0][n], mdst_spectrum[1][n], nSampCore / nSubframes, - L_subframeTCX / nSubframes, ( nrg > MAX_STE_PRE_NRG ? 1 : 0 ), hTcxEnc0->enc_ste_pre_corr_past, ( totalRate * L_subframe ) / nSubframes ); -#endif + enc_ste_pre_mdct( hTcxEnc0->spectrum_fx[n], hTcxEnc1->spectrum_fx[n], mdst_spectrum_fx[0][n], mdst_spectrum_fx[1][n], &q_com, shr( nSampCore, shift ), + shr( L_subframeTCX, shift ), tmp, hTcxEnc0->enc_ste_pre_corr_past, L_shr( imult3216( totalRate, L_subframe ), shift ) ); + move32(); + IF( NE_16( q_com_orig, q_com ) ) + { + Word16 scale = sub( q_com, q_com_orig ); + Scale_sig32( hTcxEnc0->spectrum_fx[n] + length, offset2, scale ); + Scale_sig32( hTcxEnc1->spectrum_fx[n] + length, offset2, scale ); + Scale_sig32( mdst_spectrum_fx[0][n] + length, offset2, scale ); + Scale_sig32( mdst_spectrum_fx[1][n] + length, offset2, scale ); + } + mdst_spectrum_e[0][n] = sub( Q31, q_com ); + hTcxEnc0->spectrum_e[n] = sub( Q31, q_com ); + mdst_spectrum_e[1][n] = sub( Q31, q_com ); + hTcxEnc1->spectrum_e[n] = sub( Q31, q_com ); + move16(); + move16(); + move16(); + move16(); } } - else + ELSE { hTcxEnc0->enc_ste_pre_corr_past = 0; + move32(); } } } - else + ELSE { sts[0]->hTcxEnc->enc_ste_pre_corr_past = 0; + move32(); sts[0]->hTcxEnc->kernel_switch_corr_past = 0; + move16(); - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { TCX_ENC_HANDLE hTcxEncCh = sts[ch]->hTcxEnc; - if ( ( hCPE->cpe_id * CPE_CHANNELS + ch ) >= nChannels ) + IF( GE_16( add( imult1616( hCPE->cpe_id, CPE_CHANNELS ), ch ), nChannels ) ) { hTcxEncCh->kernel_symmetry_past = hTcxEncCh->kernel_type[0] = 0; + move32(); + move32(); - continue; + CONTINUE; } init_tcx_enc_info_fx( sts[ch], &L_subframe, &L_subframeTCX, &tcx_subframe_coded_lines ); - nSubframes = ( hTcxEncCh->tcxMode == TCX_20 ) ? 1 : NB_DIV; - for ( n = 0; n < nSubframes; n++ ) + nSubframes = NB_DIV; + move16(); + shift = 1; + move16(); + IF( EQ_16( hTcxEncCh->tcxMode, TCX_20 ) ) { - hTcxEncCh->kernel_type[n] = ( hTcxEncCh->kernel_symmetry_past && sts[ch]->element_mode == IVAS_CPE_MDCT ? 3 - mct_on : 0 ); - hTcxEncCh->kernel_symmetry_past = hTcxEncCh->kernel_type[n] & 1; + nSubframes = 1; + move16(); + shift = 0; + move16(); + } -#ifdef IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - q_com = L_get_q_buf1( hTcxEncCh->spectrum[n], hTcxEncCh->L_frameTCX / nSubframes ); - q_com = s_min( q_com, L_get_q_buf1( mdst_spectrum[ch][n], hTcxEncCh->L_frameTCX / nSubframes ) ); - floatToFixed_arrL32( hTcxEncCh->spectrum[n], hTcxEncCh->spectrum_fx[n], q_com, hTcxEncCh->L_frameTCX / nSubframes ); - floatToFixed_arrL32( mdst_spectrum[ch][n], mdst_spectrum_fx[ch][n], q_com, hTcxEncCh->L_frameTCX / nSubframes ); - - Word16 nl = (int16_t) ( (float) ( hTcxEncCh->L_frameTCX / nSubframes ) * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); - floatToFixed_arr( &hTcxEncCh->new_speech_TCX_flt[nl - ( hTcxEncCh->L_frameTCX / nSubframes )], - &hTcxEncCh->new_speech_TCX[nl - ( hTcxEncCh->L_frameTCX / nSubframes )], - 0, - 2 * hTcxEncCh->L_frameTCX / nSubframes ); - - if ( n == 0 ) + FOR( n = 0; n < nSubframes; n++ ) + { + hTcxEncCh->kernel_type[n] = 0; + move32(); + test(); + IF( EQ_16( sts[ch]->element_mode, IVAS_CPE_MDCT ) && hTcxEncCh->kernel_symmetry_past ) { - floatToFixed_arr( &hTcxEncCh->speech_TCX_flt[-( sts[ch]->hTcxCfg->tcx_mdct_window_min_lengthFB - 0 )], - &hTcxEncCh->speech_TCX[-( sts[ch]->hTcxCfg->tcx_mdct_window_min_lengthFB - 0 )], - 0, - sts[ch]->hTcxCfg->tcx_mdct_window_min_lengthFB ); + hTcxEncCh->kernel_type[n] = sub( 3, mct_on ); + move32(); + } + + hTcxEncCh->kernel_symmetry_past = s_and( hTcxEncCh->kernel_type[n], 1 ); + move32(); + + q_min = s_max( mdst_spectrum_e[ch][n], hTcxEncCh->spectrum_e[n] ); + q_min = sub( Q31, q_min ); + q_com = s_min( L_norm_arr( mdst_spectrum_fx[ch][n], shr( hTcxEncCh->L_frameTCX, shift ) ), L_norm_arr( hTcxEncCh->spectrum_fx[n], shr( hTcxEncCh->L_frameTCX, shift ) ) ); + + q_com = s_min( Q31, add( q_min, q_com ) ); + + Scale_sig32( hTcxEncCh->spectrum_fx[n], shr( hTcxEncCh->L_frameTCX, shift ), sub( q_com, sub( Q31, hTcxEncCh->spectrum_e[n] ) ) ); + Scale_sig32( mdst_spectrum_fx[ch][n], shr( hTcxEncCh->L_frameTCX, shift ), sub( q_com, sub( Q31, mdst_spectrum_e[ch][n] ) ) ); + + speech = hTcxEncCh->speech_TCX; + if ( n != 0 ) + { + speech = NULL; } -#endif kernel_switch_update_transforms_fx( hTcxEncCh->spectrum_fx[n], mdst_spectrum_fx[ch][n], &q_com, hTcxEncCh->transform_type[n], sts[ch]->hTcxCfg, sts[ch]->bwidth_sw_cnt, hTcxEncCh->kernel_type[n], - hTcxEncCh->new_speech_TCX, ( n /*1*/ ? NULL : hTcxEncCh->speech_TCX ), windowedSignal_fx[ch] + n * L_FRAME48k, &q_windowedSignal[ch], L_subframeTCX / nSubframes ); -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - fixedToFloat_arrL32( hTcxEncCh->spectrum_fx[n], hTcxEncCh->spectrum[n], q_com, hTcxEncCh->L_frameTCX / nSubframes ); - fixedToFloat_arrL32( mdst_spectrum_fx[ch][n], mdst_spectrum[ch][n], q_com, hTcxEncCh->L_frameTCX / nSubframes ); -#endif -#else - kernel_switch_update_transforms( hTcxEncCh->spectrum[n], mdst_spectrum[ch][n], hTcxEncCh->transform_type[n], sts[ch]->hTcxCfg, sts[ch]->bwidth_sw_cnt, hTcxEncCh->kernel_type[n], - hTcxEncCh->new_speech_TCX_flt, ( n /*1*/ ? NULL : hTcxEncCh->speech_TCX_flt ), windowedSignal[ch] + n * L_FRAME48k, L_subframeTCX / nSubframes ); -#endif + hTcxEncCh->new_speech_TCX, speech, windowedSignal_fx[ch] + i_mult( n, L_FRAME48k ), &q_windowedSignal[ch], shr( L_subframeTCX, shift ) ); + mdst_spectrum_e[ch][n] = sub( Q31, q_com ); + move16(); + hTcxEncCh->spectrum_e[n] = sub( Q31, q_com ); + move16(); } } } -#ifdef IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - int k; - - Word16 q_temp[2][2]; TCX_ENC_HANDLE hTcxEnc = NULL; - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + q_min = 0; + move16(); + q_com = Q31; + move16(); + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; hTcxEnc = st->hTcxEnc; - nSubframes = ( hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - for ( k = 0; k < nSubframes; k++ ) + nSubframes = NB_DIV; + move16(); + shift = 1; + move16(); + IF( EQ_16( hTcxEnc->tcxMode, TCX_20 ) ) { - q_com = L_get_q_buf1( st->hTcxEnc->spectrum[k], st->hTcxEnc->L_frameTCX / nSubframes ); - st->hTcxEnc->spectrum_e[k] = Q31 - ( q_com - 4 ); - floatToFixed_arrL32( st->hTcxEnc->spectrum[k], st->hTcxEnc->spectrum_fx[k], ( Q31 - st->hTcxEnc->spectrum_e[k] ), st->hTcxEnc->L_frameTCX / nSubframes ); + nSubframes = 1; + move16(); + shift = 0; + move16(); + } - q_temp[ch][k] = L_get_q_buf1( mdst_spectrum[ch][k], st->hTcxEnc->L_frameTCX / nSubframes ); - floatToFixed_arrL32( mdst_spectrum[ch][k], mdst_spectrum_fx[ch][k], q_temp[ch][k], st->hTcxEnc->L_frameTCX / nSubframes ); + FOR( n = 0; n < nSubframes; n++ ) + { + q_min = s_max( q_min, hTcxEnc->spectrum_e[n] ); + q_com = s_min( q_com, L_norm_arr( hTcxEnc->spectrum_fx[n], shr( hTcxEnc->L_frameTCX, shift ) ) ); } } -#endif - - TNSAnalysisStereo_fx( sts, mdst_spectrum_fx, 0, tnsSize, tnsBits, param_core, mct_on ); - -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + q_min = sub( Q31, q_min ); + q_com = sub( s_min( Q31, add( q_min, q_com ) ), 4 ); + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; hTcxEnc = st->hTcxEnc; - nSubframes = ( hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - for ( k = 0; k < nSubframes; k++ ) + nSubframes = NB_DIV; + move16(); + shift = 1; + move16(); + IF( EQ_16( hTcxEnc->tcxMode, TCX_20 ) ) + { + nSubframes = 1; + move16(); + shift = 0; + move16(); + } + FOR( n = 0; n < nSubframes; n++ ) { - fixedToFloat_arrL32( st->hTcxEnc->spectrum_fx[k], st->hTcxEnc->spectrum[k], ( Q31 - st->hTcxEnc->spectrum_e[k] ), st->hTcxEnc->L_frameTCX / nSubframes ); - fixedToFloat_arrL32( mdst_spectrum_fx[ch][k], mdst_spectrum[ch][k], q_temp[ch][k], st->hTcxEnc->L_frameTCX / nSubframes ); + Scale_sig32( hTcxEnc->spectrum_fx[n], shr( hTcxEnc->L_frameTCX, shift ), sub( q_com, sub( Q31, hTcxEnc->spectrum_e[n] ) ) ); + hTcxEnc->spectrum_e[n] = sub( Q31, q_com ); + move16(); } } -#endif -#else - TNSAnalysisStereo( sts, mdst_spectrum, 0, tnsSize, tnsBits, param_core, mct_on ); -#endif + TNSAnalysisStereo_fx( sts, mdst_spectrum_fx, 0, tnsSize, tnsBits, param_core, mct_on ); /*--------------------------------------------------------------* * Envelope Quantization and FDNS *---------------------------------------------------------------*/ - - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + /* Common q for spectrum and mdst */ + q_min = 0; + move16(); + q_com = Q31; + move16(); + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - if ( ( hCPE->cpe_id * CPE_CHANNELS + ch ) >= nChannels ) + st = sts[ch]; + hTcxEnc = st->hTcxEnc; + nSubframes = NB_DIV; + move16(); + shift = 1; + move16(); + IF( EQ_16( hTcxEnc->tcxMode, TCX_20 ) ) { - continue; + nSubframes = 1; + move16(); + shift = 0; + move16(); } + FOR( n = 0; n < nSubframes; n++ ) + { + q_min = s_max( q_min, hTcxEnc->spectrum_e[n] ); + q_min = s_max( q_min, mdst_spectrum_e[ch][n] ); + q_com = s_min( q_com, L_norm_arr( mdst_spectrum_fx[ch][n], shr( hTcxEnc->L_frameTCX, shift ) ) ); + q_com = s_min( q_com, L_norm_arr( hTcxEnc->spectrum_fx[n], shr( hTcxEnc->L_frameTCX, shift ) ) ); + } + } + q_min = sub( Q31, q_min ); + q_com = s_min( Q31, add( q_min, q_com ) ); + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) + { st = sts[ch]; - nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + hTcxEnc = st->hTcxEnc; - if ( mct_on ) + nSubframes = NB_DIV; + move16(); + shift = 1; + move16(); + IF( EQ_16( hTcxEnc->tcxMode, TCX_20 ) ) { - set_zero( chE, NB_DIV ); + nSubframes = 1; + move16(); + shift = 0; + move16(); + } + FOR( n = 0; n < nSubframes; n++ ) + { + Scale_sig32( hTcxEnc->spectrum_fx[n], shr( hTcxEnc->L_frameTCX, shift ), sub( q_com, sub( Q31, hTcxEnc->spectrum_e[n] ) ) ); + Scale_sig32( mdst_spectrum_fx[ch][n], shr( hTcxEnc->L_frameTCX, shift ), sub( q_com, sub( Q31, mdst_spectrum_e[ch][n] ) ) ); + hTcxEnc->spectrum_e[n] = sub( Q31, q_com ); + move16(); + mdst_spectrum_e[ch][n] = sub( Q31, q_com ); + move16(); + } + } + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) + { + IF( GE_16( add( imult1616( hCPE->cpe_id, CPE_CHANNELS ), ch ), nChannels ) ) + { + CONTINUE; + } + + st = sts[ch]; + nSubframes = NB_DIV; + move16(); + shift = 1; + move16(); + IF( EQ_16( st->hTcxEnc->tcxMode, TCX_20 ) ) + { + nSubframes = 1; + move16(); + shift = 0; + move16(); + } + IF( mct_on ) + { + set64_fx( chE_fx, 0, NB_DIV ); } init_tcx_enc_info_fx( st, &L_subframe, &L_subframeTCX, &tcx_subframe_coded_lines ); - L_subframe = L_subframe / nSubframes; - L_subframeTCX = ( mct_on ? L_subframeTCX / nSubframes : L_subframe ); - tcx_subframe_coded_lines = tcx_subframe_coded_lines / nSubframes; + L_subframe = shr( L_subframe, shift ); + IF( mct_on ) + { + L_subframeTCX = shr( L_subframeTCX, shift ); + } + ELSE + { + L_subframeTCX = L_subframe; + move16(); + } + tcx_subframe_coded_lines = shr( tcx_subframe_coded_lines, shift ); + Word16 q_pow = 62, q_pow_tmp = sub( 63, shl( mdst_spectrum_e[0][0], 1 ) ); // add( shl( sub( Q31, mdst_spectrum_e[0][0] ), 1 ), 1 ); + move16(); - for ( n = 0; n < nSubframes; n++ ) + FOR( n = 0; n < nSubframes; n++ ) { - if ( st->hTcxEnc->fUseTns[n] ) + IF( st->hTcxEnc->fUseTns[n] ) { - for ( i = 0; i < L_subframeTCX; i++ ) + FOR( i = 0; i < L_subframeTCX; i++ ) { - powerSpec[i] = ( st->hTcxEnc->spectrum[n][i] * st->hTcxEnc->spectrum[n][i] ); + powerSpec_fx64[i] = W_mult_32_32( st->hTcxEnc->spectrum_fx[n][i], st->hTcxEnc->spectrum_fx[n][i] ); + move64(); + IF( powerSpec_fx64[i] == 0 ) + { + q_pow = s_min( q_pow, 62 ); + } + ELSE + + { + q_pow = s_min( q_pow, W_norm( powerSpec_fx64[i] ) ); + } } } - else + ELSE { - for ( i = 0; i < L_subframeTCX; i++ ) + FOR( i = 0; i < L_subframeTCX; i++ ) { - powerSpec[i] = ( mdst_spectrum[ch][n][i] * mdst_spectrum[ch][n][i] + st->hTcxEnc->spectrum[n][i] * st->hTcxEnc->spectrum[n][i] ); + powerSpec_fx64[i] = W_add( W_mult_32_32( mdst_spectrum_fx[ch][n][i], mdst_spectrum_fx[ch][n][i] ), W_mult_32_32( st->hTcxEnc->spectrum_fx[n][i], st->hTcxEnc->spectrum_fx[n][i] ) ); + move64(); + IF( powerSpec_fx64[i] == 0 ) + { + q_pow = s_min( q_pow, 62 ); + } + ELSE + + { + q_pow = s_min( q_pow, W_norm( powerSpec_fx64[i] ) ); + } } } - - if ( mct_on ) + FOR( i = 0; i < L_subframeTCX; i++ ) { - chE[n] = sum_f( powerSpec, L_subframeTCX ); + powerSpec_fx64[i] = W_shl( powerSpec_fx64[i], q_pow ); + move64(); + powerSpec_fx[i] = W_extract_h( powerSpec_fx64[i] ); + move32(); } -#ifndef IVAS_FLOAT_FIXED - sns_compute_scf( powerSpec, st->hTcxCfg->psychParamsCurrent, st->L_frame, scf[ch][n] ); -#else -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - Word16 q = L_get_q_buf1( powerSpec, L_subframeTCX ); - floatToFixed_arrL32( powerSpec, powerSpec_fx, q, L_subframeTCX ); -#endif - sns_compute_scf_fx( powerSpec_fx, st->hTcxCfg->psychParamsCurrent, st->L_frame, scf_fx[ch][n], q ); -#endif + IF( mct_on ) + { + FOR( i = 0; i < L_subframeTCX; i++ ) + { + chE_fx[n] = W_add( W_deposit32_l( powerSpec_fx[i] ), chE_fx[n] ); + move64(); + } + } + sns_compute_scf_fx( powerSpec_fx, st->hTcxCfg->psychParamsCurrent, st->L_frame, scf_fx[ch][n], sub( add( q_pow_tmp, q_pow ), 32 ) ); } /* MCT: detect whether there are silent channels and set mct_chan_mode accordingly */ - if ( mct_on ) + IF( mct_on ) { - chE_tot = sum_f( chE, NB_DIV ); - - if ( chE_tot < SILENT_CHANNEL_THRES && nSubframes == 1 ) + Word16 q = sub( add( q_pow_tmp, q_pow ), 32 ); + Word64 silent_thr = SILENT_CHANNEL_THRES_FX; + move64(); + chE_tot_fx = 0; + move64(); + FOR( i = 0; i < NB_DIV; i++ ) + { + chE_tot_fx = W_add( chE_fx[i], chE_tot_fx ); + } + IF( GT_16( q, Q24 ) ) + { + chE_tot_fx = W_shr( chE_tot_fx, sub( q, Q24 ) ); + } + ELSE + { + silent_thr = W_shr( SILENT_CHANNEL_THRES_FX, sub( Q24, q ) ); + } + test(); + IF( LT_64( chE_tot_fx, silent_thr ) && EQ_16( nSubframes, 1 ) ) { st->mct_chan_mode = MCT_CHAN_MODE_IGNORE; + move32(); st->bits_frame_channel = 0; + move16(); } - else + ELSE { st->mct_chan_mode = MCT_CHAN_MODE_REGULAR; + move32(); } } } /* set low br mode, if possible. Can later be discarded, depending on the stereo mode used for SNS parameter decoding */ - if ( hCPE->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ) ) + test(); + test(); + + sns_low_br_mode = 0; + move16(); + IF( EQ_32( hCPE->element_brate, IVAS_48k ) && ( EQ_16( sts[0]->core, TCX_20 ) && EQ_16( sts[1]->core, TCX_20 ) ) == 0 ) { sns_low_br_mode = !sts[0]->sp_aud_decision0; - } - else - { - sns_low_br_mode = 0; + move16(); } - if ( !mct_on && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) ) + test(); + test(); + test(); + + IF( ( mct_on == 0 ) && EQ_32( sts[0]->sr_core, 25600 ) && ( ( EQ_32( hCPE->element_brate, IVAS_48k ) || EQ_32( hCPE->element_brate, IVAS_64k ) ) ) ) { quantize_sns_fx( scf_fx, scf_q_fx, Q15, sts, sns_vq_indices, zero_side_flag, sns_stereo_mode ); } - else + ELSE { - if ( sts[0]->hTcxEnc->tcxMode == TCX_20 && sts[1]->hTcxEnc->tcxMode == TCX_20 && - sts[0]->mct_chan_mode == MCT_CHAN_MODE_REGULAR && sts[1]->mct_chan_mode == MCT_CHAN_MODE_REGULAR ) + test(); + test(); + test(); + IF( EQ_16( sts[0]->hTcxEnc->tcxMode, TCX_20 ) && EQ_16( sts[1]->hTcxEnc->tcxMode, TCX_20 ) && + EQ_16( sts[0]->mct_chan_mode, MCT_CHAN_MODE_REGULAR ) && EQ_16( sts[1]->mct_chan_mode, MCT_CHAN_MODE_REGULAR ) ) { sns_avq_cod_stereo_fx( scf_fx[0][0], Q15, scf_fx[1][0], Q15, sts[0]->L_frame, scf_q_fx[0][0], scf_q_fx[1][0], param_lpc[0], param_lpc[1] ); } - else + ELSE { - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { param_lpc[ch][0] = ch; - if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + move16(); + IF( EQ_16( sts[ch]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) { - continue; + CONTINUE; } st = sts[ch]; - IF( st->hTcxEnc->tcxMode == TCX_20 ) + IF( EQ_16( st->hTcxEnc->tcxMode, TCX_20 ) ) { sns_avq_cod_fx( scf_fx[ch][0], Q15, NULL, 0, scf_q_fx[ch][0], NULL, ¶m_lpc[ch][1], st->hTcxEnc->tcxMode, st->L_frame, sns_low_br_mode ); } @@ -2438,179 +2537,206 @@ void ivas_mdct_core_whitening_enc( } } - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + IF( EQ_16( sts[ch]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) { - continue; + CONTINUE; + } + st = sts[ch]; + + nSubframes = NB_DIV; + move16(); + shift = 1; + move16(); + IF( EQ_16( st->hTcxEnc->tcxMode, TCX_20 ) ) + { + nSubframes = 1; + move16(); + shift = 0; + move16(); } - st = sts[ch]; - nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + init_tcx_enc_info_fx( st, &L_subframe, &L_subframeTCX, &tcx_subframe_coded_lines ); - L_subframe = L_subframe / nSubframes; - L_subframeTCX = L_subframeTCX / nSubframes; - tcx_subframe_coded_lines = tcx_subframe_coded_lines / nSubframes; - for ( n = 0; n < nSubframes; n++ ) + IF( NE_16( st->hTcxEnc->tcxMode, TCX_20 ) ) { - mvr2r( st->hTcxEnc->spectrum[n], orig_spectrum[ch][n], L_subframeTCX ); + /* nSubframes = NB_DIV = 2 */ + L_subframe = shr( L_subframe, 1 ); // L_subframe = L_subframe / nSubframes + L_subframeTCX = shr( L_subframeTCX, 1 ); // L_subframeTCX = L_subframeTCX / nSubframes + tcx_subframe_coded_lines = shr( tcx_subframe_coded_lines, 1 ); // tcx_subframe_coded_lines = tcx_subframe_coded_lines / nSubframes + } -#ifdef IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - st->hTcxEnc->spectrum_e[n] = 31 - ( Q_factor_arrL( st->hTcxEnc->spectrum[n], tcx_subframe_coded_lines ) - 4 ); - floatToFixed_arrL( st->hTcxEnc->spectrum[n], st->hTcxEnc->spectrum_fx[n], 31 - st->hTcxEnc->spectrum_e[n], tcx_subframe_coded_lines ); -#endif + FOR( n = 0; n < nSubframes; n++ ) + { + Copy32( st->hTcxEnc->spectrum_fx[n], orig_spectrum[ch][n], L_subframeTCX ); + orig_spectrum_e[ch][n] = st->hTcxEnc->spectrum_e[n]; + move16(); + + q_com = sub( L_norm_arr( st->hTcxEnc->spectrum_fx[n], L_subframeTCX ), 4 ); + Scale_sig32( st->hTcxEnc->spectrum_fx[n], L_subframeTCX, q_com ); + st->hTcxEnc->spectrum_e[n] = sub( st->hTcxEnc->spectrum_e[n], q_com ); + move16(); /* Shape spectrum */ ShapeSpectrum_ivas_fx( st->hTcxCfg, A_q_fx[ch][n], NULL, NULL, L_subframe, tcx_subframe_coded_lines, st->hTcxEnc->spectrum_fx[n], &st->hTcxEnc->spectrum_e[n], st->hTcxEnc->fUseTns[n], st, scf_q_fx[ch][n] ); - - -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - fixedToFloat_arrL( st->hTcxEnc->spectrum_fx[n], st->hTcxEnc->spectrum[n], 31 - st->hTcxEnc->spectrum_e[n], tcx_subframe_coded_lines ); -#endif -#else - ShapeSpectrum( st->hTcxCfg, A_q[ch][n], NULL, L_subframe, tcx_subframe_coded_lines, st->hTcxEnc->spectrum[n], st->hTcxEnc->fUseTns[n], st, scf_q[ch][n] ); -#endif } } - /*--------------------------------------------------------------* * TNS *---------------------------------------------------------------*/ /* first deinterleave once more */ - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + IF( EQ_16( sts[ch]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) { - continue; + CONTINUE; } st = sts[ch]; - nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - for ( n = 0; n < nSubframes; n++ ) + nSubframes = NB_DIV; + move16(); + shift = 1; + move16(); + IF( EQ_16( st->hTcxEnc->tcxMode, TCX_20 ) ) { - if ( st->hTcxEnc->transform_type[n] == TCX_5 ) + nSubframes = 1; + move16(); + shift = 0; + move16(); + } + + FOR( n = 0; n < nSubframes; n++ ) + { + IF( EQ_16( st->hTcxEnc->transform_type[n], TCX_5 ) ) { -#ifdef IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - st->hTcxEnc->spectrum_e[n] = Q31 - L_get_q_buf1( st->hTcxEnc->spectrum[n], st->hTcxCfg->tcx5SizeFB * 2 ); - floatToFixed_arrL32( st->hTcxEnc->spectrum[n], st->hTcxEnc->spectrum_fx[n], ( Q31 - st->hTcxEnc->spectrum_e[n] ), st->hTcxCfg->tcx5SizeFB * 2 ); - mdst_spectrum_e[ch][n] = Q31 - L_get_q_buf1( mdst_spectrum[ch][n], st->hTcxCfg->tcx5SizeFB * 2 ); - floatToFixed_arrL32( mdst_spectrum[ch][n], mdst_spectrum_fx[ch][n], ( Q31 - mdst_spectrum_e[ch][n] ), st->hTcxCfg->tcx5SizeFB * 2 ); -#endif tcx5SpectrumDeinterleaving_fx( st->hTcxCfg->tcx5SizeFB, st->hTcxEnc->spectrum_fx[n] ); tcx5SpectrumDeinterleaving_fx( st->hTcxCfg->tcx5SizeFB, mdst_spectrum_fx[ch][n] ); -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - fixedToFloat_arrL32( st->hTcxEnc->spectrum_fx[n], st->hTcxEnc->spectrum[n], ( Q31 - st->hTcxEnc->spectrum_e[n] ), st->hTcxCfg->tcx5SizeFB * 2 ); - fixedToFloat_arrL32( mdst_spectrum_fx[ch][n], mdst_spectrum[ch][n], ( Q31 - mdst_spectrum_e[ch][n] ), st->hTcxCfg->tcx5SizeFB * 2 ); -#endif -#else - tcx5SpectrumDeinterleaving( st->hTcxCfg->tcx5SizeFB, st->hTcxEnc->spectrum[n] ); - tcx5SpectrumDeinterleaving( st->hTcxCfg->tcx5SizeFB, mdst_spectrum[ch][n] ); -#endif } } } -#ifdef IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + + q_min = 0; + q_com = Q31; + move16(); + move16(); + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; hTcxEnc = st->hTcxEnc; - nSubframes = ( hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - for ( k = 0; k < nSubframes; k++ ) + nSubframes = NB_DIV; + move16(); + shift = 1; + move16(); + IF( EQ_16( st->hTcxEnc->tcxMode, TCX_20 ) ) { - q_com = L_get_q_buf1( st->hTcxEnc->spectrum[k], st->hTcxEnc->L_frameTCX / nSubframes ); - st->hTcxEnc->spectrum_e[k] = Q31 - ( q_com - 4 ); - floatToFixed_arrL32( st->hTcxEnc->spectrum[k], st->hTcxEnc->spectrum_fx[k], ( Q31 - st->hTcxEnc->spectrum_e[k] ), st->hTcxEnc->L_frameTCX / nSubframes ); - - q_temp[ch][k] = L_get_q_buf1( mdst_spectrum[ch][k], st->hTcxEnc->L_frameTCX / nSubframes ); - floatToFixed_arrL32( mdst_spectrum[ch][k], mdst_spectrum_fx[ch][k], q_temp[ch][k], st->hTcxEnc->L_frameTCX / nSubframes ); + nSubframes = 1; + move16(); + shift = 0; + move16(); } - } -#endif - TNSAnalysisStereo_fx( sts, mdst_spectrum_fx, 1, tnsSize, tnsBits, param_core, mct_on ); + FOR( n = 0; n < nSubframes; n++ ) + { + q_min = s_max( q_min, hTcxEnc->spectrum_e[n] ); -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + q_com = s_min( q_com, L_norm_arr( hTcxEnc->spectrum_fx[n], shr( hTcxEnc->L_frameTCX, shift ) ) ); + } + } + q_min = sub( Q31, q_min ); + q_com = sub( s_min( Q31, add( q_min, q_com ) ), 4 ); + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; hTcxEnc = st->hTcxEnc; - nSubframes = ( hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - for ( k = 0; k < nSubframes; k++ ) + + nSubframes = NB_DIV; + move16(); + shift = 1; + move16(); + IF( EQ_16( st->hTcxEnc->tcxMode, TCX_20 ) ) + { + nSubframes = 1; + move16(); + shift = 0; + move16(); + } + + FOR( n = 0; n < nSubframes; n++ ) { - fixedToFloat_arrL32( st->hTcxEnc->spectrum_fx[k], st->hTcxEnc->spectrum[k], ( Q31 - st->hTcxEnc->spectrum_e[k] ), st->hTcxEnc->L_frameTCX / nSubframes ); - fixedToFloat_arrL32( mdst_spectrum_fx[ch][k], mdst_spectrum[ch][k], q_temp[ch][k], st->hTcxEnc->L_frameTCX / nSubframes ); + Scale_sig32( hTcxEnc->spectrum_fx[n], shr( hTcxEnc->L_frameTCX, shift ), sub( q_com, sub( 31, hTcxEnc->spectrum_e[n] ) ) ); + hTcxEnc->spectrum_e[n] = sub( 31, q_com ); + move16(); } } -#endif -#else - TNSAnalysisStereo( sts, mdst_spectrum, 1, tnsSize, tnsBits, param_core, mct_on ); -#endif - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + TNSAnalysisStereo_fx( sts, mdst_spectrum_fx, 1, tnsSize, tnsBits, param_core, mct_on ); + + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + IF( EQ_16( sts[ch]->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) { - continue; + CONTINUE; } st = sts[ch]; - nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; -#ifdef IVAS_FLOAT_FIXED + nSubframes = NB_DIV; + move16(); + shift = 1; + move16(); + IF( EQ_16( st->hTcxEnc->tcxMode, TCX_20 ) ) + { + nSubframes = 1; + move16(); + shift = 0; + move16(); + } + init_tcx_enc_info_fx( st, &L_subframe, &L_subframeTCX, &tcx_subframe_coded_lines ); -#else - init_tcx_enc_info( st, &L_subframe, &L_subframeTCX, &tcx_subframe_coded_lines ); -#endif - L_subframe = L_subframe / nSubframes; - L_subframeTCX = L_subframeTCX / nSubframes; - tcx_subframe_coded_lines = tcx_subframe_coded_lines / nSubframes; + IF( NE_16( st->hTcxEnc->tcxMode, TCX_20 ) ) + { + /* nSubframes = NB_DIV = 2 */ + L_subframe = shr( L_subframe, 1 ); // L_subframe = L_subframe / nSubframes + L_subframeTCX = shr( L_subframeTCX, 1 ); // L_subframeTCX = L_subframeTCX / nSubframes + tcx_subframe_coded_lines = shr( tcx_subframe_coded_lines, 1 ); // tcx_subframe_coded_lines = tcx_subframe_coded_lines / nSubframes + } - for ( n = 0; n < nSubframes; n++ ) + FOR( n = 0; n < nSubframes; n++ ) { - if ( !st->hTcxEnc->fUseTns[n] ) + IF( st->hTcxEnc->fUseTns[n] == 0 ) { -#ifdef IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - mdst_spectrum_e[ch][n] = 31 - ( Q_factor_arrL( mdst_spectrum[ch][n], tcx_subframe_coded_lines ) - 2 ); - floatToFixed_arrL( mdst_spectrum[ch][n], mdst_spectrum_fx[ch][n], 31 - mdst_spectrum_e[ch][n], tcx_subframe_coded_lines ); -#endif + q_com = sub( L_norm_arr( mdst_spectrum_fx[ch][n], L_subframeTCX ), 2 ); + Scale_sig32( mdst_spectrum_fx[ch][n], L_subframeTCX, q_com ); + mdst_spectrum_e[ch][n] = sub( mdst_spectrum_e[ch][n], q_com ); + move16(); /* Shape spectrum */ ShapeSpectrum_ivas_fx( st->hTcxCfg, A_q_fx[ch][n], NULL, NULL, L_subframe, tcx_subframe_coded_lines, mdst_spectrum_fx[ch][n], &mdst_spectrum_e[ch][n], st->hTcxEnc->fUseTns[n], st, scf_q_fx[ch][n] ); - - -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - fixedToFloat_arrL( mdst_spectrum_fx[ch][n], mdst_spectrum[ch][n], 31 - mdst_spectrum_e[ch][n], tcx_subframe_coded_lines ); -#endif -#else - ShapeSpectrum( st->hTcxCfg, A_q[ch][n], NULL, L_subframe, tcx_subframe_coded_lines, mdst_spectrum[ch][n], st->hTcxEnc->fUseTns[n], st, scf_q[ch][n] ); -#endif // IVAS_FLOAT_FIXED } } } - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { /*no need to write last channel bit in case of odd channels*/ - if ( ( hCPE->cpe_id * CPE_CHANNELS + ch ) >= nChannels ) + IF( GE_16( add( i_mult( hCPE->cpe_id, CPE_CHANNELS ), ch ), nChannels ) ) { - continue; + CONTINUE; } st = sts[ch]; - if ( mct_on ) /* signal bits should be written only for MCT*/ + IF( mct_on ) /* signal bits should be written only for MCT*/ { - if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + IF( EQ_16( st->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) { push_next_indice( hBstr, 1, 1 ); } - else + ELSE { assert( st->mct_chan_mode == MCT_CHAN_MODE_REGULAR ); push_next_indice( hBstr, 0, 1 ); @@ -2619,168 +2745,214 @@ void ivas_mdct_core_whitening_enc( } /* write bitstream with info up to here */ - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; - if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + IF( EQ_16( st->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) { st->side_bits_frame_channel = 0; + move16(); /*dummy initialization to prevent range coder crashing in case all channels are silent and bits are distributed to channel 0 */ - *p_param[ch] = 1 + NOISE_FILL_RANGES + LTPSIZE + tnsSize[ch][0] + NPRM_CTX_HM; - continue; + *p_param[ch] = add( 1 + NOISE_FILL_RANGES + LTPSIZE + NPRM_CTX_HM, tnsSize[ch][0] ); + move16(); + + CONTINUE; } -#ifdef IVAS_FLOAT_FIXED test(); test(); IF( ( ch > 0 ) && ( add( sts[0]->hTcxEnc->fUseTns[0], sts[0]->hTcxEnc->fUseTns[1] ) > 0 ) && !mct_on ) { enc_prm_pre_mdct_fx( st, param_core[ch], tnsSize[ch], p_param[ch], mct_on, hBstr ); - } - ELSE - { - enc_prm_pre_mdct_fx( st, param_core[ch], NULL, p_param[ch], mct_on, hBstr ); - } -#else - enc_prm_pre_mdct( st, param_core[ch], ( ( ( ch > 0 ) && ( sts[0]->hTcxEnc->fUseTns[0] + sts[0]->hTcxEnc->fUseTns[1] > 0 ) && !mct_on ) ? tnsSize[ch] : NULL ), p_param[ch], mct_on, hBstr ); -#endif - if ( ch > 0 && sts[0]->hTcxEnc->fUseTns[0] + sts[0]->hTcxEnc->fUseTns[1] > 0 && !mct_on ) - { - if ( st->hTcxEnc->tnsData[0].nFilters < 0 ) + IF( st->hTcxEnc->tnsData[0].nFilters < 0 ) { tnsBits[ch][0] = 1; + move16(); } - else + ELSE { - tnsBits[ch][0]++; + tnsBits[ch][0] = add( tnsBits[ch][0], 1 ); + move16(); } - if ( st->core == TCX_10_CORE ) + IF( EQ_16( st->core, TCX_10_CORE ) ) { - if ( st->hTcxEnc->tnsData[1].nFilters < 0 ) + IF( st->hTcxEnc->tnsData[1].nFilters < 0 ) { tnsBits[ch][1] = 1; + move16(); } - else + ELSE { - tnsBits[ch][1]++; + tnsBits[ch][1] = add( tnsBits[ch][1], 1 ); + move16(); } } } + ELSE + { + enc_prm_pre_mdct_fx( st, param_core[ch], NULL, p_param[ch], mct_on, hBstr ); + } } /*--------------------------------------------------------------------------------* * SNS parameters *--------------------------------------------------------------------------------*/ - - if ( !mct_on && sts[0]->sr_core == 25600 && ( ( hCPE->element_brate == IVAS_48k || hCPE->element_brate == IVAS_64k ) ) ) + test(); + test(); + test(); + IF( ( mct_on == 0 ) && EQ_32( sts[0]->sr_core, 25600 ) && ( EQ_32( hCPE->element_brate, IVAS_48k ) || EQ_32( hCPE->element_brate, IVAS_64k ) ) ) { idx = 0; + move16(); - if ( sts[0]->core == sts[1]->core ) + IF( EQ_16( sts[0]->core, sts[1]->core ) ) { - nSubframes = ( sts[0]->core == TCX_20_CORE ) ? 1 : NB_DIV; + nSubframes = NB_DIV; + move16(); + shift = 1; + move16(); + IF( EQ_16( sts[0]->core, TCX_20 ) ) + { + nSubframes = 1; + move16(); + shift = 0; + move16(); + } /* push all stereo mode bits first */ - for ( n = 0; n < nSubframes; ++n ) + FOR( n = 0; n < nSubframes; ++n ) { push_next_indice( hBstr, sns_stereo_mode[n], 1 ); - sts[0]->side_bits_frame_channel++; + sts[0]->side_bits_frame_channel = add( sts[0]->side_bits_frame_channel, 1 ); + move16(); } /* zero side flags only get transmitted if needed */ - for ( n = 0; n < nSubframes; ++n ) + FOR( n = 0; n < nSubframes; ++n ) { - if ( sns_stereo_mode[n] == SNS_STEREO_MODE_MS ) + IF( EQ_16( sns_stereo_mode[n], SNS_STEREO_MODE_MS ) ) { push_next_indice( hBstr, zero_side_flag[n], 1 ); - sts[0]->side_bits_frame_channel++; + sts[0]->side_bits_frame_channel = add( sts[0]->side_bits_frame_channel, 1 ); + move16(); } } } - for ( ch = 0; ch < CPE_CHANNELS; ++ch ) + FOR( ch = 0; ch < CPE_CHANNELS; ++ch ) { st = sts[ch]; nbits_start_sns = hBstr->nb_bits_tot; - nSubframes = ( st->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; - for ( n = 0; n < nSubframes; ++n ) + move16(); + + nSubframes = NB_DIV; + move16(); + shift = 1; + move16(); + IF( EQ_16( st->hTcxEnc->tcxMode, TCX_20 ) ) { - const int16_t is_side = ch == 1 && sns_stereo_mode[n] == SNS_STEREO_MODE_MS; - const int16_t *bits = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20_bits : ivas_sns_cdbks_tcx10_bits; - int16_t nStages = ( ( nSubframes == 1 ) ? SNS_MSVQ_NSTAGES_TCX20 : SNS_MSVQ_NSTAGES_TCX10 ); + nSubframes = 1; + move16(); + shift = 0; + move16(); + } - if ( is_side ) + FOR( n = 0; n < nSubframes; ++n ) + { + test(); + Word16 is_side = EQ_16( ch, 1 ) && EQ_16( sns_stereo_mode[n], SNS_STEREO_MODE_MS ); + Word16 nStages = SNS_MSVQ_NSTAGES_TCX10; + move16(); + IF( EQ_16( nSubframes, 1 ) ) { - if ( zero_side_flag[n] ) + nStages = SNS_MSVQ_NSTAGES_TCX20; + move16(); + } + const Word16 *bits = ( nSubframes == 1 ) ? ivas_sns_cdbks_tcx20_bits : ivas_sns_cdbks_tcx10_bits; + + IF( is_side ) + { + IF( zero_side_flag[n] ) { - continue; + CONTINUE; } nStages = SNS_MSVQ_NSTAGES_SIDE; + move16(); + bits = ( sts[ch]->core == TCX_20_CORE ) ? ivas_sns_cdbks_side_tcx20_bits : ivas_sns_cdbks_side_tcx10_bits; } - for ( int16_t j = 0; j < nStages; ++j, ++idx ) + FOR( Word16 j = 0; j < nStages; ( ++j, ++idx ) ) { push_next_indice( hBstr, sns_vq_indices[idx], bits[j] ); } } - st->side_bits_frame_channel += hBstr->nb_bits_tot - nbits_start_sns; + st->side_bits_frame_channel = add( st->side_bits_frame_channel, sub( hBstr->nb_bits_tot, nbits_start_sns ) ); + move16(); } } - else + ELSE { /* write SNS parameter separately since at the decoder, both channels' cores need to be decoded before, so the joint SNS decoding can be done */ skipped_first_channel = 0; - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + move16(); + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; - if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + IF( EQ_16( st->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) { skipped_first_channel = 1; - continue; + move16(); + CONTINUE; } nbits_start_sns = hBstr->nb_bits_tot; + move16(); - num_sns = ( st->core == TCX_20_CORE ) ? 1 : NB_DIV; + num_sns = NB_DIV; + move16(); + if ( EQ_16( st->core, TCX_20_CORE ) ) + { + num_sns = 1; + move16(); + } - if ( ch == 0 || skipped_first_channel ) + test(); + IF( ch == 0 || skipped_first_channel ) { - push_next_indice( hBstr, param_lpc[0][0] >> 1, 1 ); + push_next_indice( hBstr, shr( param_lpc[0][0], 1 ), 1 ); - if ( st->element_brate == IVAS_48k && !( ( sts[0]->core == TCX_20 && sts[1]->core == TCX_20 ) ) ) + IF( EQ_32( st->element_brate, IVAS_48k ) && !( EQ_16( sts[0]->core, TCX_20 ) && EQ_16( sts[1]->core, TCX_20 ) ) ) { /* write classifier decision to signal low br mode for SNS encoding, for all other configs, low_br mode is not possible */ push_next_indice( hBstr, sns_low_br_mode, 1 ); } } -#ifdef IVAS_FLOAT_FIXED + encode_lpc_avq_ivas_fx( hBstr, num_sns, param_lpc[ch], st->core, st->element_mode ); -#else - encode_lpc_avq( hBstr, num_sns, param_lpc[ch], st->core, st->element_mode ); -#endif - st->side_bits_frame_channel += hBstr->nb_bits_tot - nbits_start_sns; + st->side_bits_frame_channel = add( st->side_bits_frame_channel, sub( hBstr->nb_bits_tot, nbits_start_sns ) ); + move16(); } } /*update pitch buffer*/ - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) + FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; - if ( st->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + IF( EQ_16( st->mct_chan_mode, MCT_CHAN_MODE_IGNORE ) ) { - continue; + CONTINUE; } - if ( param_core[ch][1 + NOISE_FILL_RANGES] != 0 ) + IF( param_core[ch][1 + NOISE_FILL_RANGES] != 0 ) { set16_fx( pitch_buf_fx[ch], extract_l( Mult_32_32( L_add( L_deposit_h( st->hTcxEnc->tcxltp_pitch_int ), L_mult( st->hTcxEnc->tcxltp_pitch_fr, div_s( 1, st->pit_res_max ) ) ), Mult_32_32( L_shl( st->sr_core, Q10 ), ONE_BY_INT_FS_12k8_Q42 ) ) ), NB_SUBFR16k ); } - else + ELSE { set16_fx( pitch_buf_fx[ch], L_SUBFR << Q6, NB_SUBFR16k ); } diff --git a/lib_enc/ivas_sce_enc.c b/lib_enc/ivas_sce_enc.c index f82d245ef..a2809bdf2 100644 --- a/lib_enc/ivas_sce_enc.c +++ b/lib_enc/ivas_sce_enc.c @@ -173,7 +173,7 @@ ivas_error ivas_sce_enc_fx( move16(); } - currFlatness_fx[0] = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) st->hTranDet, NSUBBLOCKS, 0 ); // Q4 + currFlatness_fx[0] = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) st->hTranDet, NSUBBLOCKS, 0 ); // Q7 move16(); /*----------------------------------------------------------------* diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c index 8977fd3e6..bd2ef35ae 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -550,10 +550,12 @@ void stereo_mdct_core_enc( #endif int16_t i, ch, nSubframes, L_subframeTCX; int16_t n, nAvailBits; - int16_t tnsSize[CPE_CHANNELS][NB_DIV]; /* number of tns parameters put into prm */ - int16_t tnsBits[CPE_CHANNELS][NB_DIV]; /* number of tns bits in the frame */ - float *p_orig_spectrum_long[CPE_CHANNELS], orig_spectrum_long[CPE_CHANNELS][N_MAX]; /* MDCT output (L/R). */ - float *orig_spectrum[CPE_CHANNELS][NB_DIV]; /* Pointers to MDCT output for a short block (L/R) */ + int16_t tnsSize[CPE_CHANNELS][NB_DIV]; /* number of tns parameters put into prm */ + int16_t tnsBits[CPE_CHANNELS][NB_DIV]; /* number of tns bits in the frame */ + float orig_spectrum_long[CPE_CHANNELS][N_MAX]; /* MDCT output (L/R). */ + Word32 *p_orig_spectrum_long_fx[CPE_CHANNELS]; /* MDCT output (L/R). */ + float *p_orig_spectrum_long[CPE_CHANNELS]; /* MDCT output (L/R). */ + float *orig_spectrum[CPE_CHANNELS][NB_DIV]; /* Pointers to MDCT output for a short block (L/R) */ float powerSpec[CPE_CHANNELS][N_MAX]; #ifdef IVAS_FLOAT_FIXED Word16 q_powerSpec; @@ -566,6 +568,7 @@ void stereo_mdct_core_enc( float *inv_mdst_spectrum[CPE_CHANNELS][NB_DIV]; float *inv_spectrum[CPE_CHANNELS][NB_DIV]; float *p_mdst_spectrum_long[CPE_CHANNELS], mdst_spectrum_long[CPE_CHANNELS][N_MAX]; + Word32 *p_mdst_spectrum_long_fx[CPE_CHANNELS]; float *mdst_spectrum[CPE_CHANNELS][NB_DIV]; #ifdef IVAS_FLOAT_FIXED Word32 mdst_spectrum_long_fx[CPE_CHANNELS][N_MAX]; @@ -592,6 +595,8 @@ void stereo_mdct_core_enc( for ( ch = 0; ch < CPE_CHANNELS; ch++ ) { + p_mdst_spectrum_long_fx[ch] = mdst_spectrum_long_fx[ch]; + p_orig_spectrum_long_fx[ch] = orig_spectrum_long_fx[ch]; p_mdst_spectrum_long[ch] = mdst_spectrum_long[ch]; p_orig_spectrum_long[ch] = orig_spectrum_long[ch]; #ifdef IVAS_FLOAT_FIXED @@ -731,20 +736,77 @@ void stereo_mdct_core_enc( * - TNS *---------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED_CONVERSIONS + Word16 mdst_spectrum_e[CPE_CHANNELS][NB_DIV]; + Word16 orig_spectrum_e[CPE_CHANNELS][NB_DIV]; Word16 new_samples_fx[CPE_CHANNELS][L_INP]; - Word16 old_wsp_fx[CPE_CHANNELS][L_WSP], q_fac[CPE_CHANNELS]; + Word16 old_wsp_fx[CPE_CHANNELS][L_WSP], q_fac[CPE_CHANNELS], q_fac1 = Q15; for ( i = 0; i < CPE_CHANNELS; i++ ) { + Encoder_State *st1 = sts[i]; + TCX_ENC_HANDLE hTcxEncCh = st1->hTcxEnc; + nSubframes = ( st1->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + for ( n = 0; n < nSubframes; n++ ) + { + Word16 nl = (Word16) ( (float) ( hTcxEncCh->L_frameTCX / nSubframes ) * N_ZERO_MDCT_NS / FRAME_SIZE_NS ); + floatToFixed_arr( &hTcxEncCh->new_speech_TCX_flt[nl - ( hTcxEncCh->L_frameTCX / nSubframes )], + &hTcxEncCh->new_speech_TCX[nl - ( hTcxEncCh->L_frameTCX / nSubframes )], + 0, + 2 * hTcxEncCh->L_frameTCX / nSubframes ); + + IF( n == 0 ) + { + floatToFixed_arr( &hTcxEncCh->speech_TCX_flt[-( sts[0]->hTcxCfg->tcx_mdct_window_min_lengthFB - 0 )], + &hTcxEncCh->speech_TCX[-( sts[0]->hTcxCfg->tcx_mdct_window_min_lengthFB - 0 )], + 0, + sts[0]->hTcxCfg->tcx_mdct_window_min_lengthFB ); + } + } floatToFixed_arr( new_samples[i], new_samples_fx[i], 0, L_INP ); q_fac[i] = Q_factor_arr( old_wsp[i], L_WSP ); floatToFixed_arr( old_wsp[i], old_wsp_fx[i], q_fac[i], L_WSP ); + if ( st1->element_mode == IVAS_CPE_DFT ) + { + q_fac1 = Q_factor_arr( st1->buf_wspeech_enc_flt, L_FRAME16k + L_SUBFR + L_FRAME16k + L_NEXT_MAX_16k + 320 ); + floatToFixed_arr( st1->buf_wspeech_enc_flt, st1->buf_wspeech_enc, q_fac1, L_FRAME16k + L_SUBFR + L_FRAME16k + L_NEXT_MAX_16k + 320 ); + st1->exp_buf_wspeech_enc = 15 - q_fac1; + } + else if ( st1->element_mode != IVAS_CPE_MDCT ) + { + q_fac1 = Q_factor_arr( st1->buf_speech_enc_flt, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k ); + floatToFixed_arr( st1->buf_speech_enc_flt, st1->buf_speech_enc, q_fac1, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k ); + st1->exp_buf_speech_enc = 15 - q_fac1; + floatToFixed_arr( st1->hTcxEnc->buf_speech_ltp_flt, st1->hTcxEnc->buf_speech_ltp, q_fac1, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k ); + st1->hTcxEnc->exp_buf_speech_ltp = 15 - q_fac1; + } + floatToFixed_arr( st1->input_buff, st1->input_buff_fx, 0, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ); } #endif - ivas_mdct_core_whitening_enc( hCPE, new_samples_fx, old_wsp_fx, pitch_buf_fx, p_mdst_spectrum_long, - tnsBits, p_orig_spectrum_long, tnsSize, p_param, hBstr, 0, CPE_CHANNELS ); + ivas_mdct_core_whitening_enc_fx( hCPE, new_samples_fx, old_wsp_fx, pitch_buf_fx, p_mdst_spectrum_long_fx, + tnsBits, p_orig_spectrum_long_fx, tnsSize, p_param, hBstr, 0, CPE_CHANNELS, mdst_spectrum_e, orig_spectrum_e ); #ifdef IVAS_FLOAT_FIXED_CONVERSIONS for ( i = 0; i < CPE_CHANNELS; i++ ) { + Encoder_State *st1 = sts[i]; + nSubframes = ( st1->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + if ( st1->element_mode == IVAS_CPE_DFT ) + { + fixedToFloat_arr( st1->buf_wspeech_enc, st1->buf_wspeech_enc_flt, q_fac1, L_FRAME16k + L_SUBFR + L_FRAME16k + L_NEXT_MAX_16k + 320 ); + } + else if ( st1->element_mode != IVAS_CPE_MDCT ) + { + fixedToFloat_arr( st1->hTcxEnc->buf_speech_ltp, st1->hTcxEnc->buf_speech_ltp_flt, q_fac1, L_PAST_MAX_32k + L_FRAME32k + L_NEXT_MAX_32k ); + } + fixedToFloat_arr( st1->input_buff_fx, st1->input_buff, 0, L_FRAME48k + L_FRAME48k + NS2SA( 48000, DELAY_FIR_RESAMPL_NS ) ); + + fixedToFloat_arrL( st1->hTcxEnc->spectrum_fx[0], st1->hTcxEnc->spectrum[0], 31 - st1->hTcxEnc->spectrum_e[0], st1->hTcxEnc->L_frameTCX / nSubframes ); + fixedToFloat_arrL( p_orig_spectrum_long_fx[i], p_orig_spectrum_long[i], 31 - orig_spectrum_e[i][0], N_TCX10_MAX ); + fixedToFloat_arrL( p_mdst_spectrum_long_fx[i], p_mdst_spectrum_long[i], 31 - mdst_spectrum_e[i][0], N_TCX10_MAX ); + if ( nSubframes == NB_DIV ) + { + fixedToFloat_arrL( st1->hTcxEnc->spectrum_fx[1], st1->hTcxEnc->spectrum[1], 31 - st1->hTcxEnc->spectrum_e[1], st1->hTcxEnc->L_frameTCX / nSubframes ); + fixedToFloat_arrL( p_orig_spectrum_long_fx[i] + N_TCX10_MAX, p_orig_spectrum_long[i] + N_TCX10_MAX, 31 - orig_spectrum_e[i][1], N_TCX10_MAX ); + fixedToFloat_arrL( p_mdst_spectrum_long_fx[i] + N_TCX10_MAX, p_mdst_spectrum_long[i] + N_TCX10_MAX, 31 - mdst_spectrum_e[i][1], N_TCX10_MAX ); + } fixedToFloat_arr( old_wsp_fx[i], old_wsp[i], q_fac[i], L_WSP ); } #endif diff --git a/lib_enc/ivas_tcx_core_enc.c b/lib_enc/ivas_tcx_core_enc.c index fcaca81e1..6a03966c9 100644 --- a/lib_enc/ivas_tcx_core_enc.c +++ b/lib_enc/ivas_tcx_core_enc.c @@ -2034,8 +2034,8 @@ Word16 ivas_acelp_tcx20_switching_fx( test(); if ( ( GT_32( snr_acelp, tcx_snr ) ) && ( LT_32( snr_acelp, L_add( tcx_snr, 131072 /*2.0f Q16*/ ) ) ) && - ( LT_16( add_o( st->prevTempFlatness_fx, currFlatness, &Overflow ), 52 /*3.25f Q4*/ ) || EQ_16( stab_fac, 0x7fff ) || - ( !flag_16k_smc && ( st->sp_aud_decision0 > 0 ) && LT_16( add_sat( st->prevTempFlatness_fx, currFlatness ), 320 /*20.f Q4*/ ) ) ) && + ( LT_16( add_o( st->prevTempFlatness_fx, currFlatness, &Overflow ), 416 /*3.25f Q7*/ ) || EQ_16( stab_fac, 0x7fff ) || + ( !flag_16k_smc && ( st->sp_aud_decision0 > 0 ) && LT_16( add_sat( st->prevTempFlatness_fx, currFlatness ), 2560 /*20.f Q7*/ ) ) ) && ( LE_16( st->Nb_ACELP_frames, 6 ) ) ) { dsnr = -131072 /*-2.0f Q16*/; @@ -2047,7 +2047,7 @@ Word16 ivas_acelp_tcx20_switching_fx( test(); if ( ( LT_32( snr_acelp, tcx_snr ) ) && ( GT_32( snr_acelp, L_sub( tcx_snr, 131072 /*2.0f Q16*/ ) ) ) && - ( GT_16( add_sat( st->prevTempFlatness_fx, currFlatness ), 52 /*3.25f Q4*/ ) ) && + ( GT_16( add_sat( st->prevTempFlatness_fx, currFlatness ), 416 /*3.25f Q7*/ ) ) && ( GE_16( st->Nb_ACELP_frames, 6 ) ) ) { dsnr = 131072 /*2.0f Q16*/; @@ -2093,7 +2093,7 @@ Word16 ivas_acelp_tcx20_switching_fx( /* Select ACELP or TCX */ test(); test(); - IF( GT_32( L_add( snr_acelp, dsnr ), tcx_snr ) && ( st->sp_aud_decision0 == 0 || GT_16( add_sat( st->prevTempFlatness_fx, currFlatness ), 52 /*3.25f Q4*/ ) ) ) + IF( GT_32( L_add( snr_acelp, dsnr ), tcx_snr ) && ( st->sp_aud_decision0 == 0 || GT_16( add_sat( st->prevTempFlatness_fx, currFlatness ), 416 /*3.25f Q7*/ ) ) ) { smc_dec_ol = 0; move16(); diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index dddf78e3d..de864cc30 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -155,15 +155,13 @@ typedef struct #ifndef IVAS_FLOAT_FIXED float subblockNrg_flt[NSUBBLOCKS + MAX_TD_DELAY]; /* Subblock energies with a delay buffering. */ #endif - Word32 subblockNrg[NSUBBLOCKS + MAX_TD_DELAY]; - Word16 subblockNrg_e; + Word32 subblockNrg[NSUBBLOCKS + MAX_TD_DELAY]; // IVAS Q0 #ifndef IVAS_FLOAT_FIXED float accSubblockNrg_flt[NSUBBLOCKS + MAX_TD_DELAY + 1]; /* Recursively accumulated subblock energies with a delay buffering. At index i the value corresponds to the accumulated subblock energy up to i-1, including block i-1 and without block i. */ #endif - Word32 accSubblockNrg[NSUBBLOCKS + MAX_TD_DELAY + 1]; - Word16 accSubblockNrg_e; + Word32 accSubblockNrg[NSUBBLOCKS + MAX_TD_DELAY + 1]; // IVAS Q0 #ifndef IVAS_FLOAT_FIXED float subblockNrgChange_flt[NSUBBLOCKS + MAX_TD_DELAY]; /* subblockNrgChange[i] = max(subblockNrg[i]/subblockNrg[i-1], subblockNrg[i-1]/subblockNrg[i]) */ #endif diff --git a/lib_enc/swb_bwe_enc_fx.c b/lib_enc/swb_bwe_enc_fx.c index de3f5b3e1..2b6ff9c34 100644 --- a/lib_enc/swb_bwe_enc_fx.c +++ b/lib_enc/swb_bwe_enc_fx.c @@ -4351,6 +4351,7 @@ void hq_generic_hf_encoding_fx( Word16 w_env_fx[SWB_FENV]; HQ_ENC_HANDLE hHQ_core = st_fx->hHQ_core; BSTR_ENC_HANDLE hBstr = st_fx->hBstr; + Word16 EnvCdbkFB_fx_loc[N_CB_FB * DIM_FB]; set16_fx( energy_factor_fx, 0, SWB_FENV ); @@ -4495,8 +4496,15 @@ void hq_generic_hf_encoding_fx( IF( EQ_16( length, L_SPEC48k ) ) { - indice[5] = vqSimple_w_fx( hq_generic_fenv_fx + nenv, hq_generic_fenv_fx + nenv, EnvCdbkFB_fx, NULL, DIM_FB, N_CB_FB, 0 ); + Word16 sf = getScaleFactor16( hq_generic_fenv_fx, DIM_FB + nenv ); + Scale_sig( hq_generic_fenv_fx, DIM_FB + nenv, negate( sf ) ); + Copy_Scale_sig( EnvCdbkFB_fx, EnvCdbkFB_fx_loc, N_CB_FB * DIM_FB, negate( sf ) ); + // Scaling done to handel overflow inside vqSimple_w_fx + + indice[5] = vqSimple_w_fx( hq_generic_fenv_fx + nenv, hq_generic_fenv_fx + nenv, EnvCdbkFB_fx_loc, NULL, DIM_FB, N_CB_FB, 0 ); move16(); + + Scale_sig( hq_generic_fenv_fx, DIM_FB + nenv, sf ); } push_indice( hBstr, IND_SWB_FENV_HQ, indice[0], 5 ); diff --git a/lib_enc/tcx_ltp_enc_fx.c b/lib_enc/tcx_ltp_enc_fx.c index 5355386df..aec847907 100644 --- a/lib_enc/tcx_ltp_enc_fx.c +++ b/lib_enc/tcx_ltp_enc_fx.c @@ -952,8 +952,8 @@ void tcx_ltp_encode_ivas_fx( Word16 alpha_fx, step_fx; // Q15 Word16 norm_corr_fx; // Q15 Word16 border_case; - Word16 tempFlatness_fx; // Q4 - Word16 maxEnergyChange_fx; // Q7 + Word16 tempFlatness_fx; // Q7 + Word16 maxEnergyChange_fx; // Q3 Word16 pred_speech_fx[L_FRAME_PLUS]; // Qspeech Word16 buf_zir_fx[M + L_FRAME_PLUS / 4], *zir_fx; // Qspeech Word16 Aest_fx[M + 1]; @@ -1076,15 +1076,15 @@ void tcx_ltp_encode_ivas_fx( IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { - tempFlatness_fx = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) st->hTranDet, NSUBBLOCKS - NSUBBLOCKS_SHIFT, add( nPrevSubblocks, NSUBBLOCKS_SHIFT ) ); // Q4 + tempFlatness_fx = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) st->hTranDet, NSUBBLOCKS - NSUBBLOCKS_SHIFT, add( nPrevSubblocks, NSUBBLOCKS_SHIFT ) ); // Q7 maxEnergyChange_fx = GetTCXMaxenergyChange_ivas_fx( st->hTranDet, (const Word8) isTCX10, - NSUBBLOCKS - NSUBBLOCKS_SHIFT, add( nPrevSubblocks, NSUBBLOCKS_SHIFT ) ); // Q7 + NSUBBLOCKS - NSUBBLOCKS_SHIFT, add( nPrevSubblocks, NSUBBLOCKS_SHIFT ) ); // Q3 } ELSE { - tempFlatness_fx = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) st->hTranDet, NSUBBLOCKS, nPrevSubblocks ); // Q4 + tempFlatness_fx = GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) st->hTranDet, NSUBBLOCKS, nPrevSubblocks ); // Q7 maxEnergyChange_fx = GetTCXMaxenergyChange_ivas_fx( st->hTranDet, (const Word8) isTCX10, - NSUBBLOCKS, nPrevSubblocks ); + NSUBBLOCKS, nPrevSubblocks ); // Q3 } /* Switch LTP on */ @@ -1108,11 +1108,11 @@ void tcx_ltp_encode_ivas_fx( ( tcxOnly == 0 ) && EQ_16( tcxMode, TCX_20 ) && GT_16( mult( norm_corr_fx, hTcxEnc->tcxltp_norm_corr_past ), 0x2000 ) && /*mult returns Q15*/ - LT_16( tempFlatness_fx, 56 /*3.5f Q4*/ ) ) || + LT_16( tempFlatness_fx, 448 /*3.5f Q7*/ ) ) || ( EQ_16( tcxOnly, 1 ) && EQ_16( tcxMode, TCX_10 ) && GT_16( s_max( norm_corr_fx, hTcxEnc->tcxltp_norm_corr_past ), 0x4000 ) && - LT_16( maxEnergyChange_fx, 448 /*3.5f Q7*/ ) ) || + LT_16( maxEnergyChange_fx, 28 /*3.5f Q3*/ ) ) || ( /* Use LTP for lower correlation when pitch lag is big, L_frame*(1.2f-norm_corr) < pitch_int <=> norm_corr > 1.2f-pitch_int/L_frame */ EQ_16( tcxOnly, 1 ) && GT_16( norm_corr_fx, 14418 /*0.44f Q15*/ ) && @@ -1121,9 +1121,9 @@ void tcx_ltp_encode_ivas_fx( ( EQ_16( tcxOnly, 1 ) && EQ_16( tcxMode, TCX_20 ) && GT_16( norm_corr_fx, 14418 /*0.44f Q15*/ ) && - ( LT_16( tempFlatness_fx, 96 /*6.0f Q4*/ ) || - ( LT_16( tempFlatness_fx, 112 /*7.0f Q4*/ ) && - LT_16( maxEnergyChange_fx, 2816 /*22.0f Q7*/ ) ) ) ) ) + ( LT_16( tempFlatness_fx, 768 /*6.0f Q7*/ ) || + ( LT_16( tempFlatness_fx, 896 /*7.0f Q7*/ ) && + LT_16( maxEnergyChange_fx, 176 /*22.0f Q3*/ ) ) ) ) ) { IF( disable_ltp == 0 ) { @@ -1147,7 +1147,7 @@ void tcx_ltp_encode_ivas_fx( sqr = Sqrt16( hTcxEnc->tcxltp_on_mem, &exponent ); move16(); sqr = shl_sat( sqr, exponent ); - IF( ( EQ_16( tcxOnly, 1 ) && EQ_16( st->element_mode, IVAS_CPE_MDCT ) && ( GT_16( ( mult( sqr, mult( ( norm_corr_fx ), 29492 ) ) ), 14419 ) && ( LT_16( tempFlatness_fx, 96 ) || ( LT_16( tempFlatness_fx, 112 ) && LT_16( maxEnergyChange_fx, 2816 ) ) ) ) ) ) // 0.9f Q15, 6.0f Q4, 7.0f Q4, 22.0f Q7 + IF( ( EQ_16( tcxOnly, 1 ) && EQ_16( st->element_mode, IVAS_CPE_MDCT ) && ( GT_16( ( mult( sqr, mult( ( norm_corr_fx ), 29492 ) ) ), 14419 ) && ( LT_16( tempFlatness_fx, 768 ) || ( LT_16( tempFlatness_fx, 896 ) && LT_16( maxEnergyChange_fx, 176 ) ) ) ) ) ) // 0.9f Q15, 6.0f Q7, 7.0f Q7, 22.0f Q3 { ltp_on = 1; move16(); diff --git a/lib_enc/transient_detection_fx.c b/lib_enc/transient_detection_fx.c index aad1d7f26..cf4dfc2e8 100644 --- a/lib_enc/transient_detection_fx.c +++ b/lib_enc/transient_detection_fx.c @@ -354,7 +354,7 @@ Word16 GetTCXAvgTemporalFlatnessMeasure_ivas_fx( struct TransientDetection const } /* exponent = AVG_FLAT_E */ - i = div_l( L_shl( sumTempFlatness, 2 ), nTotBlocks ); // Q4 + i = div_l( L_shl( sumTempFlatness, 5 ), nTotBlocks ); // Q7 return i; } @@ -460,7 +460,7 @@ Word16 GetTCXMaxenergyChange_ivas_fx( TRAN_DET_HANDLE hTranDet, nTotBlocks = add( nCurrentSubblocks, nPrevSubblocks ); assert( nTotBlocks > 0 ); - maxEnergyChange = 0 /*0.0f Q7*/; + maxEnergyChange = 0 /*0.0f Q3*/; move16(); assert( ( nPrevSubblocks <= nRelativeDelay ) && ( nCurrentSubblocks <= NSUBBLOCKS + nDelay ) ); pSubblockNrgChange = &pSubblockEnergies->subblockNrgChange[nRelativeDelay - nPrevSubblocks]; @@ -506,7 +506,7 @@ Word16 GetTCXMaxenergyChange_ivas_fx( TRAN_DET_HANDLE hTranDet, } move16(); - i = maxEnergyChange; + i = maxEnergyChange; // Q3 return i; } @@ -755,7 +755,7 @@ void SetTCXModeInfo_ivas_fx( move16(); } } - tmp = BASOP_Util_Divide3216_Scale( ONE_IN_Q20, GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) hTranDet, NSUBBLOCKS, 0 ), &exp_diff ); + tmp = BASOP_Util_Divide3216_Scale( ONE_IN_Q23, GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) hTranDet, NSUBBLOCKS, 0 ), &exp_diff ); tmp = shl_sat( tmp, exp_diff ); // Q15 test(); IF( isLongTermTransient_fx( L_deposit_h( tmp ), &hTcxEnc->tfm_mem_fx ) && EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) @@ -785,7 +785,7 @@ void SetTCXModeInfo_ivas_fx( *tcxModeOverlap = ALDO_WINDOW; move16(); } - tmp = BASOP_Util_Divide3216_Scale( ONE_IN_Q20, GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) hTranDet, NSUBBLOCKS, 0 ), &exp_diff ); + tmp = BASOP_Util_Divide3216_Scale( ONE_IN_Q23, GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) hTranDet, NSUBBLOCKS, 0 ), &exp_diff ); tmp = shl_sat( tmp, exp_diff ); // Q15 test(); IF( isLongTermTransient_fx( L_deposit_h( tmp ), &hTcxEnc->tfm_mem_fx ) && EQ_16( st->element_mode, IVAS_CPE_MDCT ) ) @@ -998,8 +998,8 @@ static void InitSubblockEnergies_ivas_fx( Word16 nFrameLength, Word16 nDelay, De assert( ( pDelayBuffer != NULL ) && ( pSubblockEnergies != NULL ) && ( pDelayBuffer->nSubblockSize * NSUBBLOCKS == nFrameLength ) && ( pDelayBuffer->nSubblockSize > 0 ) ); set32_fx( pSubblockEnergies->subblockNrg, 107 /* 107.37 in Q0 */, nMaxBuffSize ); - set32_fx( pSubblockEnergies->accSubblockNrg, MIN_BLOCK_ENERGY_IVAS_FX_Q7, nMaxBuffSize + 1 ); - set16_fx( pSubblockEnergies->subblockNrgChange, ONE_IN_Q7, nMaxBuffSize ); + set32_fx( pSubblockEnergies->accSubblockNrg, 107 /* 107.37 in Q0 */, nMaxBuffSize + 1 ); + set16_fx( pSubblockEnergies->subblockNrgChange, ONE_IN_Q3, nMaxBuffSize ); IF( nDelay != 0 ) { pSubblockEnergies->nDelay = idiv1616( nDelay, pDelayBuffer->nSubblockSize ); @@ -1450,10 +1450,6 @@ static void CalculateSubblockEnergies_ivas_fx( Word16 const *input, Word16 nSamp /* Set accumulated subblock energy at this point. */ UpdatedAndStoreAccWindowNrg( pSubblockNrg[w], pAccSubblockTmp, facAccSubblockNrg, &pAccSubblockNrg[w] ); } - pSubblockEnergies->subblockNrg_e = 31; - pSubblockEnergies->accSubblockNrg_e = 31; - move16(); - move16(); /* Calculate energy change for each block. */ FOR( w = 0; w < nWindows; w++ ) @@ -1632,7 +1628,7 @@ Word16 transient_analysis_ivas_fx( /* Forward attack analysis */ FOR( i = -2; i < 7; i++ ) { - IF( BASOP_Util_Cmp_Mant32Exp( hTranDet->subblockEnergies.subblockNrg[nRelativeDelay + i], hTranDet->subblockEnergies.subblockNrg_e, Mpy_32_16_1( hTranDet->subblockEnergies.accSubblockNrg[nRelativeDelay + i], thr_fwd_fx ), add( hTranDet->subblockEnergies.accSubblockNrg_e, 4 ) ) > 0 ) + IF( BASOP_Util_Cmp_Mant32Exp( hTranDet->subblockEnergies.subblockNrg[nRelativeDelay + i], 31, Mpy_32_16_1( hTranDet->subblockEnergies.accSubblockNrg[nRelativeDelay + i], thr_fwd_fx ), ( 31 + 4 ) ) > 0 ) { prel_force_td = s_or( prel_force_td, 0x0001 ); } @@ -1669,7 +1665,7 @@ Word16 transient_analysis_ivas_fx( /* -3 check */ test(); - IF( BASOP_Util_Cmp_Mant32Exp( pSubblockNrg[1 + offset], hTranDet->subblockEnergies.subblockNrg_e, Mpy_32_16_1( accSubblockNrgRev_fx[1], thr_rev_fx ), add( hTranDet->subblockEnergies.subblockNrg_e, 4 ) ) > 0 ) + IF( BASOP_Util_Cmp_Mant32Exp( pSubblockNrg[1 + offset], 31, Mpy_32_16_1( accSubblockNrgRev_fx[1], thr_rev_fx ), ( 31 + 4 ) ) > 0 ) { prel_force_td = s_or( prel_force_td, 0x0002 ); move16(); @@ -1677,10 +1673,10 @@ Word16 transient_analysis_ivas_fx( /* -4 check */ test(); - IF( prel_force_td == 0 && BASOP_Util_Cmp_Mant32Exp( pSubblockNrg[offset], hTranDet->subblockEnergies.subblockNrg_e, Mpy_32_16_1( accSubblockNrgRev_fx[0], thr_rev_fx ), add( hTranDet->subblockEnergies.subblockNrg_e, 4 ) ) > 0 ) + IF( prel_force_td == 0 && BASOP_Util_Cmp_Mant32Exp( pSubblockNrg[offset], 31, Mpy_32_16_1( accSubblockNrgRev_fx[0], thr_rev_fx ), ( 31 + 4 ) ) > 0 ) { - IF( BASOP_Util_Cmp_Mant32Exp( pSubblockNrg[offset], hTranDet->subblockEnergies.subblockNrg_e, Mpy_32_16_1( accSubblockNrgRev_fx[0], add( thr_rev_fx, THR_LOW_STEP_FX ) ), add( hTranDet->subblockEnergies.subblockNrg_e, 4 ) ) > 0 ) + IF( BASOP_Util_Cmp_Mant32Exp( pSubblockNrg[offset], 31, Mpy_32_16_1( accSubblockNrgRev_fx[0], add( thr_rev_fx, THR_LOW_STEP_FX ) ), ( 31 + 4 ) ) > 0 ) { prel_force_td = s_or( prel_force_td, 0x0004 ); } -- GitLab From 5dc3f44f223ada117e78384d4736f76720de00e7 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Wed, 27 Nov 2024 22:24:14 +0530 Subject: [PATCH 2/2] Clang formatting changes --- lib_enc/ivas_core_enc.c | 2 +- lib_enc/ivas_stereo_mdct_core_enc.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c index 34efdb144..e01a915e8 100644 --- a/lib_enc/ivas_core_enc.c +++ b/lib_enc/ivas_core_enc.c @@ -527,7 +527,7 @@ ivas_error ivas_core_enc( } #endif ivas_mdct_core_whitening_enc_fx( hCPE, old_inp_16k_fx, old_wsp_fx, pitch_buf_fx_new, hMCT->p_mdst_spectrum_long_fx[cpe_id], hMCT->tnsBits[cpe_id], hMCT->p_orig_spectrum_long_fx[cpe_id], - hMCT->tnsSize[cpe_id], hMCT->p_param[cpe_id], hMCT->hBstr, 1, hMCT->nchan_out_woLFE, mdst_spectrum_e, orig_spectrum_e ); + hMCT->tnsSize[cpe_id], hMCT->p_param[cpe_id], hMCT->hBstr, 1, hMCT->nchan_out_woLFE, mdst_spectrum_e, orig_spectrum_e ); #ifdef IVAS_FLOAT_FIXED_CONVERSIONS for ( i = 0; i < CPE_CHANNELS; i++ ) { diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c index bd2ef35ae..b8978bcff 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -782,7 +782,7 @@ void stereo_mdct_core_enc( } #endif ivas_mdct_core_whitening_enc_fx( hCPE, new_samples_fx, old_wsp_fx, pitch_buf_fx, p_mdst_spectrum_long_fx, - tnsBits, p_orig_spectrum_long_fx, tnsSize, p_param, hBstr, 0, CPE_CHANNELS, mdst_spectrum_e, orig_spectrum_e ); + tnsBits, p_orig_spectrum_long_fx, tnsSize, p_param, hBstr, 0, CPE_CHANNELS, mdst_spectrum_e, orig_spectrum_e ); #ifdef IVAS_FLOAT_FIXED_CONVERSIONS for ( i = 0; i < CPE_CHANNELS; i++ ) { -- GitLab