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

Merge branch '3gpp_issue_1410_2' into 'main'

[allow regression] Fix for 3GPP issue 1410: Major Difference for Stereo input at noisy segments...

See merge request !1374
parents 82971b4d 5ab1f5c2
Loading
Loading
Loading
Loading
+7 −5
Original line number Diff line number Diff line
@@ -2317,8 +2317,10 @@ void perform_noise_estimation_enc_ivas_fx(
        move32();
        periodog_exp[i] = sub( Q31, add( add( sub( Q31, enerBuffer_exp ), 35 - 31 ), scale ) );
        move16();
        if ( *ptr_per_fx )
        {
            max_exp = s_max( max_exp, periodog_exp[i] );

        }
        ptr_per_fx++;
        i++;
    }
@@ -2350,8 +2352,8 @@ void perform_noise_estimation_enc_ivas_fx(
            &hFdCngEnc->msPeriodog_fx_exp_cldfb );

        ///* find common exponent for fft part and cldfb part of msperiodog */
        s1 = getScaleFactor32( msPeriodog_fx, nFFTpart );
        s2 = getScaleFactor32( &msPeriodog_fx[nFFTpart], nCLDFBpart );
        s1 = L_norm_arr( msPeriodog_fx, nFFTpart );
        s2 = L_norm_arr( &msPeriodog_fx[nFFTpart], nCLDFBpart );

        s = s_max( sub( hFdCngEnc->msPeriodog_fx_exp_fft, s1 ), sub( hFdCngEnc->msPeriodog_fx_exp_cldfb, s2 ) );
        s1 = sub( s, hFdCngEnc->msPeriodog_fx_exp_fft );
@@ -2370,7 +2372,7 @@ void perform_noise_estimation_enc_ivas_fx(

        FOR( i = 0; i < nCLDFBpart; i++ )
        {
            msPeriodog_fx[nFFTpart + i] = L_shr( msPeriodog_fx[nFFTpart + i], s_min( 31, s2 ) ); /*  hFdCngEnc->msPeriodog_fx_exp_fft */
            msPeriodog_fx[nFFTpart + i] = L_shr( msPeriodog_fx[nFFTpart + i], s2 ); /*  hFdCngEnc->msPeriodog_fx_exp_fft */
            move32();
        }
    }
+4 −47
Original line number Diff line number Diff line
@@ -775,14 +775,9 @@ ivas_error pre_proc_front_ivas_fx(
        move16();
    }

    Word16 scale = add( L_norm_arr( st->hNoiseEst->bckr_fx, NB_BANDS ), st->hNoiseEst->q_bckr );
    scale = s_min( scale, add( L_norm_arr( st->hNoiseEst->enrO_fx, NB_BANDS ), st->hNoiseEst->q_enrO ) );
    Word16 scale = add( L_norm_arr( st->hNoiseEst->enrO_fx, NB_BANDS ), st->hNoiseEst->q_enrO );
    scale = s_min( scale, fr_bands_fx_q );

    scale_sig32( st->hNoiseEst->bckr_fx, NB_BANDS, sub( scale, st->hNoiseEst->q_bckr ) );
    st->hNoiseEst->q_bckr = scale;
    move16();

    scale_sig32( st->hNoiseEst->enrO_fx, NB_BANDS, sub( scale, st->hNoiseEst->q_enrO ) );
    st->hNoiseEst->q_enrO = scale;
    move16();
