Commit 96cc2b6f 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 1e2efac0 c89d638e
Loading
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -729,8 +729,8 @@ ivas_error ivas_cpe_dec_fx(
            hCPE->hStereoDft->q_res_cod_mem_fx = hCPE->hStereoDft->q_dft;
            move16();
            stereo_dft_unify_dmx_fx( hCPE->hStereoDft, sts[0], DFT_fx, hCPE->input_mem_fx[1], hCPE->hStereoCng->prev_sid_nodata );
            scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( Q16, hCPE->hStereoDft->q_res_cod_mem_fx ) ); // Q16
            hCPE->hStereoDft->q_res_cod_mem_fx = Q16;
            scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( Q15, hCPE->hStereoDft->q_res_cod_mem_fx ) ); // Q15
            hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
            move16();
        }
        ELSE
@@ -754,8 +754,8 @@ ivas_error ivas_cpe_dec_fx(
                move16();
            }
            stereo_dft_dec_fx( hCPE->hStereoDft, sts[0], DFT_fx, hCPE->input_mem_fx[1], hCPE->hStereoCng, 0, 0, 0, 0, 0, 0, MAX_PARAM_SPATIAL_SUBFRAMES );
            scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( Q16, hCPE->hStereoDft->q_res_cod_mem_fx ) ); // Q16
            hCPE->hStereoDft->q_res_cod_mem_fx = Q16;
            scale_sig32( hCPE->hStereoDft->res_cod_mem_fx, STEREO_DFT_OVL_8k, sub( Q15, hCPE->hStereoDft->q_res_cod_mem_fx ) ); // Q15
            hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
            move16();
        }

+8 −8
Original line number Diff line number Diff line
@@ -146,7 +146,7 @@ void stereo_dft_dec_reset_fx(
    set16_fx( hStereoDft->res_cod_mode, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_DEC_DFT_NB );
    hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->hConfig->band_res][hStereoDft->hConfig->res_cod_mode];
    set32_fx( hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k );
    hStereoDft->q_res_cod_mem_fx = Q16;
    hStereoDft->q_res_cod_mem_fx = Q15;
    move16();

    hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max );
