Loading lib_enc/vad_fx.c +54 −19 Original line number Diff line number Diff line Loading @@ -213,6 +213,29 @@ void wb_vad_init_ivas_fx( * * accumulate snr_sum with significance thresholds *-----------------------------------------------------------------*/ static void sign_thr_snr_acc_ivas_fx( Word32 *L_snr_sum, /* o: q_snr_sum */ Word16 *q_snr_sum, Word32 L_snr, /* i: q_snr */ Word16 q_snr, Word32 sign_thr, /* i: q_snr */ Word32 min_snr /* i: q_snr */ ) { /*if( snr >= sign_thr ) */ Word32 L_tmp; Word16 exp_snr_sum = sub( 31, *q_snr_sum ); L_tmp = min_snr; move32(); IF( GE_32( L_snr, sign_thr ) ) { L_tmp = L_add( L_snr, 0 ); /* q_snr */ } *L_snr_sum = BASOP_Util_Add_Mant32Exp( *L_snr_sum, exp_snr_sum, L_tmp, sub( 31, q_snr ), &exp_snr_sum ); /* q_snr */ *q_snr_sum = sub( 31, exp_snr_sum ); move32(); move32(); } static void sign_thr_snr_acc_fx( Word32 *L_snr_sum, /* o: Q4 */ Word32 L_snr, /* i: Q4 */ Loading Loading @@ -2186,6 +2209,10 @@ Word16 wb_vad_ivas_fx( L_snr_sum = L_deposit_l( 0 ); L_snr_sum_HE_SAD = L_deposit_l( 0 ); Word16 q_snr_sum = 0; Word16 q_snr_sum_HE_SAD = 0; move16(); move16(); snr_sumt = 0; move16(); L_mssnr_hov = L_deposit_l( 0 ); Loading @@ -2199,7 +2226,7 @@ Word16 wb_vad_ivas_fx( q_snr = 0; move16(); move16(); q_shift = add( sub( q_fr_bands, hNoiseEst->q_bckr ), 15 - 4 ); q_shift = add( sub( q_fr_bands, hNoiseEst->q_bckr ), 14 - 4 ); FOR( i = st_fx->min_band; i <= st_fx->max_band; i++ ) { ftmp = L_add( *pt1++, 0 ); Loading @@ -2207,12 +2234,12 @@ Word16 wb_vad_ivas_fx( ftmp2 = L_add( *pt3++, 0 ); /*fr_enr = ( 0.2f * st->enrO[i] + 0.4f * ftmp + 0.4f * ftmp1 );*/ L_tmp = Mult_32_16( hNoiseEst->enrO_fx[i], 13107 ); /* L_tmp(high word) = Qenr0fx*Q16+1 -16 -> Qener0+1 */ L_tmp1 = Madd_32_16( L_tmp, ftmp, 26214 ); /* 26214 = .4 in Q16 */ L_tmp1 = Madd_32_16( L_tmp1, ftmp1, 26214 ); /* L_tmp1 re_used a bit later for final snr[i]*/ L_tmp = Mult_32_16( hNoiseEst->enrO_fx[i], 6554 ); /* L_tmp(high word) = Qenr0fx*Q15+1 -16 -> Qener0 */ L_tmp1 = Madd_32_16( L_tmp, ftmp, 13107 ); /* 13107 = .4 in Q15 */ L_tmp1 = Madd_32_16( L_tmp1, ftmp1, 13107 ); /* L_tmp1 re_used a bit later for final snr[i]*/ L_tmp2 = Madd_32_16( L_tmp, ftmp, 19661 ); /* 19661 = 0.3 in Q16 */ L_tmp2 = Msub_32_16( L_tmp2, ftmp1, -32768 ); /* -32768= -0.5 in Q16 */ L_tmp2 = Madd_32_16( L_tmp, ftmp, 9830 ); /* 9830 = 0.3 in Q15 */ L_tmp2 = Msub_32_16( L_tmp2, ftmp1, -16384 ); /* -16384= -0.5 in Q15 */ IF( GT_32( ftmp, ftmp1 ) ) { Loading @@ -2221,12 +2248,12 @@ Word16 wb_vad_ivas_fx( IF( ftmp2 != 0 ) { e_num = norm_l( L_tmp1 ); m_num = extract_h( L_shl( L_tmp1, e_num ) ); // q_fr_bands+1+e_num-16 m_num = extract_h( L_shl( L_tmp1, e_num ) ); // q_fr_bands+e_num-16 e_noise = norm_l( ftmp2 ); m_noise_local = extract_h( L_shl( ftmp2, e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 m_num = shr( m_num, 1 ); // q_fr_bands+e_num-16 m_num = shr( m_num, 1 ); // q_fr_bands-1+e_num-16 shift_snr = add( sub( e_num, e_noise ), q_shift ); snr_tmp = div_s( m_num, m_noise_local ); // q_fr_bands+e_num-hNoiseEst->q_bckr-e_noise Loading @@ -2234,7 +2261,7 @@ Word16 wb_vad_ivas_fx( } ELSE { L_snr = L_shr_o( L_tmp1, sub( Q3, q_fr_bands ), &Overflow ); // q_fr_bands+1 -> Q4 L_snr = L_shl_o( L_tmp1, sub( Q4, q_fr_bands ), &Overflow ); // q_fr_bands -> Q4 } } ELSE Loading @@ -2244,12 +2271,12 @@ Word16 wb_vad_ivas_fx( IF( ftmp2 != 0 ) { e_num = norm_l( L_tmp2 ); m_num = extract_h( L_shl( L_tmp2, e_num ) ); // q_fr_bands+1+e_num-16 m_num = extract_h( L_shl( L_tmp2, e_num ) ); // q_fr_bands+e_num-16 e_noise = norm_l( ftmp2 ); m_noise_local = extract_h( L_shl( ftmp2, e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 m_num = shr( m_num, 1 ); // q_fr_bands+e_num-16 m_num = shr( m_num, 1 ); // q_fr_bands-1+e_num-16 shift_snr = add( sub( e_num, e_noise ), q_shift ); snr_tmp = div_s( m_num, m_noise_local ); // q_fr_bands+e_num-hNoiseEst->q_bckr-e_noise Loading @@ -2257,7 +2284,7 @@ Word16 wb_vad_ivas_fx( } ELSE { L_snr = L_shr_o( L_tmp2, sub( Q3, q_fr_bands ), &Overflow ); // q_fr_bands+1 -> Q4 L_snr = L_shl_o( L_tmp2, sub( Q4, q_fr_bands ), &Overflow ); // q_fr_bands -> Q4 } } Loading Loading @@ -2350,25 +2377,31 @@ Word16 wb_vad_ivas_fx( IF( hNoiseEst->bckr_fx[i] != 0 ) { 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 m_num = extract_h( L_shl( L_tmp1, e_num ) ); // q_fr_bands+e_num-16 e_noise = norm_l( hNoiseEst->bckr_fx[i] ); m_noise_local = extract_h( L_shl( hNoiseEst->bckr_fx[i], e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 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 ) ) ); q_snr_tmp = add( 31, sub( add( q_fr_bands, e_num ), add( hNoiseEst->q_bckr, e_noise ) ) ); } ELSE { 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 ); L_snr_tmp = Mpy_32_16_1( L_tmp1, 18286 /* 1/E_MIN in Q6 */ ); // q_fr_bands-9 q_snr_tmp = sub( q_fr_bands, 9 ); } /* conditional snrsum, snr_sum = snr_sum + snr[i];*/ IF( GT_16( q_snr_tmp, 28 ) ) // added to avoid overflow while scaling sign_thr_HE_SAD,min_snr_HE_SAD,sign_thr and min_snr while scaling to q_snr_tmp { L_snr_tmp = L_shl( L_snr_tmp, sub( 28, q_snr_tmp ) ); q_snr_tmp = 28; move16(); } 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 ); sign_thr_snr_acc_ivas_fx( &L_snr_sum_HE_SAD, &q_snr_sum_HE_SAD, L_snr_tmp, q_snr_tmp, L_shl( sign_thr_HE_SAD, sub( q_snr_tmp, 4 ) ), L_shl( min_snr_HE_SAD, sub( q_snr_tmp, 4 ) ) ); sign_thr_snr_acc_ivas_fx( &L_snr_sum, &q_snr_sum, L_snr_tmp, q_snr_tmp, L_shl( sign_thr, sub( q_snr_tmp, 4 ) ), L_shl( min_snr, sub( q_snr_tmp, 4 ) ) ); /* if( snr[i] < 1.0f ) { snr[i] = 1.0f;} */ IF( LT_32( L_snr, 16 /* 1.0 in Q4 */ ) ) Loading Loading @@ -2413,6 +2446,8 @@ Word16 wb_vad_ivas_fx( move16(); } } /* end of band loop */ L_snr_sum = L_shl_o( L_snr_sum, sub( 4, q_snr_sum ), &Overflow ); // q_snr_sum->q4 L_snr_sum_HE_SAD = L_shl_o( L_snr_sum_HE_SAD, sub( 4, q_snr_sum_HE_SAD ), &Overflow ); // q_snr_sum_HE_SAD->q4 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 Loading Loading
lib_enc/vad_fx.c +54 −19 Original line number Diff line number Diff line Loading @@ -213,6 +213,29 @@ void wb_vad_init_ivas_fx( * * accumulate snr_sum with significance thresholds *-----------------------------------------------------------------*/ static void sign_thr_snr_acc_ivas_fx( Word32 *L_snr_sum, /* o: q_snr_sum */ Word16 *q_snr_sum, Word32 L_snr, /* i: q_snr */ Word16 q_snr, Word32 sign_thr, /* i: q_snr */ Word32 min_snr /* i: q_snr */ ) { /*if( snr >= sign_thr ) */ Word32 L_tmp; Word16 exp_snr_sum = sub( 31, *q_snr_sum ); L_tmp = min_snr; move32(); IF( GE_32( L_snr, sign_thr ) ) { L_tmp = L_add( L_snr, 0 ); /* q_snr */ } *L_snr_sum = BASOP_Util_Add_Mant32Exp( *L_snr_sum, exp_snr_sum, L_tmp, sub( 31, q_snr ), &exp_snr_sum ); /* q_snr */ *q_snr_sum = sub( 31, exp_snr_sum ); move32(); move32(); } static void sign_thr_snr_acc_fx( Word32 *L_snr_sum, /* o: Q4 */ Word32 L_snr, /* i: Q4 */ Loading Loading @@ -2186,6 +2209,10 @@ Word16 wb_vad_ivas_fx( L_snr_sum = L_deposit_l( 0 ); L_snr_sum_HE_SAD = L_deposit_l( 0 ); Word16 q_snr_sum = 0; Word16 q_snr_sum_HE_SAD = 0; move16(); move16(); snr_sumt = 0; move16(); L_mssnr_hov = L_deposit_l( 0 ); Loading @@ -2199,7 +2226,7 @@ Word16 wb_vad_ivas_fx( q_snr = 0; move16(); move16(); q_shift = add( sub( q_fr_bands, hNoiseEst->q_bckr ), 15 - 4 ); q_shift = add( sub( q_fr_bands, hNoiseEst->q_bckr ), 14 - 4 ); FOR( i = st_fx->min_band; i <= st_fx->max_band; i++ ) { ftmp = L_add( *pt1++, 0 ); Loading @@ -2207,12 +2234,12 @@ Word16 wb_vad_ivas_fx( ftmp2 = L_add( *pt3++, 0 ); /*fr_enr = ( 0.2f * st->enrO[i] + 0.4f * ftmp + 0.4f * ftmp1 );*/ L_tmp = Mult_32_16( hNoiseEst->enrO_fx[i], 13107 ); /* L_tmp(high word) = Qenr0fx*Q16+1 -16 -> Qener0+1 */ L_tmp1 = Madd_32_16( L_tmp, ftmp, 26214 ); /* 26214 = .4 in Q16 */ L_tmp1 = Madd_32_16( L_tmp1, ftmp1, 26214 ); /* L_tmp1 re_used a bit later for final snr[i]*/ L_tmp = Mult_32_16( hNoiseEst->enrO_fx[i], 6554 ); /* L_tmp(high word) = Qenr0fx*Q15+1 -16 -> Qener0 */ L_tmp1 = Madd_32_16( L_tmp, ftmp, 13107 ); /* 13107 = .4 in Q15 */ L_tmp1 = Madd_32_16( L_tmp1, ftmp1, 13107 ); /* L_tmp1 re_used a bit later for final snr[i]*/ L_tmp2 = Madd_32_16( L_tmp, ftmp, 19661 ); /* 19661 = 0.3 in Q16 */ L_tmp2 = Msub_32_16( L_tmp2, ftmp1, -32768 ); /* -32768= -0.5 in Q16 */ L_tmp2 = Madd_32_16( L_tmp, ftmp, 9830 ); /* 9830 = 0.3 in Q15 */ L_tmp2 = Msub_32_16( L_tmp2, ftmp1, -16384 ); /* -16384= -0.5 in Q15 */ IF( GT_32( ftmp, ftmp1 ) ) { Loading @@ -2221,12 +2248,12 @@ Word16 wb_vad_ivas_fx( IF( ftmp2 != 0 ) { e_num = norm_l( L_tmp1 ); m_num = extract_h( L_shl( L_tmp1, e_num ) ); // q_fr_bands+1+e_num-16 m_num = extract_h( L_shl( L_tmp1, e_num ) ); // q_fr_bands+e_num-16 e_noise = norm_l( ftmp2 ); m_noise_local = extract_h( L_shl( ftmp2, e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 m_num = shr( m_num, 1 ); // q_fr_bands+e_num-16 m_num = shr( m_num, 1 ); // q_fr_bands-1+e_num-16 shift_snr = add( sub( e_num, e_noise ), q_shift ); snr_tmp = div_s( m_num, m_noise_local ); // q_fr_bands+e_num-hNoiseEst->q_bckr-e_noise Loading @@ -2234,7 +2261,7 @@ Word16 wb_vad_ivas_fx( } ELSE { L_snr = L_shr_o( L_tmp1, sub( Q3, q_fr_bands ), &Overflow ); // q_fr_bands+1 -> Q4 L_snr = L_shl_o( L_tmp1, sub( Q4, q_fr_bands ), &Overflow ); // q_fr_bands -> Q4 } } ELSE Loading @@ -2244,12 +2271,12 @@ Word16 wb_vad_ivas_fx( IF( ftmp2 != 0 ) { e_num = norm_l( L_tmp2 ); m_num = extract_h( L_shl( L_tmp2, e_num ) ); // q_fr_bands+1+e_num-16 m_num = extract_h( L_shl( L_tmp2, e_num ) ); // q_fr_bands+e_num-16 e_noise = norm_l( ftmp2 ); m_noise_local = extract_h( L_shl( ftmp2, e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 m_num = shr( m_num, 1 ); // q_fr_bands+e_num-16 m_num = shr( m_num, 1 ); // q_fr_bands-1+e_num-16 shift_snr = add( sub( e_num, e_noise ), q_shift ); snr_tmp = div_s( m_num, m_noise_local ); // q_fr_bands+e_num-hNoiseEst->q_bckr-e_noise Loading @@ -2257,7 +2284,7 @@ Word16 wb_vad_ivas_fx( } ELSE { L_snr = L_shr_o( L_tmp2, sub( Q3, q_fr_bands ), &Overflow ); // q_fr_bands+1 -> Q4 L_snr = L_shl_o( L_tmp2, sub( Q4, q_fr_bands ), &Overflow ); // q_fr_bands -> Q4 } } Loading Loading @@ -2350,25 +2377,31 @@ Word16 wb_vad_ivas_fx( IF( hNoiseEst->bckr_fx[i] != 0 ) { 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 m_num = extract_h( L_shl( L_tmp1, e_num ) ); // q_fr_bands+e_num-16 e_noise = norm_l( hNoiseEst->bckr_fx[i] ); m_noise_local = extract_h( L_shl( hNoiseEst->bckr_fx[i], e_noise ) ); // hNoiseEst->q_bckr+e_noise-16 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 ) ) ); q_snr_tmp = add( 31, sub( add( q_fr_bands, e_num ), add( hNoiseEst->q_bckr, e_noise ) ) ); } ELSE { 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 ); L_snr_tmp = Mpy_32_16_1( L_tmp1, 18286 /* 1/E_MIN in Q6 */ ); // q_fr_bands-9 q_snr_tmp = sub( q_fr_bands, 9 ); } /* conditional snrsum, snr_sum = snr_sum + snr[i];*/ IF( GT_16( q_snr_tmp, 28 ) ) // added to avoid overflow while scaling sign_thr_HE_SAD,min_snr_HE_SAD,sign_thr and min_snr while scaling to q_snr_tmp { L_snr_tmp = L_shl( L_snr_tmp, sub( 28, q_snr_tmp ) ); q_snr_tmp = 28; move16(); } 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 ); sign_thr_snr_acc_ivas_fx( &L_snr_sum_HE_SAD, &q_snr_sum_HE_SAD, L_snr_tmp, q_snr_tmp, L_shl( sign_thr_HE_SAD, sub( q_snr_tmp, 4 ) ), L_shl( min_snr_HE_SAD, sub( q_snr_tmp, 4 ) ) ); sign_thr_snr_acc_ivas_fx( &L_snr_sum, &q_snr_sum, L_snr_tmp, q_snr_tmp, L_shl( sign_thr, sub( q_snr_tmp, 4 ) ), L_shl( min_snr, sub( q_snr_tmp, 4 ) ) ); /* if( snr[i] < 1.0f ) { snr[i] = 1.0f;} */ IF( LT_32( L_snr, 16 /* 1.0 in Q4 */ ) ) Loading Loading @@ -2413,6 +2446,8 @@ Word16 wb_vad_ivas_fx( move16(); } } /* end of band loop */ L_snr_sum = L_shl_o( L_snr_sum, sub( 4, q_snr_sum ), &Overflow ); // q_snr_sum->q4 L_snr_sum_HE_SAD = L_shl_o( L_snr_sum_HE_SAD, sub( 4, q_snr_sum_HE_SAD ), &Overflow ); // q_snr_sum_HE_SAD->q4 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 Loading