From 4f16a083d617acba4bce9ae6f591badea4f1f3d7 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Fri, 24 Jan 2025 17:14:47 +0530 Subject: [PATCH] Precision improvements and bug fixes for encoder [x] Bug fix in core_signal_analysis_high_bitrate_ivas_fx [x] [Bug-fix] minor logic correction in stereo_td_get_td_itd_fx [x] Precision improvement inside wb_vad_ivas_fx for the selection of snr_outlier_index [x] Minor bug fix in stereo_mdct_core_enc_fx [x] Fixes in unclr_classifier --- lib_enc/ext_sig_ana_fx.c | 13 ++- lib_enc/ivas_front_vad.c | 8 +- lib_enc/ivas_stereo_classifier.c | 43 ++++++- lib_enc/ivas_stereo_dft_td_itd.c | 2 +- lib_enc/ivas_stereo_mdct_core_enc.c | 6 +- lib_enc/vad_fx.c | 174 ++++++++++++++++------------ 6 files changed, 149 insertions(+), 97 deletions(-) diff --git a/lib_enc/ext_sig_ana_fx.c b/lib_enc/ext_sig_ana_fx.c index 192c5bc26..65f810816 100644 --- a/lib_enc/ext_sig_ana_fx.c +++ b/lib_enc/ext_sig_ana_fx.c @@ -691,7 +691,7 @@ void core_signal_analysis_high_bitrate_ivas_fx( Word16 *speech_fx = NULL; Word16 q_out_wtda = 0; move16(); - Word16 win_len = 0; + Word16 win_len[2]; move16(); set32_fx( buf_powerSPec, 0, N_MAX + L_MDCT_OVLP_MAX ); set16_fx( buf_powerSPec_exp, 0, N_MAX + L_MDCT_OVLP_MAX ); @@ -953,9 +953,12 @@ void core_signal_analysis_high_bitrate_ivas_fx( IF( windowed_samples != NULL ) /* save windowed speech_TCX samples */ { assert( L_subframe + ( left_overlap + right_overlap ) / 2 < 2 * L_FRAME_MAX / nSubframes - L_FRAME_MAX / 8 ); - win_len = add( L_subframe, shr( add( left_overlap, right_overlap ), 1 ) ); - windowed_samples[frameno * L_FRAME_MAX + 0] = L_deposit_l( overlap_mode[frameno] ); // Q0 + win_len[frameno] = add( L_subframe, shr( add( left_overlap, right_overlap ), 1 ) ); + move16(); + windowed_samples[frameno * L_FRAME_MAX + 0] = L_deposit_l( overlap_mode[frameno] ); // Q0 + move32(); windowed_samples[frameno * L_FRAME_MAX + 1] = L_deposit_l( overlap_mode[frameno + 1] ); // Q0 + move32(); Copy_Scale_sig_16_32( tcx20Win, windowed_samples + add( imult1616( frameno, L_FRAME_MAX ), 2 ), add( L_subframe, shr( add( left_overlap, right_overlap ), 1 ) ), 0 ); *q_win = s_min( *q_win, sub( L_norm_arr( windowed_samples + add( imult1616( frameno, L_FRAME_MAX ), 2 ), add( L_subframe, shr( add( left_overlap, right_overlap ), 1 ) ) ), 1 ) ); move16(); @@ -963,12 +966,12 @@ void core_signal_analysis_high_bitrate_ivas_fx( move16(); #ifdef MSAN_FIX - Scale_sig32( windowed_samples + frameno * L_FRAME_MAX + 2, win_len, *q_win ); // q_win + Scale_sig32( windowed_samples + frameno * L_FRAME_MAX + 2, win_len[frameno], *q_win ); // q_win #endif IF( EQ_16( frameno, 1 ) ) { - Scale_sig32( windowed_samples + 2, win_len, sub( *q_win, Q_win_temp[0] ) ); // q_win + Scale_sig32( windowed_samples + 2, win_len[0], sub( *q_win, Q_win_temp[0] ) ); // q_win } } } diff --git a/lib_enc/ivas_front_vad.c b/lib_enc/ivas_front_vad.c index d5be6f060..f5da32608 100644 --- a/lib_enc/ivas_front_vad.c +++ b/lib_enc/ivas_front_vad.c @@ -282,13 +282,7 @@ ivas_error front_vad_fx( noise_est_pre_32fx( Etot_fx, hFrontVads[0]->ini_frame, hFrontVad->hNoiseEst, 0, 0, 0 ); /* wb_vad */ - Word16 scale = add( hFrontVads[n]->hNoiseEst->q_bckr, L_norm_arr( hFrontVads[n]->hNoiseEst->bckr_fx, NB_BANDS ) ); - scale = s_min( scale, add( hFrontVads[n]->hNoiseEst->q_enrO, L_norm_arr( hFrontVads[n]->hNoiseEst->enrO_fx, NB_BANDS ) ) ); - scale = s_min( q_fr_bands[n], scale ); - - scale_sig32( hFrontVads[n]->hNoiseEst->bckr_fx, NB_BANDS, sub( scale, hFrontVads[n]->hNoiseEst->q_bckr ) ); // scale - hFrontVads[n]->hNoiseEst->q_bckr = scale; - move16(); + Word16 scale = s_min( q_fr_bands[n], add( hFrontVads[n]->hNoiseEst->q_enrO, L_norm_arr( hFrontVads[n]->hNoiseEst->enrO_fx, NB_BANDS ) ) ); scale_sig32( hFrontVads[n]->hNoiseEst->enrO_fx, NB_BANDS, sub( scale, hFrontVads[n]->hNoiseEst->q_enrO ) ); // scale hFrontVads[n]->hNoiseEst->q_enrO = scale; diff --git a/lib_enc/ivas_stereo_classifier.c b/lib_enc/ivas_stereo_classifier.c index e840a0b80..83386836e 100644 --- a/lib_enc/ivas_stereo_classifier.c +++ b/lib_enc/ivas_stereo_classifier.c @@ -909,15 +909,30 @@ void unclr_classifier_td_fx( score = Mpy_32_32( score, hStereoClassif->relE_0_1_fx ); // Q31 /* rising edge detection on relE */ - Word32 L_tmp = 0; + Word32 L_tmp = 0, tmp32; move32(); - Word16 L_tmp_e = 0; + Word16 L_tmp_e = 0, flag = 0; move16(); + move16(); + tmp32 = hStereoClassif->relE_buf_fx[0]; FOR( i = 0; i < UNCLR_L_RELE; i++ ) { L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_e, hStereoClassif->relE_buf_fx[i], 0, &L_tmp_e ); + IF( NE_32( tmp32, hStereoClassif->relE_buf_fx[i] ) ) + { + flag = 1; + move16(); + } + } + IF( EQ_16( flag, 1 ) ) + { + relE_ST = L_shl( Mpy_32_32( L_tmp, ONE_BY_UNCLR_L_RELE_Q31 ), L_tmp_e ); // Q31 + } + ELSE + { + relE_ST = hStereoClassif->relE_buf_fx[0]; + move16(); } - relE_ST = L_shl( Mpy_32_32( L_tmp, ONE_BY_UNCLR_L_RELE_Q31 ), L_tmp_e ); // Q31 IF( hStereoClassif->relE_0_1_fx > relE_ST ) { @@ -1020,15 +1035,31 @@ void unclr_classifier_dft_fx( /* rising edge detector on relE */ // relE_ST = mean(hStereoClassif->relE_buf, UNCLR_L_RELE); - Word32 L_tmp = 0; + Word32 L_tmp = 0, tmp32; move32(); - Word16 L_tmp_e = 0; + Word16 L_tmp_e = 0, flag = 0; + move16(); move16(); + tmp32 = hStereoClassif->relE_buf_fx[0]; + move32(); FOR( i = 0; i < UNCLR_L_RELE; i++ ) { L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_e, hStereoClassif->relE_buf_fx[i], 0, &L_tmp_e ); + IF( NE_32( tmp32, hStereoClassif->relE_buf_fx[i] ) ) + { + flag = 1; + move16(); + } + } + IF( EQ_16( flag, 1 ) ) + { + relE_ST = L_shl( Mpy_32_32( L_tmp, ONE_BY_UNCLR_L_RELE_Q31 ), L_tmp_e ); // Q31 + } + ELSE + { + relE_ST = hStereoClassif->relE_buf_fx[0]; + move16(); } - relE_ST = L_shl( Mpy_32_32( L_tmp, ONE_BY_UNCLR_L_RELE_Q31 ), L_tmp_e ); // Q31 IF( GT_32( hStereoClassif->relE_0_1_fx, relE_ST ) ) { diff --git a/lib_enc/ivas_stereo_dft_td_itd.c b/lib_enc/ivas_stereo_dft_td_itd.c index 3cccae9c1..e64e5a1ec 100644 --- a/lib_enc/ivas_stereo_dft_td_itd.c +++ b/lib_enc/ivas_stereo_dft_td_itd.c @@ -116,7 +116,7 @@ static void stereo_td_get_td_itd_fx( IF( itd != 0 ) { - *td_itd_32 = extract_l( L_shr( L_add( temp_add, EPSILON_FX ), sub( 14, temp_e ) ) ); + *td_itd_32 = extract_l( L_shl( L_shr( L_add( temp_add, EPSILON_FX ), sub( 15, temp_e ) ), 1 ) ); } ELSE { diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c index d525dad12..2bc32ac8a 100644 --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -665,9 +665,10 @@ void stereo_mdct_core_enc_fx( { q_spectrum = s_min( q_spectrum, sub( Q31, st->hIGFEnc->spec_be_igf_e ) ); } + q_spectrum = sub( Q31, st->hTcxEnc->spectrum_e[n] ); + Scale_sig32( orig_spectrum_fx[ch][n], N_TCX10_MAX, sub( q_spectrum, sub( Q31, p_orig_spectrum_e[ch] ) ) ); /* q_spectrum */ - q_spectrum = sub( Q31, st->hTcxEnc->spectrum_e[n] ); set16_fx( exp_powerSpec[ch], sub( Q31, q_powSpec[ch] ), N_MAX + L_MDCT_OVLP_MAX ); ProcessIGF_ivas_fx( st, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[ch][n], &q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 ); @@ -706,9 +707,10 @@ void stereo_mdct_core_enc_fx( { q_spectrum = s_min( q_spectrum, sub( Q31, st->hIGFEnc->spec_be_igf_e ) ); } + q_spectrum = sub( Q31, st->hTcxEnc->spectrum_e[n] ); + Scale_sig32( orig_spectrum_fx[ch][n], N_TCX10_MAX, sub( q_spectrum, sub( Q31, p_orig_spectrum_e[ch] ) ) ); /* q_spectrum */ - q_spectrum = sub( Q31, st->hTcxEnc->spectrum_e[n] ); set16_fx( exp_powerSpec[ch], sub( Q31, q_powSpec[ch] ), N_MAX + L_MDCT_OVLP_MAX ); ProcessIGF_ivas_fx( st, st->hTcxEnc->spectrum_fx[n], orig_spectrum_fx[ch][n], &q_spectrum, &powerSpec_fx[ch][n * L_subframeTCX], &exp_powerSpec[ch][n * L_subframeTCX], st->core == TCX_20_CORE, n, hCPE->hCoreCoder[0]->sp_aud_decision0, 0 ); diff --git a/lib_enc/vad_fx.c b/lib_enc/vad_fx.c index a076f7a74..9ecca6975 100644 --- a/lib_enc/vad_fx.c +++ b/lib_enc/vad_fx.c @@ -1915,18 +1915,18 @@ Word16 wb_vad_ivas_fx( Word32 L_snr, L_snr_sum; Word32 ftmp, ftmp1, ftmp2; - Word16 m_noise_local, e_noise, e_num, m_num, snr, snr_tmp, shift_snr; - + Word16 m_noise_local, e_noise, e_num, m_num, snr_tmp, shift_snr, q_snr_tmp, q_snr; + Word32 L_snr_tmp; Word16 snr_sumt; Word32 L_vad_thr; Word16 hangover_hd; Word16 snr_idx; - Word16 delta1, delta2, delta3, delta4; + Word32 delta1, delta2, delta3, delta4; Word16 flag_he1; Word16 stmp; Word32 L_msnr, L_mssnr = 0, L_mssnr_hov; - Word16 j, tmp, tmp1, tmp2; + Word16 j, tmp, tmp2; Word32 L_tmp, L_tmp1, L_tmp2; Word32 L_snr18, L_snr19; /* Q4 */ @@ -1938,7 +1938,7 @@ Word16 wb_vad_ivas_fx( Word32 L_snr_sum_HE_SAD; /* Q4 */ Word16 snr_sum_HE_SAD; /*Q8 log */ Word16 sign_thr_HE_SAD, min_snr_HE_SAD; - + Word32 L_snr_sumt; Word16 thr1_ol; Word32 L_snr_sum_ol; @@ -1950,6 +1950,7 @@ Word16 wb_vad_ivas_fx( Word32 L_accum_ener_H; Word16 vad_bwidth_fx; Word16 last_7k2_coder_type; + Word16 q_shift; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); @@ -2125,15 +2126,15 @@ Word16 wb_vad_ivas_fx( IF( snr_idx == 0 ) { stmp = 6; - move16(); + move32(); delta1 = 0; - move16(); /*0.0f in Q13 */ + move32(); /*0.0f in Q16 */ delta2 = 0; - move16(); /*0.0f in Q13 */ + move32(); /*0.0f in Q16 */ delta3 = 0; - move16(); /*0.0f in Q13 */ + move32(); /*0.0f in Q16 */ delta4 = 0; - move16(); + move32(); /*0.0f in Q16 */ /*vad_thr = 2.4f*lp_snr - 42.2f; @@ -2147,15 +2148,15 @@ Word16 wb_vad_ivas_fx( ELSE IF( EQ_16( snr_idx, 1 ) ) { stmp = 6; - move16(); - delta1 = 819; - move16(); /*0.1f in Q13 */ - delta2 = 1638; - move16(); /*0.2f in Q13 */ - delta3 = 1638; - move16(); /*0.2f in Q13 */ - delta4 = 1638; - move16(); /*0.2f in Q13 */ + move32(); + delta1 = 6554; + move32(); /*0.1f in Q16 */ + delta2 = 13107; + move32(); /*0.2f in Q16 */ + delta3 = 13107; + move32(); /*0.2f in Q16 */ + delta4 = 13107; + move32(); /*0.2f in Q16 */ /* vad_thr = 2.4f*lp_snr - 40.2f; vad_thr = min(vad_thr, 80); @@ -2168,15 +2169,15 @@ Word16 wb_vad_ivas_fx( ELSE { stmp = 9; - move16(); - delta1 = 1638; - move16(); /*0.2f in Q13 */ - delta2 = 3277; - move16(); /*0.4f in Q13 */ - delta3 = 2458; - move16(); /*0.3f in Q13 */ - delta4 = 3277; - move16(); /*0.4f in Q13 */ + move32(); + delta1 = 13107; + move32(); /*0.2f in Q16 */ + delta2 = 26214; + move32(); /*0.4f in Q16 */ + delta3 = 19661; + move32(); /*0.3f in Q16 */ + delta4 = 26214; + move32(); /*0.4f in Q16 */ /* vad_thr = 2.5f*lp_snr - 10.0f; vad_thr = max(vad_thr, 1); */ @@ -2203,7 +2204,12 @@ Word16 wb_vad_ivas_fx( snr_sum_HE_SAD = 0; move16(); - + L_snr_sumt = 0; + move32(); + q_snr = 0; + move16(); + move16(); + q_shift = add( sub( q_fr_bands, hNoiseEst->q_bckr ), 15 - 4 ); FOR( i = st_fx->min_band; i <= st_fx->max_band; i++ ) { ftmp = L_add( *pt1++, 0 ); @@ -2225,15 +2231,15 @@ Word16 wb_vad_ivas_fx( IF( ftmp2 != 0 ) { e_num = norm_l( L_tmp1 ); - m_num = extract_h( L_shl( L_tmp1, e_num ) ); + m_num = extract_h( L_shl( L_tmp1, e_num ) ); // q_fr_bands+1+e_num-16 e_noise = norm_l( ftmp2 ); - m_noise_local = extract_h( L_shl( ftmp2, e_noise ) ); + m_noise_local = extract_h( L_shl( ftmp2, e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 - m_num = shr( m_num, 1 ); - shift_snr = add( sub( e_num, e_noise ), 15 - 4 ); + m_num = shr( m_num, 1 ); // q_fr_bands+e_num-16 + shift_snr = add( sub( e_num, e_noise ), q_shift ); - snr_tmp = div_s( m_num, m_noise_local ); + snr_tmp = div_s( m_num, m_noise_local ); // q_fr_bands+e_num-hNoiseEst->q_bckr-e_noise L_snr = L_shr_o( snr_tmp, shift_snr, &Overflow ); /* L_snr in Q4 */ } ELSE @@ -2248,15 +2254,15 @@ Word16 wb_vad_ivas_fx( IF( ftmp2 != 0 ) { e_num = norm_l( L_tmp2 ); - m_num = extract_h( L_shl( L_tmp2, e_num ) ); + m_num = extract_h( L_shl( L_tmp2, e_num ) ); // q_fr_bands+1+e_num-16 e_noise = norm_l( ftmp2 ); - m_noise_local = extract_h( L_shl( ftmp2, e_noise ) ); + m_noise_local = extract_h( L_shl( ftmp2, e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 - m_num = shr( m_num, 1 ); - shift_snr = add( sub( e_num, e_noise ), 15 - 4 ); + m_num = shr( m_num, 1 ); // q_fr_bands+e_num-16 + shift_snr = add( sub( e_num, e_noise ), q_shift ); - snr_tmp = div_s( m_num, m_noise_local ); + snr_tmp = div_s( m_num, m_noise_local ); // q_fr_bands+e_num-hNoiseEst->q_bckr-e_noise L_snr = L_shr_o( snr_tmp, shift_snr, &Overflow ); /* L_snr in Q4 */ } ELSE @@ -2273,46 +2279,48 @@ Word16 wb_vad_ivas_fx( /* snr[i] = (float)log10(snr[i]); */ - snr = vad_snr_log_fx( L_snr, ONE_LG10 ); + Word16 exp = norm_l( L_snr ); + Word16 val = Log2_norm_lc( L_shl( L_snr, exp ) ); + exp = sub( sub( 30, exp ), Q4 ); + L_snr = L_mac( L_deposit_h( exp ), val, 1 ); // Q16 + L_snr = Mpy_32_16_1( L_snr, 9864 /* log2 in Q15 */ ); // Q16 /* snr_sumt += snr[i];*/ - snr_sumt = add( snr_sumt, shr( snr, 4 ) ); /*Q4 */ - + L_snr_sumt = L_add( L_snr_sumt, L_snr ); // Q16 - tmp = shl_o( snr, 5, &Overflow ); /* Q8 -> Q13 */ IF( LT_16( i, 2 ) ) { - tmp = add_o( tmp, delta1, &Overflow ); /*Q13 */ + ftmp = L_add( L_snr, delta1 ); // Q16 } ELSE IF( LT_16( i, 7 ) ) { - tmp = add_o( tmp, delta2, &Overflow ); /*Q13 */ + ftmp = L_add( L_snr, delta2 ); // Q16 } ELSE IF( LT_16( i, 18 ) ) { - tmp = add_o( tmp, delta3, &Overflow ); /*Q13 */ + ftmp = L_add( L_snr, delta3 ); // Q16 } ELSE { - tmp = add_o( tmp, delta4, &Overflow ); /*Q13 */ + ftmp = L_add( L_snr, delta4 ); // Q16 } - tmp1 = tmp; - move16(); /* ftmp1 = ftmp; */ - sub( 0, 0 ); - IF( i < 7 ) + ftmp1 = ftmp; // Q16 + move32(); + + if ( LT_16( i, 7 ) ) { - tmp1 = add_o( tmp, 3277, &Overflow ); /*.4 in Q13 ftmp1 = ftmp + 0.4f; */ + ftmp1 = L_add( ftmp, 26214 /*0.4 in Q16*/ ); // Q16 } - tmp = s_min( tmp, 16384 ); /* Q13, ftmp = min(ftmp, 2.0f); */ - tmp1 = s_min( tmp1, 16384 ); /* Q13, ftmp1 = min(ftmp1, 2.0f); */ + ftmp = L_min( ftmp, 2 << 16 ); // Q16 + ftmp1 = L_min( ftmp1, 2 << 16 ); // Q16 - Word16 norm_tmp = norm_l( tmp ); - Word32 scaled_tmp = L_shl( tmp, norm_tmp ); /*13+norm_tmp*/ + Word16 norm_tmp = norm_l( ftmp ); + Word32 scaled_tmp = L_shl( ftmp, norm_tmp ); /*16+norm_tmp*/ L_msnr = scaled_tmp; move32(); - L_msnr_e = sub( 18, norm_tmp ); + L_msnr_e = sub( 15, norm_tmp ); FOR( j = 1; j < stmp; j++ ) { /* Q13*Q13 +1 -16 +2 = Q13 */ @@ -2335,8 +2343,8 @@ Word16 wb_vad_ivas_fx( move16(); } - norm_tmp = norm_l( tmp1 ); - scaled_tmp = L_shl( tmp1, norm_tmp ); /*13+norm_tmp*/ + norm_tmp = norm_l( ftmp1 ); + scaled_tmp = L_shl( ftmp1, norm_tmp ); /*13+norm_tmp*/ L_msnr = scaled_tmp; move32(); L_msnr_e = sub( 18, norm_tmp ); @@ -2351,39 +2359,47 @@ Word16 wb_vad_ivas_fx( /* snr[i] = fr_enr / st->bckr[i] = L_tmp1/st->bckr[i];*/ IF( hNoiseEst->bckr_fx[i] != 0 ) { - e_num = norm_l( L_tmp1 ); - m_num = extract_h( L_shl( L_tmp1, e_num ) ); + e_num = sub( norm_l( L_tmp1 ), 1 ); + m_num = extract_h( L_shl( L_tmp1, e_num ) ); // q_fr_bands+1+e_num-16 e_noise = norm_l( hNoiseEst->bckr_fx[i] ); - m_noise_local = extract_h( L_shl( hNoiseEst->bckr_fx[i], e_noise ) ); - - m_num = shr( m_num, 1 ); - shift_snr = add( sub( e_num, e_noise ), 15 - 4 ); + m_noise_local = extract_h( L_shl( hNoiseEst->bckr_fx[i], e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 - snr_tmp = div_s( m_num, m_noise_local ); - L_snr = L_shr_o( snr_tmp, shift_snr, &Overflow ); /* L_snr in Q4 */ + L_snr_tmp = L_deposit_h( div_s( m_num, m_noise_local ) ); // 32+q_fr_bands+e_num-hNoiseEst->q_bckr-e_noise + q_snr_tmp = add( 32, sub( add( q_fr_bands, e_num ), add( hNoiseEst->q_bckr, e_noise ) ) ); } ELSE { - L_snr = L_shr_o( L_tmp1, sub( Q3, q_fr_bands ), &Overflow ); // q_fr_bands+1 -> Q4 + L_snr_tmp = Mpy_32_16_1( L_tmp1, 18286 /* 1/E_MIN in Q6 */ ); // q_fr_bands-8 + q_snr_tmp = sub( q_fr_bands, 8 ); } - /* conditional snrsum, snr_sum = snr_sum + snr[i];*/ + exp = sub( Q4, q_snr_tmp ); + L_snr = L_shl_sat( L_snr_tmp, exp ); // Q4 sign_thr_snr_acc_fx( &L_snr_sum_HE_SAD, L_snr, sign_thr_HE_SAD, min_snr_HE_SAD ); sign_thr_snr_acc_fx( &L_snr_sum, L_snr, sign_thr, min_snr ); - L_snr = L_max( L_snr, 16 ); /*Q4, if( snr[i] < 1.0f ) { snr[i] = 1.0f;} */ + /* if( snr[i] < 1.0f ) { snr[i] = 1.0f;} */ + IF( LT_32( L_snr, 16 /* 1.0 in Q4 */ ) ) + { + L_snr_tmp = 16; + q_snr_tmp = Q4; + move32(); + move16(); + exp = 0; + move16(); + } /* float saves all snrs in an snr[] vector , in fix we only save two bands */ - IF( EQ_16( i, 18 ) ) + if ( EQ_16( i, 18 ) ) { - L_snr18 = L_add( L_snr, 0 ); /*Q4 */ + L_snr18 = L_shl_sat( L_snr_tmp, exp ); /*Q4 */ } - IF( EQ_16( i, 19 ) ) + if ( EQ_16( i, 19 ) ) { - L_snr19 = L_add( L_snr, 0 ); /* Q4 */ + L_snr19 = L_shl_sat( L_snr_tmp, exp ); /* Q4 */ } /* accumulate background noise energy in bands [0-2] and in bands [3-19]*/ @@ -2397,14 +2413,20 @@ Word16 wb_vad_ivas_fx( } /* Identify the outlier band */ - IF( GT_32( L_snr, L_snr_outlier ) ) + IF( GT_32( L_snr_tmp, L_shl_sat( L_snr_outlier, sub( q_snr_tmp, q_snr ) ) ) ) { - L_snr_outlier = L_add( L_snr, 0 ); /*Q4*/ + L_snr_outlier = L_snr_tmp; + q_snr = q_snr_tmp; snr_outlier_index = i; + move32(); + move16(); move16(); } } /* end of band loop */ + L_snr_outlier = L_shl_sat( L_snr_outlier, sub( Q4, q_snr ) ); // q_snr -> Q4 + snr_sumt = extract_h( L_shl( L_snr_sumt, Q4 ) ); // Q16 -> Q4 + test(); test(); test(); /* one additional test for ELSE IF */ -- GitLab