Commit d6e8c019 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Merge branch '3gpp_issue_1461_fix' into 'main'

Fix for 3GPP issue 1461: Issue with VAD sensitivity in SBA DTX mode at 48 and 80 kbps [allow regression]

See merge request !1495
parents acc607c8 fdd58b16
Loading
Loading
Loading
Loading
+54 −19
Original line number Diff line number Diff line
@@ -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 */
@@ -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 );
@@ -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 );
@@ -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 ) )
        {
@@ -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
@@ -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
@@ -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
@@ -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
            }
        }

@@ -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 */ ) )
@@ -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