Commit 511ab49b authored by Manuel Jander's avatar Manuel Jander
Browse files

Merge remote-tracking branch 'origin' into...

Merge remote-tracking branch 'origin' into 867-wide-range-of-values-for-observed-for-reference_power-resulting-in-precision-loss-and-high-mlds-3
parents 6e176c0e 816c984c
Loading
Loading
Loading
Loading
Loading
+48 −33
Original line number Diff line number Diff line
@@ -42,6 +42,8 @@
 *-----------------------------------------------------------------------------------------*/

#define BAND_SMOOTH_REST_START_IDX ( 2 )
#define ONEeN20_Q97                0x5E728433 // 1e-20 in Q97  1.584.563.251


/*-----------------------------------------------------------------------------------------*
 * Function ivas_calculate_update_factor_fx()
@@ -87,9 +89,10 @@ static void ivas_calculate_smoothning_factor_fx(
    move16();

    tmp = BASOP_Util_Divide3232_Scale( update_factor, L_shl( L_deposit_l( min_pool_size ), Q22 ), &exp_diff ); // Q(31 - exp_diff)
    *Smoothing_factor = L_shl_sat( L_deposit_l( tmp ), add( Q16, exp_diff ) );                                 // Q31
    *Smoothing_factor = L_shl_sat( L_deposit_h( tmp ), exp_diff );                                             // Q31
    move32();


    IF( NE_32( smooth_mode, COV_SMOOTH_MC ) )
    {
        IF( LT_32( ivas_total_brate, IVAS_24k4 ) )
@@ -264,19 +267,17 @@ void ivas_spar_covar_smooth_enc_close_fx(
    return;
}


/*-----------------------------------------------------------------------------------------*
 * Function ivas_compute_smooth_cov_fx()
 *
 * Compute smooth covariance real/imag.
 *-----------------------------------------------------------------------------------------*/

