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

ApplyFdCng_fx integration in acelp_core_dec and stereo_mdct_core_dec

ApplyFdCng_fx is plugged-in at all call locations
present in acelp_core_dec and stereo_mdct_core_dec.
parent d14fe3dd
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1193,7 +1193,7 @@ void minimum_statistics_fx(
            {
                /* calculate scalar with normalized msPeriodogSum[cnt], exponent -2*s1 */
                s1 = norm_l( msPeriodogSum[cnt] );
                msPeriodogSum16 = round_fx( L_shl( msPeriodogSum[cnt], s1 ) );
                msPeriodogSum16 = round_fx_sat( L_shl( msPeriodogSum[cnt], s1 ) );
                scalar = L_mult( msPeriodogSum16, msPeriodogSum16 );

                /* calculate difference, both elements in 16Q15 format, use absolute value
+381 −1

File changed.

Preview size limit exceeded, changes collapsed.

+77 −13
Original line number Diff line number Diff line
@@ -139,6 +139,7 @@ void initFdCngDec(
    hFdCngDec->msPeriodog_ST_exp = 0;
    hFdCngDec->hFdCngCom->fftBuffer_exp = 0;
    hFdCngDec->hFdCngCom->periodog_exp = 0;
    set32_fx(hFdCngDec->smoothed_psd_fx, 0, L_FRAME16k);
#ifdef IVAS_CODE_CNG
    set_f(hFdCngDec->hFdCngCom->sidNoiseEstLp, 0.0f, NPART);

@@ -1076,9 +1077,8 @@ Word16 ApplyFdCng_fx(
    Flag Overflow = 0;
    Flag Carry = 0;
#endif

    Word64 W_tmp;
    Word16 L_frame, last_L_frame;
    Word16 factor;
    Word32 *sidNoiseEst;

    hFdCngDec = st->hFdCngDec;
@@ -1291,7 +1291,7 @@ Word16 ApplyFdCng_fx(
                    L_tmp = norm_llQ31( L_c, L_tmp, &L_tmp_exp );
                    L_tmp_exp = sub( add( L_tmp_exp, *cngNoiseLevel_exp ), 1 );

                    // L_tmp = Mpy_32_16_1(L_tmp, hFdCngCom->fftlen); /*Q16*/
                    L_tmp = Mpy_32_16_1( L_tmp, 1 );

                    L_tmp = Mpy_32_16_1( L_tmp, shr( T_DIV_L_Frame[L_shl( L_mac( -28000, NORM_MDCT_FACTOR, 95 ), 1 - 15 )], 1 ) ); /*Q16,exp -7*/
                    L_tmp_exp = add( L_tmp_exp, -7 );                                                                              /*->Q16, L_tmp_exp */
@@ -1302,6 +1302,7 @@ Word16 ApplyFdCng_fx(
#else
                    st->hTcxDec->CngLevelBackgroundTrace_bfi_fx = ( Sqrt32( L_tmp, &L_tmp_exp ) );
#endif
                    L_tmp_exp = add( L_tmp_exp, 1 );
                    st->hTcxDec->CngLevelBackgroundTrace_bfi_exp = L_tmp_exp;
                    move16();
                }
@@ -1409,24 +1410,30 @@ Word16 ApplyFdCng_fx(
            }
            test();
            test();
            L_tmp = 0;
            W_tmp = 0;
            FOR( j = hFdCngCom->startBand; j < hFdCngCom->stopFFTbin; j++ )
            {
                L_tmp = L_add( L_tmp, L_shr( cngNoiseLevel[j], 16 ) );
                W_tmp = W_add( W_tmp, L_shr( cngNoiseLevel[j], sub( 31, *cngNoiseLevel_exp ) ) );
            }
            L_tmp_exp = add( *cngNoiseLevel_exp, 16 );
            L_tmp = W_extract_h( W_shl( W_tmp, 32 ) );
            L_tmp_exp = 31;
#ifdef BASOP_NOGLOB
            IF( EQ_16( concealWholeFrame, 1 ) && EQ_16( st->nbLostCmpt, 1 ) && ( L_shl_o( L_tmp, L_tmp_exp, &Overflow ) > 21474836 /*0.01f Q31*/ ) )
#else
            IF( EQ_16( concealWholeFrame, 1 ) && EQ_16( st->nbLostCmpt, 1 ) && ( L_shl( L_tmp, L_tmp_exp ) > 21474836 /*0.01f Q31*/ ) )
#endif
            {
                /* always set psychParameters for MDCT-Stereo ... */
                IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->hTonalMDCTConc != NULL )
                {
                    st->hTonalMDCTConc->psychParams = EQ_16( st->core, TCX_20_CORE ) ? &st->hTonalMDCTConc->psychParamsTCX20 : &st->hTonalMDCTConc->psychParamsTCX10;
                }
                /* update isf cng estimate for concealment. Do that during concealment, in order to avoid addition clean channel complexity*/
                IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && NE_16( st->core, ACELP_CORE ) )
                {
                    TonalMdctConceal_whiten_noise_shape_ivas_fx( st, L_frame, ON_FIRST_LOST_FRAME );
                }
                ELSE IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) )
                ELSE IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) || EQ_16(st->core, ACELP_CORE))
                {
                    lpc_from_spectrum( hFdCngCom, hFdCngCom->startBand, hFdCngCom->stopFFTbin, 0 );
                    E_LPC_a_lsp_conversion( hFdCngCom->A_cng, lsp_cng, st->lspold_cng, M );
@@ -1643,17 +1650,73 @@ Word16 ApplyFdCng_fx(
            {
                IF( !( hFdCngCom->msFrCnt_init_counter < hFdCngCom->msFrCnt_init_thresh ) )
                {
                    Word16 scale;
                    sidNoiseEst = hFdCngCom->sidNoiseEstLp;

                    s2 = negate( sub( WORD32_BITS, 1 ) );
                    move16();
                    /* Shape the SID noise levels in each FFT bin */
                    j = 0;
                    move16();
                    FOR( k = 0; k < hFdCngCom->nFFTpart; k++ )
                    {
                        factor = BASOP_Util_Divide3232_Scale( ( sidNoiseEst[k] + 1 ), ( hFdCngDec->partNoiseShape[k] + 1 ), &scale );
                        assert( hFdCngDec->partNoiseShape[k] >= 0 );

                        /* add DELTA as it is done in FLC version, in order to avoid num > denom */
                        facTab[k] = 0;
                        move16();
                        IF( hFdCngDec->partNoiseShape[k] != 0 )
                        {
                            s1 = norm_l( hFdCngCom->sidNoiseEst[k] );
                            L_tmp = L_shl( hFdCngCom->sidNoiseEst[k], s1 );
                            L_tmp_exp = sub( hFdCngCom->sidNoiseEstExp, s1 );
                            L_tmp = BASOP_Util_Add_Mant32Exp( hFdCngCom->sidNoiseEst[k], hFdCngCom->sidNoiseEstExp, DELTA_MANTISSA_W32, DELTA_EXPONENT, &L_tmp_exp );
                            L_tmp = L_shr( L_tmp, 1 );
                            s = add( L_tmp_exp, 1 );
                            num = extract_h( L_tmp );

                            s1 = norm_l( hFdCngDec->partNoiseShape[k] );
                            L_tmp = L_shl( hFdCngDec->partNoiseShape[k], s1 );
                            L_tmp_exp = sub( hFdCngDec->partNoiseShape_exp, s1 );
                            L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_exp, DELTA_MANTISSA_W32, DELTA_EXPONENT, &L_tmp_exp );
                            s = sub( s, L_tmp_exp );
                            denom = extract_h( L_tmp );

                            facTab[k] = div_s( num, denom );
                            move16();
                            facTabExp[k] = s;
                            move16();
                        }
                        /* Set unique exponent, IF mantissa is equal to zero */
                        IF( EQ_16( facTab[k], 0 ) )
                        {
                            facTabExp[k] = negate( sub( WORD32_BITS, 1 ) );
                            move16();
                        }
                        s2 = s_max( s2, facTabExp[k] );
                    }

                    FOR( k = 0; k < hFdCngCom->nFFTpart; k++ )
                    {
                        s = sub( facTabExp[k], s2 );
                        s = s_max( s_min( s, sub( WORD32_BITS, 1 ) ), negate( sub( WORD32_BITS, 1 ) ) );
                        FOR( ; j <= hFdCngCom->part[k]; j++ )
                        {
                            cngNoiseLevel[j] = Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], factor );
                            cngNoiseLevel[j] = L_shl( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s );
                            move32();
                        }
                    }
                    /* adapt scaling for rest of the buffer */
                    s = sub( *cngNoiseLevel_exp, add( hFdCngDec->bandNoiseShape_exp, s2 ) );
                    FOR( ; k < hFdCngCom->npart; k++ )
                    {
                        FOR( ; j <= hFdCngCom->part[k]; j++ )
                        {
                            cngNoiseLevel[j] = L_shl( cngNoiseLevel[j], s );
                            move32();
                        }
                    }
                    *cngNoiseLevel_exp = add( hFdCngDec->bandNoiseShape_exp, s2 );
                    move16();
                }
            }
            IF( EQ_16( st->codec_mode, MODE2 ) )
