diff options
author | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2013-06-17 05:56:41 +0400 |
---|---|---|
committer | Jean-Marc Valin <jmvalin@jmvalin.ca> | 2013-06-17 05:56:41 +0400 |
commit | 7fd98c571f781c32d5de0ec83be3f38b678e73fe (patch) | |
tree | 42ad0868b475294a72206ee1a1a7a814c94d8f1d /celt/bands.c | |
parent | ee2506b2c7e9a0ef05eb489ed554d38d9b71a3e5 (diff) |
Converts denormalise_bands() to use 16-bit multiplications
Diffstat (limited to 'celt/bands.c')
-rw-r--r-- | celt/bands.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/celt/bands.c b/celt/bands.c index ae77ed71..f55a8fe0 100644 --- a/celt/bands.c +++ b/celt/bands.c @@ -205,17 +205,30 @@ void denormalise_bands(const CELTMode *m, const celt_norm * OPUS_RESTRICT X, for (i=start;i<end;i++) { int j, band_end; - celt_ener bandE; - opus_val32 g; + opus_val16 g; opus_val16 lg; - lg = ADD16(bandLogE[i+c*m->nbEBands], SHL16((opus_val16)eMeans[i],6)); - bandE = PSHR32(celt_exp2(lg),4); - g = SHR32(bandE,1); +#ifdef FIXED_POINT + int shift; +#endif j=M*eBands[i]; band_end = M*eBands[i+1]; + lg = ADD16(bandLogE[i+c*m->nbEBands], SHL16((opus_val16)eMeans[i],6)); +#ifdef FIXED_POINT + /* Handle the integer part of the log energy */ + shift = 16-(lg>>DB_SHIFT); + if (shift>31) + { + shift=0; + g=0; + } else { + /* Handle the fractional part. */ + g = celt_exp2_frac(lg&((1<<DB_SHIFT)-1)); + } +#else + g = celt_exp2(lg); +#endif do { - *f++ = SHL32(MULT16_32_Q15(*x, g),2); - x++; + *f++ = SHR32(MULT16_16(*x++, g), shift); } while (++j<band_end); } celt_assert(start <= end); |