Loading lib_com/prot_fx.h +31 −9 Original line number Diff line number Diff line Loading @@ -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 ); Loading Loading @@ -2866,6 +2880,11 @@ void Calc_rc0_h( Word16 *rc0 /* o : 1st parcor */ ); void Calc_rc0_h_ivas_enc_fx( Word16 *h, /* i : impulse response of composed filter */ Word16 *rc0 /* o : 1st parcor */ ); void PostShortTerm_fx( Word16 *sig_in, /* i : i signal (pointer to current subframe */ Word16 *lpccoeff, /* i : LPC coefficients for current subframe */ Loading Loading @@ -3011,10 +3030,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*/ Loading lib_com/swb_tbe_com_fx.c +133 −74 Original line number Diff line number Diff line Loading @@ -810,6 +810,65 @@ void Calc_rc0_h( } } void Calc_rc0_h_ivas_enc_fx( Word16 *h, /* i : impulse response of composed filter */ Word16 *rc0 /* o : 1st parcor */ ) { Word32 L_acc; Word16 *ptrs; Word16 acf0, acf1; 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++ ) { 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 ); acf0 = extract_h( L_acc ); ptrs = h; temp = *ptrs++; move16(); L_acc = L_mult( temp, *ptrs ); FOR( i = 1; i < LONG_H_ST - 1; i++ ) { temp = shr( *ptrs++, 2 ); move16(); L_acc = L_mac( L_acc, temp, shr( *ptrs, 2 ) ); } L_acc = L_shl( L_acc, sh_acf ); acf1 = extract_h( L_acc ); /* Compute 1st parcor */ IF( acf0 == 0 ) { *rc0 = 0; move16(); return; } IF( LT_16( acf0, abs_s( acf1 ) ) ) { *rc0 = 0; move16(); return; } *rc0 = div_s( abs_s( acf1 ), acf0 ); move16(); IF( acf1 > 0 ) { *rc0 = negate( *rc0 ); move16(); } } static void Calc_st_filt_tbe( Word16 *apond2, /* i : coefficients of numerator */ Word16 *apond1, /* i : coefficients of denominator */ Loading Loading @@ -868,7 +927,7 @@ static void Calc_st_filt_tbe_ivas_enc_fx( /* compute i.r. of composed filter apond2 / apond1 */ syn_filt_fx( temp, apond1, LPC_SHB_ORDER, apond2, h, LONG_H_ST, mem_zero, 0 ); /* compute 1st parcor */ Calc_rc0_h( h, parcor0 ); Calc_rc0_h_ivas_enc_fx( h, parcor0 ); /* compute g0 */ L_g0 = L_mult0( 1, abs_s( h[0] ) ); Loading Loading @@ -2849,10 +2908,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 */ Loading @@ -2872,6 +2934,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(); Loading Loading @@ -2899,7 +2962,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; Loading Loading @@ -3089,7 +3151,6 @@ void GenShapedSHBExcitation_ivas_enc_fx( } White_exc16k = exc16k; move16(); Word16 Q_excTmp2 = add( getScaleFactor16( excTmp2, L_FRAME16k ), *Q_bwe_exc ); IF( *mem_csfilt ) { Loading Loading @@ -3168,12 +3229,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; Loading @@ -3189,27 +3250,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 Loading @@ -3222,12 +3276,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 */ Loading @@ -3235,22 +3283,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 Loading @@ -3272,7 +3321,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(); } Loading @@ -3298,8 +3347,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 ); Loading Loading @@ -3474,7 +3523,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(); Loading Loading @@ -3538,12 +3587,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; Loading @@ -3553,24 +3605,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(); Loading @@ -3585,34 +3640,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 */ Loading @@ -3620,14 +3680,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 Loading @@ -3650,13 +3710,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) */ } Loading Loading @@ -3721,9 +3781,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 */ } Loading @@ -3740,7 +3799,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*/ } Loading @@ -3753,7 +3812,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 */ } Loading lib_com/syn_filt_fx.c +81 −5 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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(); } Loading @@ -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 * Loading lib_enc/acelp_core_enc_fx.c +0 −9 Original line number Diff line number Diff line Loading @@ -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(); Loading lib_enc/ivas_core_enc.c +1 −7 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
lib_com/prot_fx.h +31 −9 Original line number Diff line number Diff line Loading @@ -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 ); Loading Loading @@ -2866,6 +2880,11 @@ void Calc_rc0_h( Word16 *rc0 /* o : 1st parcor */ ); void Calc_rc0_h_ivas_enc_fx( Word16 *h, /* i : impulse response of composed filter */ Word16 *rc0 /* o : 1st parcor */ ); void PostShortTerm_fx( Word16 *sig_in, /* i : i signal (pointer to current subframe */ Word16 *lpccoeff, /* i : LPC coefficients for current subframe */ Loading Loading @@ -3011,10 +3030,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*/ Loading
lib_com/swb_tbe_com_fx.c +133 −74 Original line number Diff line number Diff line Loading @@ -810,6 +810,65 @@ void Calc_rc0_h( } } void Calc_rc0_h_ivas_enc_fx( Word16 *h, /* i : impulse response of composed filter */ Word16 *rc0 /* o : 1st parcor */ ) { Word32 L_acc; Word16 *ptrs; Word16 acf0, acf1; 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++ ) { 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 ); acf0 = extract_h( L_acc ); ptrs = h; temp = *ptrs++; move16(); L_acc = L_mult( temp, *ptrs ); FOR( i = 1; i < LONG_H_ST - 1; i++ ) { temp = shr( *ptrs++, 2 ); move16(); L_acc = L_mac( L_acc, temp, shr( *ptrs, 2 ) ); } L_acc = L_shl( L_acc, sh_acf ); acf1 = extract_h( L_acc ); /* Compute 1st parcor */ IF( acf0 == 0 ) { *rc0 = 0; move16(); return; } IF( LT_16( acf0, abs_s( acf1 ) ) ) { *rc0 = 0; move16(); return; } *rc0 = div_s( abs_s( acf1 ), acf0 ); move16(); IF( acf1 > 0 ) { *rc0 = negate( *rc0 ); move16(); } } static void Calc_st_filt_tbe( Word16 *apond2, /* i : coefficients of numerator */ Word16 *apond1, /* i : coefficients of denominator */ Loading Loading @@ -868,7 +927,7 @@ static void Calc_st_filt_tbe_ivas_enc_fx( /* compute i.r. of composed filter apond2 / apond1 */ syn_filt_fx( temp, apond1, LPC_SHB_ORDER, apond2, h, LONG_H_ST, mem_zero, 0 ); /* compute 1st parcor */ Calc_rc0_h( h, parcor0 ); Calc_rc0_h_ivas_enc_fx( h, parcor0 ); /* compute g0 */ L_g0 = L_mult0( 1, abs_s( h[0] ) ); Loading Loading @@ -2849,10 +2908,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 */ Loading @@ -2872,6 +2934,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(); Loading Loading @@ -2899,7 +2962,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; Loading Loading @@ -3089,7 +3151,6 @@ void GenShapedSHBExcitation_ivas_enc_fx( } White_exc16k = exc16k; move16(); Word16 Q_excTmp2 = add( getScaleFactor16( excTmp2, L_FRAME16k ), *Q_bwe_exc ); IF( *mem_csfilt ) { Loading Loading @@ -3168,12 +3229,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; Loading @@ -3189,27 +3250,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 Loading @@ -3222,12 +3276,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 */ Loading @@ -3235,22 +3283,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 Loading @@ -3272,7 +3321,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(); } Loading @@ -3298,8 +3347,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 ); Loading Loading @@ -3474,7 +3523,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(); Loading Loading @@ -3538,12 +3587,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; Loading @@ -3553,24 +3605,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(); Loading @@ -3585,34 +3640,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 */ Loading @@ -3620,14 +3680,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 Loading @@ -3650,13 +3710,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) */ } Loading Loading @@ -3721,9 +3781,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 */ } Loading @@ -3740,7 +3799,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*/ } Loading @@ -3753,7 +3812,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 */ } Loading
lib_com/syn_filt_fx.c +81 −5 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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(); } Loading @@ -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 * Loading
lib_enc/acelp_core_enc_fx.c +0 −9 Original line number Diff line number Diff line Loading @@ -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(); Loading
lib_enc/ivas_core_enc.c +1 −7 File changed.Preview size limit exceeded, changes collapsed. Show changes