@@ -2157,7 +2220,7 @@ void perform_noise_estimation_dec_fx(
    Word16 *part, *psize_inv, *psize_norm;
    Word32 *fftBuffer, *periodog, *ptr_per, *ptr_r, *ptr_i;
    Word32 temp, ftemp, delta, L_tmp;
    Word16 e_temp, wght;
    Word16 e_temp, wght, periodog_exp;
    Word32 enr, enr_tot, enr_tot0;
    Word16 enr_ratio, alpha;
    Word32 *msPeriodog;
@@ -2602,7 +2665,7 @@ void perform_noise_estimation_dec_fx(
        {
            /* use power spectrum calculated in the MDCT-domain instead of calculating new power spectrum */
            periodog = power_spectrum;
            hFdCngDec->hFdCngCom->periodog_exp = 31;
            periodog_exp = 31;
        }
        ELSE
        {
@@ -2691,10 +2754,11 @@ void perform_noise_estimation_dec_fx(
                    periodog[p] = L_shl( periodog[p], tmp_s );
                }
            }
            periodog_exp = hFdCngDec->hFdCngCom->periodog_exp;
        }

        /* Adjust to the desired frequency resolution by averaging over spectral partitions for SID transmission */
        bandcombinepow( periodog, hFdCngDec->hFdCngCom->periodog_exp, sub( stopFFTbin, startBand ), part, npart, psize_inv, hFdCngDec->msPeriodog, &hFdCngDec->msPeriodog_exp );
        bandcombinepow( periodog, periodog_exp, sub( stopFFTbin, startBand ), part, npart, psize_inv, hFdCngDec->msPeriodog, &hFdCngDec->msPeriodog_exp );


        hFdCngDec->msPeriodog_exp_fft = hFdCngDec->msPeriodog_exp;
+144 −0
Original line number Diff line number Diff line
@@ -913,7 +913,151 @@ static void run_min_stats_fx(

        if ( will_estimate_noise_on_channel[0] || will_estimate_noise_on_channel[1] || st->bfi )
        {
#ifdef IVAS_FLOAT_FIXED
            Word32 power_spec_fx[L_FRAME16k];

            if ( !st->bfi )
            {
                for ( int p = 0; p < L_FRAME16k; p++ )
                {
                    if ( power_spec[p] <= (float) MAX_32 )
                    {
                        power_spec_fx[p] = (Word32) ( power_spec[p] /** ( 1u << 0 )*/ );
                    }
                    else
                    {
                        power_spec_fx[p] = MAX_32;
                    }
                }
            }

            for ( int p = 0; p < st->hFdCngDec->hFdCngCom->fftlen; p++ )
            {
                st->hFdCngDec->hFdCngCom->fftBuffer[p] = (Word32) ( st->hFdCngDec->hFdCngCom->fftBuffer_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp ) ) );
            }
            st->hFdCngDec->msNoiseEst_exp = 31 - Q4;
            for ( int p = 0; p < NPART_SHAPING; p++ )
            {
                st->hFdCngDec->msNoiseEst[p] = (Word32) ( st->hFdCngDec->msNoiseEst_float[p] * ( 1u << ( 31 - st->hFdCngDec->msNoiseEst_exp ) ) );
                st->hFdCngDec->msPeriodog_ST_fx[p] = (Word32) ( st->hFdCngDec->msPeriodog_ST[p] * ( 1u << ( 31 - st->hFdCngDec->msPeriodog_ST_exp ) ) );
            }
            st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 31 - Q3; // Q3
            for ( int p = 0; p < FFTCLDFBLEN; p++ )
            {
                st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] = (Word32) ( st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) );
            }
            for ( int p = 0; p < MSBUFLEN * NPART_SHAPING; p++ )
            {
                if ( ( st->hFdCngDec->msMinBuf_float[p] * ( 1u << Q15 ) ) >= (float) MAX_32 )
                {
                    st->hFdCngDec->msMinBuf[p] = MAX_32;
                }
                else
                {
                    st->hFdCngDec->msMinBuf[p] = (Word32) ( st->hFdCngDec->msMinBuf_float[p] * ( 1u << ( 31 - 6 ) ) );
                }
            }
            /*=================================================*/
            ApplyFdCng_fx( NULL, 0, st->bfi ? NULL : power_spec_fx, NULL, NULL, NULL, st, st->bfi, 0 );
            /*=================================================*/
            if ( !st->bfi )
            {
                for ( int p = 0; p < st->hFdCngDec->hFdCngCom->fftlen; p++ )
                {
                    st->hFdCngDec->hFdCngCom->fftBuffer_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->fftBuffer[p] / ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp ) ) );
                }
                for ( int p = 0; p < st->hFdCngDec->npart_shaping; p++ )
                {
                    st->hFdCngDec->msNoiseEst_float[p] = ( (float) st->hFdCngDec->msNoiseEst[p] / ( 1u << ( 31 - st->hFdCngDec->msNoiseEst_exp ) ) );
                }

                st->hTcxDec->CngLevelBackgroundTrace_bfi = (float) ( st->hTcxDec->CngLevelBackgroundTrace_bfi_fx / powf( 2, ( 31 - st->hTcxDec->CngLevelBackgroundTrace_bfi_exp ) ) );
                st->cngTDLevel_float = fix16_to_float( st->cngTDLevel, ( 15 - st->cngTDLevel_e ) );

                for ( int p = 0; p < ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); p++ )
                {
                    st->hFdCngDec->bandNoiseShape_float[p] = ( (float) st->hFdCngDec->bandNoiseShape[p] / ( 1u << ( 31 - st->hFdCngDec->bandNoiseShape_exp ) ) );
                }
                for ( int p = 0; p < MSBUFLEN * NPART_SHAPING; p++ )
                {
                    if ( ( st->hFdCngDec->msMinBuf[p] == MAX_32 ) )
                    {
                        st->hFdCngDec->msMinBuf_float[p] = FLT_MAX;
                    }
                    else
                    {
                        st->hFdCngDec->msMinBuf_float[p] = (float) st->hFdCngDec->msMinBuf[p] / ( 1u << ( 31 - 6 ) ); // CNG_S = 6
                    }
                }
                for ( int p = 0; p < st->hFdCngDec->npart_shaping; p++ )
                {
                    st->hFdCngDec->msPsd_float[p] = ( (float) st->hFdCngDec->msPsd[p] / ( 1u << Q9 ) );
                    st->hFdCngDec->msPeriodog_float[p] = ( (float) st->hFdCngDec->msPeriodog[p] / ( 1u << ( 31 - st->hFdCngDec->msPeriodog_exp ) ) );
                    st->hFdCngDec->msPeriodogBuf_float[p] = ( (float) st->hFdCngDec->msPeriodogBuf[p] / ( 1u << Q9 ) );
                    st->hFdCngDec->msPeriodog_ST[p] = ( (float) st->hFdCngDec->msPeriodog_ST_fx[p] / ( 1u << ( 31 - st->hFdCngDec->msPeriodog_ST_exp ) ) );
                    st->hFdCngDec->msPsdFirstMoment_float[p] = ( (float) st->hFdCngDec->msPsdFirstMoment[p] / ( 1u << Q9 ) );
                    st->hFdCngDec->msPsdSecondMoment_float[p] = ( (float) st->hFdCngDec->msPsdSecondMoment[p] / ( 1u << Q19 ) );
                    st->hFdCngDec->msNoiseFloor_float[p] = ( (float) st->hFdCngDec->msNoiseFloor[p] / ( 1u << Q9 ) );
                    st->hFdCngDec->msAlpha_float[p] = ( (float) st->hFdCngDec->msAlpha[p] / ( 1u << Q31 ) );
                    st->hFdCngDec->msBminWin_float[p] = ( (float) st->hFdCngDec->msBminWin[p] / ( 1u << Q27 ) );
                    st->hFdCngDec->msBminSubWin_float[p] = ( (float) st->hFdCngDec->msBminSubWin[p] / ( 1u << Q27 ) );
                    if ( st->hFdCngDec->msCurrentMin[p] == MAX_32 )
                    {
                        st->hFdCngDec->msCurrentMin_float[p] = FLT_MAX;
                    }
                    else
                    {
                        st->hFdCngDec->msCurrentMin_float[p] = ( (float) st->hFdCngDec->msCurrentMin[p] / ( 1u << ( 31 - ( 6 + 1 + 4 ) ) ) ); // exp : CNG_S + 1 + 4
                    }
                    if ( st->hFdCngDec->msCurrentMinOut[p] == MAX_32 )
                    {
                        st->hFdCngDec->msCurrentMinOut_float[p] = FLT_MAX;
                    }
                    else
                    {
                        st->hFdCngDec->msCurrentMinOut_float[p] = ( (float) st->hFdCngDec->msCurrentMinOut[p] / ( 1u << ( 31 - 6 ) ) );
                    }
                    if ( st->hFdCngDec->msCurrentMinSubWindow[p] == MAX_32 )
                    {
                        st->hFdCngDec->msCurrentMinSubWindow_float[p] = FLT_MAX;
                    }
                    else
                    {
                        st->hFdCngDec->msCurrentMinSubWindow_float[p] = ( (float) st->hFdCngDec->msCurrentMinSubWindow[p] / ( 1u << ( 31 - 6 ) ) );
                    }
                }
                for ( int p = 0; p < ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); p++ )
                {
                    st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] / ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) );
                }
            }
            else if ( ( ( st->bfi == 1 ) && ( st->nbLostCmpt == 1 ) ) && ( sum_f( st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt + st->hFdCngDec->hFdCngCom->startBand, st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ) > 0.01f ) )
            {
                if ( st->element_mode == IVAS_CPE_MDCT && st->core != ACELP_CORE )
                {
                    for ( int p = 0; p < ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); p++ )
                    {
                        st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] / ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) );
                    }
                    for ( int p = 0; p < FDNS_NPTS; p++ )
                    {
                        st->hTonalMDCTConc->scaleFactorsBackground_flt[p] = (float) st->hTonalMDCTConc->scaleFactorsBackground_fx[p] / ONE_IN_Q16;
                    }
                }
                if ( st->element_mode != IVAS_CPE_MDCT || st->core == ACELP_CORE )
                {
                    int A_cng_q = 15 - norm_s( st->hFdCngDec->hFdCngCom->A_cng[0] );
                    for ( int p = 0; p < M; p++ )
                    {
                        st->hFdCngDec->hFdCngCom->A_cng_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->A_cng[p] / ( 1u << A_cng_q ) );
                        st->lspold_cng_float[p] = ( (float) st->lspold_cng[p] / ( 1u << Q15 ) );
                        st->lsf_cng_float[p] = ( (float) st->lsf_cng[p] / 2.56f ); // Q2.56
                    }
                }
            }
