/* * Parameter: * coderInfo(IO)(O:coderInfo->scale_factor) * xr(unused) * xr_pow(IO) * xi(O) * xmin(I) */ static int32_t FixNoise(CoderInfo *coderInfo, coef_t *xr_pow, int32_t *xi, real_32_t *xmin) { register int32_t i, sb; int32_t start, end; static real_32_t log_ifqstep = REAL_CONST(7.6943735514); // 1.0 / log(ifqstep) static real_32_t realconst1 = REAL_CONST(0.6931471806); //log2 static real_32_t realconst2 = REAL_CONST(0.5); for (sb = 0; sb < coderInfo->nr_of_sfb; sb++) { eng_t eng = 0; frac_t maxfixstep; start = coderInfo->sfb_offset[sb]; end = coderInfo->sfb_offset[sb+1]; for ( i=start; i< end; i++) eng += (int64_t)(COEF2INT(xr_pow[i]))*COEF2INT(xr_pow[i]); if ( (eng == 0) || (xmin[sb]==0) ) maxfixstep = FRAC_ICONST(1); else { maxfixstep = faac_sqrt(eng/(end-start)* MUL_R(xmin[sb],faac_sqrt(xmin[sb])) ); if ( maxfixstep == 0 ) maxfixstep = FRAC_ICONST(1); else maxfixstep = ((real_t)1<<(FRAC_BITS+REAL_BITS))/maxfixstep; } #ifdef DUMP_MAXFIXSTEP printf("sb = %d, maxfixstep = %.8f\n",sb, FRAC2FLOAT(maxfixstep)); #endif for (i = start; i < end; i++) { #ifdef DUMP_MAXFIXSTEP printf("xr_pow[%d] = %.8f\t",i,COEF2FLOAT(xr_pow[i])); #endif xr_pow[i] = MUL_F(xr_pow[i],maxfixstep); #ifdef DUMP_MAXFIXSTEP printf("xr_pow[%d]*fix = %.8f\n",i,COEF2FLOAT(xr_pow[i])); #endif } QuantizeBand(xr_pow, xi, start, end); coderInfo->scale_factor[sb] = (int32_t)REAL2INT(MUL_R(faac_log(maxfixstep)-FRAC2REAL_BIT*realconst1, log_ifqstep) - realconst2)+1; #ifdef DUMP_MAXFIXSTEP printf("scale_factor = %d\n", coderInfo->scale_factor[sb]); #endif } #ifdef DUMP_MAXFIXSTEP exit(1); #endif return 0; }
static int FixNoise(CoderInfo *coderInfo, const double *xr, double *xr_pow, int *xi, double *xmin, double *pow43, double *adj43) { int i, sb; int start, end; double diffvol; double tmp; const double ifqstep = pow(2.0, 0.1875); const double log_ifqstep = 1.0 / log(ifqstep); const double maxstep = 0.05; for (sb = 0; sb < coderInfo->nr_of_sfb; sb++) { double sfacfix; double fixstep = 0.25; int sfac; double fac; int dist; double sfacfix0 = 1.0, dist0 = 1e50; double maxx; start = coderInfo->sfb_offset[sb]; end = coderInfo->sfb_offset[sb+1]; if (!xmin[sb]) goto nullsfb; maxx = 0.0; for (i = start; i < end; i++) { if (xr_pow[i] > maxx) maxx = xr_pow[i]; } //printf("band %d: maxx: %f\n", sb, maxx); if (maxx < 10.0) { nullsfb: for (i = start; i < end; i++) xi[i] = 0; coderInfo->scale_factor[sb] = 10; continue; } sfacfix = 1.0 / maxx; sfac = (int)(log(sfacfix) * log_ifqstep - 0.5); for (i = start; i < end; i++) xr_pow[i] *= sfacfix; maxx *= sfacfix; coderInfo->scale_factor[sb] = sfac; QuantizeBand(xr_pow, xi, IPOW20(coderInfo->global_gain), start, end, adj43); //printf("\tsfac: %d\n", sfac); calcdist: diffvol = 0.0; for (i = start; i < end; i++) { tmp = xi[i]; diffvol += tmp * tmp; // ~x^(3/2) } if (diffvol < 1e-6) diffvol = 1e-6; tmp = pow(diffvol / (double)(end - start), -0.666); if (fabs(fixstep) > maxstep) { double dd = 0.5*(tmp / xmin[sb] - 1.0); if (fabs(dd) < fabs(fixstep)) { fixstep = dd; if (fabs(fixstep) < maxstep) fixstep = maxstep * ((fixstep > 0) ? 1 : -1); } } if (fixstep > 0) { if (tmp < dist0) { dist0 = tmp; sfacfix0 = sfacfix; } else { if (fixstep > .1) fixstep = .1; } } else { dist0 = tmp; sfacfix0 = sfacfix; } dist = (tmp > xmin[sb]); fac = 0.0; if (fabs(fixstep) >= maxstep) { if ((dist && (fixstep < 0)) || (!dist && (fixstep > 0))) { fixstep = -0.5 * fixstep; } fac = 1.0 + fixstep; } else if (dist) { fac = 1.0 + fabs(fixstep); } if (fac != 0.0) { if (maxx * fac >= IXMAX_VAL) { // restore best noise fac = sfacfix0 / sfacfix; for (i = start; i < end; i++) xr_pow[i] *= fac; maxx *= fac; sfacfix *= fac; coderInfo->scale_factor[sb] = log(sfacfix) * log_ifqstep - 0.5; QuantizeBand(xr_pow, xi, IPOW20(coderInfo->global_gain), start, end, adj43); continue; } if (coderInfo->scale_factor[sb] < -10) { for (i = start; i < end; i++) xr_pow[i] *= fac; maxx *= fac; sfacfix *= fac; coderInfo->scale_factor[sb] = log(sfacfix) * log_ifqstep - 0.5; QuantizeBand(xr_pow, xi, IPOW20(coderInfo->global_gain), start, end, adj43); goto calcdist; } } } return 0; }