@@ -1357,7 +1357,7 @@ void stereo_dft_dec_res_fx(
    IF( EQ_16( hCPE->hStereoDft->res_cod_mode[STEREO_DFT_OFFSET - 1], STEREO_DFT_RES_COD_OFF ) )
    {
        set32_fx( hCPE->hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k );
        hCPE->hStereoDft->q_res_cod_mem_fx = Q16;
        hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
        move16();
        set32_fx( hCPE->input_mem_fx[1], 0, NS2SA( 8000, STEREO_DFT32MS_OVL_NS ) );
        set16_fx( hCPE->hStereoDft->hBpf->pst_old_syn_fx, 0, STEREO_DFT_NBPSF_PIT_MAX_8k );
@@ -1370,7 +1370,7 @@ void stereo_dft_dec_res_fx(

    scale_sig( win, L_FRAME8k + STEREO_DFT_OVL_8k, -1 );

    Word16 q_shift = sub( hCPE->hStereoDft->q_res_cod_mem_fx, Q16 );
    Word16 q_shift = sub( hCPE->hStereoDft->q_res_cod_mem_fx, Q15 );
    IF( !prev_bfi )
    {
        /*OLA*/
@@ -1378,9 +1378,9 @@ void stereo_dft_dec_res_fx(

        FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ )
        {
            win[i] = extract_h( L_add( L_shr( hCPE->hStereoDft->res_cod_mem_fx[i], 1 ), L_shl( L_mult( win[i], hCPE->hStereoDft->win_8k_fx[i] ), q_shift ) ) ); /* q_res_cod_mem_fx -17 (q_shift -1)*/
            win[i] = extract_h( L_add( hCPE->hStereoDft->res_cod_mem_fx[i], L_shl( L_mult( win[i], hCPE->hStereoDft->win_8k_fx[i] ), q_shift ) ) ); /* q_res_cod_mem_fx -17 (q_shift -1)*/
            move16();
            hCPE->hStereoDft->res_cod_mem_fx[i] = L_shl( L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ), 1 ); /* -1 +15 +1 +1 */
            hCPE->hStereoDft->res_cod_mem_fx[i] = L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ); /* -1 +15 +1 */
            move32();
        }

@@ -1396,11 +1396,11 @@ void stereo_dft_dec_res_fx(
        move16();
        FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ )
        {
            win[i] = extract_h( Madd_32_16( Mpy_32_16_1( L_shr( hCPE->hStereoDft->res_cod_mem_fx[i], 1 ), sub( MAX_16, mult( fac, fac ) ) ),
            win[i] = extract_h( Madd_32_16( Mpy_32_16_1( hCPE->hStereoDft->res_cod_mem_fx[i], sub( MAX_16, mult( fac, fac ) ) ),
                                            L_shl( L_mult( hCPE->hStereoDft->win_8k_fx[i], win[i] ), q_shift ),
                                            sub( MAX_16, mult( sub( MAX_16, fac ), sub( MAX_16, fac ) ) ) ) ); /* Q(q_shift -1) */
            move16();
            hCPE->hStereoDft->res_cod_mem_fx[i] = L_shl( L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ), 1 ); /* Q16 */
            hCPE->hStereoDft->res_cod_mem_fx[i] = L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ); /* Q15 */
            move32();
            fac = add( fac, step );
        }
@@ -1411,7 +1411,7 @@ void stereo_dft_dec_res_fx(
        v_shr_16( &win[STEREO_DFT_OVL_8k], negate( q_shift ), &win[STEREO_DFT_OVL_8k], L_FRAME8k );
    }

    hCPE->hStereoDft->q_res_cod_mem_fx = Q16;
    hCPE->hStereoDft->q_res_cod_mem_fx = Q15;

    Copy( win, out_16, L_FRAME8k ); /* Q(q_shift -1 ) */

+1 −1
Original line number Diff line number Diff line
@@ -1841,7 +1841,7 @@ void stereo_switching_dec(

        /* reset residual coding / ESF (secondary channel) */
        set32_fx( hCPE->hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k );
        hCPE->hStereoDft->q_res_cod_mem_fx = Q16;
        hCPE->hStereoDft->q_res_cod_mem_fx = Q15;
        move16();

        set32_fx( hCPE->input_mem_fx[1], 0, NS2SA_FX2( sts[0]->output_Fs, STEREO_DFT32MS_OVL_NS ) );
+102 −49

File changed.

Preview size limit exceeded, changes collapsed.

+66 −58
Original line number Diff line number Diff line
@@ -6,7 +6,6 @@
#include <stdint.h>
#include "options.h"
#include "cnst.h"
//#include "prot_fx.h"
#include "prot_fx.h"     /* Function prototypes                    */
#include "prot_fx_enc.h" /* Function prototypes                    */
#include "stat_enc.h"
@@ -19,8 +18,8 @@
 *
 *-------------------------------------------------------------------*/
static void coderLookAheadInnovation(
    Word16 A_3Q12[],            /* input: coefficients NxAz[M+1]    */
    Word16 *pT,                 /* out:   pitch                     */
    Word16 A_3Q12[],            /* input: coefficients NxAz[M+1]    Q12*/
    Word16 *pT,                 /* out:   pitch                     Q0*/
    PLC_ENC_EVS_HANDLE st,      /* i/o:   coder memory state        */
    Word16 *speechLookAhead_Qx, /* i:   input speech in Q(st->Qold) */
    Word16 *old_exc,            /* i:   input excitation in Q(st->Qold) */
@@ -41,13 +40,18 @@ static void coderLookAheadInnovation(
    Word32 max_ps, max_ps_tmp;
    Word16 max_ps_e;
    Word16 tmp_loop;
    move32();
    move16();
    move16();
#ifdef BASOP_NOGLOB_DECLARE_LOCAL
    Flag Overflow = 0;
    move32();
#endif


    /* Debug init (not instrumented) */
    T0_fx = -3000;
    move16();
    subfr_len = shl( L_SUBFR, 1 ); /* 2*L_SUBFR */
    if ( GT_16( L_FRAME16k, L_frame ) )
    {
@@ -59,10 +63,10 @@ static void coderLookAheadInnovation(
     * - BASOP specific initialization.                                       *
     *------------------------------------------------------------------------*/
    /* initialization */
    exc_Qx = exc_buf_Qx + L_EXC_MEM + 8;
    exc_Qx = exc_buf_Qx + L_EXC_MEM + 8; /* Q(st->Qold) */
    FOR( i = 0; i < L_EXC_MEM + 8; i++ )
    {
        exc_buf_Qx[i] = old_exc[i];
        exc_buf_Qx[i] = old_exc[i]; /* Q(st->Qold) */
        move16();
    }

@@ -72,17 +76,17 @@ static void coderLookAheadInnovation(
     *------------------------------------------------------------------------*/
    /* find LP residual signal for look-ahead part */
    getLookAheadResSig( speechLookAhead_Qx, A_3Q12, exc_Qx, L_frame, 2 );
    Scale_sig( exc_Qx, subfr_len, 1 );
    Scale_sig( exc_Qx, subfr_len, 1 ); /* Q(st->Qold) + 1 */

    /* find target signals */
    prev_pitch = st->T0_4th;
    prev_pitch = st->T0_4th; /* Q0 */
    move16();
    /* find best candidate of pitch lag */
    T0_fx = st->T0_4th;
    T0_fx = st->T0_4th; /* Q0 */
    move16();
    mantissa_max = -0x7fffffffL;
    mantissa_max = -0x7fffffffL; /* Q15 */
    move32();
    max_ps = -0x7fffffffL;
    max_ps = -0x7fffffffL; /* Q15 */
    move32();
    max_ps_e = 16;
    move16();
@@ -90,14 +94,14 @@ static void coderLookAheadInnovation(
    /*find maximum*/
    exc_max = 0;
    move16();
    tmp_loop = s_min( -prev_pitch + search_range + subfr_len, 0 );
    tmp_loop = s_min( -prev_pitch + search_range + subfr_len, 0 ); /* Q0 */
    FOR( i = -prev_pitch - search_range; i < tmp_loop; i++ )
    {
        exc_max = s_max( exc_Qx[i], exc_max );
        exc_max = s_max( exc_Qx[i], exc_max ); /* Q(st->Qold) + 1 */
    }
    FOR( i = 0; i < subfr_len; i++ )
    {
        exc_max = s_max( exc_max, exc_Qx[i] );
        exc_max = s_max( exc_max, exc_Qx[i] ); /* Q(st->Qold) + 1 */
    }
    /*calculate scaling factor for optimal precision and assure no overflow in dotproduct*/
    exc_sh = sub( 15, norm_s( sub( subfr_len, 1 ) ) ); /*ceil(ld(subfr_len))*/
@@ -105,15 +109,15 @@ static void coderLookAheadInnovation(
    exc_sh = shr( add( exc_sh, 1 ), 1 );

    /*scale buffer only where its needed*/
    tmp_loop = s_min( -prev_pitch + search_range + subfr_len, 0 );
    tmp_loop = s_min( -prev_pitch + search_range + subfr_len, 0 ); /* Q0 */
    FOR( i = -prev_pitch - search_range; i < tmp_loop; i++ )
    {
        exc_Qx[i] = shr( exc_Qx[i], exc_sh );
        exc_Qx[i] = shr( exc_Qx[i], exc_sh ); /* Q(st->Qold) + 1 */
        move16();
    }
    FOR( i = 0; i < subfr_len; i++ )
    {
        exc_Qx[i] = shr( exc_Qx[i], exc_sh );
        exc_Qx[i] = shr( exc_Qx[i], exc_sh ); /* Q(st->Qold) + 1 */
        move16();
    }

@@ -122,7 +126,7 @@ static void coderLookAheadInnovation(
    move16();
    FOR( i = -prev_pitch - search_range; i < -prev_pitch + search_range + subfr_len; i++ )
    {
        alp_ini = L_mac( alp_ini, exc_Qx[i], exc_Qx[i] );
        alp_ini = L_mac( alp_ini, exc_Qx[i], exc_Qx[i] ); /* 2*(Q(st->Qold) + 1) + 1 */
    }

    FOR( i = -search_range; i < search_range; i++ )
@@ -138,24 +142,24 @@ static void coderLookAheadInnovation(

        FOR( k = 0; k < subfr_len; k++ )
        {
            ps = L_mac( ps, exc_Qx[k], exc_Qx[k - prev_pitch - i] );
            ps = L_mac( ps, exc_Qx[k], exc_Qx[k - prev_pitch - i] ); /* 2*(Q(st->Qold) + 1) + 1 */
        }

        /*calculate "small" dotproducts in order to subtract them from the "bigger" one*/
        FOR( k = negate( add( prev_pitch, search_range ) ); k < -prev_pitch - i; k++ )
        FOR( k = -( ( prev_pitch + search_range ) ); k < -prev_pitch - i; k++ )
        {
            alp_s1 = L_mac( alp_s1, exc_Qx[k], exc_Qx[k] );
            alp_s1 = L_mac( alp_s1, exc_Qx[k], exc_Qx[k] ); /* 2*(Q(st->Qold) + 1) + 1 */
        }
        tmp_loop = sub( add( search_range, subfr_len ), prev_pitch );
        FOR( k = +subfr_len - i - prev_pitch; k < tmp_loop; k++ )
        {
            alp_s2 = L_mac( alp_s2, exc_Qx[k], exc_Qx[k] );
            alp_s2 = L_mac( alp_s2, exc_Qx[k], exc_Qx[k] ); /* 2*(Q(st->Qold) + 1) + 1 */
        }
        alp = L_sub( alp_ini, L_add( alp_s1, alp_s2 ) );
        alp = L_max( alp, 1 ); /* alp must not be 0 */
        alp_e = shl( exc_sh, 1 );
        ps_e = shl( exc_sh, 1 );
        alp = ISqrt32( alp, &alp_e );
        alp = ISqrt32( alp, &alp_e );            /* Q31-alp_e */
        ps = Mpy_32_16_1( ps, round_fx( alp ) ); /*alp_e+ps_e*/

        ps_e = add( alp_e, ps_e );
@@ -173,7 +177,7 @@ static void coderLookAheadInnovation(
            T0_fx = add( prev_pitch, i );
        }
    }
    mantissa_max = max_ps;
    mantissa_max = max_ps; /* Q31-ps_e */
    move32();
    if ( mantissa_max < 0 )
    {
@@ -239,9 +243,9 @@ void enc_prm_side_Info_fx(
void encoderSideLossSimulation_fx(
    Encoder_State *st,
    PLC_ENC_EVS_HANDLE hPlc_Ext,
    Word16 *lsf_q,         /* Q1*1.28 */
    Word16 *lsf_q,            /* Qx2.56 */
    const Word16 stab_fac,    /* Q15 */
    const Word16 calcOnlyISF,
    const Word16 calcOnlyISF, /* Q0 */
    const Word16 L_frame )
{
    Word16 lspLocal_Q15[M];
@@ -251,11 +255,11 @@ void encoderSideLossSimulation_fx(
    /* Decoder State Update */
    IF( EQ_16( L_frame, L_FRAME_16k ) )
    {
        lsf2lsp_fx( lsf_q, lspLocal_Q15, M, INT_FS_16k_FX );
        lsf2lsp_fx( lsf_q, lspLocal_Q15, M, INT_FS_16k_FX ); /* Q15 */
    }
    ELSE
    {
        lsf2lsp_fx( lsf_q, lspLocal_Q15, M, INT_FS_FX );
        lsf2lsp_fx( lsf_q, lspLocal_Q15, M, INT_FS_FX ); /* Q15 */
    }


@@ -263,8 +267,8 @@ void encoderSideLossSimulation_fx(
                             st->narrowBand,
                             st->sr_core );

    Copy( st->mem_MA_fx, hPlc_Ext->mem_MA_14Q1, M );
    Copy( st->mem_AR_fx, hPlc_Ext->mem_AR, M );
    Copy( st->mem_MA_fx, hPlc_Ext->mem_MA_14Q1, M ); /* Qx2.56 */
    Copy( st->mem_AR_fx, hPlc_Ext->mem_AR, M );      /* Qx2.56 */


    /* ISF parameter processing for concealment */
@@ -272,15 +276,15 @@ void encoderSideLossSimulation_fx(
    hPlc_Ext->stab_fac_Q15 = stab_fac;
    move16();

    Copy( lsf_q, hPlc_Ext->lsfold_14Q1, M );
    Copy( lspLocal_Q15, hPlc_Ext->lspold_Q15, M );
    Copy( lsf_q, hPlc_Ext->lsfold_14Q1, M );       /* Qx2.56 */
    Copy( lspLocal_Q15, hPlc_Ext->lspold_Q15, M ); /* Q15 */


    IF( calcOnlyISF != 0 )
    {
        /* ISF concealment simulation */
        getConcealedLSF( hPlc_Ext, xsfBase, st->clas, L_frame );
        hPlc_Ext->T0 = hPlc_Ext->T0_4th;
        hPlc_Ext->T0 = hPlc_Ext->T0_4th; /* Q0 */
        move16();
    }
    ELSE
@@ -300,9 +304,9 @@ void encoderSideLossSimulation_fx(
        getConcealedLP( hPlc_Ext, A_3Q12, xsfBase, st->clas, L_frame );

        /* apply encoder side PLC simulation */
        hPlc_Ext->pit_min = st->pit_min;
        hPlc_Ext->pit_min = st->pit_min; /* Q0 */
        move16();
        hPlc_Ext->pit_max = st->pit_max;
        hPlc_Ext->pit_max = st->pit_max; /* Q0 */
        move16();
        coderLookAheadInnovation( A_3Q12, &( hPlc_Ext->T0 ), hPlc_Ext, speechLookAhead_Qx, old_exc_Qx, L_frame );
    }
@@ -336,11 +340,11 @@ void GplcTcxEncSetup_fx(
 *
 *-------------------------------------------------------------------*/
Word16 encSideSpecPowDiffuseDetector_fx(
    Word16 *lsf_ref,
    Word16 *lsf_con,
    const Word32 sr_core,
    Word16 *prev_lsf4_mean,
    const Word8 sw,
    Word16 *lsf_ref,        /* Qx2.56 */
    Word16 *lsf_con,        /* Qx2.56 */
    const Word32 sr_core,   /* Q0 */
    Word16 *prev_lsf4_mean, /* Qx2.56 */
    const Word8 sw,         /* Q0 */
    const Word16 coder_type )
{
    Word16 tmp;
@@ -355,14 +359,14 @@ Word16 encSideSpecPowDiffuseDetector_fx(

    /* calculate the mean of the lowest 4 LSFs */

    L_tmp = L_mult( lsf_ref[0], 8192 /*1.0/4.0 Q15*/ );
    L_tmp = L_mac( L_tmp, lsf_ref[1], 8192 /*1.0/4.0 Q15*/ );
    L_tmp = L_mac( L_tmp, lsf_ref[2], 8192 /*1.0/4.0 Q15*/ );
    lsf4_mean = mac_r( L_tmp, lsf_ref[3], 8192 /*1.0/4.0 Q15*/ );
    L_tmp = L_mult( lsf_ref[0], 8192 /*1.0/4.0 Q15*/ );           /* Qx2.56 */
    L_tmp = L_mac( L_tmp, lsf_ref[1], 8192 /*1.0/4.0 Q15*/ );     /* Qx2.56 */
    L_tmp = L_mac( L_tmp, lsf_ref[2], 8192 /*1.0/4.0 Q15*/ );     /* Qx2.56 */
    lsf4_mean = mac_r( L_tmp, lsf_ref[3], 8192 /*1.0/4.0 Q15*/ ); /* Qx2.56 */

    IF( sw )
    {
        Copy( lsf_con, lsf_mod, M );
        Copy( lsf_con, lsf_mod, M ); /* Qx2.56 */

        modify_lsf( lsf_mod, M, sr_core, 1 );

@@ -372,28 +376,29 @@ Word16 encSideSpecPowDiffuseDetector_fx(
        cum_dist2 = 0;

        cnt_imprv = 0;
        move16();

        IF( EQ_32( sr_core, INT_FS_16k ) )
        {
            th = 2560;
            th = 2560;    /* Qx2.56 */
            move16();     /* LSF */
            th_dif = 288;
            th_dif = 288; /* Qx2.56 */
            move16();     /* LSF */
        }
        ELSE
        {
            th = 2048;
            th = 2048;    /* Qx2.56 */
            move16();     /* LSF */
            th_dif = 230;
            th_dif = 230; /* Qx2.56 */
            move16();     /* LSF */
        }

        FOR( i = 0; i < M; i++ )
        {
            tmp = sub( lsf_con[i], lsf_ref[i] );
            dist1 = L_mult( tmp, tmp );
            dist1 = L_mult( tmp, tmp ); /* 2*(Qx2.56)+1 */
            tmp = sub( lsf_mod[i], lsf_ref[i] );
            dist2 = L_mult( tmp, tmp );
            dist2 = L_mult( tmp, tmp ); /* 2*(Qx2.56)+1 */

            if ( GT_32( dist1, dist2 ) )
            {
@@ -409,6 +414,7 @@ Word16 encSideSpecPowDiffuseDetector_fx(
        test();
        test();
        test();
        test();
        if ( GT_32( cum_dist1, L_add( cum_dist2, Mpy_32_16_1( cum_dist2, 4915 ) ) ) && GT_16( sub( lsf4_mean, *prev_lsf4_mean ), th_dif ) && LT_16( *prev_lsf4_mean, th ) && GT_16( cnt_imprv, 2 ) && EQ_16( coder_type, GENERIC ) )
        {
            idx = 1;
@@ -438,17 +444,19 @@ void updateSpecPowDiffuseIdx_fx(
    Word16 k;
#ifdef BASOP_NOGLOB_DECLARE_LOCAL
    Flag Overflow = 0;
    move32();
#endif


    move32();
    move16();
    st->mean_gc[1] = st->gain_code[0];
    min_gp = st->bpf_gainT[0];
    st->mean_gc[1] = st->gain_code[0]; /* Q15 */
    min_gp = st->bpf_gainT[0];         /* Q15 */

    FOR( k = 1; k < 4; k++ )
    {
        st->mean_gc[1] = L_add_o( st->mean_gc[1], st->gain_code[k], &Overflow );
        move32();
        min_gp = s_min( min_gp, st->bpf_gainT[k] );
    }

@@ -460,5 +468,5 @@ void updateSpecPowDiffuseIdx_fx(
        st->glr_idx[0] = 0;
    }
    move16();
    st->mean_gc[0] = st->mean_gc[1];
    st->mean_gc[0] = st->mean_gc[1]; /* Q15 */
}
Loading