#else
            ApplyFdCng_flt( NULL, st->bfi ? NULL : power_spec, NULL, NULL, st, st->bfi, 0 );
#endif // IVAS_FLOAT_FIXED
        }

        /* restore VAD (see above) */
+6 −3
Original line number Diff line number Diff line
@@ -888,16 +888,19 @@ void stereo_tcx_core_dec(
                }
            }

            st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 24; // Q7
            st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 31 - Q4; // Q4
            for ( int p = 0; p < FFTCLDFBLEN; p++ )
            {
                st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] = (Word32) ( st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) );
            }
            st->hFdCngDec->hFdCngCom->sidNoiseEstExp = 31 - Q4;
            st->hFdCngDec->partNoiseShape_exp = 31 - Q4;
            for ( int p = 0; p < 24; p++ )
            for ( int p = 0; p < NPART; p++ )
            {
                st->hFdCngDec->hFdCngCom->sidNoiseEst[p] = (Word32) ( st->hFdCngDec->hFdCngCom->sidNoiseEst_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->sidNoiseEstExp ) ) );
            }
            for ( int p = 0; p < 24; p++ )
            {
                st->hFdCngDec->partNoiseShape[p] = (Word32) ( st->hFdCngDec->partNoiseShape_float[p] * ( 1u << ( 31 - st->hFdCngDec->partNoiseShape_exp ) ) );
            }
/*=================================*/
@@ -1104,7 +1107,7 @@ void stereo_tcx_core_dec(
                }
            }

            st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 24; // Q7
            st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 31 - Q4; // Q4
            for ( int p = 0; p < FFTCLDFBLEN; p++ )
            {
                st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] = (Word32) ( st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) );
Loading