diff --git a/lib_com/deemph.c b/lib_com/deemph.c index 4e1093120e5caa0603aa5b3b1e8841d9fd55a026..30ffda2a2999785037ca51f959290cd3ad1bc912 100644 --- a/lib_com/deemph.c +++ b/lib_com/deemph.c @@ -74,7 +74,7 @@ void deemph_fx_32( Word16 shift, /*scaled output*/ Word32 *signal, /* i/o: signal Qx*/ const Word16 mu, /* i : deemphasis factor Q15*/ - const int16_t L, /* i : vector size */ + const Word16 L, /* i : vector size */ Word32 *mem /* i/o: memory (y[-1]) Qx+shift*/ ) { diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index 683b398d904fbe647d4dedbd4204f64c8113207d..bfc3ea6c134db86695e18a18a1d4258d3abd81c1 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -1578,7 +1578,7 @@ void deemph_fx_32( Word16 shift, /* i : scaled output */ Word32 *signal, /* i/o: signal */ const Word16 mu, /* i : deemphasis factor */ - const int16_t L, /* i : vector size */ + const Word16 L, /* i : vector size */ Word32 *mem /* i/o: memory (y[-1]) */ ); diff --git a/lib_enc/core_enc_init.c b/lib_enc/core_enc_init.c index 783a30cb188a579f5da0f68dbb3f2d0e18f9845e..069bfdd45c793df47b9e3fb02eef727031bac7a4 100644 --- a/lib_enc/core_enc_init.c +++ b/lib_enc/core_enc_init.c @@ -288,6 +288,14 @@ void init_coder_ace_plus_ivas_fx( set32_fx( st->mem_bpf_fx1, 0, 2 * L_FILT16k ); set32_fx( st->mem_error_bpf_fx, 0, 2 * L_FILT16k ); + IF( st->ini_frame == 0 ) + { + st->Q_max_enc[0] = 15; + move16(); + st->Q_max_enc[1] = 15; + move16(); + } + IF( GE_32( st->total_brate, HQ_48k ) ) { st->enablePlcWaveadjust = 1; @@ -409,7 +417,8 @@ void init_coder_ace_plus( set_zero( st->hBWE_TD->cur_sub_Aq, M + 1 ); } - st->currEnergyHF = 0; + st->currEnergyHF_fx = 0; + move32(); /* Initialize LPC analysis/quantization */ if ( st->sr_core <= INT_FS_16k && st->tcxonly == 0 ) @@ -539,6 +548,14 @@ void init_coder_ace_plus( set32_fx( st->mem_bpf_fx1, 0, 2 * L_FILT16k ); set32_fx( st->mem_error_bpf_fx, 0, 2 * L_FILT16k ); + IF( st->ini_frame == 0 ) + { + st->Q_max_enc[0] = 15; + move16(); + st->Q_max_enc[1] = 15; + move16(); + } + IF( st->total_brate >= HQ_48k ) { st->enablePlcWaveadjust = 1; @@ -597,6 +614,9 @@ static void init_tcx_ivas_fx( /* Share the memories for 2xTCX10/4xTCX5 and for TCX20 */ hTcxEnc->spectrum_fx[0] = hTcxEnc->spectrum_long_fx; hTcxEnc->spectrum_fx[1] = hTcxEnc->spectrum_long_fx + N_TCX10_MAX; + st->hTcxEnc->spectrum_e[0] = st->hTcxEnc->spectrum_e[1] = 0; + move16(); + move16(); init_tcx_cfg_ivas_fx( st->hTcxCfg, total_brate, st->sr_core, st->input_Fs, st->L_frame, st->bwidth, hTcxEnc->L_frameTCX, st->fscale, st->preemph_fac, st->tcxonly, st->rf_mode, st->igf, @@ -703,17 +723,16 @@ static void init_tcx( TCX_ENC_HANDLE hTcxEnc = st->hTcxEnc; /* Share the memories for 2xTCX10/4xTCX5 and for TCX20 */ -#if 1 - hTcxEnc->spectrum_fx[0] = hTcxEnc->spectrum_long_fx; - hTcxEnc->spectrum_fx[1] = hTcxEnc->spectrum_long_fx + N_TCX10_MAX; -#endif - hTcxEnc->spectrum[0] = hTcxEnc->spectrum_long; hTcxEnc->spectrum[1] = hTcxEnc->spectrum_long + N_TCX10_MAX; - #ifdef IVAS_FLOAT_FIXED hTcxEnc->spectrum_fx[0] = hTcxEnc->spectrum_long_fx; hTcxEnc->spectrum_fx[1] = hTcxEnc->spectrum_long_fx + N_TCX10_MAX; + st->hTcxEnc->spectrum_e[0] = st->hTcxEnc->spectrum_e[1] = 0; + move16(); + move16(); +#endif +#ifdef IVAS_FLOAT_FIXED_CONVERSIONS st->preemph_fac_flt = fix16_to_float( st->preemph_fac, Q15 ); #endif diff --git a/lib_enc/core_enc_reconf.c b/lib_enc/core_enc_reconf.c index 08278149f2e344c8a89600e706bce752108163c4..3c699b4e643c4baba7609bbe62287ca4766a79c3 100644 --- a/lib_enc/core_enc_reconf.c +++ b/lib_enc/core_enc_reconf.c @@ -110,7 +110,11 @@ void core_coder_reconfig( st->acelpEnabled = ( st->restrictedMode & 1 ) == 1; st->tcx20Enabled = ( st->restrictedMode & 2 ) == 2; } - st->prevEnergyHF = st->currEnergyHF = 65535.0f; /* prevent block switch */ + st->prevEnergyHF_fx = st->currEnergyHF_fx = 1073725440l /*65535.0f Q14*/; /* prevent block switch */ + st->currEnergyHF_e_fx = 17; + move32(); + move32(); + move16(); /* TCX-LTP */ if ( st->hTcxEnc != NULL ) diff --git a/lib_enc/core_enc_switch.c b/lib_enc/core_enc_switch.c index a0c400ae3684c75e750eeedf99e7dcc2cba2bb41..6fd08cb57415e36d6c088ad8a2bea1adfed89577 100644 --- a/lib_enc/core_enc_switch.c +++ b/lib_enc/core_enc_switch.c @@ -215,7 +215,8 @@ void core_coder_mode_switch_ivas_fx( set_zero( st->hBWE_TD->cur_sub_Aq, M + 1 ); } - st->currEnergyHF = 0; + st->currEnergyHF_fx = 0; + move32(); /* Initialize TCX */ IF( hTcxEnc != NULL ) diff --git a/lib_enc/dtx_fx.c b/lib_enc/dtx_fx.c index 445f25b675e8f62c920fa0eca9533699983ac016..d3867fc180d0e85d03617cebbd48e9b0b7241d5c 100644 --- a/lib_enc/dtx_fx.c +++ b/lib_enc/dtx_fx.c @@ -109,7 +109,7 @@ void dtx_ivas_fx( /* Initialization */ IF( st_fx->ini_frame == 0 ) { - st_fx->active_fr_cnt_fx = CNG_TYPE_HO; + st_fx->active_cnt = CNG_TYPE_HO; move16(); st_fx->cng_type = FD_CNG; @@ -224,7 +224,7 @@ void dtx_ivas_fx( st_fx->fd_cng_reset_flag == 0 ) { /* reset counter */ - st_fx->active_fr_cnt_fx = 0; + st_fx->active_cnt = 0; move16(); IF( st_fx->Opt_AMR_WB ) @@ -368,7 +368,7 @@ void dtx_ivas_fx( } test(); test(); - IF( GE_16( st_fx->active_fr_cnt_fx, CNG_TYPE_HO ) && st_fx->Opt_AMR_WB == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) + IF( GE_16( st_fx->active_cnt, CNG_TYPE_HO ) && st_fx->Opt_AMR_WB == 0 && NE_16( st_fx->element_mode, IVAS_CPE_MDCT ) ) { IF( EQ_16( st_fx->element_mode, IVAS_SCE ) ) { @@ -434,9 +434,9 @@ void dtx_ivas_fx( st_fx->cng_type = LP_CNG; move16(); } - st_fx->active_fr_cnt_fx = add( st_fx->active_fr_cnt_fx, 1 ); + st_fx->active_cnt = add( st_fx->active_cnt, 1 ); move16(); - st_fx->active_fr_cnt_fx = s_min( st_fx->active_fr_cnt_fx, 200 ); + st_fx->active_cnt = s_min( st_fx->active_cnt, 200 ); move16(); } diff --git a/lib_enc/enc_gen_voic_fx.c b/lib_enc/enc_gen_voic_fx.c index 4b4a4deacc1fbeac252919e944df5845f7abd4a2..856a4312fb88a0c92bbb3fb5228cada468bf8512 100644 --- a/lib_enc/enc_gen_voic_fx.c +++ b/lib_enc/enc_gen_voic_fx.c @@ -565,8 +565,8 @@ void encod_gen_voic_ivas_fx( Copy( &res_fx[i_subfr_fx], &exc_fx[i_subfr_fx], L_SUBFR ); - find_targets_fx( speech_fx, hLPDmem->mem_syn, i_subfr_fx, &hLPDmem->mem_w0, p_Aq_fx, - res_fx, L_SUBFR, p_Aw_fx, st_fx->preemph_fac, xn_fx, cn_fx, h1_fx ); + find_targets_ivas_fx( speech_fx, hLPDmem->mem_syn, i_subfr_fx, &hLPDmem->mem_w0, p_Aq_fx, + res_fx, L_SUBFR, p_Aw_fx, st_fx->preemph_fac, xn_fx, cn_fx, h1_fx ); Copy_Scale_sig( h1_fx, h2_fx, L_SUBFR, -2 ); Scale_sig( h1_fx, L_SUBFR, add( 1, shift ) ); /* set h1[] in Q14 with scaling for convolution */ diff --git a/lib_enc/find_tar_fx.c b/lib_enc/find_tar_fx.c index 54cdec132b4e3d52c9aaa9ff629282b81945e37f..dc8477fc42db2aab8e4093e9f80a49bddde323a6 100644 --- a/lib_enc/find_tar_fx.c +++ b/lib_enc/find_tar_fx.c @@ -278,6 +278,7 @@ void find_targets_ivas_fx( s = add( scale, 1 ); s2 = 16384; } + set16_fx( h1, 0, L_subfr ); Overflow = 0; move16(); FOR( i = 0; i < M; i++ ) diff --git a/lib_enc/init_enc.c b/lib_enc/init_enc.c index 637da29acb862c5768deeef35d8eb074f87cad83..bda6175bc75efeab2622f2e6961eeab4cfd14863 100644 --- a/lib_enc/init_enc.c +++ b/lib_enc/init_enc.c @@ -721,7 +721,6 @@ ivas_error init_encoder( st->energyCoreLookahead_Fx = 0; st->sf_energyCoreLookahead_Fx = 0; #endif - st->currEnergyLookAhead = 6.1e-5f; /*-----------------------------------------------------------------* * SC-VBR parameters @@ -970,6 +969,9 @@ ivas_error init_encoder( #ifdef IVAS_FLOAT_FIXED st->hTcxEnc->spectrum_fx[0] = st->hTcxEnc->spectrum_long_fx; st->hTcxEnc->spectrum_fx[1] = st->hTcxEnc->spectrum_long_fx + N_TCX10_MAX; + st->hTcxEnc->spectrum_e[0] = st->hTcxEnc->spectrum_e[1] = 0; + move16(); + move16(); #endif // IVAS_FLOAT_FIXED st->hTcxEnc->spectrum[0] = st->hTcxEnc->spectrum_long; @@ -1344,7 +1346,6 @@ ivas_error init_encoder_ivas_fx( set_f( st->voicing, 0.0f, 3 ); st->lp_speech = 45.0f; /* Initialize the long-term active speech level in dB */ st->active_cnt = 0; - st->currEnergyLookAhead = 6.1e-5f; #ifndef IVAS_FLOAT_FIXED st->old_hpfilt_in = 0.0f; st->old_hpfilt_out = 0.0f; @@ -2119,6 +2120,9 @@ ivas_error init_encoder_ivas_fx( /* Share the memories for 2xTCX10/4xTCX5 and for TCX20 */ st->hTcxEnc->spectrum_fx[0] = st->hTcxEnc->spectrum_long_fx; st->hTcxEnc->spectrum_fx[1] = st->hTcxEnc->spectrum_long_fx + N_TCX10_MAX; + st->hTcxEnc->spectrum_e[0] = st->hTcxEnc->spectrum_e[1] = 0; + move16(); + move16(); #if 1 set_f( st->hTcxEnc->spectrum_long, 0, N_MAX ); st->hTcxEnc->spectrum[0] = st->hTcxEnc->spectrum_long; @@ -2263,10 +2267,12 @@ ivas_error init_encoder_ivas_fx( set_zero( st->hBWE_TD->cur_sub_Aq, M + 1 ); } - st->currEnergyHF = 0; + st->currEnergyHF_fx = 0; + move32(); #ifdef MSAN_FIX - st->prevEnergyHF = 0; + st->prevEnergyHF_fx = 0; + move32(); #endif /* Initialize TCX */ diff --git a/lib_enc/ivas_core_enc.c b/lib_enc/ivas_core_enc.c index 9ef70a1b9664d15755e9a9a27159cb83e83255d6..8a8e172b319d06c1ad3fcf84d3d53c6618da2011 100644 --- a/lib_enc/ivas_core_enc.c +++ b/lib_enc/ivas_core_enc.c @@ -245,19 +245,6 @@ ivas_error ivas_core_enc( e_enerBuffer += tmp_shift; // Shifting the exponent of energyBuffer with the tmp_shift floatToFixed_arrL( st->Bin_E_old, st->Bin_E_old_fx, Q_factor_arrL( st->Bin_E_old, 129 ), 129 ); - /*setTcxmode*/ - IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) - { - Word16 q_com = Q31; - q_com = L_get_q1( st->prevEnergyHF ); - q_com = s_min( q_com, L_get_q1( st->currEnergyHF ) ); - st->prevEnergyHF_fx = floatToFixed_32( st->prevEnergyHF, q_com ); - st->currEnergyHF_fx = floatToFixed_32( st->currEnergyHF, q_com ); - st->currEnergyHF_e_fx = sub( Q31, q_com ); - move16(); - move16(); - move16(); - } #endif #ifdef IVAS_FLOAT_FIXED_CONVERSIONS Word16 old_inp_12k8_fx[L_INP_12k8]; @@ -867,9 +854,6 @@ ivas_error ivas_core_enc( floatToFixed_arrL( hCPE->hStereoDft->output_mem_res_8k, hCPE->hStereoDft->output_mem_res_8k_fx, 16, STEREO_DFT_OVL_8k ); floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx, hCPE->hStereoDft->output_mem_dmx_fx, 16, STEREO_DFT_OVL_MAX ); floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx_12k8, hCPE->hStereoDft->output_mem_dmx_12k8_fx, 16, STEREO_DFT_OVL_12k8 ); - floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx_16k, hCPE->hStereoDft->output_mem_dmx_16k_fx, 16, STEREO_DFT_OVL_16k ); - floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx_16k_shb, hCPE->hStereoDft->output_mem_dmx_16k_shb_fx, 16, STEREO_DFT_OVL_16k ); - floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx_32k, hCPE->hStereoDft->output_mem_dmx_32k_fx, 16, STEREO_DFT_OVL_32k ); } for ( int ii = 0; ii < NS2SA( 48000, DELAY_FD_BWE_ENC_NS + DELAY_FIR_RESAMPL_NS ); ii++ ) { @@ -912,13 +896,9 @@ ivas_error ivas_core_enc( if ( st->element_mode == IVAS_CPE_DFT ) { - // hCPE->hStereoICBWE->icbweRefEner = me2f( hCPE->hStereoICBWE->icbweRefEner_fx, hCPE->hStereoICBWE->icbweRefEner_fx_e ); fixedToFloat_arrL( hCPE->hStereoDft->output_mem_res_8k_fx, hCPE->hStereoDft->output_mem_res_8k, 16, STEREO_DFT_OVL_8k ); fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_fx, hCPE->hStereoDft->output_mem_dmx, 16, STEREO_DFT_OVL_MAX ); fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_12k8_fx, hCPE->hStereoDft->output_mem_dmx_12k8, 16, STEREO_DFT_OVL_12k8 ); - fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_16k_fx, hCPE->hStereoDft->output_mem_dmx_16k, 16, STEREO_DFT_OVL_16k ); - fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_16k_shb_fx, hCPE->hStereoDft->output_mem_dmx_16k_shb, 16, STEREO_DFT_OVL_16k ); - fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_32k_fx, hCPE->hStereoDft->output_mem_dmx_32k, 16, STEREO_DFT_OVL_32k ); } #endif #else @@ -1122,57 +1102,22 @@ ivas_error ivas_core_enc( #ifdef IVAS_FLOAT_FIXED #ifdef IVAS_FLOAT_FIXED_CONVERSIONS - Word16 nbSubFr; Word32 shb_speech_fx32[L_FRAME16k]; Word32 voice_factors_fx32[CPE_CHANNELS][NB_SUBFR16k]; Word16 q_shb_speech_fx32 = Q_factor_arrL( shb_speech, L_FRAME16k ); floatToFixed_arrL( shb_speech, shb_speech_fx32, q_shb_speech_fx32, L_FRAME16k ); - f2me_buf_16( hStereoICBWE->mixExc16k, hStereoICBWE->mixExc16k_fx, &hStereoICBWE->mixExc16k_e, L_FRAME16k ); - IF( st->flag_ACELP16k == 0 ) - { - nbSubFr = NB_SUBFR; - move16(); - } - ELSE - { - nbSubFr = NB_SUBFR16k; - move16(); - } - f2me_buf_16( hStereoICBWE->nlExc16k, hStereoICBWE->nlExc16k_fx, &hStereoICBWE->nlExc16k_e, L_FRAME16k / nbSubFr ); q_new_swb_speech_buffer = Q_factor_arrL( new_swb_speech_buffer, input_frame ); floatToFixed_arrL( new_swb_speech_buffer, new_swb_speech_buffer_fx, q_new_swb_speech_buffer, input_frame ); Copy_Scale_sig_16_32( voice_factors_fx[0], voice_factors_fx32[0], NB_SUBFR16k, 16 ); // Q31 - - // f2me( hCPE->hStereoICBWE->icbweRefEner, &hCPE->hStereoICBWE->icbweRefEner_fx, &hCPE->hStereoICBWE->icbweRefEner_e ); -#ifdef MSAN_FIX - f2me_buf( hCPE->hStereoICBWE->lpSHBRef, hCPE->hStereoICBWE->lpSHBRef_fx, &hCPE->hStereoICBWE->lpSHBRef_e, LPC_SHB_ORDER + 1 ); -#else - scale_factor = Q_factor_arrL( hCPE->hStereoICBWE->lpSHBRef, LPC_SHB_ORDER + 1 ) - 1; - floatToFixed_arr32( hCPE->hStereoICBWE->lpSHBRef, hCPE->hStereoICBWE->lpSHBRef_fx, scale_factor, LPC_SHB_ORDER + 1 ); - hCPE->hStereoICBWE->lpSHBRef_e = 31 - scale_factor; -#endif #endif stereo_icBWE_enc_ivas_fx( hCPE, shb_speech_fx32, 31 - q_shb_speech_fx32, new_swb_speech_buffer_fx, 31 - q_new_swb_speech_buffer, voice_factors_fx32[0] ); #ifdef IVAS_FLOAT_FIXED_CONVERSIONS IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) ) { - // hStereoICBWE->prevSpecMapping = fixedToFloat( hStereoICBWE->prevSpecMapping_fx, 31 ); IF( ( st->extl == SWB_TBE || st->extl == FB_TBE ) && st->flag_ACELP16k == 1 ) { } - ELSE - { - me2f_buf_16( hStereoICBWE->shbSynthRef_fx, hStereoICBWE->shbSynthRef_e, hStereoICBWE->shbSynthRef, L_FRAME16k ); - } - /* - FOR( i = 0; i < 2; i++ ) - { - hStereoICBWE->memGsEnerMap[i] = me2f( hStereoICBWE->memGsEnerMap_fx[i], hStereoICBWE->memGsEnerMap_e ); - } - */ - // hStereoICBWE->prevgsMapping = me2f( hStereoICBWE->prevgsMapping_fx, 0 ); - IF( ( EQ_16( st->extl, SWB_TBE ) || EQ_16( st->extl, WB_TBE ) || EQ_16( st->extl, FB_TBE ) ) && EQ_16( st->flag_ACELP16k, 1 ) ) { // hStereoICBWE->prevSpecMapping = fixedToFloat( hStereoICBWE->prevSpecMapping_fx, Q31 ); @@ -1186,14 +1131,6 @@ ivas_error ivas_core_enc( #endif } } - ELSE - { - // hStereoICBWE->prevgsMapping = me2f( hStereoICBWE->prevgsMapping_fx, hStereoICBWE->prevgsMapping_e ); - // hStereoICBWE->gDes_pastFrame = me2f( hStereoICBWE->gDes_pastFrame_fx, hStereoICBWE->gDes_pastFrame_e ); - // hStereoICBWE->prevRefEner = fixedToFloat( hStereoICBWE->prevRefEner_fx, 31 - hStereoICBWE->prevRefEner_e ); - // hStereoICBWE->prevNonRefEner = fixedToFloat( hStereoICBWE->prevNonRefEner_fx, 31 - hStereoICBWE->prevNonRefEner_e ); - // hStereoICBWE->gDes_pastFrame = me2f( hStereoICBWE->gDes_pastFrame_fx, hStereoICBWE->gDes_pastFrame_e ); - } #endif #else stereo_icBWE_enc( hCPE, shb_speech, new_swb_speech_buffer, voice_factors[0] ); diff --git a/lib_enc/ivas_core_pre_proc_front.c b/lib_enc/ivas_core_pre_proc_front.c index 11d22768fd0373057219e4ddb11ad29d85624b69..648cc744d37b9ee768759054fb8bc31f027d23fc 100644 --- a/lib_enc/ivas_core_pre_proc_front.c +++ b/lib_enc/ivas_core_pre_proc_front.c @@ -1982,18 +1982,19 @@ ivas_error pre_proc_front_ivas_fx( * LP analysis *----------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED_CONVERSIONS - Word16 *old_inp_12k8_loc_fx = (Word16 *) malloc( L_INP_12k8 * sizeof( Word16 * ) ); + Word16 *old_inp_12k8_loc_fx = (Word16 *) malloc( L_INP_12k8 * sizeof( Word16 ) ); Word16 *inp_12k8_loc_fx, *new_inp_12k8_loc_fx; /* pointers to current frame and new data */ new_inp_12k8_loc_fx = old_inp_12k8_loc_fx + L_INP_MEM; /* pointer to new samples of the input signal in 12.8kHz core */ inp_12k8_loc_fx = new_inp_12k8_loc_fx - L_look; /* pointer to the current frame of input signal in 12.8kHz core */ Word16 stab_fac_fx; Word16 Q_new_loc; + Word16 e_new_loc; Word16 Q_r[2] = { 0 }; Word16 epsP_l_loc[M + 1]; Word16 epsP_h_loc[M + 1]; Word32 ener_fx; - Q_new_loc = Q_factor_arrL( old_inp_12k8, L_INP_12k8 ); - Q_new_loc = 0; /* Dynamic Q_new used above causes overflow issues */ + Q_new_loc = ( Q_factor_arr( old_inp_12k8, L_INP_12k8 ) - 1 ); // 1 is the guard bit + // Q_new_loc = 0; /* Dynamic Q_new used above causes overflow issues */ for ( int k = 0; k < L_INP_12k8; k++ ) { if ( fabs( old_inp_12k8[k] ) > 32768.0f ) @@ -2002,7 +2003,15 @@ ivas_error pre_proc_front_ivas_fx( break; } } - floatToFixed_arr( old_inp_12k8, old_inp_12k8_loc_fx, Q_new_loc, L_INP_12k8 ); + if ( Q_new_loc < 0 ) + { + f2me_buf_16( old_inp_12k8, old_inp_12k8_loc_fx, &e_new_loc, L_INP_12k8 ); + Q_new_loc = 15 - e_new_loc; + } + else + { + floatToFixed_arr( old_inp_12k8, old_inp_12k8_loc_fx, Q_new_loc, L_INP_12k8 ); + } for ( int idx = 0; idx < 3; idx++ ) { st->voicing_fx[idx] = (Word16) ( st->voicing[idx] * 32767 ); diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index d9fa043e86299edddfe468f612f0960631c16db7..9f9b7ad8d6735d3ff132081861c64fe45eb62524 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -285,8 +285,6 @@ ivas_error ivas_cpe_enc_fx( for ( n = 0; n < CPE_CHANNELS; n++ ) { - floatToFixed_arr( hCPE->hFrontVad[n]->mem_decim, hCPE->hFrontVad[n]->mem_decim_fx, Q_inp, 90 ); - hCPE->hFrontVad[n]->mem_preemph_fx = (Word16) floatToFixed( hCPE->hFrontVad[n]->mem_preemph, Q_inp - 1 ); Q_buffer[n] = Q_factor_arr( hCPE->hFrontVad[n]->buffer_12k8 + L_FFT, L_FFT / 2 ); floatToFixed_arr( hCPE->hFrontVad[n]->buffer_12k8, hCPE->hFrontVad[n]->buffer_12k8_fx, Q_buffer[n], 384 ); floatToFixed_arrL( hCPE->hFrontVad[n]->hNoiseEst->bckr, hCPE->hFrontVad[n]->hNoiseEst->bckr_fx, Q_new_old + QSCALE, 20 ); @@ -309,8 +307,6 @@ ivas_error ivas_cpe_enc_fx( Word16 Q_new_old = add( sub( Q_inp, Qband ), Q_add ); for ( n = 0; n < CPE_CHANNELS; n++ ) { - fixedToFloat_arr( hCPE->hFrontVad[n]->mem_decim_fx, hCPE->hFrontVad[n]->mem_decim, Q_inp, 90 ); - hCPE->hFrontVad[n]->mem_preemph = fixedToFloat( hCPE->hFrontVad[n]->mem_preemph_fx, Q_inp + Qband ); fixedToFloat_arr( hCPE->hFrontVad[n]->buffer_12k8_fx, hCPE->hFrontVad[n]->buffer_12k8, Q_buffer[n], 384 ); fixedToFloat_arrL( fr_bands_fx[n], fr_bands[n], Q_buffer[n] + QSCALE, 40 ); fixedToFloat_arrL( lf_E_fx[n], lf_E[n], Q_buffer[n] + QSCALE - 2, 148 ); @@ -469,13 +465,11 @@ ivas_error ivas_cpe_enc_fx( IF( !( EQ_32( ivas_format, MC_FORMAT ) && EQ_32( st_ivas->mc_mode, MC_MODE_PARAMMC ) ) ) { #ifdef IVAS_FLOAT_FIXED_CONVERSIONS - floatToFixed_arr16( sts[n]->input, sts[n]->input_fx, -1, input_frame ); + Word16 q_inp; + f2me_buf_16( sts[n]->input, sts[n]->input_fx, &q_inp, input_frame ); + q_inp = 15 - q_inp; #endif - RunTransientDetection_ivas_fx( sts[n]->input_fx, input_frame, sts[n]->hTranDet, -1 ); - sts[n]->hTranDet->subblockEnergies.subblockNrg_e = 31 - Q7; - sts[n]->hTranDet->subblockEnergies.accSubblockNrg_e = 31 - Q7; - move16(); - move16(); + 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 @@ -630,10 +624,6 @@ ivas_error ivas_cpe_enc_fx( floatToFixed_arrL( hCPE->hStereoDft->output_mem_res_8k, hCPE->hStereoDft->output_mem_res_8k_fx, 16, STEREO_DFT_OVL_8k ); floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx, hCPE->hStereoDft->output_mem_dmx_fx, 16, STEREO_DFT_OVL_MAX ); floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx_12k8, hCPE->hStereoDft->output_mem_dmx_12k8_fx, 16, STEREO_DFT_OVL_12k8 ); - floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx_16k, hCPE->hStereoDft->output_mem_dmx_16k_fx, 16, STEREO_DFT_OVL_16k ); - floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx_16k_shb, hCPE->hStereoDft->output_mem_dmx_16k_shb_fx, 16, STEREO_DFT_OVL_16k ); - floatToFixed_arrL( hCPE->hStereoDft->output_mem_dmx_32k, hCPE->hStereoDft->output_mem_dmx_32k_fx, 16, STEREO_DFT_OVL_32k ); - /*flt2fix end*/ #endif #ifdef IVAS_FLOAT_FIXED @@ -832,10 +822,6 @@ ivas_error ivas_cpe_enc_fx( fixedToFloat_arrL( hCPE->hStereoDft->output_mem_res_8k_fx, hCPE->hStereoDft->output_mem_res_8k, 16, STEREO_DFT_OVL_8k ); fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_fx, hCPE->hStereoDft->output_mem_dmx, 16, STEREO_DFT_OVL_MAX ); fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_12k8_fx, hCPE->hStereoDft->output_mem_dmx_12k8, 16, STEREO_DFT_OVL_12k8 ); - fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_16k_fx, hCPE->hStereoDft->output_mem_dmx_16k, 16, STEREO_DFT_OVL_16k ); - fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_16k_shb_fx, hCPE->hStereoDft->output_mem_dmx_16k_shb, 16, STEREO_DFT_OVL_16k ); - fixedToFloat_arrL( hCPE->hStereoDft->output_mem_dmx_32k_fx, hCPE->hStereoDft->output_mem_dmx_32k, 16, STEREO_DFT_OVL_32k ); - /*fix2flt end*/ #endif #else diff --git a/lib_enc/ivas_front_vad.c b/lib_enc/ivas_front_vad.c index ff557c150b5fcbb4909818614cbee362b523d8e7..4f5cddbbd39e82f4402327af4c0238c5685e8a76 100644 --- a/lib_enc/ivas_front_vad.c +++ b/lib_enc/ivas_front_vad.c @@ -531,9 +531,9 @@ ivas_error front_vad_create( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VAD\n" ) ); } - set_f( hFrontVad->mem_decim, 0, 2 * L_FILT_MAX ); set_f( hFrontVad->buffer_12k8, 0, 3 * L_FRAME / 2 ); #ifdef IVAS_FLOAT_FIXED + set16_fx( hFrontVad->mem_decim_fx, 0, 2 * L_FILT_MAX ); wb_vad_init_ivas_fx( hFrontVad->hVAD ); hFrontVad->lp_speech_fx = 11520; /* Initialize the long-term active speech level in dB */ hFrontVad->lp_noise_fx = 0; /* Initialize the long-term noise level in dB */ @@ -541,14 +541,16 @@ ivas_error front_vad_create( set16_fx( hFrontVad->buffer_12k8_fx, 0, i_mult( 3, shr( L_FRAME, 1 ) ) ); hFrontVad->mem_preemph_fx = 0; #else + set_f( hFrontVad->mem_decim, 0, 2 * L_FILT_MAX ); wb_vad_init( hFrontVad->hVAD ); -#endif hFrontVad->mem_preemph = 0; +#endif hFrontVad->ini_frame = 0; hFrontVad->hVAD->vad_flag = 1; /* allocate delay buffer to compensate for filterbank delay */ hFrontVad->delay_samples = NS2SA( hEncoderConfig->input_Fs, IVAS_FB_ENC_DELAY_NS ); +#ifndef IVAS_FLOAT_FIXED hFrontVad->delay_buf = NULL; if ( hFrontVad->delay_samples > 0 ) { @@ -558,7 +560,7 @@ ivas_error front_vad_create( } set_f( hFrontVad->delay_buf, 0, hFrontVad->delay_samples ); } -#ifdef IVAS_FLOAT_FIXED +#else hFrontVad->delay_buf_fx = NULL; IF( GT_16( hFrontVad->delay_samples, 0 ) ) { @@ -624,18 +626,6 @@ ivas_error front_vad_create_fx( set16_fx( hFrontVad->delay_buf_fx, 0, hFrontVad->delay_samples ); } -#if 1 - hFrontVad->delay_buf = NULL; // Inorder to avoid issue in front_vad_distroy_fx call , Will have to be removed later - if ( hFrontVad->delay_samples > 0 ) - { - if ( ( hFrontVad->delay_buf = (float *) malloc( hFrontVad->delay_samples * sizeof( float ) ) ) == NULL ) - { - return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for VAD delay buffer\n" ) ); - } - set_f( hFrontVad->delay_buf, 0, hFrontVad->delay_samples ); - } -#endif - *hFrontVad_out = hFrontVad; return IVAS_ERR_OK; @@ -660,12 +650,6 @@ void front_vad_destroy( free( ( *hFrontVad )->hVAD ); ( *hFrontVad )->hVAD = NULL; - IF( ( *hFrontVad )->delay_buf != NULL ) - { - free( ( *hFrontVad )->delay_buf ); - ( *hFrontVad )->delay_buf = NULL; - } - free( *hFrontVad ); *hFrontVad = NULL; } @@ -690,11 +674,7 @@ void front_vad_destroy_fx( free( ( *hFrontVad )->delay_buf_fx ); ( *hFrontVad )->delay_buf_fx = NULL; } - IF( ( *hFrontVad )->delay_buf != NULL ) - { - free( ( *hFrontVad )->delay_buf ); - ( *hFrontVad )->delay_buf = NULL; - } + free( *hFrontVad ); *hFrontVad = NULL; } @@ -874,8 +854,6 @@ ivas_error front_vad_spar_fx( move16(); Word16 Q_new_old = add( sub( Q_inp, Qband ), Q_add ); Word16 band_ener_guardbits = find_guarded_bits_fx( 2 * NB_BANDS ); - floatToFixed_arr( hFrontVad->mem_decim, hFrontVad->mem_decim_fx, Q_inp, 90 ); - hFrontVad->mem_preemph_fx = (Word16) floatToFixed( hFrontVad->mem_preemph, Q_inp - 1 ); Word16 Q_buffer = Q_factor_arr( hFrontVad->buffer_12k8 + L_FFT, L_FFT / 2 ); floatToFixed_arr( hFrontVad->buffer_12k8, hFrontVad->buffer_12k8_fx, Q_buffer, 384 ); st->lp_speech_fx = (Word16) floatToFixed( st->lp_speech, Q8 ); @@ -891,9 +869,6 @@ ivas_error front_vad_spar_fx( return error; } #ifdef IVAS_FLOAT_FIXED_CONVERSIONS - // fixedToFloat_arrL( &band_energies_LR_fx[0], &band_energies_LR[0], Q_new + QSCALE + 2 - band_ener_guardbits, 40 ); - fixedToFloat_arr( hFrontVad->mem_decim_fx, hFrontVad->mem_decim, Q_inp, 90 ); - hFrontVad->mem_preemph = fixedToFloat( hFrontVad->mem_preemph_fx, Q_inp + Qband ); fixedToFloat_arr( hFrontVad->buffer_12k8_fx, hFrontVad->buffer_12k8, Q_buffer, 384 ); fixedToFloat_arrL( fr_bands_fx[0], fr_bands[0], Q_buffer + QSCALE + 2, 40 ); fixedToFloat_arrL( lf_E_fx[0], lf_E[0], Q_buffer + QSCALE, 148 ); diff --git a/lib_enc/ivas_mdct_core_enc.c b/lib_enc/ivas_mdct_core_enc.c index a672563d2dd6ef1c01c5b4db27f8c98b80ac88f7..8d98292b4391575651f9f0926c27179c7ec5abcc 100644 --- a/lib_enc/ivas_mdct_core_enc.c +++ b/lib_enc/ivas_mdct_core_enc.c @@ -1764,14 +1764,6 @@ void ivas_mdct_core_whitening_enc( { st = sts[ch]; #ifdef IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - q_com = Q31; - q_com = L_get_q1( st->prevEnergyHF ); - q_com = s_min( q_com, L_get_q1( st->currEnergyHF ) ); - st->prevEnergyHF_fx = floatToFixed_32( st->prevEnergyHF, q_com ); - st->currEnergyHF_fx = floatToFixed_32( st->currEnergyHF, q_com ); - st->currEnergyHF_e_fx = sub( Q31, q_com ); -#endif SetTCXModeInfo_ivas_fx( st, st->hTranDet, &st->hTcxCfg->tcx_curr_overlap_mode ); #else SetTCXModeInfo( st, st->hTranDet, &st->hTcxCfg->tcx_curr_overlap_mode ); diff --git a/lib_enc/ivas_stat_enc.h b/lib_enc/ivas_stat_enc.h index 676c69e1c8554719a68e3484575ddbb8a4a8871a..74f32fd7d068854fa07f9c67b415432da3166990 100644 --- a/lib_enc/ivas_stat_enc.h +++ b/lib_enc/ivas_stat_enc.h @@ -46,44 +46,44 @@ typedef struct stereo_itd_data_struct { - int16_t prev_itd; + Word16 prev_itd; #ifndef IVAS_FLOAT_FIXED float itd[STEREO_DFT_ENC_DFT_NB]; float deltaItd[STEREO_DFT_ENC_DFT_NB]; #endif - int16_t td_itd[STEREO_DFT_ENC_DFT_NB]; - int16_t td_itd_32k[STEREO_DFT_ENC_DFT_NB]; - int16_t itd_index[STEREO_DFT_ENC_DFT_NB]; + Word16 td_itd[STEREO_DFT_ENC_DFT_NB]; + Word16 td_itd_32k[STEREO_DFT_ENC_DFT_NB]; + Word16 itd_index[STEREO_DFT_ENC_DFT_NB]; #ifndef IVAS_FLOAT_FIXED float xcorr_smooth[STEREO_DFT_N_32k_ENC]; float lp_phat_peak; /* low-pass GCC PHAT peak value */ #endif - int16_t itd_hangover; /* ITD hangover counter */ - int16_t itd_cnt; /* Consecutive valid ITD counter */ + Word16 itd_hangover; /* ITD hangover counter */ + Word16 itd_cnt; /* Consecutive valid ITD counter */ #ifndef IVAS_FLOAT_FIXED float prev_sum_nrg_L_lb; float prev_xcorr_lb[STEREO_DFT_XCORR_LB_MAX]; float E_band_n[STEREO_DFT_ITD_VAD_BAND_NUM]; #endif - int16_t vad_frm_cnt; - int16_t pre_vad; - int16_t itd_nonzero_cnt; + Word16 vad_frm_cnt; + Word16 pre_vad; + Word16 itd_nonzero_cnt; #ifndef IVAS_FLOAT_FIXED float acorr_L[STEREO_DFT_BAND_MAX]; float acorr_R[STEREO_DFT_BAND_MAX]; float cohSNR; float itd_thres; #endif - int16_t valid_itd_cnt; /* Extra variable to store value of itd_cnt for fine-control decision making */ + Word16 valid_itd_cnt; /* Extra variable to store value of itd_cnt for fine-control decision making */ - int16_t detected_itd_flag; - int16_t itd_tracking; + Word16 detected_itd_flag; + Word16 itd_tracking; #ifndef IVAS_FLOAT_FIXED float prev_max; float prev_avg_max; #endif Word32 prev_max_fx; // Q31 - int16_t prev_index; + Word16 prev_index; Word32 prev_avg_max_fx; Word16 prev_avg_max_fx_e; #ifndef IVAS_FLOAT_FIXED @@ -98,11 +98,11 @@ typedef struct stereo_itd_data_struct #endif Word32 prev_m1_fx; // Q31 Word32 prev_m2_fx; // Q31 - int16_t prev_itd1; - int16_t prev_itd2; + Word16 prev_itd1; + Word16 prev_itd2; /*flag for hybrid ITD for very large ITDs*/ - int16_t hybrid_itd_max; + Word16 hybrid_itd_max; Word32 itd_fx[STEREO_DFT_ENC_DFT_NB]; // Q16 Word32 acorr_L_fx[STEREO_DFT_BAND_MAX]; @@ -127,12 +127,12 @@ typedef struct stereo_itd_data_struct typedef struct dft_ana_struct { /*Sizes*/ - int16_t N; /* Size of the frame and hop */ - int16_t NFFT; /* Size of the FFT=frame size+overlap */ + Word16 N; /* Size of the frame and hop */ + Word16 NFFT; /* Size of the FFT=frame size+overlap */ /*FFT*/ - int16_t dft_ovl; /* Overlap size */ - int16_t dft_zp; /* Zero padding */ + Word16 dft_ovl; /* Overlap size */ + Word16 dft_zp; /* Zero padding */ #ifndef IVAS_FLOAT_FIXED const float *win_ana; /* DFT analysis window */ @@ -144,7 +144,7 @@ typedef struct dft_ana_struct const Word16 *dft_trigo_fx; const Word16 *dft_trigo_32k_fx; - int16_t dft_trigo_step; + Word16 dft_trigo_step; } DFT_ANA, *DFT_ANA_HANDLE; @@ -169,8 +169,8 @@ typedef struct stereo_dft_enc_data_struct STEREO_DFT_CONFIG_DATA_HANDLE hConfig; /*Sizes*/ - int16_t N; /* Size of the frame and hop */ - int16_t NFFT; /* Size of the FFT=frame size+overlap */ + Word16 N; /* Size of the frame and hop */ + Word16 NFFT; /* Size of the FFT=frame size+overlap */ /*FFT*/ #ifdef IVAS_FLOAT_FIXED @@ -179,8 +179,8 @@ typedef struct stereo_dft_enc_data_struct // Word16 DFT_q_fx[CLDFB_NO_CHANNELS_MAX]; #endif float DFT[CPE_CHANNELS][STEREO_DFT_N_MAX_ENC]; - int16_t dft_ovl; /* Overlap size */ - int16_t dft_zp; /* Zero padding */ + Word16 dft_ovl; /* Overlap size */ + Word16 dft_zp; /* Zero padding */ #ifndef IVAS_FLOAT_FIXED const float *win; /* DFT window */ const float *win_8k; /* DFT window */ @@ -202,24 +202,24 @@ typedef struct stereo_dft_enc_data_struct const float *dft_trigo_16k; const float *dft_trigo_32k; #endif - int16_t dft_trigo_step; + Word16 dft_trigo_step; float output_mem_res_8k[STEREO_DFT_OVL_8k]; /*I/O channel buffers */ float output_mem_dmx[STEREO_DFT_OVL_MAX]; float output_mem_dmx_12k8[STEREO_DFT_OVL_12k8]; - float output_mem_dmx_16k[STEREO_DFT_OVL_16k]; /*can hold 16, 12.8 or 32kHz signals*/ - float output_mem_dmx_32k[STEREO_DFT_OVL_32k]; /*can hold 16, 12.8 or 32kHz signals*/ - float output_mem_dmx_16k_shb[STEREO_DFT_OVL_16k]; #ifndef IVAS_FLOAT_FIXED + float output_mem_dmx_16k_shb[STEREO_DFT_OVL_16k]; + float output_mem_dmx_32k[STEREO_DFT_OVL_32k]; /*can hold 16, 12.8 or 32kHz signals*/ + float output_mem_dmx_16k[STEREO_DFT_OVL_16k]; /*can hold 16, 12.8 or 32kHz signals*/ float input_mem_itd[CPE_CHANNELS][STEREO_DFT_OVL_MAX]; #endif /*Bands*/ - int16_t band_res[STEREO_DFT_ENC_DFT_NB]; - int16_t band_limits[STEREO_DFT_BAND_MAX + 1]; - int16_t nbands; - int16_t band_limits_dmx[STEREO_DFT_BAND_MAX + 1]; - int16_t nbands_dmx; + Word16 band_res[STEREO_DFT_ENC_DFT_NB]; + Word16 band_limits[STEREO_DFT_BAND_MAX + 1]; + Word16 nbands; + Word16 band_limits_dmx[STEREO_DFT_BAND_MAX + 1]; + Word16 nbands_dmx; #ifndef IVAS_FLOAT_FIXED /*Stereo parameters*/ float past_nrgL[STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX]; @@ -227,19 +227,19 @@ typedef struct stereo_dft_enc_data_struct float past_dot_prod_real[STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX]; float past_dot_prod_imag[STEREO_DFT_NRG_PAST_LEN * STEREO_DFT_BAND_MAX]; #endif - int16_t nrg_past_pos; + Word16 nrg_past_pos; /*Side Gain*/ #ifndef IVAS_FLOAT_FIXED float side_gain[STEREO_DFT_ENC_DFT_NB * STEREO_DFT_BAND_MAX]; #endif Word32 side_gain_fx[STEREO_DFT_ENC_DFT_NB * STEREO_DFT_BAND_MAX]; // Q31 - int16_t side_gain_flag_1; - int16_t side_gain_flag_2; - int16_t side_gain_index_ECDiff[STEREO_DFT_BAND_MAX]; - int16_t side_gain_index_ECprevious[STEREO_DFT_BAND_MAX]; - int16_t side_gain_index_EC[STEREO_DFT_BAND_MAX]; - int16_t side_gain_counter; + Word16 side_gain_flag_1; + Word16 side_gain_flag_2; + Word16 side_gain_index_ECDiff[STEREO_DFT_BAND_MAX]; + Word16 side_gain_index_ECprevious[STEREO_DFT_BAND_MAX]; + Word16 side_gain_index_EC[STEREO_DFT_BAND_MAX]; + Word16 side_gain_counter; #ifdef IVAS_FLOAT_FIXED Word16 side_gain_bitdiff_lp_fx; Word16 q_side_gain_bitdiff_lp; @@ -261,22 +261,22 @@ typedef struct stereo_dft_enc_data_struct float Spd_L_smooth[STEREO_DFT_N_32k_ENC / 2]; float Spd_R_smooth[STEREO_DFT_N_32k_ENC / 2]; #endif - int16_t coh_fade_counter; + Word16 coh_fade_counter; Word32 prev_sid_gipd_fx; // Q13 - int16_t prev_sid_no_ipd_flag; + Word16 prev_sid_no_ipd_flag; /*IPD*/ #ifndef IVAS_FLOAT_FIXED float gipd[STEREO_DFT_ENC_DFT_NB]; #endif - int16_t gipd_band_max; - int16_t gipd_index; - int16_t no_ipd_flag; /* flag to indicate when group IPD gets used */ - int16_t prev_no_ipd_flag; /* flag from previous frame */ - int16_t no_ipd_cnt; /* counter */ - int16_t no_ipd_cnt1; /* counter */ - int16_t attackPresent; - int16_t wasTransient; + Word16 gipd_band_max; + Word16 gipd_index; + Word16 no_ipd_flag; /* flag to indicate when group IPD gets used */ + Word16 prev_no_ipd_flag; /* flag from previous frame */ + Word16 no_ipd_cnt; /* counter */ + Word16 no_ipd_cnt1; /* counter */ + Word16 attackPresent; + Word16 wasTransient; #ifndef IVAS_FLOAT_FIXED float gainIPD_sm; /* long-term gain IPD for NIPD detection */ float sfm; @@ -295,9 +295,9 @@ typedef struct stereo_dft_enc_data_struct Word32 voicing_lt_fx; // Q31 - int16_t currentNumUpdates; - int16_t expectedNumUpdates; /* Expected number of frames before use of ITD estimate */ - int16_t resetFrames; + Word16 currentNumUpdates; + Word16 expectedNumUpdates; /* Expected number of frames before use of ITD estimate */ + Word16 resetFrames; #ifndef IVAS_FLOAT_FIXED /* energy buffers for ICBWE */ float nrg_L[2]; @@ -305,21 +305,21 @@ typedef struct stereo_dft_enc_data_struct float nrg_DMX[2]; #endif /*Residual prediction*/ - int16_t res_pred_mode[STEREO_DFT_ENC_DFT_NB]; /* mode from 0 (off) to 1 (on) */ + Word16 res_pred_mode[STEREO_DFT_ENC_DFT_NB]; /* mode from 0 (off) to 1 (on) */ #ifndef IVAS_FLOAT_FIXED float res_pred_gain[STEREO_DFT_ENC_DFT_NB * STEREO_DFT_BAND_MAX]; /*prediction gain for the residual HFs */ #endif - int16_t res_pred_band_min; /* Band min for prediction of residual */ - int16_t res_pred_flag_1; - int16_t res_pred_flag_2; - int16_t res_pred_counter; + Word16 res_pred_band_min; /* Band min for prediction of residual */ + Word16 res_pred_flag_1; + Word16 res_pred_flag_2; + Word16 res_pred_counter; #ifndef IVAS_FLOAT_FIXED float res_pred_gain_f[STEREO_DFT_BAND_MAX]; #endif - int16_t res_pred_index_EC[STEREO_DFT_BAND_MAX]; - int16_t res_pred_index_ECDiff[STEREO_DFT_BAND_MAX]; - int16_t res_pred_index_ECprevious[STEREO_DFT_BAND_MAX]; - int16_t reverb_flag; + Word16 res_pred_index_EC[STEREO_DFT_BAND_MAX]; + Word16 res_pred_index_ECDiff[STEREO_DFT_BAND_MAX]; + Word16 res_pred_index_ECprevious[STEREO_DFT_BAND_MAX]; + Word16 reverb_flag; #ifndef IVAS_FLOAT_FIXED float pre_sub_nrg_DMX[STEREO_DFT_BAND_MAX]; float diff_l_h_sm; @@ -327,28 +327,28 @@ typedef struct stereo_dft_enc_data_struct float prev_fac2; #endif /*Residual coding*/ - int16_t res_cod_mode[STEREO_DFT_ENC_DFT_NB]; /* mode from 0 (off) to 3 */ - int16_t res_cod_band_max; /* Band max for coding of residual */ - int16_t res_cod_line_max; /* Maximum number of MDCT lines to code for the residual coding */ + Word16 res_cod_mode[STEREO_DFT_ENC_DFT_NB]; /* mode from 0 (off) to 3 */ + Word16 res_cod_band_max; /* Band max for coding of residual */ + Word16 res_cod_line_max; /* Maximum number of MDCT lines to code for the residual coding */ float res_cod_SNR_M[STEREO_DFT_BAND_MAX]; #ifndef IVAS_FLOAT_FIXED float res_cod_NRG_M[STEREO_DFT_BAND_MAX]; float res_cod_NRG_S[STEREO_DFT_BAND_MAX]; float old_snr; #endif - int16_t first_frm_flag; /* ADAP first frame flag */ + Word16 first_frm_flag; /* ADAP first frame flag */ /* flags and data for adaptive wideband residual coding */ #ifndef IVAS_FLOAT_FIXED float res_dmx_ratio_lt; /* long term energy ratio between RES and DMX */ #endif - int16_t hangover_cnt0; /* counter 0 for hangover */ - int16_t hangover_cnt1; /* counter 1 for hangover */ + Word16 hangover_cnt0; /* counter 0 for hangover */ + Word16 hangover_cnt1; /* counter 1 for hangover */ #ifndef IVAS_FLOAT_FIXED float dmx_res_all_prev; /* energy of the previous frame */ #endif - int16_t last_res_cod_mode_modify_flag; /* a flag to indicate whether the res_cod_mode_flag has been modified for the switching frame in which res_cod_mode_flag should be swithced from 1 to 0 */ - int16_t res_cod_sw_flag; /* a flag to indicate whether it is a switching frame */ + Word16 last_res_cod_mode_modify_flag; /* a flag to indicate whether the res_cod_mode_flag has been modified for the switching frame in which res_cod_mode_flag should be swithced from 1 to 0 */ + Word16 res_cod_sw_flag; /* a flag to indicate whether it is a switching frame */ #ifndef IVAS_FLOAT_FIXED float switch_fade_factor; /* Adaptive fade factor for switch frame */ #endif @@ -363,7 +363,7 @@ typedef struct stereo_dft_enc_data_struct Word32 lbEner_fx; Word16 lbEner_fx_e; #endif - int16_t flip_sign; + Word16 flip_sign; Word32 dmx_res_all_prev_fx; /* energy of the previous frame Q(31 - dmx_res_all_prev_fx_e) */ Word16 dmx_res_all_prev_fx_e; /* energy of the previous frame */ Word16 switch_fade_factor_fx; /* Adaptive fade factor for switch frame Q15*/ @@ -684,14 +684,13 @@ typedef struct stereo_icbwe_enc_data_structure float mem_nrg_L[CPE_CHANNELS]; float mem_nrg_R[CPE_CHANNELS]; float mem_nrg_DMX[CPE_CHANNELS]; -#endif - // float gDes_pastFrame; - // float icbweRefEner; - + float gDes_pastFrame; + float icbweRefEner; + float lpSHBRef[LPC_SHB_ORDER + 1]; float shbSynthRef[L_FRAME16k]; float nlExc16k[L_FRAME16k]; float mixExc16k[L_FRAME16k]; - float lpSHBRef[LPC_SHB_ORDER + 1]; +#endif /* SHB speech resampler memory */ Word16 memHPF_fx[8]; // Q -> q_dataChan_fx @@ -894,23 +893,23 @@ typedef struct typedef struct front_vad_enc { - int16_t ini_frame; /* initialization frames counter */ + Word16 ini_frame; /* initialization frames counter */ #ifndef IVAS_FLOAT_FIXED float lp_speech; /* long term speech average */ /* Q9 long term speech average */ float lp_noise; /* long term noise average */ + float *delay_buf; + float mem_preemph; /* preemph filter memory */ + float mem_decim[2 * L_FILT_MAX]; /* decimation filter memory */ #endif - float mem_decim[2 * L_FILT_MAX]; /* decimation filter memory */ float buffer_12k8[3 * L_FRAME / 2]; /* 12k8 signal buffer */ - float mem_preemph; /* preemph filter memory */ Word16 mem_preemph_fx; /* preemph filter memory */ NOISE_EST_HANDLE hNoiseEst; /* Noise estimation handle */ VAD_HANDLE hVAD; /* VAD handle */ - float *delay_buf; Word16 *delay_buf_fx; - int16_t delay_samples; - int16_t rem_dtx_ho; /* Remaining hangover frames */ + Word16 delay_samples; + Word16 rem_dtx_ho; /* Remaining hangover frames */ #ifdef IVAS_FLOAT_FIXED Word16 lp_speech_fx; diff --git a/lib_enc/ivas_stereo_dft_enc.c b/lib_enc/ivas_stereo_dft_enc.c index 901b4855eca7fc55bc3a4600a117e39d982774c0..a6ad046c380498f6493e232ee1b9c818b319c22c 100644 --- a/lib_enc/ivas_stereo_dft_enc.c +++ b/lib_enc/ivas_stereo_dft_enc.c @@ -672,8 +672,8 @@ static void stereo_dft_enc_open( #endif hStereoDft->dft_zp = (int16_t) ( STEREO_DFT_ZP_MAX_ENC * input_Fs / 48000 ); - set_f( hStereoDft->output_mem_dmx_32k, 0, STEREO_DFT_OVL_32k ); #ifndef IVAS_FLOAT_FIXED + set_f( hStereoDft->output_mem_dmx_32k, 0, STEREO_DFT_OVL_32k ); hStereoDft->dft_trigo_8k = dft_trigo_32k; hStereoDft->dft_trigo_12k8 = dft_trigo_12k8; hStereoDft->dft_trigo_16k = dft_trigo_32k; @@ -688,6 +688,8 @@ static void stereo_dft_enc_open( hStereoDft->win_12k8 = win_syn_12k8; hStereoDft->win_16k = win_syn_16k; hStereoDft->win_32k = win_syn_32k; +#else + set32_fx( hStereoDft->output_mem_dmx_32k_fx, 0, STEREO_DFT_OVL_32k ); #endif // need to remove this once fixed function is called // #ifdef IVAS_FLOAT_FIXED @@ -759,9 +761,12 @@ static void stereo_dft_enc_open( /*I/O Buffers*/ set_zero( hStereoDft->output_mem_dmx, STEREO_DFT_OVL_MAX ); set_zero( hStereoDft->output_mem_dmx_12k8, STEREO_DFT_OVL_12k8 ); - set_zero( hStereoDft->output_mem_dmx_16k, STEREO_DFT_OVL_16k ); - set_zero( hStereoDft->output_mem_dmx_16k_shb, STEREO_DFT_OVL_16k ); set_zero( hStereoDft->output_mem_res_8k, STEREO_DFT_OVL_8k ); + set32_fx( hStereoDft->output_mem_dmx_16k_shb_fx, 0, STEREO_DFT_OVL_16k ); + set32_fx( hStereoDft->output_mem_dmx_16k_fx, 0, STEREO_DFT_OVL_16k ); +#else + set_zero( hStereoDft->output_mem_dmx_16k_shb, STEREO_DFT_OVL_16k ); + set_zero( hStereoDft->output_mem_dmx_16k, STEREO_DFT_OVL_16k ); #endif #ifdef IVAS_FLOAT_FIXED hStereoDft->dft_trigo_8k_fx = dft_trigo_32k_fx; diff --git a/lib_enc/ivas_stereo_ica_enc.c b/lib_enc/ivas_stereo_ica_enc.c index bd8a947d75240bf393cc7e10fecab24c6dc79d78..b42f60c147716014981022cdaa2cab68a698ff74 100644 --- a/lib_enc/ivas_stereo_ica_enc.c +++ b/lib_enc/ivas_stereo_ica_enc.c @@ -673,16 +673,22 @@ static void utilCrossCorr_mod_fx( ELSE { Inv_Tot_E = 25088; /* 98.82 in Q8 */ + move16(); Inv_Tot_E_exp = 7; + move16(); } hStereoTCA->E1_mem_fx = E1; + move32(); hStereoTCA->E2_mem_fx = E2; + move32(); hStereoTCA->E1_E2_mem_exp = E1E2_exp; move16(); *corrEst_Exp = corrEst_exp[0]; + move16(); + /* FOR BASOP causing error/warning */ for ( i = lagSearchRange[0], j = 0; i <= 0; i++, j++ ) { L64_sum = 1; @@ -697,12 +703,18 @@ static void utilCrossCorr_mod_fx( C_exp = sub( 31, sub( add( add( shl( q_com, 1 ), 1 ), k ), 32 ) ); C_C_mem = BASOP_Util_Add_Mant32Exp( C, C_exp, hStereoTCA->C_mem_fx[j], hStereoTCA->C_mem_exp[j], &exp ); corrEst[j] = Mpy_32_16_1( C_C_mem, Inv_Tot_E ); + move32(); corrEst_exp[j] = add( Inv_Tot_E_exp, exp ); + move16(); *corrEst_Exp = s_max( *corrEst_Exp, corrEst_exp[j] ); + move16(); hStereoTCA->C_mem_fx[j] = C; + move32(); hStereoTCA->C_mem_exp[j] = C_exp; + move16(); } + /* FOR BASOP causing error/warning */ for ( ; i <= lagSearchRange[1]; i++, j++ ) { L64_sum = 1; @@ -717,10 +729,15 @@ static void utilCrossCorr_mod_fx( C_exp = sub( 31, sub( add( add( shl( q_com, 1 ), 1 ), k ), 32 ) ); C_C_mem = BASOP_Util_Add_Mant32Exp( C, C_exp, hStereoTCA->C_mem_fx[j], hStereoTCA->C_mem_exp[j], &exp ); corrEst[j] = Mpy_32_16_1( C_C_mem, Inv_Tot_E ); + move32(); corrEst_exp[j] = add( Inv_Tot_E_exp, exp ); + move16(); *corrEst_Exp = s_max( *corrEst_Exp, corrEst_exp[j] ); + move16(); hStereoTCA->C_mem_fx[j] = C; + move32(); hStereoTCA->C_mem_exp[j] = C_exp; + move16(); } /* Rescaling buffers */ diff --git a/lib_enc/ivas_stereo_icbwe_enc.c b/lib_enc/ivas_stereo_icbwe_enc.c index dda3897840a95fc5a24698a294151cea05f91430..b1e7097e1525e515e30f5416de2ce83d47a3d20b 100644 --- a/lib_enc/ivas_stereo_icbwe_enc.c +++ b/lib_enc/ivas_stereo_icbwe_enc.c @@ -1642,14 +1642,10 @@ void stereo_icBWE_init_enc_fx( hStereoICBWE->MSFlag = 0; move16(); -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - set_f( hStereoICBWE->nlExc16k, 0, L_FRAME16k ); set16_fx( hStereoICBWE->nlExc16k_fx, 0, L_FRAME16k ); hStereoICBWE->nlExc16k_e = 0; - set_f( hStereoICBWE->mixExc16k, 0, L_FRAME16k ); set16_fx( hStereoICBWE->mixExc16k_fx, 0, L_FRAME16k ); hStereoICBWE->mixExc16k_e = 0; -#endif return; } diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c index c94b2a81c87b405b976876edbd4e5a0e4c265b26..90e961dec09bc7538aa5bcd2e222bd3dcd3b8c0c 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -629,18 +629,6 @@ void stereo_mdct_core_enc( move16(); #endif #ifdef IVAS_FLOAT_FIXED -#ifdef IVAS_FLOAT_FIXED_CONVERSIONS - for ( ch = 0; ch < CPE_CHANNELS; ch++ ) - { - st = sts[ch]; - Word16 q_com = Q31; - q_com = L_get_q1( st->prevEnergyHF ); - q_com = s_min( q_com, L_get_q1( st->currEnergyHF ) ); - st->prevEnergyHF_fx = floatToFixed_32( st->prevEnergyHF, q_com ); - st->currEnergyHF_fx = floatToFixed_32( st->currEnergyHF, q_com ); - st->currEnergyHF_e_fx = sub( Q31, q_com ); - } -#endif FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { st = sts[ch]; diff --git a/lib_enc/ivas_stereo_switching_enc.c b/lib_enc/ivas_stereo_switching_enc.c index eee9509118a8e18009b97e939f1b20057e3931a7..6ba8cd1a844dec4bf270dcf32a74d8d5a6201078 100644 --- a/lib_enc/ivas_stereo_switching_enc.c +++ b/lib_enc/ivas_stereo_switching_enc.c @@ -607,19 +607,20 @@ ivas_error stereo_memory_enc_fx( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxEnc\n" ) ); } -#ifdef IVAS_FLOAT_FIXED - st->hTcxEnc->spectrum_fx[0] = st->hTcxEnc->spectrum_long_fx; - st->hTcxEnc->spectrum_fx[1] = st->hTcxEnc->spectrum_long_fx + N_TCX10_MAX; -#endif // IVAS_FLOAT_FIXED - st->hTcxEnc->spectrum[0] = st->hTcxEnc->spectrum_long; st->hTcxEnc->spectrum[1] = st->hTcxEnc->spectrum_long + N_TCX10_MAX; #ifdef IVAS_FLOAT_FIXED st->hTcxEnc->spectrum_fx[0] = st->hTcxEnc->spectrum_long_fx; st->hTcxEnc->spectrum_fx[1] = st->hTcxEnc->spectrum_long_fx + N_TCX10_MAX; + st->hTcxEnc->spectrum_e[0] = st->hTcxEnc->spectrum_e[1] = 0; + move16(); + move16(); #endif set_f( st->hTcxEnc->old_out, 0, L_FRAME32k ); set_f( st->hTcxEnc->spectrum_long, 0, N_MAX ); +#ifdef IVAS_FLOAT_FIXED + set32_fx( st->hTcxEnc->spectrum_long_fx, 0, N_MAX ); +#endif #ifndef IVAS_FLOAT_FIXED st->hTcxEnc->tfm_mem = 0.75f; #else @@ -680,8 +681,6 @@ ivas_error stereo_memory_enc_fx( return error; } - st->currEnergyLookAhead = 6.1e-5f; - IF( st->hDtxEnc == NULL ) { IF( ( st->hDtxEnc = (DTX_ENC_HANDLE) malloc( sizeof( DTX_ENC_DATA ) ) ) == NULL ) @@ -706,7 +705,7 @@ ivas_error stereo_memory_enc_fx( #else initFdCngEnc( st->hFdCngEnc, st->input_Fs, st->cldfbAnaEnc->scale_flt ); #endif - configureFdCngEnc( st->hFdCngEnc, st->bwidth, st->rf_mode && st->total_brate == ACELP_13k20 ? ACELP_9k60 : st->total_brate ); + configureFdCngEnc_ivas_fx( st->hFdCngEnc, st->bwidth, st->rf_mode && st->total_brate == ACELP_13k20 ? ACELP_9k60 : st->total_brate ); } } } @@ -1036,17 +1035,8 @@ ivas_error stereo_memory_enc( return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for hTcxEnc\n" ) ); } -#ifdef IVAS_FLOAT_FIXED - st->hTcxEnc->spectrum_fx[0] = st->hTcxEnc->spectrum_long_fx; - st->hTcxEnc->spectrum_fx[1] = st->hTcxEnc->spectrum_long_fx + N_TCX10_MAX; -#endif // IVAS_FLOAT_FIXED - st->hTcxEnc->spectrum[0] = st->hTcxEnc->spectrum_long; st->hTcxEnc->spectrum[1] = st->hTcxEnc->spectrum_long + N_TCX10_MAX; -#ifdef IVAS_FLOAT_FIXED - st->hTcxEnc->spectrum_fx[0] = st->hTcxEnc->spectrum_long_fx; - st->hTcxEnc->spectrum_fx[1] = st->hTcxEnc->spectrum_long_fx + N_TCX10_MAX; -#endif set_f( st->hTcxEnc->old_out, 0, L_FRAME32k ); set_f( st->hTcxEnc->spectrum_long, 0, N_MAX ); st->hTcxEnc->tfm_mem = 0.75f; @@ -1190,6 +1180,8 @@ void stereo_switching_enc_fx( dft_ovl = extract_l( Mpy_32_32( imult3216( input_frame, STEREO_DFT_OVL_MAX ), 2236963 ) ); // 1/L_FRAME48k = 2236963 (Q31) /* update DFT analysis overlap memory */ + test(); + test(); IF( GT_16( hCPE->element_mode, IVAS_CPE_DFT ) && hCPE->input_mem_fx[0] != NULL && NE_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) { FOR( n = 0; n < CPE_CHANNELS; n++ ) @@ -1215,6 +1207,7 @@ void stereo_switching_enc_fx( FOR( i = 0; i < dft_ovl; i++ ) { hCPE->hStereoDft->output_mem_dmx_fx[i] = Mpy_32_16_r( hCPE->hStereoDft->win_fx[dft_ovl - 1 - i], old_input_signal_pri[input_frame - dft_ovl + i] ); + move32(); } /* reset 48kHz BWE overlap memory */ set32_fx( hCPE->hStereoDft->output_mem_dmx_32k_fx, 0, STEREO_DFT_OVL_32k ); @@ -1229,6 +1222,7 @@ void stereo_switching_enc_fx( } /* Update the side_gain[] parameters */ + test(); IF( hCPE->hStereoTCA != NULL && NE_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) ) { tmp_fx = usdequant_fx( hCPE->hStereoTCA->indx_ica_gD, STEREO_TCA_GDMIN_FX, STEREO_TCA_GDSTEP_FX ); @@ -1301,12 +1295,17 @@ void stereo_switching_enc_fx( set_zero_fx( sts[1]->input32_fx - input_frame, input_frame ); hCPE->hStereoTD->tdm_last_ratio_fx = tdm_ratio_tabl_fx[LRTD_STEREO_LEFT_IS_PRIM]; + move32(); hCPE->hStereoTD->tdm_last_ratio_idx = LRTD_STEREO_LEFT_IS_PRIM; + move16(); + test(); + test(); IF( LT_32( hCPE->hStereoTCA->instTargetGain_fx, 26843546 ) && ( hCPE->hCoreCoder[0]->vad_flag || hCPE->hCoreCoder[1]->vad_flag ) ) /* but if there is no content in the L channel -> the primary channel is forced to right */ { hCPE->hStereoTD->tdm_last_ratio_fx = tdm_ratio_tabl_fx[LRTD_STEREO_RIGHT_IS_PRIM]; + move32(); hCPE->hStereoTD->tdm_last_ratio_idx = LRTD_STEREO_RIGHT_IS_PRIM; move16(); } @@ -1320,7 +1319,7 @@ void stereo_switching_enc_fx( IF( sts[0]->cldfbAnaEnc != NULL ) { offset = sub( sts[0]->cldfbAnaEnc->p_filter_length, sts[0]->cldfbAnaEnc->no_channels ); - for ( i = 0; i < offset; i++ ) + FOR( i = 0; i < offset; i++ ) { sts[0]->cldfbAnaEnc->cldfb_state_fx[i] = L_deposit_h( old_input_signal_pri[input_frame - offset - NS2SA( input_frame * FRAMES_PER_SEC, L_MEM_RECALC_TBE_NS ) + i] ); move32(); @@ -1336,10 +1335,12 @@ void stereo_switching_enc_fx( move32(); } + test(); IF( hCPE->hStereoICBWE == NULL && sts[1]->cldfbAnaEnc != NULL ) { offset = sub( sts[1]->cldfbAnaEnc->p_filter_length, sts[1]->cldfbAnaEnc->no_channels ); + test(); IF( hCPE->hStereoTD != NULL && EQ_16( hCPE->hStereoTD->tdm_last_ratio_idx, LRTD_STEREO_LEFT_IS_PRIM ) ) { v_multc_fixed_32_16( hCPE->hCoreCoder[1]->old_input_signal_fx + sub( input_frame, add( offset, NS2SA( input_frame * FRAMES_PER_SEC, L_MEM_RECALC_TBE_NS ) ) ), -MAX_32, sts[1]->cldfbAnaEnc->cldfb_state_fx, offset ); diff --git a/lib_enc/prot_fx_enc.h b/lib_enc/prot_fx_enc.h index d3432bdc48ce3b22fffc3f7f170d46a6a1250ce8..05eb312685033ab1e118bcb51629e4c2ed6a1d0e 100644 --- a/lib_enc/prot_fx_enc.h +++ b/lib_enc/prot_fx_enc.h @@ -1096,7 +1096,7 @@ void RunTransientDetection_fx( Word16 const *i, Word16 nSamplesAvailable, struct void RunTransientDetection_ivas_fx( - const Word16 *input_fx, /* i : input signal Q: q_input */ + Word16 *input_fx, /* i : input signal Q: q_input */ const Word16 length, /* i : frame length */ TRAN_DET_HANDLE hTranDet, /* i/o: transient detection handle */ Word16 q_input /*i: stores q for input_fx*/ diff --git a/lib_enc/speech_music_classif.c b/lib_enc/speech_music_classif.c index bf74ed5ad807b27cc9c39df8f0f5e0dc13646d13..6d358119ccf0d640cc55aa35b8eabb8b05039fb0 100644 --- a/lib_enc/speech_music_classif.c +++ b/lib_enc/speech_music_classif.c @@ -240,6 +240,8 @@ void speech_music_clas_init( #ifdef IVAS_FLOAT_FIXED hSpMusClas->tdm_lt_Etot_fx = 328 /* 0.01 in Q15*/; set32_fx( hSpMusClas->tod_lt_Bin_E_fx, 0, TOD_NSPEC ); + hSpMusClas->Q_tod_lt_Bin_E = Q31; + move16(); #else hSpMusClas->tdm_lt_Etot = 0.01f; set_f( hSpMusClas->tod_lt_Bin_E, 0.0f, TOD_NSPEC ); diff --git a/lib_enc/speech_music_classif_fx.c b/lib_enc/speech_music_classif_fx.c index b7c0799055817e9e642ad8a5061e0c0f364df4e4..407e2e31c74f671adca7d714196063969493b2f6 100644 --- a/lib_enc/speech_music_classif_fx.c +++ b/lib_enc/speech_music_classif_fx.c @@ -446,6 +446,8 @@ void speech_music_clas_init_ivas_fx( hSpMusClas->tdm_lt_Etot_fx = 3; /* 0.01f in Q8 */ move16(); set32_fx( hSpMusClas->tod_lt_Bin_E_fx, 0, TOD_NSPEC ); + hSpMusClas->Q_tod_lt_Bin_E = Q31; + move16(); set32_fx( hSpMusClas->tod_S_map_lt_fx, 0, TOD_NSPEC ); hSpMusClas->tod_thr_lt_fx = TOD_THR_MASS_FX_Q22; move32(); @@ -3059,12 +3061,15 @@ void ivas_smc_mode_selection_fx( ton = tonal_det_fx( S_map, st->vad_flag, hSpMusClas->tod_S_map_lt_fx, &hSpMusClas->tod_thr_lt_fx, &hSpMusClas->tod_weight_fx, &hSpMusClas->tod_S_mass_prev_fx, &hSpMusClas->tod_S_mass_lt_fx ); // Q22 /* calculate spectral peak-to-average ratio */ + Word16 shift = sub( add( Q_new, Q_SCALE - 2 ), st->hSpMusClas->Q_tod_lt_Bin_E ); FOR( i = 0; i < TOD_NSPEC; i++ ) { // st->hSpMusClas->tod_lt_Bin_E[i] = P2A_FACT * st->hSpMusClas->tod_lt_Bin_E[i] + ( 1 - P2A_FACT ) * st->Bin_E[i]; - st->hSpMusClas->tod_lt_Bin_E_fx[i] = Madd_32_16( Mpy_32_16_1( st->hSpMusClas->tod_lt_Bin_E_fx[i], P2A_FACT_FX_Q15 ), st->Bin_E_fx[i], ( 32767 - P2A_FACT_FX_Q15 ) ); // Q = Q_new + Q_SCALE - 2 + st->hSpMusClas->tod_lt_Bin_E_fx[i] = Madd_32_16( L_shl( Mpy_32_16_1( st->hSpMusClas->tod_lt_Bin_E_fx[i], P2A_FACT_FX_Q15 ), shift ), st->Bin_E_fx[i], ( 32767 - P2A_FACT_FX_Q15 ) ); // Q = Q_new + Q_SCALE - 2 + move32(); } - + st->hSpMusClas->Q_tod_lt_Bin_E = add( st->hSpMusClas->Q_tod_lt_Bin_E, shift ); + move16(); maximum_32_fx( st->hSpMusClas->tod_lt_Bin_E_fx, TOD_NSPEC, &S_max ); // S_ave = sum_f( st->hSpMusClas->tod_lt_Bin_E_fx, TOD_NSPEC ) / TOD_NSPEC; FOR( i = 0; i < TOD_NSPEC; i++ ) diff --git a/lib_enc/stat_enc.h b/lib_enc/stat_enc.h index 8859acceda2529688e6d3de155fb15c38c0572d3..02df0a4df6561083cc2a11fe30c53b021d12856e 100644 --- a/lib_enc/stat_enc.h +++ b/lib_enc/stat_enc.h @@ -167,9 +167,9 @@ typedef struct #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 - Word16 subblockNrgChange[NSUBBLOCKS + MAX_TD_DELAY]; /* Q7(15 - SUBBLOCK_NRG_CHANGE_E) */ - int16_t nDelay; /* Size of the delay buffer in use, as number of subblocks. Maximum delay from all users of this buffer. */ - int16_t nPartialDelay; /* Delay of the input (modulo pDelayBuffer->nSubblockSize), nPartialDelay <= pDelayBuffer->nDelay. */ + Word16 subblockNrgChange[NSUBBLOCKS + MAX_TD_DELAY]; /* EVS: Q7(15 - SUBBLOCK_NRG_CHANGE_E) */ /* IVAS: Q3 */ + int16_t nDelay; /* Size of the delay buffer in use, as number of subblocks. Maximum delay from all users of this buffer. */ + int16_t nPartialDelay; /* Delay of the input (modulo pDelayBuffer->nSubblockSize), nPartialDelay <= pDelayBuffer->nDelay. */ /* Decay factor for the recursive accumulation */ #ifndef IVAS_FLOAT_FIXED @@ -184,6 +184,7 @@ typedef struct #endif Word16 firState1; Word16 firState2; + Word16 q_firState; uint16_t ramp_up_flag; /* bit map flags to indicate a ramp up in beginning of TCX frame */ @@ -957,7 +958,8 @@ typedef struct sp_mus_clas_structure Word32 finc_prev_fx[ATT_NSEG]; /* strong attack detection - previous finc, (Q_new * 2) */ Word32 lt_finc_fx; /* strong attack detection - long-term finc energy, (Q_new * 2) */ int16_t last_strong_attack; /* strong attack detection - last strong attack flag */ - Word32 tod_lt_Bin_E_fx[TOD_NSPEC]; /* tonal detector - long-term energy spectrum, Q_new + Q_SCALE - 2 */ + Word32 tod_lt_Bin_E_fx[TOD_NSPEC]; /* tonal detector - long-term energy spectrum, Q_tod_lt_Bin_E */ + Word16 Q_tod_lt_Bin_E; #ifndef IVAS_FLOAT_FIXED float tod_lt_Bin_E[TOD_NSPEC]; /* tonal detector - long-term energy spectrum */ float tod_S_map_lt[TOD_NSPEC]; /* tonal detector - long-term correlation map */ @@ -2385,9 +2387,9 @@ typedef struct enc_core_structure float lt_mean_WB; float lt_mean_SWB; #else - Word16 lt_mean_NB_fx; /* Q11 */ - Word16 lt_mean_WB_fx; /* Q11 */ - Word16 lt_mean_SWB_fx; /* Q11 */ + Word16 lt_mean_NB_fx; /* Q11 */ + Word16 lt_mean_WB_fx; /* Q11 */ + Word16 lt_mean_SWB_fx; /* Q11 */ #endif int16_t count_WB; int16_t count_SWB; @@ -2475,8 +2477,8 @@ typedef struct enc_core_structure #ifndef IVAS_FLOAT_FIXED float gamma_flt; #else - Word16 gamma; /* Q15 */ - Word16 inv_gamma; /* Q14 */ + Word16 gamma; /* Q15 */ + Word16 inv_gamma; /* Q14 */ #endif TRAN_DET_HANDLE hTranDet; @@ -2486,12 +2488,10 @@ typedef struct enc_core_structure #ifndef IVAS_FLOAT_FIXED float prevTempFlatness; #else - Word16 prevTempFlatness_fx; /* exponent is AVG_FLAT_E Q7 */ + Word16 prevTempFlatness_fx; /* exponent is AVG_FLAT_E Q7 in EVS */ /* Q4 in IVAS */ #endif - float prevEnergyHF; - float currEnergyHF; - float currEnergyLookAhead; + // float currEnergyLookAhead; Word32 currEnergyLookAhead_fx; // Q31 Word32 prevEnergyHF_fx; Word32 currEnergyHF_fx; @@ -2555,15 +2555,15 @@ typedef struct enc_core_structure float mean_gc_flt[2]; float prev_lsf4_mean_flt; #else - Word32 mean_gc[2]; /* Q15 */ - Word16 prev_lsf4_mean; /* Qlog2(2.56) */ + Word32 mean_gc[2]; /* Q15 */ + Word16 prev_lsf4_mean; /* Qlog2(2.56) */ #endif int16_t glr_reset; int32_t last_sr_core; #ifndef IVAS_FLOAT_FIXED float last_stab_fac_flt; #else - Word16 last_stab_fac; /* Q15 */ + Word16 last_stab_fac; /* Q15 */ #endif Word32 gain_code[NB_SUBFR16k]; diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c index 9b193ef8d4d186aa2266feccaf530cc52793b1d7..fa8acaab9a014c3da6442c9bd36a8b7fe45f852a 100644 --- a/lib_enc/swb_tbe_enc_fx.c +++ b/lib_enc/swb_tbe_enc_fx.c @@ -4342,6 +4342,8 @@ void swb_tbe_enc_ivas_fx( { // Check Qs Copy_Scale_sig_16_32( lpc_shb_fx, hStereoICBWE->lpSHBRef_fx, LPC_SHB_ORDER + 1, 0 ); + hStereoICBWE->lpSHBRef_e = 31 - Q12; + move16(); } /* Adjust the subframe and frame gain of the synthesized SHB signal */ diff --git a/lib_enc/transient_detection_fx.c b/lib_enc/transient_detection_fx.c index 6d237279c3405a5ee7714371be8386c99c69e323..aad1d7f2669fed227ac05bd8cc63a843d91c503d 100644 --- a/lib_enc/transient_detection_fx.c +++ b/lib_enc/transient_detection_fx.c @@ -28,12 +28,13 @@ #define MIN_BLOCK_ENERGY ( (Word32) 1 ) #ifdef IVAS_FLOAT_FIXED -#define MIN_BLOCK_ENERGY_FX 107 -#define THR_HIGH_FX 17408 /* 8.5f in Q11 */ -#define THR_NORM_HIGH_FX 16384 /* 8 in Q11 */ -#define THR_NORM_LOW_FX 9216 /* 4.5f in Q11 */ -#define THR_LOW_FX 8704 /* 4.25f in Q11 */ -#define THR_LOW_STEP_FX ONE_IN_Q11 /* 1 in Q11 */ +#define MIN_BLOCK_ENERGY_FX 107 +#define THR_HIGH_FX 17408 /* 8.5f in Q11 */ +#define THR_NORM_HIGH_FX 16384 /* 8 in Q11 */ +#define THR_NORM_LOW_FX 9216 /* 4.5f in Q11 */ +#define THR_LOW_FX 8704 /* 4.25f in Q11 */ +#define THR_LOW_STEP_FX ONE_IN_Q11 /* 1 in Q11 */ +#define MIN_BLOCK_ENERGY_IVAS_FX_Q7 13743 /* 107.37f in Q7 */ #endif /************************************************/ @@ -46,11 +47,12 @@ static void InitDelayBuffer( Word16 nFrameLength, Word16 nDelay, DelayBuffer *pD static void InitSubblockEnergies( Word16 nFrameLength, Word16 nDelay, DelayBuffer *pDelayBuffer, SubblockEnergies *pSubblockEnergies ); static void InitSubblockEnergies_ivas_fx( Word16 nFrameLength, Word16 nDelay, DelayBuffer *pDelayBuffer, SubblockEnergies *pSubblockEnergies ); static void InitTransientDetector_fx( SubblockEnergies *pSubblockEnergies, Word16 nDelay, Word16 nSubblocksToCheck, TCheckSubblocksForAttack_fx pCheckSubblocksForAttack, Word16 attackRatioThreshold, TransientDetector *pTransientDetector ); +static void InitTransientDetector_ivas_fx( SubblockEnergies *pSubblockEnergies, Word16 nDelay, Word16 nSubblocksToCheck, TCheckSubblocksForAttack_fx pCheckSubblocksForAttack, Word16 attackRatioThreshold, TransientDetector *pTransientDetector ); static void UpdateDelayBuffer( Word16 const *input, Word16 nSamplesAvailable, DelayBuffer *pDelayBuffer ); -static void HighPassFilter( Word16 const *input, Word16 length, Word16 *pFirState1, Word16 *pFirState2, Word16 *output ); +static void HighPassFilter_fx( Word16 const *input, Word16 length, Word16 *pFirState1, Word16 *pFirState2, Word16 *output ); static void UpdateSubblockEnergies( Word16 const *input, Word16 nSamplesAvailable, SubblockEnergies *pSubblockEnergies ); static void CalculateSubblockEnergies( Word16 const *input, Word16 nSamplesAvailable, SubblockEnergies *pSubblockEnergies ); -static void RunTransientDetector( TransientDetector *pTransientDetector ); +static void RunTransientDetector_fx( TransientDetector *pTransientDetector ); static void CalculateSubblockEnergies_ivas_fx( Word16 const *input, Word16 nSamplesAvailable, SubblockEnergies *pSubblockEnergies ); @@ -258,17 +260,19 @@ void InitTransientDetection_ivas_fx( Word16 nFrameLength, /* Init a subblock energies buffer used for the TCX Short/Long decision. */ InitSubblockEnergies_ivas_fx( nFrameLength, nTCXDelay, &pTransientDetection->delayBuffer, &pTransientDetection->subblockEnergies ); /* Init the TCX Short/Long transient detector. */ - InitTCXTransientDetector( nTCXDelay, &pTransientDetection->subblockEnergies, &pTransientDetection->transientDetector ); + InitTransientDetector_ivas_fx( &pTransientDetection->subblockEnergies, nTCXDelay, NSUBBLOCKS, GetAttackForTCXDecision, 17408 /*8.5f/(1<transientDetector ); /* We need two past subblocks for the TCX TD and NSUBBLOCKS+1 for the temporal flatness measure FOR the TCX LTP. */ IF( ext_mem_flag ) { pTransientDetection->transientDetector.pSubblockEnergies->nDelay = add( pTransientDetection->transientDetector.pSubblockEnergies->nDelay, add( ( NSUBBLOCKS + 1 ), ( NSUBBLOCKS_SHIFT + 1 ) ) ); + move16(); } ELSE { pTransientDetection->transientDetector.pSubblockEnergies->nDelay = add( pTransientDetection->transientDetector.pSubblockEnergies->nDelay, NSUBBLOCKS + 1 ); + move16(); } } @@ -515,13 +519,13 @@ void RunTransientDetection_fx( Word16 const *input, Word16 nSamplesAvailable, Tr assert( ( input != NULL ) && ( pTransientDetection != NULL ) && ( pSubblockEnergies != NULL ) && ( pTransientDetector != NULL ) ); - HighPassFilter( input, nSamplesAvailable, &pSubblockEnergies->firState1, &pSubblockEnergies->firState2, filteredInput ); + HighPassFilter_fx( input, nSamplesAvailable, &pSubblockEnergies->firState1, &pSubblockEnergies->firState2, filteredInput ); /* Update subblock energies. */ UpdateSubblockEnergies( filteredInput, nSamplesAvailable, pSubblockEnergies ); /* Run transient detectors. */ - RunTransientDetector( pTransientDetector ); + RunTransientDetector_fx( pTransientDetector ); /* Update the delay buffer. */ UpdateDelayBuffer( filteredInput, nSamplesAvailable, &pTransientDetection->delayBuffer ); @@ -540,7 +544,7 @@ void RunTransientDetection_fx( Word16 const *input, Word16 nSamplesAvailable, Tr #ifdef IVAS_FLOAT_FIXED void RunTransientDetection_ivas_fx( - const Word16 *input_fx, /* i : input signal Q: q_input */ + Word16 *input_fx, /* i : input signal Q: q_input */ const Word16 length, /* i : frame length */ TRAN_DET_HANDLE hTranDet, /* i/o: transient detection handle */ Word16 q_input /*i: stores q for input_fx*/ @@ -552,12 +556,44 @@ void RunTransientDetection_ivas_fx( TransientDetector *pTransientDetector = &hTranDet->transientDetector; Word32 e0_fx, e1_fx; + Word16 exp = 0, exp1 = 0, q_old_inp = q_input; + move16(); + move16(); + move16(); assert( ( input_fx != NULL ) && ( hTranDet != NULL ) && ( pSubblockEnergies != NULL ) && ( pTransientDetector != NULL ) ); /* Variable initializations */ - HighPassFilter( input_fx, length, &pSubblockEnergies->firState1, &pSubblockEnergies->firState2, filteredInput_fx ); + Word16 shift = norm_s( pSubblockEnergies->firState1 ); + shift = s_min( shift, norm_s( pSubblockEnergies->firState2 ) ); + IF( GT_16( sub( q_input, pSubblockEnergies->q_firState ), shift ) ) + { + Scale_sig( input_fx, length, add( sub( pSubblockEnergies->q_firState, q_input ), shift ) ); // q_firState + shift + pSubblockEnergies->firState1 = shl( pSubblockEnergies->firState1, shift ); // q_firState + shift + move16(); + pSubblockEnergies->firState2 = shl( pSubblockEnergies->firState2, shift ); // q_firState + shift + move16(); + pSubblockEnergies->q_firState = add( pSubblockEnergies->q_firState, shift ); // q_firState + shift + move16(); + q_input = add( pSubblockEnergies->q_firState, shift ); // q_firState + shift + } + ELSE + { + pSubblockEnergies->firState1 = shl( pSubblockEnergies->firState1, sub( q_input, pSubblockEnergies->q_firState ) ); // q_input + move16(); + pSubblockEnergies->firState2 = shl( pSubblockEnergies->firState2, sub( q_input, pSubblockEnergies->q_firState ) ); // q_input + move16(); + pSubblockEnergies->q_firState = q_input; + move16(); + } + + HighPassFilter_fx( input_fx, length, &pSubblockEnergies->firState1, &pSubblockEnergies->firState2, filteredInput_fx ); // q_input + + IF( NE_16( q_input, q_old_inp ) ) + { + Scale_sig( input_fx, length, sub( q_old_inp, q_input ) ); // q_old_inp + } /* Update subblock energies. */ #ifdef MSAN_FIX @@ -568,20 +604,22 @@ void RunTransientDetection_ivas_fx( UpdateSubblockEnergies_ivas_fx( filteredInput_fx, length, pSubblockEnergies ); /* Run transient detectors. */ - RunTransientDetector( pTransientDetector ); + RunTransientDetector_fx( pTransientDetector ); /* Update the delay buffer. */ UpdateDelayBuffer( filteredInput_fx, length, &hTranDet->delayBuffer ); /* compute ramp up flag */ - pSubblockEnergies->ramp_up_flag = ( ( pSubblockEnergies->ramp_up_flag << 1 ) & 0x0003 ); - Word16 exp = 0, exp1 = 0; - e0_fx = dotp_fx( filteredInput_fx + length / 2, filteredInput_fx + length / 2, pSubblockEnergies->pDelayBuffer->nSubblockSize / 2, &exp ); - e0_fx = BASOP_Util_Add_Mant32Exp( 1, exp, e0_fx, exp, &exp1 ); // exponent: exp1 - e1_fx = L_sub( pSubblockEnergies->subblockNrg[pSubblockEnergies->nDelay + 4], L_shr( e0_fx, 31 - exp1 ) ); // exponent: 31, Q: 0 - IF( BASOP_Util_Cmp_Mant32Exp( e0_fx, exp1, e1_fx, 31 ) > 0 ) + pSubblockEnergies->ramp_up_flag = (UWord16) L_and( L_shl( pSubblockEnergies->ramp_up_flag, 1 ), 0x0003 ); + move16(); + + e0_fx = dotp_fx( filteredInput_fx + /* length / 2 */ shr( length, 1 ), filteredInput_fx + /* length / 2 */ shr( length, 1 ), shr( pSubblockEnergies->pDelayBuffer->nSubblockSize, 1 ) /* pSubblockEnergies->pDelayBuffer->nSubblockSize / 2 */, &exp ); + exp = sub( exp, 2 * 0 - 1 ); // Q = 2*0 + (30-exp), E = 31 - (2*0 + 30 - exp) = 1 + exp - 2*0 = exp - (2*0-1) + e0_fx = BASOP_Util_Add_Mant32Exp( MIN_BLOCK_ENERGY_IVAS_FX_Q7 / 2, 31 - Q7, e0_fx, exp, &exp ); + e1_fx = BASOP_Util_Add_Mant32Exp( pSubblockEnergies->subblockNrg[pSubblockEnergies->nDelay + 4], 31 - 0, L_negate( e0_fx ), exp, &exp1 ); + IF( BASOP_Util_Cmp_Mant32Exp( e1_fx, exp1, e0_fx, exp ) > 0 ) { - pSubblockEnergies->ramp_up_flag = s_or( pSubblockEnergies->ramp_up_flag, 0x0001 ); + pSubblockEnergies->ramp_up_flag = (UWord16) L_or( pSubblockEnergies->ramp_up_flag, 0x0001 ); move16(); } @@ -718,7 +756,7 @@ void SetTCXModeInfo_ivas_fx( } } tmp = BASOP_Util_Divide3216_Scale( ONE_IN_Q20, GetTCXAvgTemporalFlatnessMeasure_ivas_fx( (const TransientDetection *) hTranDet, NSUBBLOCKS, 0 ), &exp_diff ); - tmp = shl( tmp, exp_diff ); // Q15 + 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 ) ) { @@ -954,24 +992,39 @@ static void InitSubblockEnergies( Word16 nFrameLength, Word16 nDelay, DelayBuffe static void InitSubblockEnergies_ivas_fx( Word16 nFrameLength, Word16 nDelay, DelayBuffer *pDelayBuffer, SubblockEnergies *pSubblockEnergies ) { - Word16 const nMaxBuffSize = sizeof( pSubblockEnergies->subblockNrg ) / sizeof( pSubblockEnergies->subblockNrg[0] ); - (void) nFrameLength; - + Word16 const nMaxBuffSize = NSUBBLOCKS + MAX_TD_DELAY; + move16(); 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, 13743, nMaxBuffSize + 1 ); + set32_fx( pSubblockEnergies->accSubblockNrg, MIN_BLOCK_ENERGY_IVAS_FX_Q7, nMaxBuffSize + 1 ); set16_fx( pSubblockEnergies->subblockNrgChange, ONE_IN_Q7, nMaxBuffSize ); - pSubblockEnergies->nDelay = nDelay / pDelayBuffer->nSubblockSize; + IF( nDelay != 0 ) + { + pSubblockEnergies->nDelay = idiv1616( nDelay, pDelayBuffer->nSubblockSize ); + move16(); + } + ELSE + { + pSubblockEnergies->nDelay = 0; + move16(); + } assert( pSubblockEnergies->nDelay < nMaxBuffSize ); pSubblockEnergies->nPartialDelay = nDelay % pDelayBuffer->nSubblockSize; + move16(); pSubblockEnergies->facAccSubblockNrg = 26624 /*0.8125f Q15*/; /* Energy accumulation factor */ + move16(); pSubblockEnergies->firState1 = 0; + move16(); pSubblockEnergies->firState2 = 0; + move16(); + pSubblockEnergies->q_firState = 15; + move16(); pSubblockEnergies->pDelayBuffer = pDelayBuffer; pDelayBuffer->nDelay = s_max( pDelayBuffer->nDelay, pSubblockEnergies->nPartialDelay ); + move16(); } /** Init transient detector. @@ -1006,6 +1059,43 @@ static void InitTransientDetector_fx( SubblockEnergies *pSubblockEnergies, Word1 pTransientDetector->attackIndex = -1; } +static void InitTransientDetector_ivas_fx( SubblockEnergies *pSubblockEnergies, Word16 nDelay, Word16 nSubblocksToCheck, TCheckSubblocksForAttack_fx pCheckSubblocksForAttack, Word16 attackRatioThreshold, TransientDetector *pTransientDetector ) +{ + const Word16 nMaxBuffSize = NSUBBLOCKS + MAX_TD_DELAY; + move16(); + + assert( ( pSubblockEnergies != NULL ) && ( pSubblockEnergies->pDelayBuffer != NULL ) && ( pTransientDetector != NULL ) && ( pSubblockEnergies->pDelayBuffer->nSubblockSize != 0 ) ); + pTransientDetector->pSubblockEnergies = pSubblockEnergies; + IF( sub( nDelay, pSubblockEnergies->nPartialDelay ) != 0 ) + { + pTransientDetector->nDelay = idiv1616( sub( nDelay, pSubblockEnergies->nPartialDelay ), pSubblockEnergies->pDelayBuffer->nSubblockSize ); + move16(); + } + ELSE + { + pTransientDetector->nDelay = 0; + move16(); + } + assert( nDelay == pTransientDetector->nDelay * pSubblockEnergies->pDelayBuffer->nSubblockSize + pSubblockEnergies->nPartialDelay ); + assert( pTransientDetector->nDelay < nMaxBuffSize ); + pSubblockEnergies->nDelay = s_max( pSubblockEnergies->nDelay, pTransientDetector->nDelay ); + move16(); + assert( nSubblocksToCheck <= NSUBBLOCKS + pTransientDetector->nDelay ); + pTransientDetector->nSubblocksToCheck = nSubblocksToCheck; + move16(); + pTransientDetector->CheckSubblocksForAttack_fx = pCheckSubblocksForAttack; + pTransientDetector->attackRatioThreshold = attackRatioThreshold; + move16(); + pTransientDetector->bIsAttackPresent = FALSE; + move16(); + pTransientDetector->prev_bIsAttackPresent = FALSE; + move16(); + pTransientDetector->attackIndex = -1; + move16(); + pTransientDetector->pSubblockEnergies->ramp_up_flag = 0x0; + move16(); +} + /* This function should be inlined and WMOPS instrumentation takes that into account, meaning that all references are considered as local variables */ static Word32 InlineFilter( Word16 inValue, Word16 firState1, Word16 firState2 ) { @@ -1014,16 +1104,19 @@ static Word32 InlineFilter( Word16 inValue, Word16 firState1, Word16 firState2 ) return L_msu( L_mac( L_mult( firState2, 4096 /*0.125f Q15*/ ), inValue, 12288 /*0.375f Q15*/ ), firState1, 16384 /*0.5f Q15*/ ); } -static void HighPassFilter( Word16 const *input, Word16 length, Word16 *pFirState1, Word16 *pFirState2, Word16 *output ) +static void HighPassFilter_fx( Word16 const *input, Word16 length, Word16 *pFirState1, Word16 *pFirState2, Word16 *output ) { Word16 i; output[0] = round_fx( InlineFilter( input[0], *pFirState1, *pFirState2 ) ); + move16(); output[1] = round_fx( InlineFilter( input[1], input[0], *pFirState1 ) ); + move16(); FOR( i = 2; i < length; i++ ) { output[i] = round_fx( InlineFilter( input[i], input[i - 1], input[i - 2] ) ); + move16(); } /* update filter states: shift time samples through delay line */ @@ -1033,12 +1126,15 @@ static void HighPassFilter( Word16 const *input, Word16 length, Word16 *pFirStat *pFirState1 = input[length - 1]; } -static void RunTransientDetector( TransientDetector *pTransientDetector ) +static void RunTransientDetector_fx( TransientDetector *pTransientDetector ) { Word16 const attackRatioThreshold = pTransientDetector->attackRatioThreshold; + move16(); SubblockEnergies const *pSubblockEnergies = pTransientDetector->pSubblockEnergies; Word16 const nDelay = pTransientDetector->nDelay; - Word16 const nRelativeDelay = pSubblockEnergies->nDelay - nDelay; + move16(); + Word16 const nRelativeDelay = sub( pSubblockEnergies->nDelay, nDelay ); + move16(); Word32 const *pSubblockNrg = &pSubblockEnergies->subblockNrg[nRelativeDelay]; Word32 const *pAccSubblockNrg = &pSubblockEnergies->accSubblockNrg[nRelativeDelay]; @@ -1277,7 +1373,6 @@ static void CalculateSubblockEnergies_ivas_fx( Word16 const *input, Word16 nSamp Word32 *pAccSubblockTmp; Word16 nWindows; Word16 w, k, k2, tmp; - Word16 firState1, firState2; Word32 w0, w1; Word32 accu; @@ -1297,12 +1392,8 @@ static void CalculateSubblockEnergies_ivas_fx( Word16 const *input, Word16 nSamp pAccSubblockNrg = &pSubblockEnergies->accSubblockNrg[nDelay]; pSubblockNrgChange = &pSubblockEnergies->subblockNrgChange[nDelay]; - move16(); - move16(); /* nWindows = (nSamplesAvailable + nPartialDelay) / nSubblockSize */ nWindows = shr( div_s( add( nSamplesAvailable, nPartialDelay ), shl( nSubblockSize, 7 ) ), 8 ); - firState1 = pSubblockEnergies->firState1; - firState2 = pSubblockEnergies->firState2; pAccSubblockTmp = &pAccSubblockNrg[nWindows]; IF( nWindows > 0 ) @@ -1387,11 +1478,6 @@ static void CalculateSubblockEnergies_ivas_fx( Word16 const *input, Word16 nSamp } } } - - move16(); - move16(); - pSubblockEnergies->firState1 = firState1; - pSubblockEnergies->firState2 = firState2; } #ifdef IVAS_CODE /*-------------------------------------------------------------------*