Beispiel #1
0
/* 
 * 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;
}
Beispiel #2
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;
}