Commit 19a1fb17 authored by Fabian Bauer's avatar Fabian Bauer
Browse files

Merge branch 'main' into 1326-complexity-issue-ism-4-32-kbps-fb-to-binaural-basop

parents e556037d d4fd91a6
Loading
Loading
Loading
Loading
Loading
+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;
+2 −2
Original line number Diff line number Diff line
@@ -3205,7 +3205,7 @@ static Word16 SWB_BWE_encoding_ivas_fx(
            tmp = i_mult2( n_band, L );
            FOR( i = 0; i < L; i++ )
            {
                WB_tenv_syn_fx = L_add( WB_tenv_syn_fx, L_shr( L_mult0( synth_fx[i + tmp], synth_fx[i + tmp] ), 7 ) );         /*2*st_fx->Q_syn2 - 7 */
                WB_tenv_syn_fx = L_add( WB_tenv_syn_fx, L_shr( L_mult0( synth_fx[i + tmp], synth_fx[i + tmp] ), 7 ) );         /*2*Q_insig_lp-7 */
                WB_tenv_orig_fx = L_add( WB_tenv_orig_fx, L_shr( L_mult0( insig_lp_fx[i + tmp], insig_lp_fx[i + tmp] ), 7 ) ); /*2*Q_insig_lp - 7 */
            }

@@ -3239,7 +3239,7 @@ static Word16 SWB_BWE_encoding_ivas_fx(
#else
            den = round_fx( L_shl( WB_tenv_syn_fx, expd ) );
#endif
            expd = sub( sub( 30, expd ), sub( shl( st_fx->Q_syn2, 1 ), 7 ) );
            expd = sub( sub( 30, expd ), sub( shl( Q_insig_lp, 1 ), 7 ) );

            scale = shr( sub( den, num ), 15 );
            num = shl( num, scale );