@@ -917,44 +912,14 @@ ivas_error pre_proc_front_ivas_fx(
     * Correlation correction as a function of total noise level
     *----------------------------------------------------------------*/

    noise_est_down_ivas_fx( fr_bands_fx, fr_bands_fx_q, st->hNoiseEst->bckr_fx, tmpN_fx, tmpE_fx, st->min_band, st->max_band,
    noise_est_down_ivas_fx( fr_bands_fx, fr_bands_fx_q, st->hNoiseEst->bckr_fx, &st->hNoiseEst->q_bckr, tmpN_fx, &q_tmpN, tmpE_fx, &q_tmpE, st->min_band, st->max_band,
                            &st->hNoiseEst->totalNoise_fx, Etot_fx, &st->hNoiseEst->Etot_last_fx, &st->hNoiseEst->Etot_v_h2_fx );
    q_tmpN = fr_bands_fx_q;
    q_tmpE = fr_bands_fx_q;
    move16();
    move16();

    test();
    IF( lr_vad_enabled && st->idchan == 0 )
    {
        scale = add( L_norm_arr( hCPE->hFrontVad[0]->hNoiseEst->bckr_fx, NB_BANDS ), hCPE->hFrontVad[0]->hNoiseEst->q_bckr );
        scale = s_min( scale, add( L_norm_arr( hCPE->hFrontVad[1]->hNoiseEst->bckr_fx, NB_BANDS ), hCPE->hFrontVad[1]->hNoiseEst->q_bckr ) );
        scale = s_min( scale, add( L_norm_arr( fr_bands_LR_fx[0], 2 * NB_BANDS ), fr_bands_LR_fx_q[0] ) );
        scale = s_min( scale, add( L_norm_arr( fr_bands_LR_fx[1], 2 * NB_BANDS ), fr_bands_LR_fx_q[1] ) );

        scale_sig32( fr_bands_LR_fx[0], 2 * NB_BANDS, sub( scale, fr_bands_LR_fx_q[0] ) );
        fr_bands_LR_fx_q[0] = scale;
        move16();
        scale_sig32( fr_bands_LR_fx[1], 2 * NB_BANDS, sub( scale, fr_bands_LR_fx_q[1] ) );
        fr_bands_LR_fx_q[1] = scale;
        move16();

        scale_sig32( hCPE->hFrontVad[0]->hNoiseEst->bckr_fx, NB_BANDS, sub( scale, hCPE->hFrontVad[0]->hNoiseEst->q_bckr ) );
        hCPE->hFrontVad[0]->hNoiseEst->q_bckr = scale;
        move16();
        scale_sig32( hCPE->hFrontVad[1]->hNoiseEst->bckr_fx, NB_BANDS, sub( scale, hCPE->hFrontVad[1]->hNoiseEst->q_bckr ) );
        hCPE->hFrontVad[1]->hNoiseEst->q_bckr = scale;
        move16();

        noise_est_down_ivas_fx( fr_bands_LR_fx[0], fr_bands_LR_fx_q[0], hCPE->hFrontVad[0]->hNoiseEst->bckr_fx, tmpN_LR_fx[0], tmpE_LR_fx[0], st->min_band, st->max_band, &hCPE->hFrontVad[0]->hNoiseEst->totalNoise_fx, Etot_LR_fx[0], &hCPE->hFrontVad[0]->hNoiseEst->Etot_last_fx, &hCPE->hFrontVad[0]->hNoiseEst->Etot_v_h2_fx );
        noise_est_down_ivas_fx( fr_bands_LR_fx[1], fr_bands_LR_fx_q[1], hCPE->hFrontVad[1]->hNoiseEst->bckr_fx, tmpN_LR_fx[1], tmpE_LR_fx[1], st->min_band, st->max_band, &hCPE->hFrontVad[1]->hNoiseEst->totalNoise_fx, Etot_LR_fx[1], &hCPE->hFrontVad[1]->hNoiseEst->Etot_last_fx, &hCPE->hFrontVad[1]->hNoiseEst->Etot_v_h2_fx );

        q_tmpN_LR[0] = q_tmpE_LR[0] = scale;
        move16();
        move16();
        q_tmpN_LR[1] = q_tmpE_LR[1] = scale;
        move16();
        move16();
        noise_est_down_ivas_fx( fr_bands_LR_fx[0], fr_bands_LR_fx_q[0], hCPE->hFrontVad[0]->hNoiseEst->bckr_fx, &hCPE->hFrontVad[0]->hNoiseEst->q_bckr, tmpN_LR_fx[0], &q_tmpN_LR[0], tmpE_LR_fx[0], &q_tmpE_LR[0], st->min_band, st->max_band, &hCPE->hFrontVad[0]->hNoiseEst->totalNoise_fx, Etot_LR_fx[0], &hCPE->hFrontVad[0]->hNoiseEst->Etot_last_fx, &hCPE->hFrontVad[0]->hNoiseEst->Etot_v_h2_fx );
        noise_est_down_ivas_fx( fr_bands_LR_fx[1], fr_bands_LR_fx_q[1], hCPE->hFrontVad[1]->hNoiseEst->bckr_fx, &hCPE->hFrontVad[1]->hNoiseEst->q_bckr, tmpN_LR_fx[1], &q_tmpN_LR[1], tmpE_LR_fx[1], &q_tmpE_LR[1], st->min_band, st->max_band, &hCPE->hFrontVad[1]->hNoiseEst->totalNoise_fx, Etot_LR_fx[1], &hCPE->hFrontVad[1]->hNoiseEst->Etot_last_fx, &hCPE->hFrontVad[1]->hNoiseEst->Etot_v_h2_fx );

        corr_shiftL_fx = correlation_shift_fx( hCPE->hFrontVad[0]->hNoiseEst->totalNoise_fx ); // Q15
        corr_shiftR_fx = correlation_shift_fx( hCPE->hFrontVad[1]->hNoiseEst->totalNoise_fx ); // Q15
@@ -1310,14 +1275,6 @@ ivas_error pre_proc_front_ivas_fx(
    /*------------------------------------------------------------------*
     * Update estimated noise energy and voicing cut-off frequency
     *-----------------------------------------------------------------*/
    {
        // TODO: this scalings to be checked
        scale = s_min( Q30, add( st->hNoiseEst->q_bckr, L_norm_arr( st->hNoiseEst->bckr_fx, NB_BANDS ) ) );
        scale = s_min( scale, sub( add( fr_bands_fx_q, L_norm_arr( fr_bands_fx, 2 * NB_BANDS ) ), 4 ) );
        scale_sig32( st->hNoiseEst->bckr_fx, NB_BANDS, sub( scale, st->hNoiseEst->q_bckr ) );
        scale_sig32( fr_bands_fx, 2 * NB_BANDS, sub( scale, fr_bands_fx_q ) );
        st->hNoiseEst->q_bckr = fr_bands_fx_q = scale;
    }

    scale = s_min( Q31, s_min( add( q_tmpN, L_norm_arr( tmpN_fx, NB_BANDS ) ), add( st->hNoiseEst->q_bckr, L_norm_arr( st->hNoiseEst->bckr_fx, NB_BANDS ) ) ) );
    scale = sub( scale, 1 ); // guard bits
+6 −12
Original line number Diff line number Diff line
@@ -609,14 +609,8 @@ ivas_error front_vad_spar_fx(
        Q_inp_12k8 = hFrontVad->q_buffer_12k8;
        move16();

        scale = s_min( add( q_fr_bands[0], L_norm_arr( fr_bands_fx[0], 2 * NB_BANDS ) ), add( hFrontVad->hNoiseEst->q_bckr, L_norm_arr( hFrontVad->hNoiseEst->bckr_fx, NB_BANDS ) ) );
        scale_sig32( fr_bands_fx[0], 40, sub( scale, q_fr_bands[0] ) );                                     // scale
        scale_sig32( hFrontVad->hNoiseEst->bckr_fx, NB_BANDS, sub( scale, hFrontVad->hNoiseEst->q_bckr ) ); // scale
        hFrontVad->hNoiseEst->q_bckr = q_fr_bands[0] = scale;
        move16();
        move16();

        noise_est_down_ivas_fx( fr_bands_fx[0], q_fr_bands[0], hFrontVad->hNoiseEst->bckr_fx, tmpN_fx, tmpE_fx, st->min_band, st->max_band,
        Word16 q_tmpN, q_tmpE;
        noise_est_down_ivas_fx( fr_bands_fx[0], q_fr_bands[0], hFrontVad->hNoiseEst->bckr_fx, &hFrontVad->hNoiseEst->q_bckr, tmpN_fx, &q_tmpN, tmpE_fx, &q_tmpE, st->min_band, st->max_band,
                                &hFrontVad->hNoiseEst->totalNoise_fx, Etot_fx[0], &hFrontVad->hNoiseEst->Etot_last_fx, &hFrontVad->hNoiseEst->Etot_v_h2_fx );

        corr_shift_fx = correlation_shift_fx( hFrontVad->hNoiseEst->totalNoise_fx ); /* Q15 */
@@ -727,18 +721,18 @@ ivas_error front_vad_spar_fx(
        Scale_sig32( epsP_fx, M + 1, scale ); // Q_esp

        scale = add( hFrontVad->hNoiseEst->ave_enr_q, s_min( L_norm_arr( hFrontVad->hNoiseEst->ave_enr_fx, NB_BANDS ), L_norm_arr( hFrontVad->hNoiseEst->ave_enr2_fx, NB_BANDS ) ) );
        scale = s_min( scale, add( hFrontVad->hNoiseEst->q_bckr, L_norm_arr( tmpE_fx, NB_BANDS ) ) );
        scale = s_min( scale, add( q_tmpE, L_norm_arr( tmpE_fx, NB_BANDS ) ) );
        scale = sub( s_min( scale, Q31 ), 1 );
        scale_sig32( hFrontVad->hNoiseEst->ave_enr_fx, NB_BANDS, sub( scale, hFrontVad->hNoiseEst->ave_enr_q ) );
        scale_sig32( hFrontVad->hNoiseEst->ave_enr2_fx, NB_BANDS, sub( scale, hFrontVad->hNoiseEst->ave_enr_q ) );
        scale_sig32( tmpE_fx, NB_BANDS, sub( scale, hFrontVad->hNoiseEst->q_bckr ) );
        scale_sig32( tmpE_fx, NB_BANDS, sub( scale, q_tmpE ) );
        hFrontVad->hNoiseEst->ave_enr_q = scale;
        move16();

        scale = add( hFrontVad->hNoiseEst->q_bckr, s_min( L_norm_arr( hFrontVad->hNoiseEst->bckr_fx, NB_BANDS ), L_norm_arr( tmpN_fx, NB_BANDS ) ) );
        scale = s_min( add( hFrontVad->hNoiseEst->q_bckr, L_norm_arr( hFrontVad->hNoiseEst->bckr_fx, NB_BANDS ) ), add( q_tmpN, L_norm_arr( tmpN_fx, NB_BANDS ) ) );
        scale = sub( s_min( Q31, scale ), 1 ); // guard bits
        scale_sig32( hFrontVad->hNoiseEst->bckr_fx, NB_BANDS, sub( scale, hFrontVad->hNoiseEst->q_bckr ) );
        scale_sig32( tmpN_fx, NB_BANDS, sub( scale, hFrontVad->hNoiseEst->q_bckr ) );
        scale_sig32( tmpN_fx, NB_BANDS, sub( scale, q_tmpN ) );
        hFrontVad->hNoiseEst->q_bckr = scale;
        move16();

+75 −18
Original line number Diff line number Diff line
@@ -740,8 +740,11 @@ void noise_est_down_ivas_fx(
    const Word32 fr_bands[], /* i  : per band input energy (contains 2 vectors) q_fr_bands */
    const Word16 q_fr_bands, /* i  : Q of fr_bands                                         */
    Word32 bckr[],           /* i/o: per band background noise energy estimate  q_fr_bands */
    Word16 *q_bckr,
    Word32 tmpN[], /* o  : temporary noise update                     q_fr_bands */
    Word16 *q_tmpN,
    Word32 enr[], /* o  : averaged energy over both subframes                   */
    Word16 *q_enr,
    const Word16 min_band, /* i  : minimum critical band                                 */
    const Word16 max_band, /* i  : maximum critical band                                 */
    Word16 *totalNoise,    /* o  : noise estimate over all critical bands                */
@@ -755,13 +758,17 @@ void noise_est_down_ivas_fx(
    const Word32 *pt1, *pt2;
    Word16 i;
    Word16 e_Noise, f_Noise;
    Word32 e_min;
    Word32 totalNoise_temp;
    Word32 L_Etot, L_Etot_last, L_Etot_v_h2, L_Etot_v;
    Word64 sum;
    Word16 q_sum;
    Word32 enr32[NB_BANDS], bckr32[NB_BANDS], tmpN32[NB_BANDS];
    Word16 enr_q[NB_BANDS], bckr_q[NB_BANDS], tmpN_q[NB_BANDS];
    Word16 shift, shift1, shift2, shift3;
    Word64 tmpN64, tmp, enr64;

    e_min = L_shl( E_MIN_FXQ31, sub( q_fr_bands, Q31 ) ); // q_fr_bands
    Copy32( bckr, bckr32, NB_BANDS );
    set16_fx( bckr_q, *q_bckr, NB_BANDS );

    L_Etot = L_shl( Etot, 16 ); /*Q24 for later AR1 computations*/
    L_Etot_last = L_shl( *Etot_last, 16 );
@@ -778,7 +785,7 @@ void noise_est_down_ivas_fx(
    {
        sum = W_mac_32_16( sum, bckr[i], 1 ); // q_fr_bands+1
    }
    q_sum = add( q_fr_bands, 1 );
    q_sum = add( *q_bckr, 1 );
    IF( sum == 0 )
    {
        sum = W_mult0_32_32( E_MIN_FXQ31, add( sub( max_band, min_band ), 1 ) ); // Q31
@@ -808,8 +815,12 @@ void noise_est_down_ivas_fx(
    FOR( i = 0; i < NB_BANDS; i++ )
    {
        /* enr[i] = 0.5f * ( *pt1++ + *pt2++ ); */
        enr[i] = W_extract_h( W_mac_32_32( W_mult_32_32( *pt1, ONE_IN_Q30 ), *pt2, ONE_IN_Q30 ) ); // q_fr_bands+30+1-32+1 = q_fr_bands
        enr64 = W_mac_32_32( W_mult_32_32( *pt1, ONE_IN_Q29 ), *pt2, ONE_IN_Q29 ); // q_fr_bands + 1 + Q29 + 1 (0.5 handle here)
        shift = W_norm( enr64 );
        enr32[i] = W_extract_h( W_shl( enr64, shift ) );
        move32();
        enr_q[i] = sub( add( q_fr_bands, shift ), 1 );
        move16();
        pt1++;
        pt2++;
    }
@@ -817,20 +828,66 @@ void noise_est_down_ivas_fx(
    /*-----------------------------------------------------------------*
     * Background noise energy update
     *-----------------------------------------------------------------*/

    FOR( i = 0; i < NB_BANDS; i++ )
    {
        /* tmpN[i] = (1-ALPHA) * bckr[i] + ALPHA * enr[i]; */
        /* handle  div by zero in find_tilt_fx  */
        tmpN[i] = L_max( Madd_32_16( Mpy_32_16_1( bckr[i], ALPHAM1_FX ), enr[i], ALPHA_FX ), e_min ); // q_fr_bands

        tmpN64 = W_mult_32_16( bckr32[i], ALPHAM1_FX );
        tmp = W_mult_32_16( enr32[i], ALPHA_FX );

        shift = s_min( bckr_q[i], enr_q[i] );
        tmpN64 = W_add( W_shl( tmpN64, sub( shift, bckr_q[i] ) ), W_shl( tmp, sub( shift, enr_q[i] ) ) ); // shift + q16
        shift1 = W_norm( tmpN64 );
        tmpN32[i] = W_extract_h( W_shl( tmpN64, shift1 ) ); // shift + q16 + shift1 - 32
        move32();
        tmpN_q[i] = sub( add( add( Q16, shift ), shift1 ), 32 );
        move16();

        /*  if( tmpN[i] < bckr[i] ) { bckr[i] = tmpN[i];  }*/
        /* Defend to increase noise estimate: keep as it is or decrease  */
        bckr[i] = L_max( L_min( bckr[i], tmpN[i] ), e_min ); // q_fr_bands
        IF( GT_32( E_MIN_FXQ31, L_shl_sat( tmpN32[i], sub( 31, tmpN_q[i] ) ) ) )
        {
            tmpN32[i] = E_MIN_FXQ31;
            tmpN_q[i] = 31;
            move32();
            move16();
        }

        IF( GT_32( bckr32[i], L_shl_sat( tmpN32[i], sub( bckr_q[i], tmpN_q[i] ) ) ) )
        {
            bckr32[i] = tmpN32[i]; /* Defend to increase noise estimate: keep as it is or decrease  */
            bckr_q[i] = tmpN_q[i];
            move32();
            move16();
        }
    }

    /* Scaling to common Q*/
    shift1 = bckr_q[0], shift2 = enr_q[0], shift3 = tmpN_q[0];
    move16();
    move16();
    move16();

    FOR( i = 1; i < NB_BANDS; i++ )
    {
        shift1 = s_min( shift1, bckr_q[i] );
        shift2 = s_min( shift2, enr_q[i] );
        shift3 = s_min( shift3, tmpN_q[i] );
    }
    FOR( i = 0; i < NB_BANDS; i++ )
    {
        bckr[i] = L_shl( bckr32[i], sub( shift1, bckr_q[i] ) );
        enr[i] = L_shl( enr32[i], sub( shift2, enr_q[i] ) );
        tmpN[i] = L_shl( tmpN32[i], sub( shift3, tmpN_q[i] ) );
        move32();
        move32();
        move32();
    }
    *q_bckr = shift1;
    *q_enr = shift2;
    *q_tmpN = shift3;
    move16();
    move16();
    move16();
    /*------------------------------------------------------------------*
     * Energy variation update
     *------------------------------------------------------------------*/
+11 −8
Original line number Diff line number Diff line
@@ -355,8 +355,11 @@ void noise_est_down_ivas_fx(
    const Word32 fr_bands[], /* i  : per band i   energy (contains 2 vectors)   */
    const Word16 q_fr_bands, /* i  : Q of fr_bands                              */
    Word32 bckr[],           /* i/o: per band background noise energy estimate  */
    Word16 *q_bckr,
    Word32 tmpN[], /* o  : temporary noise update                     */
    Word16 *q_tmpN,
    Word32 enr[], /* o  : averaged energy over both subframes        */
    Word16 *q_enr,
    const Word16 min_band, /* i  : minimum critical band                      */
    const Word16 max_band, /* i  : maximum critical band                      */
    Word16 *totalNoise,    /* o  : noise estimate over all critical bands     */