Commit 1cda1ff1 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Few bug fixes and precision improvements

parent e43f1385
Loading
Loading
Loading
Loading
Loading
+26 −9
Original line number Diff line number Diff line
@@ -2391,6 +2391,20 @@ void syn_filt_fx(
    const Word16 update_m /* i  : update memory flag Q0 : 0 --> no memory update */
);                        /*                              1 --> update of memory */
void syn_filt_fx32(
    const Word16 a_e,     /* i  : exp of LP coeffs                          Q0   */
    const Word32 a[],     /* i  : LP filter coefficients                    Q12  */
    const Word16 m,       /* i  : order of LP filter                        Q0   */
    const Word32 x[],     /* i  : input signal                              Qx   */
    const Word16 x_e,     /* i  : input signal                              Qx   */
    Word32 y[],           /* o  : output signal                             Qx   */
    Word16 *y_e,          /* o  : output signal                             Qx   */
    const Word16 l,       /* i  : size of filtering                         Q0   */
    Word32 mem[],         /* i/o: initial filter states                     Qx   */
    Word16 *mem_e,        /* i/o: initial filter states                     Qx   */
    const Word16 update_m /* i  : update memory flag Q0 : 0 --> no memory update */
);
void E_UTIL_synthesis( const Word16 shift, const Word16 a[], const Word16 x[], Word16 y[], const Word16 lg, Word16 mem[], const Word16 update, const Word16 m );
void E_UTIL_synthesis_fx( const Word16 shift, const Word32 a[], const Word32 x[], Word32 y[], const Word16 lg, Word32 mem[], const Word16 update, const Word16 m );
@@ -3011,10 +3025,13 @@ void GenShapedSHBExcitation_ivas_enc_fx(
    const Word16 element_mode,  /* i  : element mode                            */
    const Word16 flag_ACELP16k, /* i  : ACELP@16kHz flag                        */
    Word16 *nlExc16k,           /* i/o: NL exc for IC-BWE                       */
    Word16 *nlExc16k_e,         /* i/o: exp of nlExc16k                         */
    Word16 *mixExc16k,          /* i/o: exc spreading for IC-BWE                */
    Word16 *mixExc16k_e,        /* i/o: exp of mixExc16k_fx                     */
    const Word32 extl_brate,    /* i  : extension layer bitarte                 */
    const Word16 MSFlag,        /* i  : Multi Source flag                       */
    Word16 EnvSHBres_4k[],      /* i/o: TD envelope of the SHB residual signal  */
    Word16 Q_EnvSHBres_4k,
    Word32 *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame */
    Word16 *prev_mix_factor,      /* i/o: mixing factor in the previous frame     */
    Word16 *Env_error,            /* o  : error in SHB residual envelope modelling*/
+67 −66
Original line number Diff line number Diff line
@@ -760,14 +760,15 @@ void Calc_rc0_h(
    Word32 L_acc;
    Word16 *ptrs;
    Word16 acf0, acf1;
    Word16 temp, sh_acf;
    Word16 temp, sh_acf, tmp2;
    Word16 i;

    /* computation of the autocorrelation function acf */
    L_acc = L_mult( h[0], h[0] );
    FOR( i = 1; i < LONG_H_ST; i++ )
    {
        L_acc = L_mac( L_acc, h[i], h[i] );
        tmp2 = shr( h[i], 2 );
        L_acc = L_mac( L_acc, tmp2, tmp2 );
    }
    sh_acf = norm_l( L_acc );
    L_acc = L_shl( L_acc, sh_acf );
@@ -780,9 +781,9 @@ void Calc_rc0_h(
    L_acc = L_mult( temp, *ptrs );
    FOR( i = 1; i < LONG_H_ST - 1; i++ )
    {
        temp = *ptrs++;
        temp = shr( *ptrs++, 2 );
        move16();
        L_acc = L_mac( L_acc, temp, *ptrs );
        L_acc = L_mac( L_acc, temp, shr( *ptrs, 2 ) );
    }
    L_acc = L_shl( L_acc, sh_acf );
    acf1 = extract_h( L_acc );
@@ -2849,10 +2850,13 @@ void GenShapedSHBExcitation_ivas_enc_fx(
    const Word16 element_mode,    /* i  : element mode                                               */
    const Word16 flag_ACELP16k,   /* i  : ACELP@16kHz flag                                           */
    Word16 *nlExc16k,             /* i/o: NL exc for IC-BWE                                          */
    Word16 *nlExc16k_e,           /* i/o: exp of nlExc16k                                            */
    Word16 *mixExc16k,            /* i/o: exc spreading for IC-BWE                                   */
    Word16 *mixExc16k_e,          /* i/o: exp of mixExc16k_fx                                        */
    const Word32 extl_brate,      /* i  : extension layer bitarte                                    */
    const Word16 MSFlag,          /* i  : Multi Source flag                                          */
    Word16 EnvSHBres_4k[],        /* i/o: TD envelope of the SHB residual signal                     */
    Word16 Q_EnvSHBres_4k,
    Word32 *prev_pow_exc16kWhtnd, /* i/o: power of the LB excitation signal in the previous frame    */
    Word16 *prev_mix_factor,      /* i/o: mixing factor in the previous frame                        */
    Word16 *Env_error,            /* o  : error in SHB residual envelope modelling                Q0 */
@@ -2872,6 +2876,7 @@ void GenShapedSHBExcitation_ivas_enc_fx(

    Word16 excTmp2[L_FRAME16k];
    Word16 *White_exc16k;
    Word16 Q_White_exc16k;
    Word16 excNoisyEnv[L_FRAME16k];
    Word16 csfilt_num2[1] = { 6554 }; /*0.2 in Q15 */
    move16();
@@ -2899,7 +2904,6 @@ void GenShapedSHBExcitation_ivas_enc_fx(
    Word16 White_exc16k_FB_temp[L_FRAME16k];
    Word32 White_exc16k_32[L_FRAME16k];
    Word16 White_exc16k_tmp[L_FRAME16k];
    Word16 Q_temp;
    Word16 prev_Q_bwe_exc_fb;
    Word16 chk1, chk2;
    chk1 = 0;
@@ -3089,7 +3093,6 @@ void GenShapedSHBExcitation_ivas_enc_fx(
    }

    White_exc16k = exc16k;
    move16();
    Word16 Q_excTmp2 = add( getScaleFactor16( excTmp2, L_FRAME16k ), *Q_bwe_exc );
    IF( *mem_csfilt )
    {
@@ -3168,12 +3171,12 @@ void GenShapedSHBExcitation_ivas_enc_fx(
        /* generate gaussian (white) excitation */
        FOR( k = 0; k < L_FRAME16k; k++ )
        {
            White_exc16k[k] = own_random( &bwe_seed[0] );
            White_exc16k[k] = own_random( &bwe_seed[0] ); // Q0
            move16();
        }

        /* normalize the amplitude of the gaussian excitation to that of the LB exc. */
        Word32 pow22_inv = POW_EXC16k_WHTND_FX_INV_SQRT;
        Word32 pow22_inv = POW_EXC16k_WHTND_FX_INV_SQRT; // Q31
        move32();
        move32();
        pow22 = POW_EXC16k_WHTND_FX;
@@ -3189,27 +3192,20 @@ void GenShapedSHBExcitation_ivas_enc_fx(
        // v_multc_fixed_16_16(White_exc16k, round_fx(temp_pow), White_exc16k, L_FRAME16k);
        L_tmp = 0;
        move32();
        Q_White_exc16k = add( getScaleFactor16( White_exc16k, L_FRAME16k ), norm_l( temp_pow ) );
        FOR( k = 0; k < L_FRAME16k; k++ )
        {
            White_exc16k_32[k] = Mpy_32_16_1( temp_pow, White_exc16k[k] );
            White_exc16k_32[k] = Mpy_32_16_1( temp_pow, White_exc16k[k] ); // Q31 + Q0 - Q15 = Q16
            move32();
            White_exc16k[k] = round_fx( L_shl( White_exc16k_32[k], sub( *Q_bwe_exc, NOISE_QADJ ) ) ); //  Q_bwe_exc - NOISE_QADJ
            White_exc16k[k] = round_fx( L_shl( White_exc16k_32[k], Q_White_exc16k ) ); //  Q16 + Q_White_exc16k - Q16 = Q_White_exc16k
            move16();
            L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
        }
        Q_temp = norm_l( L_tmp );
        IF( L_tmp == 0 )
        {
            Q_temp = 31;
            move16();
        }
    }
    ELSE
#endif
    {
        /* create a random excitation - Reuse exc16k memory */
        White_exc16k = exc16k;
        move16();
        create_random_vector_fx( White_exc16k, L_FRAME, bwe_seed );                        // Q5
        create_random_vector_fx( White_exc16k + L_FRAME, L_FRAME16k - L_FRAME, bwe_seed ); // Q5

@@ -3222,12 +3218,6 @@ void GenShapedSHBExcitation_ivas_enc_fx(
            move32();
            L_tmp = L_max( L_tmp, L_abs( White_exc16k_32[k] ) );
        }
        Q_temp = norm_l( L_tmp );
        IF( L_tmp == 0 )
        {
            Q_temp = 31;
            move16();
        }
        /*Copy_Scale_sig( White_exc16k, White_exc16k, L_FRAME16k, sub(NOISE_QFAC, 5) );)*/
        /* White_exc16k in Q6 */

@@ -3235,22 +3225,23 @@ void GenShapedSHBExcitation_ivas_enc_fx(
        /* pow22=0.00001f */
        tmp = sub( shl( sub( *Q_bwe_exc, NOISE_QADJ ), 1 ), 31 );
        Word64 sum = W_shl( 21475l /*0.00001f Q31*/, tmp ); /* 0.00001f in 2*(*Q_bwe_exc-NOISE_QADJ) */
        Q_White_exc16k = getScaleFactor32( White_exc16k_32, L_FRAME16k );
        FOR( k = 0; k < L_FRAME16k; k++ )
        {
            /* White_exc16k[k] *= excNoisyEnv[k]; */
            White_exc16k[k] = mult_r( excNoisyEnv[k], shl( White_exc16k[k], 1 ) ); // Q_excTmp2 + 5 + 1 - 15 ==> Q_excTmp2 - 9
            White_exc16k[k] = extract_h( L_shl( White_exc16k_32[k], Q_White_exc16k ) ); // Q_excTmp2 + 6 + Q_White_exc16k - 16 ==> Q_excTmp2 + Q_White_exc16k - 10
            move16();
            chk2 = s_or( chk2, White_exc16k[k] );
            /* i: excNoisyEnv in (Q_excTmp2)     */
            /* i: White_exc16k  in Q6               */
            /* o: White_exc16k in (Q_bwe_exc-NOISE_QADJ)  */
            /* pow22 += White_exc16k[k] * White_exc16k[k]; */
            sum = W_mac0_16_16( sum, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_excTmp2-NOISE_QADJ)*/
            sum = W_mac0_16_16( sum, White_exc16k[k], White_exc16k[k] ); /* 2*(Q_excTmp2 + Q_White_exc16k - 10)*/
        }
        Q_pow22 = W_norm( sum );
        pow22 = W_extract_h( W_shl( sum, Q_pow22 ) ); // 2*(Q_excTmp2-NOISE_QADJ)+Q_pow22-32
        Q_pow22 = sub( add( Q_pow22, shl( sub( Q_excTmp2, NOISE_QADJ ), 1 ) ), 32 );
        Scale_sig( White_exc16k, L_FRAME16k, sub( *Q_bwe_exc, Q_excTmp2 ) );
        pow22 = W_extract_h( W_shl( sum, Q_pow22 ) ); // 2*(Q_excTmp2 + Q_White_exc16k - 10)+Q_pow22-32
        Q_pow22 = sub( add( Q_pow22, shl( sub( add( Q_White_exc16k, Q_excTmp2 ), 10 ), 1 ) ), 32 );
        Q_White_exc16k = add( Q_White_exc16k, sub( Q_excTmp2, 10 ) );
    }

#if 1 // def ADD_IVAS_TBE_CODE
@@ -3272,7 +3263,7 @@ void GenShapedSHBExcitation_ivas_enc_fx(
            {
                FOR( k = 0; k < L_FRAME16k; k++ )
                {
                    White_exc16k_tmp[k] = round_fx( L_shl( White_exc16k_32[k], *Q_bwe_exc ) );
                    White_exc16k_tmp[k] = shl( White_exc16k[k], sub( *Q_bwe_exc, Q_White_exc16k ) );
                    move16();
                }

@@ -3298,8 +3289,8 @@ void GenShapedSHBExcitation_ivas_enc_fx(
                move32();

                temp1 = add( shl( *Q_bwe_exc, 1 ), 1 );
                temp2 = add( add( Q_shb, *Q_bwe_exc ), 1 );
                temp3 = add( shl( Q_shb, 1 ), 1 );
                temp2 = add( add( Q_EnvSHBres_4k, *Q_bwe_exc ), 1 );
                temp3 = add( shl( Q_EnvSHBres_4k, 1 ), 1 );
                FOR( i = 0; i < NUM_SHB_SUBGAINS; i++ )
                {
                    // c0_part[i] = sum2_f( &EnvExc16kWhtnd_4k[i * L_FRAME4k / NUM_SHB_SUBGAINS], L_FRAME4k / NUM_SHB_SUBGAINS );
@@ -3474,7 +3465,7 @@ void GenShapedSHBExcitation_ivas_enc_fx(
#endif
            {
                Estimate_mix_factors_fx( shb_res, Q_shb, exc16kWhtnd, *Q_bwe_exc, White_exc16k,
                                         ( *Q_bwe_exc - NOISE_QADJ ), pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind );
                                         Q_White_exc16k, pow1, Q_pow1, pow22, Q_pow22, voiceFacEst, vf_ind );
                tmp = voiceFacEst[0];
                tmp2 = MAX_16;
                move16();
@@ -3538,12 +3529,15 @@ void GenShapedSHBExcitation_ivas_enc_fx(
        }
    }
#if 1                                                                         // def ADD_IVAS_TBE_CODE
    Scale_sig( White_exc16k, L_FRAME16k, sub( *Q_bwe_exc, Q_White_exc16k ) ); // Q_bwe_exc
    test();
    IF( GE_16( element_mode, IVAS_CPE_DFT ) && nlExc16k != NULL )
    {
        /* save buffers for IC-BWE */
        // mvr2r(exc16kWhtnd, nlExc16k, L_FRAME16k);
        Copy( exc16kWhtnd, nlExc16k, L_FRAME16k );
        *nlExc16k_e = sub( 15, *Q_bwe_exc );
        move16();
        // v_multc(White_exc16k, (float)sqrt(pow1 / pow22), mixExc16k, L_FRAME16k);
        /*Word16 temp_fac = divide3232(L_shr(pow1, Q_pow1), pow22);
        Word16 temp_fac_exp = 0;
@@ -3553,24 +3547,27 @@ void GenShapedSHBExcitation_ivas_enc_fx(
        // v_multc_fixed_16_16(White_exc16k,shr(temp_fac, temp_fac_exp) , mixExc16k, L_FRAME16k);
        FOR( k = 0; k < L_FRAME16k; k++ )
        {
            mixExc16k[k] = mult_r( White_exc16k[k], temp_fac );
            mixExc16k[k] = mult_r( White_exc16k[k], temp_fac ); // Q_bwe_exc
            move16();
        }
        *mixExc16k_e = sub( 15, *Q_bwe_exc );
        move16();
    }
#endif

    tmp = sub( Q_temp, 3 );
    FOR( k = 0; k < L_FRAME16k; k++ )
    {
        White_exc16k_FB[k] = White_exc16k[k]; /* Q_bwe_exc-NOISE_QADJ */
        White_exc16k_FB[k] = White_exc16k[k]; /* Q_bwe_exc */
        move16();
    }
    prev_Q_bwe_exc_fb = *Q_bwe_exc_fb;
    move16();
    *Q_bwe_exc_fb = sub( *Q_bwe_exc, NOISE_QADJ );
    *Q_bwe_exc_fb = *Q_bwe_exc;
    move16();

    deemph_fx( White_exc16k, PREEMPH_FAC, L_FRAME16k, tbe_demph );
    /* i/o: White_exc16k (Q_bwe_exc-NOISE_QADJ) */
    /* i: tbe_demph (Q_bwe_exc-NOISE_QADJ) */
    /* i/o: White_exc16k (Q_bwe_exc) */
    /* i: tbe_demph (Q_bwe_exc) */

#if 1 // def ADD_IVAS_TBE_CODE
    test();
@@ -3585,34 +3582,39 @@ void GenShapedSHBExcitation_ivas_enc_fx(
            // old_scale = Sqrt16(old_scale, &old_scale_exp);
            // old_scale = shl(old_scale, old_scale_exp); //Q15
            L_tmp = root_a_over_b_fx( *prev_pow_exc16kWhtnd, 0, pow1, Q_pow1, &exp );
            old_scale = round_fx_sat( L_shl_sat( L_tmp, exp ) ); // Q15
            // new_scale = 1.0f;
            new_scale = 32767;
            IF( exp < 0 )
            {
                L_tmp = L_shl( L_tmp, exp );
                exp = 0;
                move16();
            }
            old_scale = round_fx_sat( L_tmp ); // exp
            // new_scale = 1.0f;
            new_scale = shr( 32767, exp ); // exp
            // step_scale = (new_scale - old_scale) / (L_FRAME16k / 2);
            step_scale = mult_r( sub( new_scale, old_scale ), 205 );
            scale = old_scale;
            step_scale = mult_r( sub( new_scale, old_scale ), 205 ); // exp
            scale = old_scale;                                       // exp
            move16();
            /* interpolate between the old and the new value of the mixing factor */
            old_fact = *prev_mix_factor;
            old_fact = *prev_mix_factor; // Q15
            move16();
            new_fact = mix_factor;
            new_fact = mix_factor; // Q15
            move16();
            // step = (new_fact - old_fact) / (L_FRAME16k / 2);
            step = mult_r( sub( new_fact, old_fact ), 205 );
            fact = old_fact;
            step = mult_r( sub( new_fact, old_fact ), 205 ); // Q15
            fact = old_fact;                                 // Q15
            move16();
            /* mixing of LB and gaussian excitation in the first half of the frame */
            FOR( k = 0; k < L_FRAME16k / 2; k++ )
            {
                // exc16kWhtnd[k] = (float)fact * (White_exc16k[k] * scale) + (float)(1 - fact) * exc16kWhtnd[k];
                // exc16kWhtnd[k] = add(mult_r(fact, mult(shl(White_exc16k[k], *Q_bwe_exc), scale)), mult_r(sub(32767, fact), exc16kWhtnd[k]));
                L_tmp = L_add( L_shl( L_mult( fact, mult_r( White_exc16k[k], scale ) ), NOISE_QADJ ),
                               L_mult( sub( 32767, fact ), exc16kWhtnd[k] ) ); // Q_bwe_exc
                exc16kWhtnd[k] = round_fx( L_tmp );
                L_tmp = L_add_sat( L_shl_sat( L_mult( fact, mult_r( White_exc16k[k], scale ) ), exp ), // Q15 + Q_bwe_exc + (Q15-exp) - Q15 + exp + Q1
                                   L_mult( sub( 32767, fact ), exc16kWhtnd[k] ) );                     // Q_bwe_exc + Q16
                exc16kWhtnd[k] = round_fx_sat( L_tmp );                                                // Q_bwe_exc
                move16();
                fact = add_sat( fact, step );
                scale = add_sat( scale, step_scale );
                fact = add_sat( fact, step );         // Q15
                scale = add_sat( scale, step_scale ); // exp
            }

            /* mixing of LB and gaussian excitation in the second half of the frame */
@@ -3620,14 +3622,14 @@ void GenShapedSHBExcitation_ivas_enc_fx(
            {
                // exc16kWhtnd[k] = (float)new_fact * White_exc16k[k] + (float)(1 - new_fact) * exc16kWhtnd[k];
                // exc16kWhtnd[k] = add(mult_r(new_fact, shl(White_exc16k[k], *Q_bwe_exc)), mult_r(sub(32767, new_fact), exc16kWhtnd[k]));
                L_tmp = L_add( L_shl( L_mult( new_fact, White_exc16k[k] ), NOISE_QADJ ),
                               mult_r( sub( 32767, new_fact ), exc16kWhtnd[k] ) ); // Q_bwe_exc
                exc16kWhtnd[k] = round_fx( L_tmp );
                L_tmp = L_add( L_mult( new_fact, White_exc16k[k] ),
                               mult_r( sub( 32767, new_fact ), exc16kWhtnd[k] ) ); // Q_bwe_exc + Q15 + Q1 => Q_bwe_exc + Q16
                exc16kWhtnd[k] = round_fx( L_tmp );                                // Q_bwe_exc
                move16();
            }
        }
        // preemph(exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph);
        PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph );
        PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); // Q_bwe_exc
    }
    ELSE
#endif
@@ -3650,13 +3652,13 @@ void GenShapedSHBExcitation_ivas_enc_fx(
            FOR( k = 0; k < L_FRAME16k; k++ )
            {
                /* White_exc16k: (Q_bwe_exc-NOISE_QADJ), scale: Q15 */
                L_tmp = L_mult( White_exc16k[k], scale );
                L_tmp = L_mult( White_exc16k[k], scale ); // Q_bwe_exc + Q15 + Q1 => Q_bwe_exc + Q16
                /* L_tmp: (Q_bwe_exc-NOISE_QADJ) + 15 + 1 */
                exc16kWhtnd[k] = round_fx_sat( L_shl_sat( L_tmp, NOISE_QADJ ) );
                exc16kWhtnd[k] = round_fx_sat( L_tmp ); // Q_bwe_exc
                move16();
                /* exc16kWhtnd:  Q_bwe_exc */
            }
            PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph );
            PREEMPH_FX( exc16kWhtnd, PREEMPH_FAC, L_FRAME16k, tbe_premph ); // Q_bwe_exc
            /* i/o: exc16kWhtnd  (Q_bwe_exc) */
            /* i/o: tbe_premph (Q_bwe_exc) */
        }
@@ -3721,9 +3723,8 @@ void GenShapedSHBExcitation_ivas_enc_fx(
                FOR( j = 0; j < lSubFr; j++ )
                {
                    /*exc16kWhtnd[k+j] = temp1 * exc16kWhtnd[k+j] + temp2 * White_exc16k[k+j]; */
                    L_tmp = L_mult( temp2, White_exc16k[k + j] ); /* 16+(Q_bwe_exc-NOISE_QADJ)*/
                    L_tmp = L_shl_sat( L_tmp, NOISE_QADJ );       /* 16+(Q_bwe_exc) */
                    exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] );
                    L_tmp = L_mult( temp2, White_exc16k[k + j] );                       /* 16+(Q_bwe_exc)*/
                    exc16kWhtnd[k + j] = mac_r_sat( L_tmp, temp1, exc16kWhtnd[k + j] ); // Q_bwe_exc
                    move16();
                    /* Q_bwe_exc */
                }
@@ -3740,7 +3741,7 @@ void GenShapedSHBExcitation_ivas_enc_fx(
                temp = div_s( temp, temp2 );           /* Q15 */
                temp = mult_r( PREEMPH_FAC, temp );

                PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph );
                PREEMPH_FX( &exc16kWhtnd[i * lSubFr], temp, lSubFr, tbe_premph ); // Q_bwe_exc
                /* exc16kWhtnd: Q_bwe_exc;
                   tbe_premph: Q_bwe_exc*/
            }
@@ -3753,7 +3754,7 @@ void GenShapedSHBExcitation_ivas_enc_fx(
    IF( LT_32( bitrate, ACELP_24k40 ) )
#endif
    {
        Syn_filt_s( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 );
        syn_filt_fx( 0, lpc_shb, LPC_SHB_ORDER, exc16kWhtnd, excSHB, L_FRAME16k, state_lpc_syn, 1 );
        /* i: exc16kWhtnd in Q_bwe_exc */
        /* o: excSHB in Q_bwe_exc */
    }
+81 −5
Original line number Diff line number Diff line
@@ -185,7 +185,8 @@ void syn_filt_fx(
{
    Word16 i, j;
    Word16 buf[L_FRAME48k + L_FRAME48k / 2 + TCXLTP_LTP_ORDER]; /* temporary synthesis buffer */
    Word16 s, *yy;
    Word16 *yy;
    Word32 s;
    Word16 q;
    Flag Overflow = 0;
    move16();
@@ -212,15 +213,16 @@ void syn_filt_fx(

    FOR( i = 0; i < l; i++ )
    {
        s = mult_r( shl_o( a0, q, &Overflow ), x[i] );
        s = L_mult( a0, x[i] );
        FOR( j = 1; j <= m; j++ )
        {
            s = msu_ro( L_deposit_h( s ), shl_o( a[j], q, &Overflow ), yy[i - j], &Overflow );
            s = L_msu_sat( s, shr( a[j], shift ), yy[i - j] );
        }

        yy[i] = s;
        s = L_shl_sat( s, q );
        yy[i] = extract_h( s );
        move16();
        y[i] = s;
        y[i] = extract_h( s );
        move16();
    }

@@ -241,6 +243,80 @@ void syn_filt_fx(
}


void syn_filt_fx32(
    const Word16 a_e,     /* i  : exp of LP coeffs                          Q0   */
    const Word32 a[],     /* i  : LP filter coefficients                    Q12  */
    const Word16 m,       /* i  : order of LP filter                        Q0   */
    const Word32 x[],     /* i  : input signal                              Qx   */
    const Word16 x_e,     /* i  : input signal                              Qx   */
    Word32 y[],           /* o  : output signal                             Qx   */
    Word16 *y_e,          /* o  : output signal                             Qx   */
    const Word16 l,       /* i  : size of filtering                         Q0   */
    Word32 mem[],         /* i/o: initial filter states                     Qx   */
    Word16 *mem_e,        /* i/o: initial filter states                     Qx   */
    const Word16 update_m /* i  : update memory flag Q0 : 0 --> no memory update */
    )                     /*                              1 --> update of memory */
{
    Word16 i, j;
    Word64 buf[L_FRAME48k + L_FRAME48k / 2 + TCXLTP_LTP_ORDER]; /* temporary synthesis buffer */
    Word64 s, *yy;

    yy = &buf[0];

    /*------------------------------------------------------------------*
     * copy initial filter states into synthesis buffer and do synthesis
     *------------------------------------------------------------------*/

    FOR( i = 0; i < m; i++ )
    {
        *yy++ = W_deposit32_l( mem[i] );
        move32();
    }

    /*-----------------------------------------------------------------------*
     * Do the filtering
     *-----------------------------------------------------------------------*/
    Word64 max_val = 1;
    FOR( i = 0; i < l; i++ )
    {
        s = W_deposit32_l( x[i] );
        FOR( j = 1; j <= m; j++ )
        {
            s = W_sub( s, W_mult0_32_32( a[j], W_extract_l( W_shr( yy[i - j], sub( 31, a_e ) ) ) ) );
        }

        yy[i] = s;
        move32();
        if ( GT_64( W_abs( s ), max_val ) )
        {
            max_val = W_abs( s );
        }
    }

    Word16 norm = W_norm( max_val );

    FOR( i = 0; i < l; i++ )
    {
        y[i] = W_extract_l( W_shr( yy[i], sub( 32, norm ) ) );
    }
    *y_e = sub( 31, add( sub( 31, x_e ), sub( norm, 32 ) ) );
    /*------------------------------------------------------------------*
     * Update memory if required
     *------------------------------------------------------------------*/

    IF( update_m )
    {
        FOR( i = 0; i < m; i++ )
        {
            mem[i] = W_extract_l( W_shr( yy[l - m + i], sub( 32, norm ) ) );
        }
        *mem_e = sub( 31, add( sub( 31, x_e ), sub( norm, 32 ) ) );
    }

    return;
}


/*
 * E_UTIL_synthesis
 *
+0 −9
Original line number Diff line number Diff line
@@ -1102,15 +1102,6 @@ ivas_error acelp_core_enc_ivas_fx(
        /* update Aw[] coefficients */
        weight_a_subfr_fx( shr( st->L_frame, 6 ), A, Aw, st->gamma, M );
    }
    IF( st->hLPDmem )
    {
        st->hLPDmem->q_mem_syn = sub( Q_new, 1 );
        move16();
        st->hLPDmem->q_lpd_old_exc = Q_new;
        move16();
        st->hLPDmem->q_lpd_syn = Q_new;
        move16();
    }

    test();
    test();
+1 −7
Original line number Diff line number Diff line
@@ -328,7 +328,6 @@ ivas_error ivas_core_enc_fx(
        /*---------------------------------------------------------------------*
         * Preprocessing (preparing) for ACELP/HQ core switching
         *---------------------------------------------------------------------*/

        core_switching_pre_enc_ivas_fx( st, old_inp_12k8_fx[n], sub( Q_new[n], 1 ), old_inp_16k_fx[n], sub( Q_new[n], 1 ), sts[0]->active_cnt, last_element_mode );

        /*---------------------------------------------------------------------*
@@ -794,13 +793,8 @@ ivas_error ivas_core_enc_fx(
            stereo_icBWE_preproc_fx( hCPE, input_frame, new_swb_speech_buffer_fx_16 /*tmp buffer*/, q_new_swb_speech_buffer );

            q_new_swb_speech_buffer = add( q_new_swb_speech_buffer, 16 );
#ifdef FIX_ISSUE_1237
            Copy_Scale_sig_16_32_no_sat( new_swb_speech_buffer_fx_16, new_swb_speech_buffer_fx, input_frame, Q16 ); // q_new_swb_speech_buffer
            Copy_Scale_sig_16_32_no_sat( voice_factors_fx[0], voice_factors_fx32[0], NB_SUBFR16k, Q16 );
#else
            Copy_Scale_sig_16_32_DEPREC( new_swb_speech_buffer_fx_16, new_swb_speech_buffer_fx, input_frame, Q16 ); // q_new_swb_speech_buffer
            Copy_Scale_sig_16_32_DEPREC( voice_factors_fx[0], voice_factors_fx32[0], NB_SUBFR16k, Q16 );            // Q31
#endif
            Copy_Scale_sig_16_32_no_sat( voice_factors_fx[0], voice_factors_fx32[0], NB_SUBFR16k, Q16 );            // Q31

            stereo_icBWE_enc_ivas_fx( hCPE, shb_speech_fx32, sub( Q31, Q_shb_spch ), new_swb_speech_buffer_fx, sub( Q31, q_new_swb_speech_buffer ), voice_factors_fx32[0] );

Loading