diff options
Diffstat (limited to 'apps/codecs/libfaad/sbr_hfadj.c')
| -rw-r--r-- | apps/codecs/libfaad/sbr_hfadj.c | 96 |
1 files changed, 34 insertions, 62 deletions
diff --git a/apps/codecs/libfaad/sbr_hfadj.c b/apps/codecs/libfaad/sbr_hfadj.c index 453180d..29e12cd 100644 --- a/apps/codecs/libfaad/sbr_hfadj.c +++ b/apps/codecs/libfaad/sbr_hfadj.c @@ -107,9 +107,9 @@ static uint8_t get_S_mapped(sbr_info *sbr, uint8_t ch, uint8_t l, uint8_t curren */ /* find first HI_RES band in current LO_RES band */ - lb = 2*current_band - ((sbr->N_high & 1) ? 1 : 0); + lb = 2 * (current_band ) - ((sbr->N_high & 1) ? 1 : 0); /* find first HI_RES band in next LO_RES band */ - ub = 2*(current_band+1) - ((sbr->N_high & 1) ? 1 : 0); + ub = 2 * (current_band+1) - ((sbr->N_high & 1) ? 1 : 0); /* check all HI_RES bands in current LO_RES band for sinusoid */ for (b = lb; b < ub; b++) @@ -130,8 +130,8 @@ static void estimate_current_envelope(sbr_info *sbr, sbr_hfadj_info *adj, qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch) { uint8_t m, l, j, k, k_l, k_h, p; - real_t nrg, div; - + real_t nrg, div, tmp; + (void)adj; if (sbr->bs_interpol_freq == 1) { @@ -150,30 +150,18 @@ static void estimate_current_envelope(sbr_info *sbr, sbr_hfadj_info *adj, for (i = l_i + sbr->tHFAdj; i < u_i + sbr->tHFAdj; i++) { -#ifdef FIXED_POINT -#ifdef SBR_LOW_POWER - nrg += ((QMF_RE(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_RE(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS); -#else - nrg += ((QMF_RE(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_RE(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS) + - ((QMF_IM(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_IM(Xsbr[i][m + sbr->kx])+(1<<(REAL_BITS-1)))>>REAL_BITS); -#endif -#else - nrg += MUL_R(QMF_RE(Xsbr[i][m + sbr->kx]), QMF_RE(Xsbr[i][m + sbr->kx])) + tmp = QMF_RE(Xsbr[i][m + sbr->kx]); + nrg += MUL_R(tmp, tmp); #ifndef SBR_LOW_POWER - + MUL_R(QMF_IM(Xsbr[i][m + sbr->kx]), QMF_IM(Xsbr[i][m + sbr->kx])) -#endif - ; + tmp = QMF_IM(Xsbr[i][m + sbr->kx]); + nrg += MUL_R(tmp, tmp); #endif } sbr->E_curr[ch][m][l] = nrg / div; #ifdef SBR_LOW_POWER -#ifdef FIXED_POINT - sbr->E_curr[ch][m][l] <<= 1; -#else sbr->E_curr[ch][m][l] *= 2; #endif -#endif } } } else { @@ -198,31 +186,19 @@ static void estimate_current_envelope(sbr_info *sbr, sbr_hfadj_info *adj, { for (j = k_l; j < k_h; j++) { -#ifdef FIXED_POINT -#ifdef SBR_LOW_POWER - nrg += ((QMF_RE(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_RE(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS); -#else - nrg += ((QMF_RE(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_RE(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS) + - ((QMF_IM(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS)*((QMF_IM(Xsbr[i][j])+(1<<(REAL_BITS-1)))>>REAL_BITS); -#endif -#else - nrg += MUL_R(QMF_RE(Xsbr[i][j]), QMF_RE(Xsbr[i][j])) + tmp = QMF_RE(Xsbr[i][j]); + nrg += MUL_R(tmp, tmp); #ifndef SBR_LOW_POWER - + MUL_R(QMF_IM(Xsbr[i][j]), QMF_IM(Xsbr[i][j])) -#endif - ; + tmp = QMF_IM(Xsbr[i][j]); + nrg += MUL_R(tmp, tmp); #endif } } sbr->E_curr[ch][k - sbr->kx][l] = nrg / div; #ifdef SBR_LOW_POWER -#ifdef FIXED_POINT - sbr->E_curr[ch][k - sbr->kx][l] <<= 1; -#else sbr->E_curr[ch][k - sbr->kx][l] *= 2; #endif -#endif } } } @@ -241,7 +217,7 @@ static void estimate_current_envelope(sbr_info *sbr, sbr_hfadj_info *adj, /* log2 values of [0..63] */ static const real_t log2_int_tab[] = { - LOG2_MIN_INF, REAL_CONST(0.000000000000000), REAL_CONST(1.000000000000000), REAL_CONST(1.584962500721156), + LOG2_MIN_INF , REAL_CONST(0.000000000000000), REAL_CONST(1.000000000000000), REAL_CONST(1.584962500721156), REAL_CONST(2.000000000000000), REAL_CONST(2.321928094887362), REAL_CONST(2.584962500721156), REAL_CONST(2.807354922057604), REAL_CONST(3.000000000000000), REAL_CONST(3.169925001442313), REAL_CONST(3.321928094887363), REAL_CONST(3.459431618637297), REAL_CONST(3.584962500721156), REAL_CONST(3.700439718141092), REAL_CONST(3.807354922057604), REAL_CONST(3.906890595608519), @@ -438,7 +414,6 @@ static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch) ALIGN real_t G_boost; ALIGN real_t S_M[MAX_M]; - for (l = 0; l < sbr->L_E[ch]; l++) { uint8_t current_f_noise_band = 0; @@ -902,7 +877,6 @@ static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch) ALIGN real_t G_boost; ALIGN real_t S_M[MAX_M]; - for (l = 0; l < sbr->L_E[ch]; l++) { uint8_t current_f_noise_band = 0; @@ -1415,11 +1389,7 @@ static void aliasing_reduction(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, { G_target = 0; } else { -#ifdef FIXED_POINT - G_target = (((int64_t)(E_total))<<Q2_BITS)/(E_total_est + EPS); -#else - G_target = E_total / (E_total_est + EPS); -#endif + G_target = DIV_Q(E_total, (E_total_est + EPS)); } acc = 0; @@ -1451,11 +1421,7 @@ static void aliasing_reduction(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, { acc = 0; } else { -#ifdef FIXED_POINT - acc = (((int64_t)(E_total))<<Q2_BITS)/(acc + EPS); -#else - acc = E_total / (acc + EPS); -#endif + acc = DIV_Q(E_total, (acc + EPS)); } for(m = sbr->f_group[l][(k<<1)]; m < sbr->f_group[l][(k<<1) + 1]; m++) { @@ -1506,7 +1472,6 @@ static void hf_assembly(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t h_SL; - if (sbr->Reset == 1) { assembly_reset = 1; @@ -1665,39 +1630,46 @@ static void hf_assembly(sbr_info *sbr, sbr_hfadj_info *adj, } } #else + real_t tmp1 = 0; + real_t tmp2 = 0; + real_t tmp3 = 0; if ((m == 0) && (phi_re[i_plus1] != 0)) { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx - 1]) += - (rev*phi_re[i_plus1] * MUL_F((adj->S_M_boost[l][0]<<REAL_BITS), FRAC_CONST(0.00815))); + tmp1 += (phi_re[i_plus1] * MUL_F((adj->S_M_boost[l][0]<<REAL_BITS), FRAC_CONST(0.00815))); if (sbr->M != 0) { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= - (rev*phi_re[i_plus1] * MUL_F((adj->S_M_boost[l][1]<<REAL_BITS), FRAC_CONST(0.00815))); + tmp2 -= (phi_re[i_plus1] * MUL_F((adj->S_M_boost[l][1]<<REAL_BITS), FRAC_CONST(0.00815))); } } if ((m > 0) && (m < sbr->M - 1) && (sinusoids < 16) && (phi_re[i_min1] != 0)) { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= - (rev*phi_re[i_min1] * MUL_F((adj->S_M_boost[l][m - 1]<<REAL_BITS), FRAC_CONST(0.00815))); + tmp2 -= (phi_re[i_min1] * MUL_F((adj->S_M_boost[l][m - 1]<<REAL_BITS), FRAC_CONST(0.00815))); } if ((m > 0) && (m < sbr->M - 1) && (sinusoids < 16) && (phi_re[i_plus1] != 0)) { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= - (rev*phi_re[i_plus1] * MUL_F((adj->S_M_boost[l][m + 1]<<REAL_BITS), FRAC_CONST(0.00815))); + tmp2 -= (phi_re[i_plus1] * MUL_F((adj->S_M_boost[l][m + 1]<<REAL_BITS), FRAC_CONST(0.00815))); } if ((m == sbr->M - 1) && (sinusoids < 16) && (phi_re[i_min1] != 0)) { if (m > 0) { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -= - (rev*phi_re[i_min1] * MUL_F((adj->S_M_boost[l][m - 1]<<REAL_BITS), FRAC_CONST(0.00815))); + tmp2 -= (phi_re[i_min1] * MUL_F((adj->S_M_boost[l][m - 1]<<REAL_BITS), FRAC_CONST(0.00815))); } if (m + sbr->kx < 64) { - QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx + 1]) += - (rev*phi_re[i_min1] * MUL_F((adj->S_M_boost[l][m]<<REAL_BITS), FRAC_CONST(0.00815))); + tmp3 += (phi_re[i_min1] * MUL_F((adj->S_M_boost[l][m]<<REAL_BITS), FRAC_CONST(0.00815))); } } + + if (rev<0) + { + tmp1 = -tmp1; + tmp2 = -tmp2; + tmp3 = -tmp3; + } + QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx - 1]) += tmp1; + QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx ]) += tmp2; + QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx + 1]) += tmp3; #endif if (adj->S_M_boost[l][m] != 0) |