Commit 019b6a9a authored by Fabian Bauer's avatar Fabian Bauer
Browse files

Merge branch 'main' into 1439-complexity-overhead-stereo-to-stereo-32kbps-fb-float-vs-basop

parents 11d2a43d f44565a5
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++ )
    {
+35 −4
Original line number Diff line number Diff line
@@ -666,14 +666,45 @@ ivas_error front_vad_spar_fx(

        old_pitch = st->pitch[1];
        move16();
        Scale_sig( wsp_fx, 368, sub( Q8, Q_inp_12k8 ) ); // Q8
        pitch_ol_ivas_fx( st->pitch, st->voicing_fx, &st->old_pitch, &st->old_corr_fx, corr_shift_fx, &st->old_thres_fx, &st->delta_pit, st->old_wsp2_fx, wsp_fx, st->mem_decim2_fx, relE_fx, st->clas, st->input_bwidth, st->Opt_SC_VBR, Q8 );
        Word16 shift, Q_wsp;
        Word16 shift1 = norm_arr( old_wsp_fx, L_WSP_MEM );
        Word16 shift2 = norm_arr( wsp_fx, L_WSP - L_WSP_MEM );
        maximum_abs_16_fx( old_wsp_fx, L_WSP_MEM, &shift );
        if ( !shift )
        {
            shift1 = Q15;
            move16();
        }
        maximum_abs_16_fx( wsp_fx, L_WSP - L_WSP_MEM, &shift );
        if ( !shift )
        {
            shift2 = Q15;
            move16();
        }

        shift = s_min( Q15, s_min( add( Q_inp_12k8, shift1 ), add( Q_inp_12k8, shift2 ) ) );
        shift = s_min( shift, add( norm_arr( st->mem_decim2_fx, 3 ), st->Q_old_wsp2 ) );
        shift = s_min( shift, add( norm_arr( st->old_wsp2_fx, ( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM ), st->Q_old_wsp2 ) );

        scale_sig( old_wsp_fx, L_WSP_MEM, sub( shift, Q_inp_12k8 ) );
        scale_sig( wsp_fx, L_WSP - L_WSP_MEM, sub( shift, Q_inp_12k8 ) );

        Q_wsp = shift;
        move16();

        scale_sig( st->mem_decim2_fx, 3, sub( Q_wsp, st->Q_old_wsp2 ) );                                    // Q( mem_decim ) = Q( old_wsp2 )
        scale_sig( st->old_wsp2_fx, ( L_WSP_MEM - L_INTERPOL ) / OPL_DECIM, sub( Q_wsp, st->Q_old_wsp2 ) ); // Q_wsp

        st->Q_old_wsp2 = Q_wsp;
        move16();

        pitch_ol_ivas_fx( st->pitch, st->voicing_fx, &st->old_pitch, &st->old_corr_fx, corr_shift_fx, &st->old_thres_fx, &st->delta_pit, st->old_wsp2_fx, wsp_fx, st->mem_decim2_fx, relE_fx, st->clas, st->input_bwidth, st->Opt_SC_VBR, Q_wsp );

        /* Updates for adaptive lag window memory */
        st->old_pitch_la = st->pitch[2]; /* Q0 */
        move16();
        Scale_sig( wsp_fx, 368, Q9 - Q8 ); /* Q9 */
        StableHighPitchDetect_ivas_fx( &flag_spitch, st->pitch, st->voicing_fx, wsp_fx, st->localVAD, &st->voicing_sm_fx, &st->voicing0_sm_fx, &st->LF_EnergyRatio_sm_fx, &st->predecision_flag, &st->diff_sm_fx, &st->energy_sm_fx, Q12, st->lgBin_E_fx );

        StableHighPitchDetect_ivas_fx( &flag_spitch, st->pitch, st->voicing_fx, wsp_fx, st->localVAD, &st->voicing_sm_fx, &st->voicing0_sm_fx, &st->LF_EnergyRatio_sm_fx, &st->predecision_flag, &st->diff_sm_fx, &st->energy_sm_fx, Q_wsp, st->lgBin_E_fx );
        IF( st->hSpMusClas != NULL )
        {
            Word16 dummy_int;
+36 −33

File changed.

Preview size limit exceeded, changes collapsed.

+6 −9
Original line number Diff line number Diff line
@@ -363,11 +363,11 @@ void stereo_mdct_core_enc_fx(
        move16();
        FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
        {
            length = sts[ch]->hTcxEnc->L_frameTCX;
            length = sts[ch]->hTcxEnc->spectrum_length;
            move16();
            if ( NE_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) )
            IF( NE_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) )
            {
                length = shr( sts[ch]->hTcxEnc->L_frameTCX, 1 );
                length = shr( length, 1 );
            }

            hdrm_min = s_min( hdrm_min, L_norm_arr( sts[ch]->hTcxEnc->spectrum_fx[0], length ) );
@@ -384,15 +384,12 @@ void stereo_mdct_core_enc_fx(

        FOR( ch = 0; ch < CPE_CHANNELS; ch++ )
        {
            Word16 n_sb = NB_DIV;
            length = sts[ch]->hTcxEnc->spectrum_length;
            move16();
            if ( EQ_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) )
            IF( NE_16( sts[ch]->hTcxEnc->tcxMode, TCX_20 ) )
            {
                n_sb = 1;
                move16();
                length = shr( length, 1 );
            }
            length = idiv1616( sts[ch]->hTcxEnc->L_frameTCX, n_sb ); /* Q0 */

            FOR( k = 0; k <= ( ( sts[ch]->core == TCX_20_CORE ) ? 1 : NB_DIV ) - 1; k++ )
            {
                Scale_sig32( sts[ch]->hTcxEnc->spectrum_fx[k], length, sub( q_spec, sub( Q31, sts[ch]->hTcxEnc->spectrum_e[k] ) ) ); /* q_spec */
+1 −0
Original line number Diff line number Diff line
@@ -1211,6 +1211,7 @@ typedef struct tcx_enc_structure
    Word32 spectrum_long_fx[N_MAX]; /* MDCT output for a long block. Points to spectrum */
    Word16 spectrum_long_e;         /* MDCT output for a long block. Points to spectrum */
    Word16 q_spectrum_long_fx;
    Word16 spectrum_length; /* corresponds to L_frameTCX, used for scaling of MDCT/MDST buffers */
} TCX_ENC_DATA, *TCX_ENC_HANDLE;

typedef struct TransientDetection