static void ivas_compute_smooth_cov_fx(
    ivas_cov_smooth_state_t *hCovState,
    ivas_filterbank_t *pFb,
    Word32 *pCov_buf[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH],       // i/o: Q(q_cov[i][j])
    Word32 *pPrior_cov_buf[IVAS_SPAR_MAX_CH][IVAS_SPAR_MAX_CH], // i: hCovState->q_cov_real_per_band[i][j][k]
    const Word32 fac,
    const Word32 fac,                                           // i: ONEeN20_Q97 (1e-20 in Q97)
    const Word16 start_band,
    const Word16 end_band,
    const Word16 num_ch,
@@ -285,10 +286,15 @@ static void ivas_compute_smooth_cov_fx(
{
    Word16 i, j, k;
    Word16 prev_idx = hCovState->prior_bank_idx;
    Word32 factor = 0, L_tmp, L_tmp1;
    Word32 factor = 0, L_tmp0, L_tmp1;

    const Word16 q_fac = 97;
    const Word16 fac_e = sub( Q31, q_fac );

    Word16 cov_buf_e;

    Word16 sm_b;
    Word16 non_sm_b_idx;
    Word16 q_tmp[IVAS_MAX_NUM_BANDS];

    sm_b = BAND_SMOOTH_REST_START_IDX;
    move16();
@@ -296,7 +302,6 @@ static void ivas_compute_smooth_cov_fx(
    move32();

    assert( end_band <= pFb->filterbank_num_bands );

    test();
    IF( EQ_16( prev_idx, -1 ) || EQ_16( transient_det[1], 1 ) )
    {
@@ -311,9 +316,11 @@ static void ivas_compute_smooth_cov_fx(
        {
            FOR( k = start_band; k < end_band; k++ )
            {
                L_tmp = Mpy_32_32( hCovState->pSmoothing_factor_fx[k], fac );                                                        // (Q31, Q31) -> Q31
                pCov_buf[i][i][k] = L_add( pCov_buf[i][i][k], L_shl( L_tmp, sub( hCovState->q_cov_real_per_band[i][i][k], Q31 ) ) ); // hCovState->q_cov_real_per_band[i][j][k]
                /* ref: pCov_buf[i][i][k] += ( hCovState->pSmoothing_factor[k] * fac ); */
                pCov_buf[i][i][k] = BASOP_Util_Add_Mant32Exp( pCov_buf[i][i][k], sub( Q31, q_cov[i][i] ), Mpy_32_32( hCovState->pSmoothing_factor_fx[k], fac ), fac_e, &cov_buf_e );
                move32();
                hCovState->q_cov_real_per_band[i][i][k] = sub( Q31, cov_buf_e );
                move16();
            }
        }
    }
@@ -326,38 +333,45 @@ static void ivas_compute_smooth_cov_fx(
            {
                IF( EQ_16( i, j ) )
                {
                    factor = fac; // Q31
                    factor = fac; // Q97
                    move32();
                }
                ELSE
                {
                    factor = 0;
                    factor = 0; // Q97
                    move32();
                }

                set16_fx( q_tmp, q_cov[i][j], sub( end_band, start_band ) );
                FOR( k = start_band; k < non_sm_b_idx; k++ )
                {
                    L_tmp = Mpy_32_32( hCovState->pSmoothing_factor_fx[k], pCov_buf[i][j][k] );                                                                                   // (Q31, q_cov[i][j]) -> q_cov[i][j]
                    L_tmp1 = Mpy_32_32( L_sub( ONE_IN_Q31, hCovState->pSmoothing_factor_fx[k] ), pPrior_cov_buf[i][j][k] );                                                       // (Q31, hCovState->q_cov_real_per_band[i][j][k]) -> hCovState->q_cov_real_per_band[i][j][k]
                    pCov_buf[i][j][k] = BASOP_Util_Add_Mant32Exp( L_tmp, sub( Q31, q_cov[i][j] ), L_tmp1, sub( Q31, hCovState->q_prior_cov_real_per_band[i][j][k] ), &q_tmp[k] ); // Q(31 - q_tmp[k])
                    /* ref: pCov_buf[i][j][k] = pPrior_cov_buf[i][j][k] + ( hCovState->pSmoothing_factor[k] * ( pCov_buf[i][j][k] - pPrior_cov_buf[i][j][k] + factor ) ); */
                    /* mod: pCov_buf[i][j][k] = pCov_buf[i][j][k] * hCovState->pSmoothing_factor[k] +
                                                    pPrior_cov_buf[i][j][k] * (1.0 - hCovState->pSmoothing_factor[k]) +
                                                        factor * hCovState->pSmoothing_factor[k] ); */
                    L_tmp0 = Mpy_32_32( hCovState->pSmoothing_factor_fx[k], pCov_buf[i][j][k] );                            // q_tmp0: q_cov[i][j]                                                                                  // (Q31, q_cov[i][j]) -> q_cov[i][j]
                    L_tmp1 = Mpy_32_32( L_sub( ONE_IN_Q31, hCovState->pSmoothing_factor_fx[k] ), pPrior_cov_buf[i][j][k] ); // q_tmp1: hCovState->q_prior_cov_real_per_band[i][j][k]
                    L_tmp0 = BASOP_Util_Add_Mant32Exp( L_tmp0, sub( Q31, q_cov[i][j] ), L_tmp1, sub( Q31, hCovState->q_prior_cov_real_per_band[i][j][k] ), &cov_buf_e );
                    pCov_buf[i][j][k] = BASOP_Util_Add_Mant32Exp( L_tmp0, cov_buf_e, Mpy_32_32( hCovState->pSmoothing_factor_fx[k], factor ), fac_e, &cov_buf_e );
                    move32();
                    q_tmp[k] = sub( Q31, q_tmp[k] ); // Q of pConv_buf[i][j][k] is now q_tmp[k]
                    hCovState->q_cov_real_per_band[i][j][k] = sub( Q31, cov_buf_e ); // Q of pCov_buf[i][j][k]
                    move16();
                }
                FOR( ; k < end_band; k++ )
                {
                    hCovState->q_cov_real_per_band[i][j][k] = q_cov[i][j];
                    move16();
                    L_tmp = L_shl( Mpy_32_32( hCovState->pSmoothing_factor_fx[k], factor ), sub( q_tmp[k], Q31 ) ); // ((Q31, Q31) -> Q31) -> q_tmp[k]
                    pCov_buf[i][j][k] = L_add( pCov_buf[i][j][k], L_tmp );                                          // q_tmp[k]
                    move32();
                }
                Copy( q_tmp, hCovState->q_cov_real_per_band[i][j], sub( end_band, start_band ) ); // Q of pCov_buf[i][j][k] is hCovState->q_cov_real_per_band[i][j][j]
            }
        }
        FOR( i = 0; i < num_ch; i++ )
        {
            FOR( k = non_sm_b_idx; k < end_band; k++ )
            {
                L_tmp = Mpy_32_32( hCovState->pSmoothing_factor_fx[k], fac );                                                        // (Q31, Q31) -> Q31
                pCov_buf[i][i][k] = L_add( pCov_buf[i][i][k], L_shl( L_tmp, sub( hCovState->q_cov_real_per_band[i][i][k], Q31 ) ) ); // hCovState->q_cov_real_per_band[i][j][j]
                /* ref: pCov_buf[i][i][k] += ( hCovState->pSmoothing_factor[k] * fac ); */
                pCov_buf[i][i][k] = BASOP_Util_Add_Mant32Exp( pCov_buf[i][i][k], sub( Q31, q_cov[i][i] ), Mpy_32_32( hCovState->pSmoothing_factor_fx[k], fac ), fac_e, &cov_buf_e );
                move32();
                hCovState->q_cov_real_per_band[i][i][k] = sub( Q31, cov_buf_e ); // Q of pCov_buf[i][i][k]
                move16();
            }
        }
    }
@@ -369,28 +383,29 @@ static void ivas_compute_smooth_cov_fx(
            {
                IF( EQ_16( i, j ) )
                {
                    factor = fac; // Q31
                    factor = fac; // Q97
                    move32();
                }
                ELSE
                {
                    factor = 0;
                    factor = 0; // Q97
                    move32();
                }

                FOR( k = start_band; k < end_band; k++ )
                {
                    L_tmp = Mpy_32_32( hCovState->pSmoothing_factor_fx[k], pCov_buf[i][j][k] );                                                                                   // (Q31, q_cov[i][j]) -> q_cov[i][j]
                    L_tmp1 = Mpy_32_32( L_sub( ONE_IN_Q31, hCovState->pSmoothing_factor_fx[k] ), pPrior_cov_buf[i][j][k] );                                                       // (Q31, hCovState->q_cov_real_per_band[i][j][k]) -> hCovState->q_cov_real_per_band[i][j][k]
                    pCov_buf[i][j][k] = BASOP_Util_Add_Mant32Exp( L_tmp, sub( Q31, q_cov[i][j] ), L_tmp1, sub( Q31, hCovState->q_prior_cov_real_per_band[i][j][k] ), &q_tmp[k] ); // Q(31 - q_tmp[k])
                    /* ref: pCov_buf[i][j][k] = pPrior_cov_buf[i][j][k] + ( hCovState->pSmoothing_factor[k] * ( pCov_buf[i][j][k] - pPrior_cov_buf[i][j][k] + factor ) ); */
                    /* mod: pCov_buf[i][j][k] = pCov_buf[i][j][k] * hCovState->pSmoothing_factor[k] +
                                                pPrior_cov_buf[i][j][k] * (1.0 - hCovState->pSmoothing_factor[k]) +
                                                factor * hCovState->pSmoothing_factor[k] ); */
                    L_tmp0 = Mpy_32_32( hCovState->pSmoothing_factor_fx[k], pCov_buf[i][j][k] );                            // q_tmp0: q_cov[i][j]                                                                                  // (Q31, q_cov[i][j]) -> q_cov[i][j]
                    L_tmp1 = Mpy_32_32( L_sub( ONE_IN_Q31, hCovState->pSmoothing_factor_fx[k] ), pPrior_cov_buf[i][j][k] ); // q_tmp1: hCovState->q_prior_cov_real_per_band[i][j][k]
                    L_tmp0 = BASOP_Util_Add_Mant32Exp( L_tmp0, sub( Q31, q_cov[i][j] ), L_tmp1, sub( Q31, hCovState->q_prior_cov_real_per_band[i][j][k] ), &cov_buf_e );
                    pCov_buf[i][j][k] = BASOP_Util_Add_Mant32Exp( L_tmp0, cov_buf_e, Mpy_32_32( hCovState->pSmoothing_factor_fx[k], factor ), fac_e, &cov_buf_e );
                    move32();
                    q_tmp[k] = sub( Q31, q_tmp[k] ); // Q of pConv_buf[i][j][k] is now q_tmp[k]
                    hCovState->q_cov_real_per_band[i][j][k] = sub( Q31, cov_buf_e ); // Q of pCov_buf[i][j][k]
                    move16();
                    L_tmp = L_shl( Mpy_32_32( hCovState->pSmoothing_factor_fx[k], factor ), sub( q_tmp[k], Q31 ) ); // ((Q31, Q31) -> Q31) -> q_tmp[k]
                    pCov_buf[i][j][k] = L_add( pCov_buf[i][j][k], L_tmp );                                          // q_tmp[k]
                    move32();
                }
                Copy( q_tmp, hCovState->q_cov_real_per_band[i][j], sub( end_band, start_band ) ); // Q of pCov_buf[i][j][k] is hCovState->q_cov_real_per_band[i][j][j]
            }
        }
    }
@@ -418,7 +433,7 @@ void ivas_cov_smooth_process_fx(
    Word16 i, j, k;
    Word16 num_bands = sub( end_band, start_band );

    ivas_compute_smooth_cov_fx( hCovState, pFb, cov_real, hCovState->pPrior_cov_real_fx, 0, start_band, end_band, num_ch, transient_det, q_cov );
    ivas_compute_smooth_cov_fx( hCovState, pFb, cov_real, hCovState->pPrior_cov_real_fx, ONEeN20_Q97, start_band, end_band, num_ch, transient_det, q_cov );

    FOR( i = 0; i < num_ch; i++ )
    {
+75 −79
Original line number Diff line number Diff line
@@ -1383,12 +1383,15 @@ void TonalMDCTConceal_InsertNoise_ivas_fx(
    Word16 rnd;

    Word16 tmp, g, tilt, exp_last, exp_noise, tiltFactor, crossfadeGain, e_crossfadeGain;
    Word32 L_tmp, L_tmp2, nrgNoiseInLastFrame, nrgWhiteNoise;
    Word32 L_tmp, L_tmp1, L_tmp2, nrgNoiseInLastFrame, nrgWhiteNoise;
    Word16 inv_exp, inv_samples, exp;
    Word32 last_block_nrg_correct;
    Word16 last_block_nrg_correct_e;
    Word32 max_concealment_value;
    Word16 max_spectral_value;
    Word64 sum1, sum2;
    Word16 num16, den16, exp1, exp2;
    Word16 shift1, shift2;

    crossfadeGain = crossfadeGain_const;
    move16();
@@ -1851,28 +1854,36 @@ void TonalMDCTConceal_InsertNoise_ivas_fx(
        }
    }
    ELSE{
        IF( !tonalConcealmentActive ){
            ld = sub( 14, norm_s( hTonalMDCTConc->lastBlockData.nSamples ) );
    fac = shr( -32768, ld );

        IF( tonalConcealmentActive == 0 ){
            sum1 = 0;
    sum2 = 0;
    move64();
    move64();
    FOR( i = 0; i < crossOverFreq; i++ )
    {
        Word16 x = hTonalMDCTConc->lastBlockData.spectralData[i];
        Word32 y;
        rnd = extract_l( L_mac0( 13849, rnd, 31821 ) ); /* Q0 */
        y = L_mult( tilt, rnd );                        /*  15Q16 */
        Word16 x;
        /*x = hTonalMDCTConc->lastBlockData.spectralData[i];
        nrgNoiseInLastFrame += x * x;*/
        sum1 = W_mac0_16_16( sum1, hTonalMDCTConc->lastBlockData.spectralData[i], hTonalMDCTConc->lastBlockData.spectralData[i] ); // Q: 2*(15-hTonalMDCTConc->lastBlockData.spectralData_exp)

        nrgNoiseInLastFrame = L_add( nrgNoiseInLastFrame, Mpy_32_16_1( L_msu( 0, x, fac ), x ) ); // Q(31 - x_exp - ld) + Q(15 - x_exp) - 15 = Q(31 - x_exp * 2 - ld)
        x = round_fx( y );                                                                        /* 15Q16 -> 15Q0 */
        nrgWhiteNoise = L_add( nrgWhiteNoise, Mpy_32_16_1( L_msu( 0, x, fac ), x ) );             // Q(31 - (15 - 0) - ld) + Q(0) - 15 = Q(1 - ld)
        /* rnd = own_random(&rnd); */
        rnd = extract_l( L_mac0( 13849, rnd, 31821 ) ); /* Q0 */

        mdctSpectrum[i] = y; /*  15Q16 */
        /* mdctSpectrum[i] = tilt * rnd; */
        mdctSpectrum[i] = L_mult( tilt, rnd ); // Q16
        move32();

        /* tilt *= tiltFactor; */
        tilt = mult_r( tilt, tiltFactor ); /* Q15 */

        /* nrgWhiteNoise += mdctSpectrum[i] * mdctSpectrum[i]; */
        x = round_fx( mdctSpectrum[i] );   // Q0
        sum2 = W_mac0_16_16( sum2, x, x ); // Q0
    }
    *mdctSpectrum_exp = 15;
    move16();

    IF( nrgNoiseInLastFrame == 0 )
    IF( sum1 /* nrgNoiseInLastFrame */ == 0 )
    {
        set32_fx( mdctSpectrum, 0, crossOverFreq );
        *mdctSpectrum_exp = SPEC_EXP_DEC;
@@ -1880,85 +1891,70 @@ void TonalMDCTConceal_InsertNoise_ivas_fx(
    }
    ELSE
    {
        exp_last = add( ld, shl( hTonalMDCTConc->lastBlockData.spectralData_exp, 1 ) );
        exp_noise = add( ld, 30 );

        IF( nrgWhiteNoise > 0 )
        IF( g == 0 )
        {
            ld = norm_l( nrgNoiseInLastFrame );
            nrgNoiseInLastFrame = L_shl( nrgNoiseInLastFrame, ld ); // Q31- exp_last + ld
            exp_last = sub( exp_last, ld );
            ld = norm_l( nrgWhiteNoise );
            nrgWhiteNoise = L_shl( nrgWhiteNoise, ld ); // Q31 - exp_noise + ld
            exp_noise = sub( exp_noise, ld );

            exp = sub( exp_last, exp_noise );

            IF( GT_32( nrgNoiseInLastFrame, nrgWhiteNoise ) )
            *mdctSpectrum_exp = add( add( hTonalMDCTConc->lastBlockData.spectralData_exp, e_crossfadeGain ), 31 - SPEC_EXP_DEC );
            move16();
            FOR( i = 0; i < crossOverFreq; i++ )
            {
                nrgNoiseInLastFrame = L_shr( nrgNoiseInLastFrame, 1 ); // Q31-exp -1
                exp = add( exp, 1 );
            }
            tmp = div_l( nrgNoiseInLastFrame, round_fx( nrgWhiteNoise ) ); // Q15
            tmp = Sqrt16( tmp, &exp );
            g = mult_r( g, tmp ); // exponent of g = exp

            L_tmp = L_deposit_h( 0 );
            ld = sub( hTonalMDCTConc->lastBlockData.spectralData_exp, 15 );
            exp = sub( ld, exp );

            IF( exp > 0 )
                /* mdctSpectrum[i] = g * mdctSpectrum[i] + crossfadeGain * hTonalMDCTConc->lastBlockData.spectralData[i]; */
                L_tmp = L_mult( crossfadeGain, hTonalMDCTConc->lastBlockData.spectralData[i] ); // exp: hTonalMDCTConc->lastBlockData.spectralData_exp+e_crossfadeGain
                if ( mdctSpectrum[i] <= 0 )
                {
                g = shr( g, exp ); // Q15 - exp
                *mdctSpectrum_exp = hTonalMDCTConc->lastBlockData.spectralData_exp;
                move16();
                    /* mdctSpectrum[i] = g * mdctSpectrum[i] - crossfadeGain * hTonalMDCTConc->lastBlockData.spectralData[i]; */
                    L_tmp = L_negate( L_tmp ); // exp: hTonalMDCTConc->lastBlockData.spectralData_exp+e_crossfadeGain
                }
            ELSE
            {
                crossfadeGain = shl( crossfadeGain, exp ); // Q15-e_crossfadeGain+ exp
                e_crossfadeGain = sub( e_crossfadeGain, exp );
                *mdctSpectrum_exp = add( e_crossfadeGain, hTonalMDCTConc->lastBlockData.spectralData_exp );
                move16();
                /* headroom for mdct_shaping */
                mdctSpectrum[i] = L_shr( L_tmp, 31 - SPEC_EXP_DEC ); // *mdctSpectrum_exp
                move32();
            }
            /*make a headroom for mdct_shaping*/
            exp = sub( *mdctSpectrum_exp, SPEC_EXP_DEC );
            /* assert(exp < 0);*/
            IF( exp < 0 )
            {
                *mdctSpectrum_exp = SPEC_EXP_DEC;
                move16();
        }
        ELSE
        {
                exp = 0;
                move16();
            }
        }
        FOR( i = 0; i < crossOverFreq; i++ )
            IF( sum2 /* nrgWhiteNoise */ > 0 )
            {
            Word16 const x = hTonalMDCTConc->lastBlockData.spectralData[i]; // Q15 - spectralData_exp
            move16();
            Word32 const y = mdctSpectrum[i]; // Q31-mdctSpectrum_exp
            move32();
                exp1 = sub( W_norm( sum1 ), 1 );
                num16 = extract_h( W_extract_h( W_shl( sum1, exp1 ) ) ); // nrgNoiseInLastFrame -> Q: 2*(15-hTonalMDCTConc->lastBlockData.spectralData_exp)+exp1-48
                exp2 = W_norm( sum2 );
                den16 = extract_h( W_extract_h( W_shl( sum2, exp2 ) ) ); // nrgWhiteNoise -> Q: exp2-48

            IF( g > 0 )
            {
                L_tmp = Mpy_32_16_1( y, g ); // Q31-mdctSpectrum_exp- spectralData_exp
                /* sqrt( nrgNoiseInLastFrame / nrgWhiteNoise ) */
                tmp = div_s( num16, den16 );                                                                         // Q: 15+(2*(15-hTonalMDCTConc->lastBlockData.spectralData_exp)+exp1-48)-(exp2-48)
                exp = sub( sub( shl( hTonalMDCTConc->lastBlockData.spectralData_exp, 1 ), 30 ), sub( exp1, exp2 ) ); // exp of tmp
                tmp = Sqrt16( tmp, &exp );
                g = mult_r( g, tmp ); // exponent of g = exp
            }

            L_tmp2 = L_msu( L_tmp, crossfadeGain, x ); // Q15 - e_crossfadeGain + Q15 - spectralData_exp
            IF( GT_32( y, 0 ) )
            exp1 = add( *mdctSpectrum_exp, exp );
            exp2 = add( hTonalMDCTConc->lastBlockData.spectralData_exp, e_crossfadeGain );
            exp = add( s_max( exp1, exp2 ), 1 );
            shift1 = sub( exp1, exp );
            shift2 = sub( exp2, exp );

            FOR( i = 0; i < crossOverFreq; i++ )
            {
                L_tmp2 = L_mac( L_tmp, crossfadeGain, x ); // Q15 - e_crossfadeGain + Q15 - spectralData_exp
                L_tmp1 = L_shl( Mpy_32_16_1( mdctSpectrum[i], g ), shift1 );                                      // g * mdctSpectrum[i]
                L_tmp2 = L_shl( L_mult( crossfadeGain, hTonalMDCTConc->lastBlockData.spectralData[i] ), shift2 ); // exp

                /* mdctSpectrum[i] = g * mdctSpectrum[i] - crossfadeGain * hTonalMDCTConc->lastBlockData.spectralData[i]; */
                L_tmp = L_sub( L_tmp1, L_tmp2 ); // exp
                if ( mdctSpectrum[i] > 0 )
                {
                    /* mdctSpectrum[i] = g * mdctSpectrum[i] + crossfadeGain * hTonalMDCTConc->lastBlockData.spectralData[i]; */
                    L_tmp = L_add( L_tmp1, L_tmp2 ); // exp
                }
            mdctSpectrum[i] = L_shl( L_tmp2, exp ); // Q15 - e_crossfadeGain + Q15 - spectralData_exp + exp
                mdctSpectrum[i] = L_shr( L_tmp, 31 - SPEC_EXP_DEC ); // exp+31-SPEC_EXP_DEC
                move32();
            }
            /* headroom for mdct_shaping */
            *mdctSpectrum_exp = add( exp, 31 - SPEC_EXP_DEC );
            move16();
        }
    exp = sub( hTonalMDCTConc->lastBlockData.spectralData_exp, sub( *mdctSpectrum_exp, 16 ) );
    }
    exp = sub( hTonalMDCTConc->lastBlockData.spectralData_exp, *mdctSpectrum_exp );
    FOR( i = crossOverFreq; i < hTonalMDCTConc->lastBlockData.nSamples; i++ )
    {
        mdctSpectrum[i] = L_shl( L_deposit_l( hTonalMDCTConc->lastBlockData.spectralData[i] ), exp ); // Q15 - spectralData_exp + exp
        mdctSpectrum[i] = L_shl( L_deposit_h( hTonalMDCTConc->lastBlockData.spectralData[i] ), exp ); // mdctSpectrum_exp
        move32();
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -372,7 +372,7 @@ void amr_wb_enc_fx(
     * WB, SWB and FB bandwidth detector
     *----------------------------------------------------------------*/

    bw_detect_fx( st, st->input_fx, NULL, NULL, NULL, MONO_FORMAT, 0 );
    bw_detect_fx( st, st->input_fx, NULL, NULL, NULL, MONO_FORMAT, 0, 0 );

    /* in AMR_WB IO, limit the maximum band-width to WB */
    if ( GT_16( st->bwidth, WB ) )
+9 −3
Original line number Diff line number Diff line
@@ -41,12 +41,12 @@
void bw_detect_fx(
    Encoder_State *st,               /* i/o: Encoder State           */
    const Word16 signal_in[],        /* i  : input signal           */
    Word16 *spectrum,                /* i  : MDCT spectrum          */
    Word16 *spectrum,                /* i  : MDCT spectrum       Q_spec   */
    const Word32 *enerBuffer,        /* i  : CLDFB Energy   Q31      */
    const Word16 *cldfbBuf_Ener_Exp, /* i  : CLDFB Energy Exponent   */
    const IVAS_FORMAT ivas_format,   /* i  : IVAS format             */
    const Word16 mct_on              /* i  : flag MCT mode           */
)
    const Word16 mct_on,             /* i  : flag MCT mode           */
    const Word16 Q_spec )
{
    Word16 Q_dct;
    Word16 i, j, k, bw_max, bin_width, n_bins;
@@ -312,6 +312,11 @@ void bw_detect_fx(

                bin_width = i_mult( bin_width, l_frame / BWD_TOTAL_WIDTH );
                Copy( spectrum, spect, l_frame );
                if ( st->element_mode != EVS_MONO )
                {
                    Q_dct = Q_spec;
                    move16();
                }
            }
            /*---------------------------------------------------------------------*
             * compute energy per spectral bins
@@ -903,6 +908,7 @@ void bw_detect_fx(

    return;
}

/*-------------------------------------------------------------------*
 * set_bw_fx()
 *
+1 −1
Original line number Diff line number Diff line
@@ -870,7 +870,7 @@ ivas_error pre_proc_front_ivas_fx(
        Word16 input_fx_tmp[480];
        Copy_Scale_sig( st->input_fx, input_fx_tmp, shr( input_frame, 1 ), negate( st->q_inp ) ); /*scaling from Q_inp_const to q0*/

        bw_detect_fx( st, input_fx_tmp, NULL, enerBuffer_fx, sf_energySum, ivas_format, 0 );
        bw_detect_fx( st, input_fx_tmp, NULL, enerBuffer_fx, sf_energySum, ivas_format, 0, 0 );
    }

    IF( EQ_16( element_mode, IVAS_CPE_DFT ) )
Loading