Loading lib_com/swb_bwe_com_fx.c +74 −64 Original line number Diff line number Diff line Loading @@ -732,7 +732,7 @@ Word32 calc_tilt_bwe_fx( /* o : Tilt in Q24 */ return L_temp; } #ifdef IVAS_FLOAT_FIXED Word32 ivas_calc_tilt_bwe_fx( /* o : Tilt in Q24 */ Word16 ivas_calc_tilt_bwe_fx( /* o : Tilt in Q24 */ const Word32 *sp, /* i : input signal */ const Word16 exp_sp, /* i : Exp of inp signal */ const Word16 N /* i : signal length */ Loading @@ -741,6 +741,7 @@ Word32 ivas_calc_tilt_bwe_fx( /* o : Tilt in Q24 */ Word16 i, j; Word32 L_ener, L_ener_tot, L_temp; Word32 tmp1, tmp2; Word16 sign = 0; const Word32 *ptr; Word16 exp2, tmp_exp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Loading @@ -762,61 +763,33 @@ Word32 ivas_calc_tilt_bwe_fx( /* o : Tilt in Q24 */ /* Divide Frame Length by 32 */ FOR(j = shr(N, 5); j > 0; j--) { #ifdef BASOP_NOGLOB /* Critical Overflow and all those below*/ Word16 tmp = mult_ro( (Word16) *ptr++, 8192, &Overflow ); /* Divide by 4 */ #else tmp1 = mult_r(*ptr++, 8192); /* Divide by 4 */ #endif L_ener = L_mult0( tmp, tmp ); Word32 tmp = *ptr++; /* Divide by 4 */ L_ener = Mpy_32_32( tmp, tmp ); /* With the shift by 4 and the L_mult0, no overflow possible for 32 samples */ FOR(i = 1; i < 32; i++) { tmp1 = L_mls_o(*ptr++, 8192, &Overflow); /* Divide by 4 */ tmp1 = *ptr++; /* Divide by 4 */ L_ener = Madd_32_32(L_ener, tmp1, tmp1); } #ifdef BASOP_NOGLOB /* Critical Overflow */ L_ener = L_shr_o(L_ener, exp2, &Overflow); L_temp = L_add_o(L_ener_tot, L_ener, &Overflow); #else L_ener = L_shr(L_ener, exp2); L_temp = L_add(L_ener_tot, L_ener); #endif IF(Overflow != 0) { L_ener_tot = L_shr(L_ener_tot, 1); L_ener = L_shr(L_ener, 1); exp2 = add(exp2, 1); /* this is required, do not remove */ Overflow = 0; move16(); } #ifdef BASOP_NOGLOB /* Critical Overflow */ L_ener_tot = L_add_o(L_ener_tot, L_ener, &Overflow); #else L_ener_tot = L_add(L_ener_tot, L_ener); #endif } #ifdef BASOP_NOGLOB L_ener = (L_abs(L_sub_o(sp[1], sp[0], &Overflow))); #else L_ener = L_deposit_l(abs_s(sub(sp[1], sp[0]))); #endif L_ener = L_abs(L_sub(sp[1], sp[0])); FOR(i = 2; i < N; i++) { /* Eq to (sp[i] - sp[i-1]) * (sp[i-1] - sp[i-2]) < 0 */ #ifdef BASOP_NOGLOB tmp1 = L_sub_o(sp[i], sp[i - 1], &Overflow); tmp2 = L_sub_o(sp[i - 1], sp[i - 2], &Overflow); #else tmp1 = sub(sp[i], sp[i - 1]); tmp2 = sub(sp[i - 1], sp[i - 2]); #endif tmp2 = mult(tmp1, tmp2); tmp1 = abs_s(tmp1); tmp1 = L_sub(sp[i], sp[i - 1]); tmp2 = L_sub(sp[i - 1], sp[i - 2]); tmp2 = Mpy_32_32(tmp1, tmp2); tmp1 = L_abs(tmp1); /* to Get either 0 or -1 in 'tmp2' */ tmp2 = shr(tmp2, 15); tmp2 = L_shr(tmp2, 31); sign = extract_l(L_shl(tmp2, Q15)); /* this allows this code */ L_ener = L_msu0(L_ener, tmp2, tmp1); L_ener = Msub_32_16(L_ener, tmp1, sign); /* instead of this one */ /* test(); */ /* if (tmp2 < 0) */ Loading @@ -826,30 +799,24 @@ Word32 ivas_calc_tilt_bwe_fx( /* o : Tilt in Q24 */ /* it saves one op */ } tmp_exp = norm_l(L_ener_tot); L_temp = L_shl(L_ener_tot, tmp_exp); tmp1 = sub(add(31 + 4, exp2), add(tmp_exp, shl(exp_sp, 1))); L_temp = Isqrt_lc(L_temp, &tmp_exp); L_temp = L_ener_tot; tmp_exp = sub(Q31, sub(shl(exp_sp, 1), Q31)); L_temp = Sqrt32(L_temp, &tmp_exp); L_temp = L_shl(L_temp, sub(exp_sp, sub(Q31, tmp_exp))); /* *tilt_flt = (float)(r1/sqrt(r0)); */ exp2 = norm_l(L_ener); #ifdef BASOP_NOGLOB L_temp = Mult_32_16( L_temp, round_fx( L_shl_sat( L_ener, exp2 ) ) ); #else L_temp = Mult_32_16( L_temp, round_fx( L_shl( L_ener, exp2 ) ) ); #endif exp2 = sub(exp2, tmp_exp); exp2 = add(exp2, exp_sp); /* Put in Q24 */ #ifdef BASOP_NOGLOB L_temp = L_shr_sat( L_temp, sub( exp2, 24 ) ); #else L_temp = L_shr( L_temp, sub( exp2, 24 ) ); #endif L_temp = L_deposit_l(BASOP_Util_Divide3232_Scale(L_ener, L_temp, &exp2)); IF (GT_16(sub(exp2, 4) , norm_l(L_temp))) { L_temp = MAX_16; } ELSE { L_temp = L_shl(L_temp, sub(exp2, 4)); // Output is expected in Q11 } BASOP_SATURATE_WARNING_ON_EVS return L_temp; return extract_l(L_temp); } #endif Loading Loading @@ -3166,4 +3133,47 @@ void hq_generic_decoding_fx( FOR(; n_freq < fb_bwe_subband[DIM_FB]; n_freq++) { L_tmp = Mult_32_16(coeff_out_fx[n_freq], wfenv_fx);/*15 + 12 + 1 - 15 */ coeff_out_fx[n_freq] = L_shr(L_tmp, 1 No newline at end of file coeff_out_fx[n_freq] = L_shr(L_tmp, 1); move32();/*12 */ } } } return; } /*-------------------------------------------------------------------* * save_old_syn() * * Save and delay the ACELP core synthesis signal by * DELAY_FD_BWE_ENC_xxkx to be used by SWB BWE *-------------------------------------------------------------------*/ void save_old_syn_fx( const Word16 L_frame, /* i : frame length */ const Word16 syn[], /* i : ACELP synthesis */ Word16 old_syn[], /* o : old synthesis buffer */ Word16 old_syn_mem[], /* i/o: old synthesis buffer memory */ const Word16 preemph_fac, /* i : preemphasis factor */ Word16 *mem_deemph /* i/o: deemphasis filter memory */ ) { Word16 tmps; tmps = NS2SA(16000, DELAY_FD_BWE_ENC_16k_NS); move16(); if (EQ_16(L_frame, L_FRAME)) { tmps = NS2SA(12800, DELAY_FD_BWE_ENC_12k8_NS); move16(); } Copy(old_syn_mem, old_syn, tmps); Copy(syn, old_syn + tmps, L_frame - tmps); Copy(syn + L_frame - tmps, old_syn_mem, tmps); deemph_fx(old_syn, preemph_fac, L_frame, mem_deemph); return; } Loading
lib_com/swb_bwe_com_fx.c +74 −64 Original line number Diff line number Diff line Loading @@ -732,7 +732,7 @@ Word32 calc_tilt_bwe_fx( /* o : Tilt in Q24 */ return L_temp; } #ifdef IVAS_FLOAT_FIXED Word32 ivas_calc_tilt_bwe_fx( /* o : Tilt in Q24 */ Word16 ivas_calc_tilt_bwe_fx( /* o : Tilt in Q24 */ const Word32 *sp, /* i : input signal */ const Word16 exp_sp, /* i : Exp of inp signal */ const Word16 N /* i : signal length */ Loading @@ -741,6 +741,7 @@ Word32 ivas_calc_tilt_bwe_fx( /* o : Tilt in Q24 */ Word16 i, j; Word32 L_ener, L_ener_tot, L_temp; Word32 tmp1, tmp2; Word16 sign = 0; const Word32 *ptr; Word16 exp2, tmp_exp; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Loading @@ -762,61 +763,33 @@ Word32 ivas_calc_tilt_bwe_fx( /* o : Tilt in Q24 */ /* Divide Frame Length by 32 */ FOR(j = shr(N, 5); j > 0; j--) { #ifdef BASOP_NOGLOB /* Critical Overflow and all those below*/ Word16 tmp = mult_ro( (Word16) *ptr++, 8192, &Overflow ); /* Divide by 4 */ #else tmp1 = mult_r(*ptr++, 8192); /* Divide by 4 */ #endif L_ener = L_mult0( tmp, tmp ); Word32 tmp = *ptr++; /* Divide by 4 */ L_ener = Mpy_32_32( tmp, tmp ); /* With the shift by 4 and the L_mult0, no overflow possible for 32 samples */ FOR(i = 1; i < 32; i++) { tmp1 = L_mls_o(*ptr++, 8192, &Overflow); /* Divide by 4 */ tmp1 = *ptr++; /* Divide by 4 */ L_ener = Madd_32_32(L_ener, tmp1, tmp1); } #ifdef BASOP_NOGLOB /* Critical Overflow */ L_ener = L_shr_o(L_ener, exp2, &Overflow); L_temp = L_add_o(L_ener_tot, L_ener, &Overflow); #else L_ener = L_shr(L_ener, exp2); L_temp = L_add(L_ener_tot, L_ener); #endif IF(Overflow != 0) { L_ener_tot = L_shr(L_ener_tot, 1); L_ener = L_shr(L_ener, 1); exp2 = add(exp2, 1); /* this is required, do not remove */ Overflow = 0; move16(); } #ifdef BASOP_NOGLOB /* Critical Overflow */ L_ener_tot = L_add_o(L_ener_tot, L_ener, &Overflow); #else L_ener_tot = L_add(L_ener_tot, L_ener); #endif } #ifdef BASOP_NOGLOB L_ener = (L_abs(L_sub_o(sp[1], sp[0], &Overflow))); #else L_ener = L_deposit_l(abs_s(sub(sp[1], sp[0]))); #endif L_ener = L_abs(L_sub(sp[1], sp[0])); FOR(i = 2; i < N; i++) { /* Eq to (sp[i] - sp[i-1]) * (sp[i-1] - sp[i-2]) < 0 */ #ifdef BASOP_NOGLOB tmp1 = L_sub_o(sp[i], sp[i - 1], &Overflow); tmp2 = L_sub_o(sp[i - 1], sp[i - 2], &Overflow); #else tmp1 = sub(sp[i], sp[i - 1]); tmp2 = sub(sp[i - 1], sp[i - 2]); #endif tmp2 = mult(tmp1, tmp2); tmp1 = abs_s(tmp1); tmp1 = L_sub(sp[i], sp[i - 1]); tmp2 = L_sub(sp[i - 1], sp[i - 2]); tmp2 = Mpy_32_32(tmp1, tmp2); tmp1 = L_abs(tmp1); /* to Get either 0 or -1 in 'tmp2' */ tmp2 = shr(tmp2, 15); tmp2 = L_shr(tmp2, 31); sign = extract_l(L_shl(tmp2, Q15)); /* this allows this code */ L_ener = L_msu0(L_ener, tmp2, tmp1); L_ener = Msub_32_16(L_ener, tmp1, sign); /* instead of this one */ /* test(); */ /* if (tmp2 < 0) */ Loading @@ -826,30 +799,24 @@ Word32 ivas_calc_tilt_bwe_fx( /* o : Tilt in Q24 */ /* it saves one op */ } tmp_exp = norm_l(L_ener_tot); L_temp = L_shl(L_ener_tot, tmp_exp); tmp1 = sub(add(31 + 4, exp2), add(tmp_exp, shl(exp_sp, 1))); L_temp = Isqrt_lc(L_temp, &tmp_exp); L_temp = L_ener_tot; tmp_exp = sub(Q31, sub(shl(exp_sp, 1), Q31)); L_temp = Sqrt32(L_temp, &tmp_exp); L_temp = L_shl(L_temp, sub(exp_sp, sub(Q31, tmp_exp))); /* *tilt_flt = (float)(r1/sqrt(r0)); */ exp2 = norm_l(L_ener); #ifdef BASOP_NOGLOB L_temp = Mult_32_16( L_temp, round_fx( L_shl_sat( L_ener, exp2 ) ) ); #else L_temp = Mult_32_16( L_temp, round_fx( L_shl( L_ener, exp2 ) ) ); #endif exp2 = sub(exp2, tmp_exp); exp2 = add(exp2, exp_sp); /* Put in Q24 */ #ifdef BASOP_NOGLOB L_temp = L_shr_sat( L_temp, sub( exp2, 24 ) ); #else L_temp = L_shr( L_temp, sub( exp2, 24 ) ); #endif L_temp = L_deposit_l(BASOP_Util_Divide3232_Scale(L_ener, L_temp, &exp2)); IF (GT_16(sub(exp2, 4) , norm_l(L_temp))) { L_temp = MAX_16; } ELSE { L_temp = L_shl(L_temp, sub(exp2, 4)); // Output is expected in Q11 } BASOP_SATURATE_WARNING_ON_EVS return L_temp; return extract_l(L_temp); } #endif Loading Loading @@ -3166,4 +3133,47 @@ void hq_generic_decoding_fx( FOR(; n_freq < fb_bwe_subband[DIM_FB]; n_freq++) { L_tmp = Mult_32_16(coeff_out_fx[n_freq], wfenv_fx);/*15 + 12 + 1 - 15 */ coeff_out_fx[n_freq] = L_shr(L_tmp, 1 No newline at end of file coeff_out_fx[n_freq] = L_shr(L_tmp, 1); move32();/*12 */ } } } return; } /*-------------------------------------------------------------------* * save_old_syn() * * Save and delay the ACELP core synthesis signal by * DELAY_FD_BWE_ENC_xxkx to be used by SWB BWE *-------------------------------------------------------------------*/ void save_old_syn_fx( const Word16 L_frame, /* i : frame length */ const Word16 syn[], /* i : ACELP synthesis */ Word16 old_syn[], /* o : old synthesis buffer */ Word16 old_syn_mem[], /* i/o: old synthesis buffer memory */ const Word16 preemph_fac, /* i : preemphasis factor */ Word16 *mem_deemph /* i/o: deemphasis filter memory */ ) { Word16 tmps; tmps = NS2SA(16000, DELAY_FD_BWE_ENC_16k_NS); move16(); if (EQ_16(L_frame, L_FRAME)) { tmps = NS2SA(12800, DELAY_FD_BWE_ENC_12k8_NS); move16(); } Copy(old_syn_mem, old_syn, tmps); Copy(syn, old_syn + tmps, L_frame - tmps); Copy(syn + L_frame - tmps, old_syn_mem, tmps); deemph_fx(old_syn, preemph_fac, L_frame, mem_deemph); return; }