Commit 654f1001 authored by emerit's avatar emerit
Browse files

Merge branch 'main' into update_crend_v2

parents 3105605f d4fd91a6
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -4710,6 +4710,8 @@ Word32 dot_product_cholesky_fx(
    const Word32 *A, /* i  : Cholesky  matrix A              */
    const Word16 N   /* i  : vector & matrix size            */
);

#ifndef DOT_PROD_CHOLESKY_64BIT
Word32 dot_product_cholesky_fixed(
    const Word32 *x, /* i  : vector x                        */
    const Word32 *A, /* i  : Cholesky  matrix A              */
@@ -4717,6 +4719,13 @@ Word32 dot_product_cholesky_fixed(
    const Word16 exp_x,
    const Word16 exp_A,
    Word16 *exp_sum );
#else
Word64 dot_product_cholesky_fixed(
    const Word32 *x, /* i  : vector x                        */
    const Word32 *A, /* i  : Cholesky  matrix A              */
    const Word16 N   /* i  : vector & matrix size            */
);
#endif

void v_mult_mat_fx(
    Word32 *y_fx, /* o  : the product x*A                         */
@@ -5861,8 +5870,7 @@ ivas_error ivas_compute_core_buffers_fx(
    Word16 lsp_mid_fx[M],                  /* i/o: LSPs in the middle of the frame          */
    Word16 Q_old_inp_16k,
    Word16 Q_r[2],
    Word16 *Q_new,
    Word16 downscale_buf_speech_enc_pe );
    Word16 *Q_new );

ivas_error ivas_enc_fx(
    Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure      */
+39 −0
Original line number Diff line number Diff line
@@ -606,6 +606,7 @@ void v_sub32_fx(
 * Therefore, S=A*A' where A is upper triangular matrix of size (m*m+m)/2 (zeros ommitted, column-wise)
 *---------------------------------------------------------------------*/

#ifndef DOT_PROD_CHOLESKY_64BIT
/*! r: the dot product x'*A*A'*x */
Word32 dot_product_cholesky_fixed(
    const Word32 *x, /* i  : vector x                        Q31 - exp_x*/
@@ -642,6 +643,44 @@ Word32 dot_product_cholesky_fixed(

    return suma;
}
#else
/*! r: the dot product x'*A*A'*x */
Word64 dot_product_cholesky_fixed(
    const Word32 *x, /* i  : vector x                        Q31 - exp_x*/
    const Word32 *A, /* i  : Cholesky  matrix A              Q31 - exp_A*/
    const Word16 N   /* i  : vector & matrix size            Q0*/
)
{
    Word16 i, j;
    Word64 suma, tmp_sum;
    Word32 mul;
    Word32 tmp;
    const Word32 *pt_x, *pt_A;
    pt_A = A;
    suma = 0;
    move64();

    FOR( i = 0; i < N; i++ )
    {
        tmp_sum = 0;
        move32();
        pt_x = x;

        FOR( j = 0; j <= i; j++ )
        {
            mul = Mpy_32_32( *pt_x++, *pt_A++ );
            tmp_sum = W_add( tmp_sum, W_deposit32_l( mul ) );
        }

        tmp_sum = W_shr( tmp_sum, 4 ); // to make sure that the tmp_sum will not overflow
        tmp = W_extract_l( tmp_sum );
        suma = W_mac_32_32( suma, tmp, tmp );
    }

    return suma;
}
#endif

void v_mult_mat_fixed(
    Word32 *y,       /* o  : the product x*A               Qx - guardbits*/
    const Word32 *x, /* i  : vector x                      Qx*/
+1 −0
Original line number Diff line number Diff line
@@ -190,4 +190,5 @@
#define NONBE_FIX_1277_EVS_DTX_HIGH_RATE_THRESHOLD      /* VA/Eri: FLP issue 1277: Fix Mismatch in DTX high-rate threshold between EVS float and BASOP */
#define NONBE_FIX_708_OSBA_BR_SWITCHING_CRASH   /* FhG: issue 708: fix crash in OSBA BR switching with long test vectors */
//#define OPT_STEREO_32KBPS_V1                    /* Optimization made in stereo decoding path for 32kbps decoding */
#define DOT_PROD_CHOLESKY_64BIT                 /* FhG: Issue 1323, optimized 64 bit implementation of dot_product_cholesky() */
#endif
+1 −0
Original line number Diff line number Diff line
@@ -761,6 +761,7 @@ void preemph_ivas_fx(
    const Word16 L,  /* i  : vector size        Q0*/
    Word32 *mem      /* i/o: memory (x[-1])     Qx*/
);

void cb_shape(
    const int16_t preemphFlag,     /* i  : flag for pre-emphasis                       */
    const int16_t pitchFlag,       /* i  : flag for pitch sharpening                   */
+35 −71
Original line number Diff line number Diff line
@@ -5379,13 +5379,13 @@ void TNSAnalysisStereo_fx(
)
{
    Word16 ch, k, L_spec, L_frame, nSubframes, iFilter;
    Word32 *spectrum_fx;
    Word32 *spectrum_fx, sum;
    Encoder_State *st = NULL;
    TCX_ENC_HANDLE hTcxEnc = NULL;
    Word16 individual_decision[NB_DIV];
    Word32 maxPredictionGain_fx = 0, meanPredictionGain_fx;
    move32();
    Word16 maxPredictionGain_e = Q31, meanPredictionGain_e;
    Word16 maxPredictionGain_e = 0, meanPredictionGain_e;
    move16();
    Word16 sum_e = 0;
    move16();
@@ -5544,31 +5544,21 @@ void TNSAnalysisStereo_fx(
                         */

                        meanPredictionGain_fx = BASOP_Util_Add_Mant32Exp( Mpy_32_16_1( pFilter[0]->predictionGain32, 16384 /*0.5f Q15*/ ), pFilter[0]->predictionGain_e, Mpy_32_16_1( pFilter[1]->predictionGain32, 16384 /*0.5f Q15*/ ), pFilter[1]->predictionGain_e, &meanPredictionGain_e ); // meanPredictionGain_e
                        Word16 flag = BASOP_Util_Cmp_Mant32Exp( maxPredictionGain_fx, maxPredictionGain_e, meanPredictionGain_fx, meanPredictionGain_e );
                        IF( flag < 0 )

                        /* maxPredictionGain = max( maxPredictionGain, meanPredictionGain );*/
                        IF( GT_32( meanPredictionGain_fx, L_shl_sat( maxPredictionGain_fx, sub( maxPredictionGain_e, meanPredictionGain_e ) ) ) ) /* exp: meanPredictionGain_e */
                        {
                            maxPredictionGain_fx = meanPredictionGain_fx;
                            maxPredictionGain_e = meanPredictionGain_e;
                            move32();
                            move16();
                        }
                        flag = BASOP_Util_Cmp_Mant32Exp( pFilter[0]->predictionGain32, pFilter[0]->predictionGain_e, L_deposit_h( pTnsParameters[0]->minPredictionGain ), PRED_GAIN_E );
                        if ( flag < 0 )
                        {
                            flag = 0;
                            move16();
                        }
                        Word16 flag_1 = BASOP_Util_Cmp_Mant32Exp( pFilter[1]->predictionGain32, pFilter[1]->predictionGain_e, L_deposit_h( pTnsParameters[1]->minPredictionGain ), PRED_GAIN_E );
                        if ( flag_1 < 0 )
                        {
                            flag_1 = 0;
                            move16();
                        }

                        test();
                        test();
                        test();
                        IF( flag && LT_32( sts[0]->element_brate, IVAS_80k ) &&
                            flag_1 && EQ_16( sts[0]->hTcxEnc->tnsData[k].nFilters, sts[1]->hTcxEnc->tnsData[k].nFilters ) )
                        IF( GT_32( pFilter[0]->predictionGain32, L_shl_sat( L_deposit_h( pTnsParameters[0]->minPredictionGain ), sub( PRED_GAIN_E, pFilter[0]->predictionGain_e ) ) ) && LT_32( sts[0]->element_brate, IVAS_80k ) &&
                            GT_32( pFilter[1]->predictionGain32, L_shl_sat( L_deposit_h( pTnsParameters[1]->minPredictionGain ), sub( PRED_GAIN_E, pFilter[1]->predictionGain_e ) ) ) && EQ_16( sts[0]->hTcxEnc->tnsData[k].nFilters, sts[1]->hTcxEnc->tnsData[k].nFilters ) )
                        {
                            pFilter[0]->predictionGain32 = pFilter[1]->predictionGain32 = meanPredictionGain_fx; /* more TNS filter sync at 48kbps */
                            move32();
@@ -5578,39 +5568,29 @@ void TNSAnalysisStereo_fx(
                            move16();
                            pFilter[0]->predictionGain = pFilter[1]->predictionGain = shl_sat( extract_h( meanPredictionGain_fx ), sub( meanPredictionGain_e, PRED_GAIN_E ) ); /* Q7 */
                            move16();
                            move16();
                        }
                        flag = BASOP_Util_Cmp_Mant32Exp( Mpy_32_16_1( meanPredictionGain_fx, SIMILAR_TNS_THRESHOLD_FX_IN_Q15 ), meanPredictionGain_e, L_abs( BASOP_Util_Add_Mant32Exp( pFilter[0]->predictionGain32, pFilter[0]->predictionGain_e, L_negate( pFilter[1]->predictionGain32 ), pFilter[1]->predictionGain_e, &sum_e ) ), sum_e );
                        if ( flag < 0 )
                        {
                            flag = 0;
                            move16();
                        }
                        test();
                        IF( flag &&
                        sum_e = s_max( pFilter[0]->predictionGain_e, pFilter[1]->predictionGain_e );
                        sum = L_abs( L_sub_sat( L_shl( pFilter[0]->predictionGain32, sub( pFilter[0]->predictionGain_e, sum_e ) ), L_shl( pFilter[1]->predictionGain32, sub( pFilter[1]->predictionGain_e, sum_e ) ) ) ); // sum_e

                        IF( LT_32( L_shl_sat( sum, sub( sum_e, meanPredictionGain_e ) ), Mpy_32_16_1( meanPredictionGain_fx, SIMILAR_TNS_THRESHOLD_FX_IN_Q15 ) ) &&
                            ( EQ_16( sts[0]->hTcxEnc->tnsData[k].nFilters, sts[1]->hTcxEnc->tnsData[k].nFilters ) ) )
                        {

                            Word16 maxAvgSqrCoef_fx = s_max( pFilter[0]->avgSqrCoef, pFilter[1]->avgSqrCoef ); // Q15
                            Word16 meanLtpGain_fx = add( shr( sts[0]->hTcxEnc->tcxltp_gain, 1 ), shr( sts[1]->hTcxEnc->tcxltp_gain, 1 ) );
                            // maxPredGain_fx = L_max( maxPredGain_fx, meanPredictionGain_fx );
                            flag = BASOP_Util_Cmp_Mant32Exp( maxPredGain_fx, maxPredGain_e, meanPredictionGain_fx, meanPredictionGain_e );
                            IF( flag < 0 )

                            /* maxPredGain_fx = L_max( maxPredGain_fx, meanPredictionGain_fx ); */
                            IF( GT_32( meanPredictionGain_fx, L_shl_sat( maxPredGain_fx, sub( maxPredGain_e, maxPredictionGain_e ) ) ) ) /* exp: meanPredictionGain_e */
                            {
                                maxPredGain_fx = meanPredictionGain_fx;
                                maxPredGain_e = meanPredictionGain_e;
                                move32();
                                move16();
                            }
                            flag = BASOP_Util_Cmp_Mant32Exp( meanPredictionGain_fx, meanPredictionGain_e, L_deposit_h( pTnsParameters[0]->minPredictionGain ), PRED_GAIN_E );
                            if ( flag < 0 )
                            {
                                flag = 0;
                                move16();
                            }

                            test();
                            test();
                            IF( flag || GT_16( maxAvgSqrCoef_fx, pTnsParameters[0]->minAvgSqrCoef ) )
                            IF( GT_32( meanPredictionGain_fx, L_shl_sat( L_deposit_h( pTnsParameters[0]->minPredictionGain ), sub( PRED_GAIN_E, meanPredictionGain_e ) ) ) || GT_16( maxAvgSqrCoef_fx, pTnsParameters[0]->minAvgSqrCoef ) )
                            {
                                test();
                                test();
@@ -5813,16 +5793,13 @@ void TNSAnalysisStereo_fx(
                            move16();
                        }
                    }
                    Word16 flag = BASOP_Util_Cmp_Mant32Exp( TNS_GAIN_THRESHOLD_FOR_WHITE_FX_IN_Q23, PRED_GAIN_E, maxPredGain_fx, maxPredGain_e );
                    if ( flag < 0 )
                    {
                        flag = 0;
                        move16();
                    }

                    test();
                    test();
                    test();
                    IF( !bWhitenedDomain && individual_decision[k] == 0 && flag && NE_16( sts[0]->hTcxEnc->transform_type[k], TCX_5 ) )
                    IF( !bWhitenedDomain && individual_decision[k] == 0 &&
                        LT_32( L_shl_sat( maxPredGain_fx, sub( maxPredGain_e, PRED_GAIN_E ) ), TNS_GAIN_THRESHOLD_FOR_WHITE_FX_IN_Q23 ) &&
                        NE_16( sts[0]->hTcxEnc->transform_type[k], TCX_5 ) )
                    {
                        sts[0]->hTcxEnc->bTnsOnWhithenedSpectra[k] = 1;
                        move16();
@@ -5842,9 +5819,9 @@ void TNSAnalysisStereo_fx(
                            ClearTnsFilterCoefficients( sts[1]->hTcxEnc->tnsData[k].filter + iFilter );
                        }
                    }
                    //   maxPredictionGain_fx = L_max( maxPredictionGain_fx, maxPredGain_fx );
                    flag = BASOP_Util_Cmp_Mant32Exp( maxPredictionGain_fx, maxPredictionGain_e, maxPredGain_fx, maxPredGain_e );
                    IF( flag < 0 )

                    /* maxPredictionGain_fx = L_max( maxPredictionGain_fx, maxPredGain_fx ); */
                    IF( GT_32( maxPredGain_fx, L_shl_sat( maxPredictionGain_fx, sub( maxPredictionGain_e, maxPredGain_e ) ) ) ) /* exp: maxPredGain_e */
                    {
                        maxPredictionGain_fx = maxPredGain_fx;
                        maxPredictionGain_e = maxPredGain_e;
@@ -5902,22 +5879,16 @@ void TNSAnalysisStereo_fx(
                    pTnsParameters = sts[ch]->hTcxCfg->pCurrentTnsConfig->pTnsParameters + iFilter;

                    // maxPredGain_fx = L_max( maxPredGain_fx, pFilter->predictionGain32 );
                    Word16 flag = BASOP_Util_Cmp_Mant32Exp( maxPredGain_fx, maxPredGain_e, pFilter->predictionGain32, pFilter->predictionGain_e );
                    IF( flag < 0 )
                    IF( GT_32( pFilter->predictionGain32, L_shl_sat( maxPredGain_fx, sub( maxPredGain_e, pFilter->predictionGain_e ) ) ) ) /* pFilter->predictionGain_e */
                    {
                        maxPredGain_fx = pFilter->predictionGain32;
                        move32();
                        maxPredGain_e = pFilter->predictionGain_e;
                        move32();
                        move16();
                    }
                    flag = BASOP_Util_Cmp_Mant32Exp( pFilter->predictionGain32, pFilter->predictionGain_e, L_deposit_h( pTnsParameters->minPredictionGain ), PRED_GAIN_E );
                    if ( flag < 0 )
                    {
                        flag = 0;
                        move16();
                    }

                    test();
                    IF( flag || GT_16( pFilter->avgSqrCoef, pTnsParameters->minAvgSqrCoef ) )
                    IF( GT_32( pFilter->predictionGain32, L_shl_sat( L_deposit_h( pTnsParameters->minPredictionGain ), sub( PRED_GAIN_E, pFilter->predictionGain_e ) ) ) || GT_16( pFilter->avgSqrCoef, pTnsParameters->minAvgSqrCoef ) )
                    {
                        test();
                        test();
@@ -5980,24 +5951,17 @@ void TNSAnalysisStereo_fx(
                    }
                }

                IF( ( sts[ch]->hTcxEnc->tnsData[k].nFilters > 0 ) )
                {
                    sts[ch]->hTcxEnc->fUseTns[k] = 1;
                }
                ELSE
                {
                sts[ch]->hTcxEnc->fUseTns[k] = 0;
                }
                move16();
                Word16 flag = BASOP_Util_Cmp_Mant32Exp( TNS_GAIN_THRESHOLD_FOR_WHITE_FX_IN_Q23, PRED_GAIN_E, maxPredGain_fx, maxPredGain_e );
                if ( flag < 0 )
                if ( sts[ch]->hTcxEnc->tnsData[k].nFilters > 0 )
                {
                    flag = 0;
                    sts[ch]->hTcxEnc->fUseTns[k] = 1;
                    move16();
                }

                test();
                test();
                IF( !bWhitenedDomain && flag && NE_16( sts[ch]->hTcxEnc->transform_type[k], TCX_5 ) )
                IF( !bWhitenedDomain && LT_32( L_shl_sat( maxPredGain_fx, sub( maxPredGain_e, PRED_GAIN_E ) ), TNS_GAIN_THRESHOLD_FOR_WHITE_FX_IN_Q23 ) && NE_16( sts[ch]->hTcxEnc->transform_type[k], TCX_5 ) )
                {
                    sts[ch]->hTcxEnc->fUseTns[k] = 0;
                    move16();
@@ -6012,9 +5976,9 @@ void TNSAnalysisStereo_fx(
                        move16();
                    }
                }

                // maxPredictionGain_fx = L_max( maxPredictionGain_fx, maxPredGain_fx );
                flag = BASOP_Util_Cmp_Mant32Exp( maxPredictionGain_fx, maxPredictionGain_e, maxPredGain_fx, maxPredGain_e );
                IF( flag < 0 )
                IF( GT_32( maxPredGain_fx, L_shl_sat( maxPredictionGain_fx, sub( maxPredictionGain_e, maxPredGain_e ) ) ) ) /* maxPredGain_e */
                {
                    maxPredictionGain_fx = maxPredGain_fx;
                    maxPredictionGain_e = maxPredGain_e;
Loading