Home | History | Annotate | Download | only in aacdec
      1 /* ------------------------------------------------------------------
      2  * Copyright (C) 1998-2009 PacketVideo
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
     13  * express or implied.
     14  * See the License for the specific language governing permissions
     15  * and limitations under the License.
     16  * -------------------------------------------------------------------
     17  */
     18 /*
     19  Filename: calc_sbr_envelope.c
     20 
     21 ------------------------------------------------------------------------------
     22  REVISION HISTORY
     23 
     24 
     25  Who:                                   Date: MM/DD/YYYY
     26  Description:
     27 
     28 ------------------------------------------------------------------------------
     29  INPUT AND OUTPUT DEFINITIONS
     30 
     31 
     32 
     33 ------------------------------------------------------------------------------
     34  FUNCTION DESCRIPTION
     35 
     36 
     37 ------------------------------------------------------------------------------
     38  REQUIREMENTS
     39 
     40 
     41 ------------------------------------------------------------------------------
     42  REFERENCES
     43 
     44 SC 29 Software Copyright Licencing Disclaimer:
     45 
     46 This software module was originally developed by
     47   Coding Technologies
     48 
     49 and edited by
     50   -
     51 
     52 in the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
     53 standards for reference purposes and its performance may not have been
     54 optimized. This software module is an implementation of one or more tools as
     55 specified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
     56 ISO/IEC gives users free license to this software module or modifications
     57 thereof for use in products claiming conformance to audiovisual and
     58 image-coding related ITU Recommendations and/or ISO/IEC International
     59 Standards. ISO/IEC gives users the same free license to this software module or
     60 modifications thereof for research purposes and further ISO/IEC standardisation.
     61 Those intending to use this software module in products are advised that its
     62 use may infringe existing patents. ISO/IEC have no liability for use of this
     63 software module or modifications thereof. Copyright is not released for
     64 products that do not conform to audiovisual and image-coding related ITU
     65 Recommendations and/or ISO/IEC International Standards.
     66 The original developer retains full right to modify and use the code for its
     67 own purpose, assign or donate the code to a third party and to inhibit third
     68 parties from using the code for products that do not conform to audiovisual and
     69 image-coding related ITU Recommendations and/or ISO/IEC International Standards.
     70 This copyright notice must be included in all copies or derivative works.
     71 Copyright (c) ISO/IEC 2002.
     72 
     73 ------------------------------------------------------------------------------
     74  PSEUDO-CODE
     75 
     76 ------------------------------------------------------------------------------
     77 */
     78 
     79 
     80 /*----------------------------------------------------------------------------
     81 ; INCLUDES
     82 ----------------------------------------------------------------------------*/
     83 
     84 #ifdef AAC_PLUS
     85 
     86 
     87 #include    "calc_sbr_envelope.h"
     88 #include    "sbr_envelope_calc_tbl.h"
     89 #include    "sbr_create_limiter_bands.h"
     90 #include    "aac_mem_funcs.h"
     91 
     92 #include    "fxp_mul32.h"
     93 #include    "pv_normalize.h"
     94 
     95 #include    "sbr_aliasing_reduction.h"
     96 
     97 /*----------------------------------------------------------------------------
     98 ; MACROS
     99 ; Define module specific macros here
    100 ----------------------------------------------------------------------------*/
    101 
    102 
    103 /*----------------------------------------------------------------------------
    104 ; DEFINES
    105 ; Include all pre-processor statements here. Include conditional
    106 ; compile variables also.
    107 ----------------------------------------------------------------------------*/
    108 #include    "pv_sqrt.h"
    109 
    110 #include    "pv_div.h"
    111 #include    "fxp_mul32.h"
    112 #include    "pv_normalize.h"
    113 
    114 #define Q30fmt(x)   (Int32)(x*((Int32)1<<30) + (x>=0?0.5F:-0.5F))
    115 #define Q28fmt(x)   (Int32)(x*((Int32)1<<28) + (x>=0?0.5F:-0.5F))
    116 #define Q15fmt(x)   (Int32)(x*((Int32)1<<15) + (x>=0?0.5F:-0.5F))
    117 
    118 
    119 /*----------------------------------------------------------------------------
    120 ; LOCAL FUNCTION DEFINITIONS
    121 ; Function Prototype declaration
    122 ----------------------------------------------------------------------------*/
    123 #ifdef __cplusplus
    124 extern "C"
    125 {
    126 #endif
    127 
    128     void envelope_application_LC(Int32  *aBufR,
    129     Int32  *nrg_gain_man,
    130     Int32  *nrg_gain_exp,
    131     Int32  *noise_level_man,
    132     Int32  *noise_level_exp,
    133     Int32  *nrg_tone_man,
    134     Int32  *nrg_tone_exp,
    135     Int32  band_nrg_tone_detector,
    136     const Int32 *frame_info,
    137     Int32  *harm_index,
    138     Int32  *phase_index,
    139     Int32  i,
    140     Int32  lowSubband,
    141     Int32  noSubbands,
    142     Int32  noNoiseFlag);
    143 
    144 
    145     void energy_estimation_LC(Int32 *aBufR,
    146                               Int32 *nrg_est_man,
    147                               Int32 *nrg_est_exp,
    148                               const Int32 *frame_info,
    149                               Int32 i,
    150                               Int32 k,
    151                               Int32 c,
    152                               Int32 ui2);
    153 
    154 #ifdef HQ_SBR
    155 
    156 
    157     void envelope_application(Int32  *aBufR,
    158                               Int32  *aBufI,
    159                               Int32  *nrg_gain_man,
    160                               Int32  *nrg_gain_exp,
    161                               Int32  *noise_level_man,
    162                               Int32  *noise_level_exp,
    163                               Int32  *nrg_tone_man,
    164                               Int32  *nrg_tone_exp,
    165                               Int32 *fBuf_man[64],
    166                               Int32 *fBuf_exp[64],
    167                               Int32 *fBufN_man[64],
    168                               Int32 *fBufN_exp[64],
    169                               const Int32 *frame_info,
    170                               Int32  *harm_index,
    171                               Int32  *phase_index,
    172                               Int32  i,
    173                               Int32  lowSubband,
    174                               Int32  noSubbands,
    175                               Int32  noNoiseFlag,
    176                               Int32  band_nrg_tone_detector,
    177                               Int32  maxSmoothLength,
    178                               Int32  smooth_length);
    179 
    180 
    181     void energy_estimation(Int32 *aBufR,
    182                            Int32 *aBufI,
    183                            Int32 *nrg_est_man,
    184                            Int32 *nrg_est_exp,
    185                            const Int32 *frame_info,
    186                            Int32 i,
    187                            Int32 k,
    188                            Int32 c,
    189                            Int32 ui2);
    190 
    191 #endif
    192 
    193 #ifdef __cplusplus
    194 }
    195 #endif
    196 
    197 /*----------------------------------------------------------------------------
    198 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
    199 ; Variable declaration - defined here and used outside this module
    200 ----------------------------------------------------------------------------*/
    201 
    202 /*----------------------------------------------------------------------------
    203 ; EXTERNAL FUNCTION REFERENCES
    204 ; Declare functions defined elsewhere and referenced in this module
    205 ----------------------------------------------------------------------------*/
    206 
    207 /*----------------------------------------------------------------------------
    208 ; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
    209 ; Declare variables used in this module but defined elsewhere
    210 ----------------------------------------------------------------------------*/
    211 
    212 /*----------------------------------------------------------------------------
    213 ; FUNCTION CODE
    214 ----------------------------------------------------------------------------*/
    215 
    216 void calc_sbr_envelope(SBR_FRAME_DATA *frameData,
    217                        Int32 *aBufR,
    218                        Int32 *aBufI,
    219                        Int freqBandTable1[2][MAX_FREQ_COEFFS + 1],
    220                        const Int32 *nSfb,
    221                        Int32 freqBandTable2[MAX_NOISE_COEFFS + 1],
    222                        Int32 nNBands,
    223                        Int32 reset,
    224                        Int32 *degreeAlias,
    225                        Int32 *harm_index,
    226                        Int32 *phase_index,
    227                        Int32 hFp[64],
    228                        Int32 *sUp,
    229                        Int32 limSbc[][13],
    230                        Int32 *gateMode,
    231 #ifdef HQ_SBR
    232                        Int32 *fBuf_man[64],
    233                        Int32 *fBuf_exp[64],
    234                        Int32 *fBufN_man[64],
    235                        Int32 *fBufN_exp[64],
    236 #endif
    237                        Int32 scratch_mem[][64],
    238                        struct PATCH Patch,
    239                        Int32  sqrt_cache[][4],
    240                        Int32  LC_flag)
    241 {
    242 
    243     Int32 c;
    244     Int32 li;
    245     Int32 ui;
    246     Int32 i;
    247     Int32 j;
    248     Int32 k = 0;
    249     Int32 l;
    250     Int m = 0;
    251     Int kk = 0;
    252     Int o;
    253     Int next = -1;
    254     Int32 ui2;
    255     Int flag;
    256     Int noNoiseFlag;
    257     Int *ptr;
    258 
    259 
    260     UInt32 nrg = 0;
    261     Int32 nrg_exp = 0;
    262     struct intg_div   quotient;
    263     struct intg_sqrt  root_sq;
    264 
    265     Int32 aux1;
    266 
    267     Int32 *nL_man       = frameData->sbrNoiseFloorLevel_man;
    268     Int32 *nL_exp       = frameData->sbrNoiseFloorLevel_exp;
    269 
    270     Int32 *sfb_nrg_man  = frameData->iEnvelope_man;
    271     Int32 *sfb_nrg_exp  = frameData->iEnvelope_exp;
    272 
    273     Int32 tmp_q1;
    274     Int32 tmp_q2;
    275 
    276     Int32 g_max_man;
    277     Int32 g_max_exp;
    278 
    279     Int32 p_ref_man;
    280     Int32 p_ref_exp;
    281 
    282     Int32 p_est_man;
    283     Int32 p_est_exp;
    284 
    285     Int32 p_adj_man;
    286     Int32 p_adj_exp;
    287     Int32 avg_gain;
    288 
    289     Int32 boost_gain_q;
    290 
    291     Int32 band_nrg_tone_detector;
    292 
    293     Int32 *nrg_est_man     = scratch_mem[0];
    294     Int32 *nrg_est_exp     = scratch_mem[1];
    295     Int32 *nrg_ref_man     = scratch_mem[2];
    296     Int32 *nrg_ref_exp     = scratch_mem[3];
    297     Int32 *nrg_gain_man    = scratch_mem[4];
    298     Int32 *nrg_gain_exp    = scratch_mem[5];
    299     Int32 *noise_level_man = scratch_mem[6];
    300     Int32 *noise_level_exp = scratch_mem[7];
    301     Int32 *nrg_tone_man    = scratch_mem[8];
    302     Int32 *nrg_tone_exp    = scratch_mem[9];
    303     Int32 *hF              = scratch_mem[10];
    304 
    305 
    306 
    307     const Int32 *frame_info = frameData->frameInfo;
    308     Int32 int_mode          = frameData->sbr_header.interpolFreq;
    309 
    310 
    311 
    312 
    313 
    314     Int32 dontUseTheseGainValues[64];
    315 
    316 #ifdef HQ_SBR
    317 
    318     Int32 n;
    319     Int32 smooth_length;
    320     Int32 smoothingLength   = frameData->sbr_header.smoothingLength;
    321     Int32 maxSmoothLength   = smoothLengths[0];
    322 
    323 #endif
    324 
    325     Int32 limiterBand       = frameData->sbr_header.limiterBands;
    326     Int32 limiterGains      = frameData->sbr_header.limiterGains;
    327     Int32 *addHarmonics     = frameData->addHarmonics;
    328 
    329     Int32 lowSubband        = freqBandTable1[LOW_RES][0];
    330     Int32 noSubbands        = freqBandTable1[LOW_RES][nSfb[LOW_RES]] - lowSubband;
    331     Int32 nEnv              = frame_info[0];
    332     Int32 sEnv              = frame_info[(nEnv + 1)<<1];
    333 
    334     /* ensure that noSubbands in the range [0,64] */
    335     noSubbands = (noSubbands >> 31) ^ noSubbands;
    336     if (noSubbands > 64)
    337     {
    338         noSubbands = 64;
    339     }
    340 
    341     if (reset)
    342     {
    343         *sUp = 1;
    344         *phase_index = 0;
    345         sbr_create_limiter_bands(limSbc,
    346                                  gateMode,
    347                                  freqBandTable1[LOW_RES],
    348                                  Patch,
    349                                  nSfb[LOW_RES]);
    350     }
    351 
    352     /* Mapping. */
    353     pv_memset((void*)hF, 0, (sizeof(*hF) << 6));
    354 
    355     ptr  = freqBandTable1[HI];
    356     l = *(ptr++);
    357 
    358     for (i = nSfb[HI]; i != 0; i--)
    359     {
    360         k     = *(ptr++);
    361         j     = ((k + l) >> 1) - lowSubband;
    362         l   = k;
    363         hF[j] = *(addHarmonics++);
    364     }
    365 
    366 
    367     /* Envelope adjustment. */
    368 
    369     for (i = 0; i < nEnv; i++)
    370     {
    371 
    372         if (frame_info[1+i] == frame_info[(nEnv<<1)+4+kk])
    373         {
    374             kk++, next++;
    375         }
    376 
    377         noNoiseFlag = (i == sEnv || i == frameData->prevEnvIsShort) ? 1 : 0;
    378 
    379 #ifdef HQ_SBR
    380         smooth_length = (noNoiseFlag ? 0 : smoothLengths[smoothingLength]);
    381 #endif
    382 
    383 
    384         /* Estimate levels. */
    385         c = 0;
    386         o = 0;
    387 
    388         band_nrg_tone_detector = 0;
    389 
    390         Int kkkk = freqBandTable1[ frame_info[nEnv+2+i] ][0];
    391 
    392         for (j = 0; j <  nSfb[frame_info[nEnv+2+i]]; j++)
    393         {
    394             li = freqBandTable1[ frame_info[nEnv+2+i] ][j    ];
    395             ui = freqBandTable1[ frame_info[nEnv+2+i] ][j + 1];
    396             flag = 0;
    397 
    398             for (k = li; k < ui; k++)
    399             {                               /* Calculate the average energy over the current envelope, */
    400                 ui2   = (frame_info[1+i] << 1);
    401 
    402                 if (LC_flag == ON)
    403                 {
    404                     energy_estimation_LC((Int32 *)aBufR,
    405                                          nrg_est_man,
    406                                          nrg_est_exp,
    407                                          frame_info,
    408                                          i,
    409                                          k - kkkk,
    410                                          c,
    411                                          ui2);
    412                 }
    413 #ifdef HQ_SBR
    414                 else
    415                 {
    416 
    417                     energy_estimation((Int32 *)aBufR,
    418                                       (Int32 *)aBufI,
    419                                       nrg_est_man,
    420                                       nrg_est_exp,
    421                                       frame_info,
    422                                       i,
    423                                       k - kkkk,
    424                                       c,
    425                                       ui2);
    426                 }
    427 #endif
    428 
    429                 flag = (hF[c] && (i >= sEnv || hFp[c+lowSubband])) ? 1 : flag;
    430                 c++;
    431             }
    432 
    433 
    434             ui2 = freqBandTable2[o+1];
    435 
    436             if (!int_mode)
    437             {                                /* If no interpolation is used,   */
    438 
    439                 tmp_q1 = -100;
    440 
    441                 for (k = c - (ui - li); k < c; k++)
    442                 {
    443                     if (tmp_q1 < nrg_est_exp[k])
    444                     {
    445                         tmp_q1 = nrg_est_exp[k];
    446                     }
    447                 }
    448 
    449                 nrg = 0;
    450                 for (k = c - (ui - li); k < c; k++)
    451                 {    /* average the energy in all the QMF bands, */
    452                     nrg += nrg_est_man[k] >> (tmp_q1 - nrg_est_exp[k]); /* for the whole scalefactor band.  */
    453                 }
    454                 nrg /= (ui - li);
    455                 nrg_exp = tmp_q1;
    456 
    457             }
    458 
    459             c -= (ui - li);
    460 
    461             for (k = 0; k < ui - li; k++)
    462             {
    463                 o = (k + li >= ui2) ? o + 1 : o;
    464                 ui2 = freqBandTable2[o+1];
    465                 /*
    466                  *  If no interpolation is used, use the averaged energy from above,
    467                  *  otherwise do nothing.
    468                  */
    469 
    470 
    471                 if (!int_mode)
    472                 {
    473                     nrg_est_man[c] = nrg;
    474                     nrg_est_exp[c] = nrg_exp;
    475                 }
    476 
    477                 if (LC_flag == ON)
    478                 {
    479                     nrg_est_exp[c] += 1;
    480 
    481                     if (flag)
    482                     {
    483                         dontUseTheseGainValues[k + li - lowSubband] = 1;
    484                     }
    485                     else
    486                     {
    487                         dontUseTheseGainValues[k + li - lowSubband] = 0;
    488                     }
    489                 }
    490 
    491                 nrg_ref_man[c] = sfb_nrg_man[m];
    492                 nrg_ref_exp[c] = sfb_nrg_exp[m];
    493 
    494                 /*
    495                  *  compute nL/(1 + nL);   where nL = nL_man*2^nL_exp
    496                  */
    497                 aux1 = next * nNBands + o;
    498 
    499                 tmp_q1 = nL_exp[aux1];
    500 
    501                 if (tmp_q1 >= 0)
    502                 {
    503                     pv_div(nL_man[aux1], nL_man[aux1] + (0x3FFFFFFF >> tmp_q1), &quotient);
    504                 }
    505                 else
    506                 {
    507                     tmp_q1 = nL_man[aux1] >> (-tmp_q1);
    508                     pv_div(tmp_q1, tmp_q1 + 0x3FFFFFFF, &quotient);
    509                 }
    510 
    511                 /*
    512                  *  tmp_q1 = nL/(1 + nL)*nrg_ref[c];
    513                  */
    514 
    515                 tmp_q1 = fxp_mul32_Q30(quotient.quotient >> quotient.shift_factor,  nrg_ref_man[c]);
    516 
    517                 if (flag)
    518                 {
    519                     /*
    520                      *  Calculate levels and gain, dependent on whether a synthetic, a sine is present or not.
    521                      *
    522                      *  nrg_gain[c]=(float)pv_sqrt( tmp/(nrg_est[c] + 1), sqrt_cache[1] );
    523                      */
    524 
    525 
    526                     pv_div(tmp_q1, nrg_est_man[c] + 1, &quotient);
    527                     /*
    528                      *  nrg_est_man[c] is an integer number, while tmp_q1 and quotient.quotient
    529                      *  are fractions in Q30
    530                      */
    531 
    532                     tmp_q2 = nrg_ref_exp[c] - nrg_est_exp[c] - quotient.shift_factor - 30;
    533 
    534                     pv_sqrt(quotient.quotient, tmp_q2, &root_sq, sqrt_cache[1]);
    535                     nrg_gain_man[c] = root_sq.root;     /*  in Q28 format */
    536                     nrg_gain_exp[c] = root_sq.shift_factor;
    537 
    538 
    539                     /*
    540                      *  nrg_tone[c]=(float)( (hF[c] && (i >= sEnv || hFp[c+lowSubband])) ?
    541                      *                          pv_sqrt(nrg_ref[c]/(1+tmp_nL), sqrt_cache[2]) : 0);
    542                      */
    543                     if (hF[c] && (i >= sEnv || hFp[c+lowSubband]))
    544                     {
    545                         /*
    546                          *  nrg_ref[c] and  nL, as well as quotient.quotient
    547                          *  are fractions in Q30
    548                          */
    549 
    550                         /*  aux1 == next*nNBands + o */
    551 
    552                         tmp_q2 = nL_exp[aux1];
    553                         /*
    554                          *  nrg_ref[c]/(1+tmp_nL)
    555                          */
    556 
    557                         if (tmp_q2 >= 0)
    558                         {
    559                             pv_div(nrg_ref_man[c], nL_man[aux1] + (0x3FFFFFFF >> tmp_q2), &quotient);
    560                         }
    561                         else
    562                         {
    563                             tmp_q2 = nL_man[aux1] >> (-tmp_q2);
    564                             pv_div(nrg_ref_man[c], tmp_q2 + 0x3FFFFFFF, &quotient);
    565                             tmp_q2 = 0;     /* exponent has been applied to the sum ((man>>exp) + 1)  */
    566                         }
    567 
    568                         tmp_q2 = nrg_ref_exp[c] - tmp_q2 - quotient.shift_factor;
    569 
    570                         pv_sqrt(quotient.quotient, tmp_q2, &root_sq, sqrt_cache[2]);
    571                         nrg_tone_man[c]    = root_sq.root;
    572                         nrg_tone_exp[c]    = root_sq.shift_factor;
    573 
    574                     }
    575                     else
    576                     {
    577                         nrg_tone_man[c]    = 0;
    578                         nrg_tone_exp[c]    = 0;
    579                     }
    580 
    581                 }
    582                 else
    583                 {
    584                     if (noNoiseFlag)
    585                     {
    586                         /*
    587                          * nrg_gain[c] = (float) pv_sqrt(nrg_ref[c] /(nrg_est[c] + 1), sqrt_cache[3]);
    588                          */
    589 
    590                         pv_div(nrg_ref_man[c], nrg_est_man[c] + 1, &quotient);
    591 
    592                         /*
    593                          *  nrg_est_man[c] is an integer number, while nrg_ref_man[c] and
    594                          *  quotient.quotient are fractions in Q30
    595                          */
    596 
    597                         tmp_q2 = nrg_ref_exp[c] - nrg_est_exp[c] - quotient.shift_factor - 30;
    598 
    599                         pv_sqrt(quotient.quotient, tmp_q2, &root_sq, sqrt_cache[3]);
    600                         nrg_gain_man[c] = root_sq.root;
    601                         nrg_gain_exp[c] = root_sq.shift_factor;
    602 
    603                     }
    604                     else
    605                     {
    606                         /*
    607                          *  nrg_gain[c] = (float) pv_sqrt(nrg_ref[c]/((nrg_est[c] + 1)*(1+tmp_nL)), sqrt_cache[4]);
    608                          */
    609                         /*  aux1 == next*nNBands + o */
    610 
    611                         tmp_q2 = nL_exp[aux1];
    612                         /*
    613                          *  nrg_ref[c]/((nrg_est[c] + 1)*(1+tmp_nL))
    614                          */
    615 
    616                         if (nrg_est_man[c] == 0)
    617                         {
    618                             tmp_q2 = 0;     /*  avoid division by 0 in next if-else, this could be due to
    619                                                 rounding noise */
    620                         }
    621 
    622 
    623                         if (tmp_q2 >= 0)
    624                         {
    625 
    626                             tmp_q2 = fxp_mul32_Q30(nrg_est_man[c] + 1, nL_man[aux1] + (0x3FFFFFFF >> tmp_q2));
    627                             pv_div(nrg_ref_man[c], tmp_q2, &quotient);
    628                             /*
    629                              *  nrg_est_man[c] is an integer number, while nrg_ref_man[c] and
    630                              *  quotient.quotient are fractions in Q30
    631                              */
    632                             tmp_q2 = nrg_ref_exp[c] - quotient.shift_factor - 30 - nL_exp[aux1];
    633                             if (nrg_est_man[c])
    634                             {
    635                                 tmp_q2 -=  nrg_est_exp[c];
    636                             }
    637 
    638                             tmp_q2 = nrg_ref_exp[c] - nrg_est_exp[c] - quotient.shift_factor - 30 - nL_exp[aux1];
    639                         }
    640                         else
    641                         {
    642                             if (tmp_q2 > - 10)
    643                             {
    644                                 tmp_q2 = nL_man[aux1] >> (-tmp_q2);
    645 
    646                                 tmp_q2 = fxp_mul32_Q30(nrg_est_man[c] + 1, tmp_q2 + 0x3FFFFFFF);
    647                             }
    648                             else
    649                             {
    650                                 tmp_q2 = nrg_est_man[c] + 1;
    651                             }
    652 
    653 
    654                             pv_div(nrg_ref_man[c], tmp_q2, &quotient);
    655                             /*
    656                              *  nrg_est_man[c] is an integer number, while nrg_ref_man[c] and
    657                              *  quotient.quotient are fractions in Q30
    658                              */
    659 
    660                             tmp_q2 = nrg_ref_exp[c] - quotient.shift_factor - 30;
    661                             if (nrg_est_man[c])
    662                             {
    663                                 tmp_q2 -=  nrg_est_exp[c];
    664                             }
    665 
    666                         }
    667 
    668                         pv_sqrt(quotient.quotient, tmp_q2, &root_sq, sqrt_cache[4]);
    669                         nrg_gain_man[c] = root_sq.root;
    670                         nrg_gain_exp[c] = root_sq.shift_factor;
    671 
    672                     }
    673 
    674                     nrg_tone_man[c]    = 0;
    675                     nrg_tone_exp[c]    = -100;
    676 
    677                 }
    678 
    679                 band_nrg_tone_detector |= nrg_tone_man[c];   /*  detect any tone activity  */
    680 
    681                 pv_sqrt(tmp_q1, nrg_ref_exp[c], &root_sq, sqrt_cache[5]);
    682                 noise_level_man[c] = root_sq.root;
    683                 noise_level_exp[c] = root_sq.shift_factor;
    684 
    685                 c++;
    686 
    687             }   /* ---- end-for-loop (k) ------ */
    688             m++;
    689 
    690         }   /* -------- Estimate levels end-for-loop (j) ----- */
    691 
    692 
    693 
    694         /*
    695          *      Limiter
    696          */
    697 
    698 
    699         for (c = 0; c < gateMode[limiterBand]; c++)
    700         {
    701 
    702             p_ref_man = 0;
    703             p_est_man = 0;
    704 
    705             /*
    706              *  get max exponent for the reference and estimated energy
    707              */
    708             p_ref_exp = -100;
    709             p_est_exp = -100;
    710 
    711             for (k = limSbc[limiterBand][c]; k < limSbc[limiterBand][c + 1]; k++)
    712             {
    713                 if (p_ref_exp < nrg_ref_exp[k])
    714                 {
    715                     p_ref_exp = nrg_ref_exp[k];    /* max */
    716                 }
    717                 if (p_est_exp < nrg_est_exp[k])
    718                 {
    719                     p_est_exp = nrg_est_exp[k];    /* max */
    720                 }
    721             }
    722 
    723             k -= limSbc[limiterBand][c];     /*  number of element used in the addition */
    724 
    725             while (k != 0)      /*  bit guard protection depends on log2(k)  */
    726             {
    727                 k >>= 1;
    728                 p_ref_exp++;       /*  add extra bit-overflow-guard, nrg_ref_exp is in Q30 format */
    729             }
    730 
    731 
    732             for (k = limSbc[limiterBand][c]; k < limSbc[limiterBand][c + 1]; k++)
    733             {   /*Calculate the average gain for the current limiter band.*/
    734                 p_ref_man += (nrg_ref_man[k] >> (p_ref_exp - nrg_ref_exp[k]));
    735                 p_est_man += (nrg_est_man[k] >> (p_est_exp - nrg_est_exp[k]));
    736 
    737             }
    738 
    739             if (p_est_man)
    740             {
    741                 /*
    742                  *  "average gain" (not equal to average of nrg_gain)
    743                  */
    744                 pv_div(p_ref_man, p_est_man, &quotient);
    745 
    746                 tmp_q2 = p_ref_exp - 30 - p_est_exp - quotient.shift_factor;
    747 
    748                 /*
    749                  *  avg_gain = sqrt(p_ref/p_est)
    750                  */
    751                 pv_sqrt(quotient.quotient, tmp_q2, &root_sq, sqrt_cache[6]);
    752                 avg_gain  = root_sq.root;
    753                 g_max_exp = root_sq.shift_factor;
    754 
    755                 /*
    756                  *  maximum gain allowed is calculated from table.
    757                  */
    758 
    759                 /*
    760                  *  g_max = avg_gain * limGains[limiterGains];
    761                  */
    762 
    763                 g_max_man = fxp_mul32_Q30(avg_gain, limGains[limiterGains]);   /*  table is in Q30 */
    764 
    765                 if (limiterGains == 3)
    766                 {
    767                     g_max_exp = limGains[4];
    768                 }
    769 
    770                 tmp_q1 = g_max_exp >= 16 ? g_max_exp : 16;
    771 
    772                 tmp_q2 = g_max_man >> (tmp_q1 - g_max_exp);
    773                 tmp_q1 = Q28fmt(1.52587890625F) >> (tmp_q1 - 16);
    774 
    775                 if (tmp_q2 > tmp_q1)
    776                 {
    777                     /* upper limit, +100 dB */
    778                     g_max_man = Q28fmt(1.52587890625F);
    779                     g_max_exp = 16;
    780                 }
    781             }
    782             else
    783             {
    784                 /*  Qfmt(1.52587890625F)    exp = 16 */
    785                 g_max_man = Q28fmt(1.52587890625F);
    786                 g_max_exp = 16;
    787             }
    788 
    789             /*
    790              *  Compute Adjusted power p_adj
    791              */
    792             for (k = limSbc[limiterBand][c]; k < limSbc[limiterBand][c + 1]; k++)
    793             {
    794 
    795                 tmp_q1 = g_max_exp >= nrg_gain_exp[k] ? g_max_exp : nrg_gain_exp[k];
    796 
    797                 tmp_q2 = g_max_man >> (tmp_q1 - g_max_exp);
    798                 tmp_q1 = nrg_gain_man[k] >> (tmp_q1 - nrg_gain_exp[k]);
    799                 /*
    800                  *  if(g_max <= nrg_gain[k])
    801                  */
    802                 if (tmp_q2 <= tmp_q1)
    803                 {
    804                     tmp_q1 = fxp_mul32_Q28(noise_level_man[k], g_max_man);
    805                     pv_div(tmp_q1, nrg_gain_man[k], &quotient);
    806                     noise_level_man[k] = quotient.quotient >> 2;   /* in Q28 */
    807                     noise_level_exp[k] = noise_level_exp[k] + g_max_exp - quotient.shift_factor - nrg_gain_exp[k];
    808 
    809                     nrg_gain_man[k] =  g_max_man;       /* gains with noise supression */
    810                     nrg_gain_exp[k] =  g_max_exp;
    811                 }
    812             }
    813 
    814             p_adj_exp = -100;
    815 
    816             for (k = limSbc[limiterBand][c]; k < limSbc[limiterBand][c + 1]; k++)
    817             {
    818                 tmp_q1 = nrg_est_exp[k] + (nrg_gain_exp[k] << 1) + 28;  /* 28 to match shift down by mult32_Q28  */
    819 
    820                 if (p_adj_exp < tmp_q1)
    821                 {
    822                     p_adj_exp = tmp_q1;
    823                 }
    824                 if (nrg_tone_man[k])
    825                 {
    826                     tmp_q1 = (nrg_tone_exp[k] << 1);
    827                     if (p_adj_exp < tmp_q1)
    828                     {
    829                         p_adj_exp = tmp_q1;
    830                     }
    831                 }
    832                 else if (!noNoiseFlag)
    833                 {
    834                     tmp_q1 = (noise_level_exp[k] << 1);
    835 
    836                     if (p_adj_exp < tmp_q1)
    837                     {
    838                         p_adj_exp = tmp_q1;
    839                     }
    840                 }
    841             }
    842 
    843             p_adj_exp += 1; /* overflow bit-guard*/
    844 
    845             p_adj_man = 0;
    846 
    847             for (k = limSbc[limiterBand][c]; k < limSbc[limiterBand][c + 1]; k++)
    848             {
    849                 /*
    850                  *  p_adj += nrg_gain[k]*nrg_gain[k]*nrg_est[k];
    851                  */
    852 
    853                 if (p_adj_exp - (nrg_est_exp[k] + (nrg_gain_exp[k] << 1)) < 59)
    854                 {
    855                     tmp_q1 = fxp_mul32_Q28(nrg_gain_man[k], nrg_gain_man[k]);
    856                     tmp_q1 = fxp_mul32_Q28(tmp_q1, nrg_est_man[k]);
    857                     p_adj_man += (tmp_q1 >> (p_adj_exp - (nrg_est_exp[k] + (nrg_gain_exp[k] << 1) + 28)));
    858                 }
    859 
    860                 if (nrg_tone_man[k])
    861                 {
    862                     /*
    863                      *  p_adj += nrg_tone[k]*nrg_tone[k];
    864                      */
    865                     if (p_adj_exp - (nrg_tone_exp[k] << 1) < 31)
    866                     {
    867                         tmp_q1 = fxp_mul32_Q28(nrg_tone_man[k], nrg_tone_man[k]);
    868                         p_adj_man += (tmp_q1 >> (p_adj_exp - (nrg_tone_exp[k] << 1)));
    869                     }
    870                 }
    871                 else if (!noNoiseFlag)
    872                 {
    873                     /*
    874                      *  p_adj += noise_level[k]*noise_level[k];
    875                      */
    876 
    877                     if (p_adj_exp - (noise_level_exp[k] << 1) < 31)
    878                     {
    879                         tmp_q1 = fxp_mul32_Q28(noise_level_man[k], noise_level_man[k]);
    880                         p_adj_man += (tmp_q1 >> (p_adj_exp - (noise_level_exp[k] << 1)));
    881                     }
    882 
    883                 }
    884             }
    885 
    886 
    887             if (p_adj_man)
    888             {
    889                 pv_div(p_ref_man, p_adj_man, &quotient);
    890                 tmp_q2 = p_ref_exp - p_adj_exp - 58 - quotient.shift_factor;   /*  58 <> Q30 + Q28 */
    891 
    892                 pv_sqrt(quotient.quotient, tmp_q2, &root_sq, sqrt_cache[7]);
    893 
    894                 if (root_sq.shift_factor > -28)
    895                 {
    896                     boost_gain_q = root_sq.root << (root_sq.shift_factor + 28);
    897                 }
    898                 else
    899                 {
    900                     boost_gain_q = root_sq.root >> (-28 - root_sq.shift_factor);
    901                 }
    902 
    903                 tmp_q1 = root_sq.shift_factor >= -28 ? root_sq.shift_factor : -28;
    904 
    905                 tmp_q2 = root_sq.root >> (tmp_q1 - root_sq.shift_factor);
    906                 tmp_q1 = Q28fmt(1.584893192f) >> (tmp_q1 + 28);
    907 
    908 
    909                 if (tmp_q2 > tmp_q1)
    910                 {
    911                     boost_gain_q = Q28fmt(1.584893192f);
    912                 }
    913             }
    914             else
    915             {
    916                 boost_gain_q = Q28fmt(1.584893192f);
    917             }
    918 
    919             if (band_nrg_tone_detector)
    920             {
    921                 for (k = limSbc[limiterBand][c]; k < limSbc[limiterBand][c + 1]; k++)
    922                 {
    923                     nrg_gain_man[k]    = fxp_mul32_Q28(nrg_gain_man[k], boost_gain_q);
    924                     noise_level_man[k] = fxp_mul32_Q28(noise_level_man[k], boost_gain_q);
    925                     nrg_tone_man[k]    = fxp_mul32_Q28(nrg_tone_man[k], boost_gain_q);
    926                 }
    927             }
    928             else
    929             {
    930 
    931                 for (k = limSbc[limiterBand][c]; k < limSbc[limiterBand][c + 1]; k++)
    932                 {
    933                     nrg_gain_man[k]    = fxp_mul32_Q28(nrg_gain_man[k], boost_gain_q);
    934                     noise_level_man[k] = fxp_mul32_Q28(noise_level_man[k], boost_gain_q);
    935                 }
    936 
    937 
    938             }
    939 
    940         }   /* Limiter  End for loop (c) */
    941 
    942 
    943         if (LC_flag == ON)
    944         {
    945 
    946             /*
    947              *          Aliasing correction
    948              */
    949 
    950             sbr_aliasing_reduction(degreeAlias,
    951                                    nrg_gain_man,
    952                                    nrg_gain_exp,
    953                                    nrg_est_man,
    954                                    nrg_est_exp,
    955                                    dontUseTheseGainValues,
    956                                    noSubbands,
    957                                    lowSubband,
    958                                    sqrt_cache,
    959                                    scratch_mem[3]);
    960 
    961             if (*sUp)     /* Init only done once upon reset */
    962             {
    963                 *sUp = 0;
    964             }
    965 
    966             envelope_application_LC((Int32 *)aBufR,
    967                                     nrg_gain_man,
    968                                     nrg_gain_exp,
    969                                     noise_level_man,
    970                                     noise_level_exp,
    971                                     nrg_tone_man,
    972                                     nrg_tone_exp,
    973                                     band_nrg_tone_detector,
    974                                     frame_info,
    975                                     harm_index,
    976                                     phase_index,
    977                                     i,
    978                                     lowSubband,
    979                                     noSubbands,
    980                                     noNoiseFlag);
    981         }
    982 #ifdef HQ_SBR
    983         else
    984         {
    985 
    986             if (*sUp)     /* Init only done once upon reset */
    987             {
    988                 for (n = 0; n < maxSmoothLength; n++)
    989                 {
    990                     pv_memcpy(fBuf_man[n],     nrg_gain_man, noSubbands*sizeof(*fBuf_man[n]));
    991                     pv_memcpy(fBufN_man[n], noise_level_man, noSubbands*sizeof(*fBufN_man[n]));
    992                     pv_memcpy(fBuf_exp[n],     nrg_gain_exp, noSubbands*sizeof(*fBuf_exp[n]));
    993                     pv_memcpy(fBufN_exp[n], noise_level_exp, noSubbands*sizeof(*fBufN_exp[n]));
    994                 }
    995                 *sUp = 0;
    996             }
    997 
    998 
    999             envelope_application((Int32 *)aBufR,
   1000                                  (Int32 *)aBufI,
   1001                                  nrg_gain_man,
   1002                                  nrg_gain_exp,
   1003                                  noise_level_man,
   1004                                  noise_level_exp,
   1005                                  nrg_tone_man,
   1006                                  nrg_tone_exp,
   1007                                  fBuf_man,
   1008                                  fBuf_exp,
   1009                                  fBufN_man,
   1010                                  fBufN_exp,
   1011                                  frame_info,
   1012                                  harm_index,
   1013                                  phase_index,
   1014                                  i,
   1015                                  lowSubband,
   1016                                  noSubbands,
   1017                                  noNoiseFlag,
   1018                                  band_nrg_tone_detector,
   1019                                  maxSmoothLength,
   1020                                  smooth_length);
   1021 
   1022         }
   1023 #endif
   1024 
   1025     }   /* -----  Envelope adjustment end for-loop (i) ---- */
   1026 
   1027 
   1028     pv_memcpy(&hFp[0] + lowSubband,
   1029               hF,
   1030               (64 - lowSubband)*sizeof(*hF));
   1031 
   1032     if (sEnv == nEnv)
   1033     {
   1034         frameData->prevEnvIsShort = 0;
   1035     }
   1036     else
   1037     {
   1038         frameData->prevEnvIsShort = -1;
   1039     }
   1040 
   1041 
   1042 }
   1043 
   1044 
   1045 
   1046 /*----------------------------------------------------------------------------
   1047 ; FUNCTION CODE
   1048 ----------------------------------------------------------------------------*/
   1049 
   1050 void envelope_application_LC(Int32  *aBufR,
   1051                              Int32  *nrg_gain_man,
   1052                              Int32  *nrg_gain_exp,
   1053                              Int32  *noise_level_man,
   1054                              Int32  *noise_level_exp,
   1055                              Int32  *nrg_tone_man,
   1056                              Int32  *nrg_tone_exp,
   1057                              Int32  band_nrg_tone_detector,
   1058                              const Int32 *frame_info,
   1059                              Int32  *harm_index,
   1060                              Int32  *phase_index,
   1061                              Int32  i,
   1062                              Int32  lowSubband,
   1063                              Int32  noSubbands,
   1064                              Int32  noNoiseFlag)
   1065 {
   1066 
   1067     Int32 *ptrReal;
   1068     Int32 sb_gain_man;
   1069     Int32 sb_noise_man;
   1070     Int32 sb_noise_exp;
   1071     Int32 l;
   1072     Int32 k;
   1073     Int32 tmp_q1;
   1074     Int32 tmp_q2;
   1075     Int32 tone_count;
   1076     Int16 tmp_16;
   1077     Int32 indexMinus1;
   1078     Int32 indexPlus1;
   1079 
   1080 
   1081     /*
   1082      *          Application
   1083      */
   1084 
   1085     if (band_nrg_tone_detector)     /* Add tone energy only if energy is detected  */
   1086     {
   1087 
   1088         /*
   1089          *  pre-calculate tone application
   1090          */
   1091         for (k = 0; k < noSubbands; k++)
   1092         {
   1093             tmp_q2 = (-nrg_tone_exp[k]);
   1094             tmp_q1 = nrg_tone_man[k];
   1095             tmp_q2 = tmp_q1 >> tmp_q2;
   1096             tmp_q1 = fxp_mul32_by_16(tmp_q2, Q15fmt(0.0163f));
   1097             nrg_tone_man[k] = tmp_q2;
   1098             nrg_tone_exp[k] = tmp_q1;
   1099             noise_level_exp[k] += 1;
   1100             nrg_gain_exp[k] += 28;
   1101         }
   1102 
   1103         for (l = (frame_info[1+i] << 1); l < (frame_info[2+i] << 1); l++)
   1104         {
   1105             ptrReal = (aBufR + l * SBR_NUM_BANDS);
   1106 
   1107             tone_count = 0;
   1108 
   1109             indexPlus1  = (*harm_index + 1) & 3;
   1110 
   1111             if (indexPlus1 & 1)    /*  if indexPlus1 is odd */
   1112             {
   1113                 for (k = 0; k < noSubbands; k++)
   1114                 {
   1115 
   1116                     sb_gain_man = nrg_gain_man[k];
   1117                     tmp_q1 = *ptrReal;
   1118                     tmp_q2 = nrg_gain_exp[k];
   1119                     tmp_q1 = fxp_mul32_Q28(tmp_q1, sb_gain_man);
   1120 
   1121                     if (tmp_q2 < 0)
   1122                     {
   1123                         if (tmp_q2 > -32)
   1124                         {
   1125                             *ptrReal = tmp_q1 >> (-tmp_q2);
   1126                         }
   1127                     }
   1128                     else
   1129                     {
   1130                         *ptrReal = tmp_q1 << tmp_q2;
   1131                     }
   1132 
   1133                     *phase_index = (*phase_index + 1) & 511;
   1134 
   1135                     if (!nrg_tone_man[k] && !noNoiseFlag)
   1136 
   1137                     {
   1138                         tmp_16 = rP_LCx[*phase_index];
   1139                         sb_noise_man = noise_level_man[k];
   1140                         sb_noise_exp = noise_level_exp[k];
   1141 
   1142                         tmp_q1 = fxp_mul32_by_16(sb_noise_man, tmp_16);
   1143 
   1144                         if (sb_noise_exp < 0)
   1145                         {
   1146                             if (sb_noise_exp > -32)
   1147                             {
   1148                                 *ptrReal += tmp_q1 >> (-sb_noise_exp);
   1149                             }
   1150                         }
   1151                         else
   1152                         {
   1153                             *ptrReal += tmp_q1 << sb_noise_exp;
   1154                         }
   1155                     }
   1156 
   1157                     tmp_q1 = nrg_tone_man[k];
   1158 
   1159                     if (*harm_index)
   1160                     {
   1161                         *ptrReal -= tmp_q1;
   1162                     }
   1163                     else
   1164                     {
   1165                         *ptrReal += tmp_q1;
   1166                     }
   1167 
   1168                     if (tmp_q1)
   1169                     {
   1170                         tone_count++;
   1171                     }
   1172 
   1173                     ptrReal++;
   1174 
   1175                 }   /*  for-loop (k) */
   1176 
   1177             }
   1178             else        /*  if indexPlus1 is even */
   1179             {
   1180                 indexMinus1 = (*harm_index - 1) & 3;
   1181 
   1182                 /*  ---  k = 0  ----- */
   1183 
   1184                 sb_gain_man = nrg_gain_man[0];
   1185                 tmp_q1 = *ptrReal;
   1186                 tmp_q2 = nrg_gain_exp[0];
   1187                 tmp_q1 = fxp_mul32_Q28(tmp_q1, sb_gain_man);
   1188 
   1189                 if (tmp_q2 < 0)
   1190                 {
   1191                     if (tmp_q2 > -32)
   1192                     {
   1193                         *ptrReal = tmp_q1 >> (-tmp_q2);
   1194                     }
   1195                 }
   1196                 else
   1197                 {
   1198                     *ptrReal = tmp_q1 << tmp_q2;
   1199                 }
   1200 
   1201                 *phase_index = (*phase_index + 1) & 511;
   1202 
   1203                 tmp_q1 = nrg_tone_exp[0];
   1204                 tmp_q2 = nrg_tone_exp[1];
   1205 
   1206                 if ((indexPlus1 != 0) ^((lowSubband & 1) != 0))
   1207                 {
   1208                     *(ptrReal - 1) -= tmp_q1;
   1209                     *(ptrReal)   += tmp_q2;
   1210                 }
   1211                 else
   1212                 {
   1213                     *(ptrReal - 1) += tmp_q1;
   1214                     *(ptrReal)   -= tmp_q2;
   1215                 }
   1216 
   1217                 if (!nrg_tone_man[0] && !noNoiseFlag)
   1218                 {
   1219                     tmp_16 = rP_LCx[*phase_index];
   1220                     sb_noise_man = noise_level_man[0];
   1221                     sb_noise_exp = noise_level_exp[0];
   1222 
   1223                     tmp_q1 = fxp_mul32_by_16(sb_noise_man, tmp_16);
   1224 
   1225                     if (sb_noise_exp < 0)
   1226                     {
   1227                         if (sb_noise_exp > -32)
   1228                         {
   1229                             *ptrReal += tmp_q1 >> (-sb_noise_exp);
   1230                         }
   1231                     }
   1232                     else
   1233                     {
   1234                         *ptrReal += tmp_q1 << sb_noise_exp;
   1235                     }
   1236                 }
   1237                 else
   1238                 {
   1239                     tone_count++;
   1240                 }
   1241 
   1242                 ptrReal++;
   1243 
   1244                 /* ----  */
   1245 
   1246                 for (k = 1; k < noSubbands - 1; k++)
   1247                 {
   1248 
   1249                     sb_gain_man = nrg_gain_man[k];
   1250                     tmp_q1 = *ptrReal;
   1251                     tmp_q2 = nrg_gain_exp[k];
   1252                     tmp_q1 = fxp_mul32_Q28(tmp_q1, sb_gain_man);
   1253 
   1254                     if (tmp_q2 < 0)
   1255                     {
   1256                         if (tmp_q2 > -32)
   1257                         {
   1258                             *ptrReal = tmp_q1 >> (-tmp_q2);
   1259                         }
   1260                     }
   1261                     else
   1262                     {
   1263                         *ptrReal = tmp_q1 << tmp_q2;
   1264                     }
   1265 
   1266                     *phase_index = (*phase_index + 1) & 511;
   1267 
   1268 
   1269                     if (tone_count < 16)
   1270                     {
   1271                         tmp_q1 = nrg_tone_exp[k - 1];
   1272                         tmp_q2 = nrg_tone_exp[k + 1];
   1273 
   1274                         tmp_q1 -= tmp_q2;
   1275 
   1276 
   1277                         if ((indexPlus1 != 0) ^(((k + lowSubband) & 1) != 0))
   1278                         {
   1279                             *(ptrReal) -= tmp_q1;
   1280                         }
   1281                         else
   1282                         {
   1283                             *(ptrReal) += tmp_q1;
   1284                         }
   1285                     }   /*   if (tone_count < 16)  */
   1286 
   1287 
   1288                     if (!nrg_tone_man[k] && !noNoiseFlag)
   1289                     {
   1290                         tmp_16 = rP_LCx[*phase_index];
   1291                         sb_noise_man = noise_level_man[k];
   1292                         sb_noise_exp = noise_level_exp[k];
   1293 
   1294                         tmp_q1 = fxp_mul32_by_16(sb_noise_man, tmp_16);
   1295 
   1296                         if (sb_noise_exp < 0)
   1297                         {
   1298                             if (sb_noise_exp > -32)
   1299                             {
   1300                                 *ptrReal += tmp_q1 >> (-sb_noise_exp);
   1301                             }
   1302                         }
   1303                         else
   1304                         {
   1305                             *ptrReal += tmp_q1 << sb_noise_exp;
   1306                         }
   1307                     }
   1308                     else
   1309                     {
   1310                         tone_count++;
   1311                     }
   1312 
   1313                     ptrReal++;
   1314 
   1315                 }   /*  for-loop (k) */
   1316 
   1317                 sb_gain_man = nrg_gain_man[k];
   1318                 tmp_q1 = *ptrReal;
   1319                 tmp_q2 = nrg_gain_exp[k];
   1320                 tmp_q1 = fxp_mul32_Q28(tmp_q1, sb_gain_man);
   1321 
   1322                 if (tmp_q2 < 0)
   1323                 {
   1324                     if (tmp_q2 > -31)
   1325                     {
   1326                         *ptrReal = tmp_q1 >> (-tmp_q2);
   1327                     }
   1328                 }
   1329                 else
   1330                 {
   1331                     *ptrReal = tmp_q1 << tmp_q2;
   1332                 }
   1333 
   1334                 *phase_index = (*phase_index + 1) & 511;
   1335 
   1336 
   1337                 if ((tone_count < 16) && !(indexMinus1 &1))
   1338                 {
   1339                     tmp_q1 = nrg_tone_exp[k - 1];
   1340                     tmp_q2 = nrg_tone_exp[k    ];
   1341 
   1342                     if ((indexMinus1 != 0) ^(((k + lowSubband) & 1) != 0))
   1343                     {
   1344                         *(ptrReal)   += tmp_q1;
   1345 
   1346                         if (k + lowSubband < 62)
   1347                         {
   1348                             *(ptrReal + 1) -= tmp_q2;
   1349                         }
   1350                     }
   1351                     else
   1352                     {
   1353                         *(ptrReal)   -= tmp_q1;
   1354 
   1355                         if (k + lowSubband < 62)
   1356                         {
   1357                             *(ptrReal + 1) += tmp_q2;
   1358                         }
   1359                     }
   1360                 }   /*   if (tone_count < 16)  */
   1361 
   1362 
   1363                 if (!nrg_tone_man[k] && !noNoiseFlag)
   1364                 {
   1365                     tmp_16 = rP_LCx[*phase_index];
   1366                     sb_noise_man = noise_level_man[k];
   1367                     sb_noise_exp = noise_level_exp[k];
   1368 
   1369                     tmp_q1 = fxp_mul32_by_16(sb_noise_man, tmp_16);
   1370 
   1371                     if (sb_noise_exp < 0)
   1372                     {
   1373                         if (sb_noise_exp > -31)
   1374                         {
   1375                             *ptrReal += tmp_q1 >> (-sb_noise_exp);
   1376                         }
   1377                     }
   1378                     else
   1379                     {
   1380                         *ptrReal += tmp_q1 << sb_noise_exp;
   1381                     }
   1382                 }
   1383 
   1384             }   /*  if indexPlus1 is odd */
   1385 
   1386             *harm_index = indexPlus1;
   1387 
   1388 
   1389         }        /*  for-loop (l) */
   1390 
   1391     }
   1392     else        /*   if ( band_nrg_tone_detector)   */
   1393     {
   1394 
   1395         for (k = 0; k < noSubbands; k++)
   1396         {
   1397             tmp_q1 = noise_level_exp[k];
   1398             tmp_q2 = nrg_gain_exp[k];
   1399             noise_level_exp[k] =  tmp_q1 + 1;
   1400             nrg_gain_exp[k] = tmp_q2 + 28;
   1401         }
   1402 
   1403         for (l = (frame_info[1+i] << 1); l < (frame_info[2+i] << 1); l++)
   1404         {
   1405             ptrReal = (aBufR + l * SBR_NUM_BANDS);
   1406 
   1407             for (k = 0; k < noSubbands; k++)
   1408             {
   1409 
   1410                 tmp_q1 = *ptrReal;
   1411                 sb_gain_man = nrg_gain_man[k];
   1412 
   1413                 tmp_q2 = nrg_gain_exp[k];
   1414 
   1415                 tmp_q1 = fxp_mul32_Q28(tmp_q1, sb_gain_man);
   1416 
   1417                 if (tmp_q2 < 0)
   1418                 {
   1419                     if (tmp_q2 > -31)
   1420                     {
   1421                         *ptrReal = tmp_q1 >> (-tmp_q2);
   1422                     }
   1423                 }
   1424                 else
   1425                 {
   1426                     *ptrReal = tmp_q1 << tmp_q2;
   1427                 }
   1428 
   1429                 *phase_index = (*phase_index + 1) & 511;
   1430 
   1431                 if (! noNoiseFlag)
   1432                 {
   1433                     tmp_16 = rP_LCx[*phase_index];
   1434                     sb_noise_man = noise_level_man[k];
   1435                     sb_noise_exp = noise_level_exp[k];
   1436 
   1437                     tmp_q1 = fxp_mul32_by_16(sb_noise_man, tmp_16);
   1438 
   1439                     if (sb_noise_exp < 0)
   1440                     {
   1441                         if (sb_noise_exp > -31)
   1442                         {
   1443                             *ptrReal += tmp_q1 >> (-sb_noise_exp);
   1444                         }
   1445                     }
   1446                     else
   1447                     {
   1448                         *ptrReal += tmp_q1 << sb_noise_exp;
   1449                     }
   1450                 }
   1451 
   1452                 ptrReal++;
   1453 
   1454             }   /*  for-loop (k) */
   1455 
   1456             *harm_index  = (*harm_index + 1) & 3;
   1457 
   1458 
   1459         }   /*  for-loop (l) */
   1460 
   1461     }
   1462 
   1463 }
   1464 
   1465 
   1466 
   1467 /*----------------------------------------------------------------------------
   1468 ; FUNCTION CODE
   1469 ----------------------------------------------------------------------------*/
   1470 
   1471 
   1472 #define Qfmt15(a)   (Int32)(a*((Int32)1<<15) + (a>=0?0.5F:-0.5F))
   1473 
   1474 
   1475 const Int16 pow2[39] = { 0, 0, 1, 0, 2,
   1476                          0, Qfmt15(2 / 6.0f), 0, 3, 0, Qfmt15(2 / 10.0f), 0, Qfmt15(2 / 12.0f), 0, Qfmt15(2 / 14.0f), 0, 4,
   1477                          0, Qfmt15(2 / 18.0f),    0, Qfmt15(2 / 20.0f), 0, Qfmt15(2 / 22.0f), 0, Qfmt15(2 / 24.0f),
   1478                          0, Qfmt15(2 / 26.0f), 0, Qfmt15(2 / 28.0f), 0, Qfmt15(2 / 30.0f), 0, 5, 0, Qfmt15(2 / 34.0f),
   1479                          0, Qfmt15(2 / 36.0f), 0, Qfmt15(2 / 38.0f)
   1480                        };
   1481 
   1482 void energy_estimation_LC(Int32 *aBufR,
   1483                           Int32 *nrg_est_man,
   1484                           Int32 *nrg_est_exp,
   1485                           const Int32 *frame_info,
   1486                           Int32 i,
   1487                           Int32 k,
   1488                           Int32 c,
   1489                           Int32 ui2)
   1490 {
   1491 
   1492 
   1493     Int32  aux1;
   1494     Int32  aux2;
   1495     Int32  l;
   1496 
   1497 
   1498     int64_t nrg_h = 0;
   1499     Int32 tmp1;
   1500     UInt32 tmp2;
   1501 
   1502     for (l = ui2; l < (frame_info[2+i] << 1); l++)
   1503     {
   1504 
   1505         aux1 = aBufR[l++*SBR_NUM_BANDS + k ];
   1506         aux2 = aBufR[l  *SBR_NUM_BANDS + k ];
   1507 
   1508         nrg_h = fxp_mac64_Q31(nrg_h, aux1, aux1);
   1509         nrg_h = fxp_mac64_Q31(nrg_h, aux2, aux2);
   1510     }
   1511 
   1512     /*
   1513      *  Check for overflow and saturate if needed
   1514      */
   1515     if (nrg_h < 0)
   1516     {
   1517         nrg_h = 0x7fffffff;
   1518     }
   1519 
   1520 
   1521     if (nrg_h)
   1522     {
   1523         tmp2 = (UInt32)(nrg_h >> 32);
   1524         if (tmp2)
   1525         {
   1526             aux2 = pv_normalize(tmp2);
   1527             aux2 -= 1;                  /*  ensure Q30 */
   1528             nrg_h = (nrg_h << aux2) >> 33;
   1529             tmp2 = (UInt32)(nrg_h);
   1530             nrg_est_exp[c] = 33 - aux2;
   1531         }
   1532         else
   1533         {
   1534             tmp2 = (UInt32)(nrg_h >> 2);
   1535             aux2 = pv_normalize(tmp2);
   1536             aux2 -= 1;                  /*  ensure Q30 */
   1537 
   1538             tmp2 = (tmp2 << aux2);
   1539             nrg_est_exp[c] =  -aux2 + 2;
   1540         }
   1541 
   1542         tmp1 = (l - ui2);
   1543 
   1544         aux2 = pow2[tmp1];
   1545         if (tmp1 == (tmp1 & (-tmp1)))
   1546         {
   1547             nrg_est_man[c] = tmp2 >> aux2;
   1548         }
   1549         else
   1550         {
   1551             nrg_est_man[c] = fxp_mul32_by_16(tmp2, aux2);
   1552         }
   1553 
   1554     }
   1555     else
   1556     {
   1557         nrg_est_man[c] = 0;
   1558         nrg_est_exp[c] = -100;
   1559     }
   1560 
   1561 
   1562 
   1563 
   1564 
   1565 }
   1566 
   1567 
   1568 
   1569 
   1570 
   1571 
   1572 #if HQ_SBR
   1573 
   1574 /*----------------------------------------------------------------------------
   1575 ; FUNCTION CODE
   1576 ----------------------------------------------------------------------------*/
   1577 
   1578 void envelope_application(Int32  *aBufR,
   1579                           Int32  *aBufI,
   1580                           Int32  *nrg_gain_man,
   1581                           Int32  *nrg_gain_exp,
   1582                           Int32  *noise_level_man,
   1583                           Int32  *noise_level_exp,
   1584                           Int32  *nrg_tone_man,
   1585                           Int32  *nrg_tone_exp,
   1586                           Int32  *fBuf_man[64],
   1587                           Int32  *fBuf_exp[64],
   1588                           Int32  *fBufN_man[64],
   1589                           Int32  *fBufN_exp[64],
   1590                           const  Int32 *frame_info,
   1591                           Int32  *harm_index,
   1592                           Int32  *phase_index,
   1593                           Int32  i,
   1594                           Int32  lowSubband,
   1595                           Int32  noSubbands,
   1596                           Int32  noNoiseFlag,
   1597                           Int32  band_nrg_tone_detector,
   1598                           Int32  maxSmoothLength,
   1599                           Int32  smooth_length)
   1600 {
   1601 
   1602     Int32 *ptrReal;
   1603     Int32 *ptrImag;
   1604     Int32 sb_gain_man;
   1605     Int32 sb_gain_exp;
   1606     Int32 sb_noise_man;
   1607     Int32 sb_noise_exp;
   1608     Int32 l;
   1609     Int32 k;
   1610     Int32 n;
   1611     Int32 tmp_q1;
   1612     Int32 tmp_q2;
   1613     Int32  aux1;
   1614     Int32  aux2;
   1615     Int32  filter_history = 0;
   1616 
   1617 
   1618     if (band_nrg_tone_detector)     /* Add tone energy only if energy is detected  */
   1619     {
   1620 
   1621         /*
   1622          *  pre-calculate tone application
   1623          */
   1624 
   1625         ptrReal = nrg_tone_exp;
   1626         ptrImag = nrg_tone_man;
   1627         tmp_q1 = - *(ptrReal++);
   1628         aux1   =   *(ptrImag);
   1629         for (k = 0; k < noSubbands; k++)
   1630         {
   1631             *(ptrImag++) = aux1 >> tmp_q1;
   1632             tmp_q1 = - *(ptrReal++);
   1633             aux1   =   *(ptrImag);
   1634         }
   1635 
   1636         /*
   1637          *          Application
   1638          */
   1639 
   1640         for (l = (frame_info[1+i] << 1); l < (frame_info[2+i] << 1); l++)
   1641         {
   1642             ptrReal = (aBufR + l * SBR_NUM_BANDS);
   1643             ptrImag = (aBufI + l * SBR_NUM_BANDS);
   1644 
   1645             if (filter_history <= maxSmoothLength)     /* no more update is needed as buffer will have same info */
   1646             {
   1647                 pv_memmove(fBuf_man[maxSmoothLength], nrg_gain_man, noSubbands*sizeof(*nrg_gain_man));
   1648                 pv_memmove(fBuf_exp[maxSmoothLength], nrg_gain_exp, noSubbands*sizeof(*nrg_gain_exp));
   1649                 pv_memmove(fBufN_man[maxSmoothLength], noise_level_man, noSubbands*sizeof(*noise_level_man));
   1650                 pv_memmove(fBufN_exp[maxSmoothLength], noise_level_exp, noSubbands*sizeof(*noise_level_exp));
   1651             }
   1652 
   1653             /*
   1654              *  nrg_gain_max bounded to 1.584893192*1e5, which requires (32-bit) Q14 notation
   1655              */
   1656             for (k = 0; k < noSubbands; k++)
   1657             {
   1658                 if (smooth_length == 0)     /* no filter-smooth needed */
   1659                 {
   1660                     sb_gain_man = nrg_gain_man[k];
   1661                     sb_gain_exp = nrg_gain_exp[k];
   1662 
   1663                     sb_noise_man = noise_level_man[k];
   1664                     sb_noise_exp = noise_level_exp[k];
   1665 
   1666                 }
   1667                 else
   1668                 {   /* else  smooth_length == 4  and fir_4 filter is being used */
   1669 
   1670                     sb_gain_exp = fBuf_exp[maxSmoothLength][k];
   1671 
   1672                     sb_noise_exp = fBufN_exp[maxSmoothLength][k];
   1673 
   1674                     for (n = maxSmoothLength - smooth_length; n < maxSmoothLength; n++)
   1675                     {
   1676                         if (sb_gain_exp  < fBuf_exp[n][k])
   1677                         {
   1678                             sb_gain_exp = fBuf_exp[n][k];
   1679                         }
   1680 
   1681                         if (sb_noise_exp  < fBufN_exp[n][k])
   1682                         {
   1683                             sb_noise_exp = fBufN_exp[n][k];
   1684                         }
   1685                     }
   1686 
   1687                     sb_gain_man = fxp_mul32_Q30(fBuf_man[maxSmoothLength][k], Q30fmt(0.33333333333333f));
   1688                     sb_gain_man  = sb_gain_man >> (sb_gain_exp - fBuf_exp[maxSmoothLength][k]);
   1689 
   1690                     sb_noise_man = fxp_mul32_Q30(fBufN_man[maxSmoothLength][k], Q30fmt(0.33333333333333f));
   1691                     sb_noise_man = sb_noise_man >> (sb_noise_exp - fBufN_exp[maxSmoothLength][k]);
   1692 
   1693                     n = maxSmoothLength - smooth_length;
   1694 
   1695                     tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.03183050093751f));
   1696                     sb_gain_man  += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]);
   1697 
   1698                     tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.03183050093751f));
   1699                     sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n++][k]);
   1700 
   1701                     tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.11516383427084f));
   1702                     sb_gain_man  += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]);
   1703 
   1704                     tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.11516383427084f));
   1705                     sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n++][k]);
   1706 
   1707                     tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.21816949906249f));
   1708                     sb_gain_man  += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]);
   1709 
   1710                     tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.21816949906249f));
   1711                     sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n++][k]);
   1712 
   1713                     tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.30150283239582f));
   1714                     sb_gain_man  += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]);
   1715 
   1716                     tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.30150283239582f));
   1717                     sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n][k]);
   1718 
   1719                 }
   1720 
   1721 
   1722 
   1723                 /*
   1724                  *    *ptrReal  = *ptrReal * sb_gain ;
   1725                  *    *ptrImag  = *ptrImag * sb_gain;
   1726                  */
   1727                 aux1 = *ptrReal;
   1728                 aux2 = *ptrImag;
   1729                 sb_gain_exp += 32;
   1730                 aux1 = fxp_mul32_Q31(aux1, sb_gain_man);
   1731                 aux2 = fxp_mul32_Q31(aux2, sb_gain_man);
   1732 
   1733 
   1734                 if (sb_gain_exp < 0)
   1735                 {
   1736                     sb_gain_exp = -sb_gain_exp;
   1737                     if (sb_gain_exp < 32)
   1738                     {
   1739                         *ptrReal = (aux1 >> sb_gain_exp);
   1740                         *ptrImag = (aux2 >> sb_gain_exp);
   1741                     }
   1742                 }
   1743                 else
   1744                 {
   1745                     *ptrReal = (aux1 << sb_gain_exp);
   1746                     *ptrImag = (aux2 << sb_gain_exp);
   1747                 }
   1748 
   1749 
   1750 
   1751                 /*
   1752                  *     if ( sb_noise != 0)
   1753                  *     {
   1754                  *         *ptrReal += sb_noise * rP[*phase_index][0];
   1755                  *         *ptrImag += sb_noise * rP[*phase_index][1];
   1756                  *     }
   1757                  */
   1758                 *phase_index = (*phase_index + 1) & 511;
   1759 
   1760                 if (nrg_tone_man[k] || noNoiseFlag)
   1761                 {
   1762                     sb_noise_man = 0;
   1763                     sb_noise_exp = 0;
   1764                 }
   1765                 else
   1766                 {
   1767 
   1768                     Int32 tmp = rPxx[*phase_index];
   1769                     sb_noise_exp += 1;
   1770                     tmp_q1 = fxp_mul32_by_16t(sb_noise_man, tmp);
   1771                     tmp_q2 = fxp_mul32_by_16b(sb_noise_man, tmp);
   1772 
   1773 
   1774                     if (sb_noise_exp < 0)
   1775                     {
   1776                         if (sb_noise_exp > -32)
   1777                         {
   1778                             *ptrReal += tmp_q1 >> (-sb_noise_exp);
   1779                             *ptrImag += tmp_q2 >> (-sb_noise_exp);
   1780                         }
   1781                     }
   1782                     else
   1783                     {
   1784                         *ptrReal += tmp_q1 << sb_noise_exp;
   1785                         *ptrImag += tmp_q2 << sb_noise_exp;
   1786                     }
   1787                 }
   1788 
   1789                 /*
   1790                  *      tmp_q1 = nrg_tone[k]
   1791                  */
   1792 
   1793                 tmp_q1 = nrg_tone_man[k];
   1794 
   1795                 if (*harm_index & 1)
   1796                 {
   1797                     if ((((k + lowSubband) & 1) != 0) ^(*harm_index != 1))
   1798                     {
   1799                         *ptrImag  -=  tmp_q1;
   1800                     }
   1801                     else
   1802                     {
   1803                         *ptrImag  +=  tmp_q1;
   1804                     }
   1805                 }
   1806                 else
   1807                 {
   1808                     *ptrReal += (*harm_index) ? -tmp_q1 : tmp_q1;
   1809                 }
   1810 
   1811                 *ptrReal++ <<= 10;
   1812                 *ptrImag++ <<= 10;
   1813 
   1814 
   1815             }    /*  for-loop (k) */
   1816 
   1817 
   1818             *harm_index = (*harm_index + 1) & 3;
   1819 
   1820             /*
   1821              *  Update smoothing filter history
   1822              */
   1823 
   1824             if (filter_history++ < maxSmoothLength)     /* no more update is needed as buffer will have same info */
   1825             {
   1826                 /*
   1827                  *  mantissas
   1828                  */
   1829 
   1830                 ptrReal = (Int32 *)fBuf_man[0];
   1831                 ptrImag = (Int32 *)fBufN_man[0];
   1832 
   1833                 for (n = 0; n < maxSmoothLength; n++)
   1834                 {
   1835                     fBuf_man[n]  = fBuf_man[n+1];
   1836                     fBufN_man[n] = fBufN_man[n+1];
   1837                 }
   1838 
   1839                 fBuf_man[maxSmoothLength]  = ptrReal;
   1840                 fBufN_man[maxSmoothLength] = ptrImag;
   1841 
   1842                 /*
   1843                  *  exponents
   1844                  */
   1845                 ptrReal = (Int32 *)fBuf_exp[0];
   1846                 ptrImag = (Int32 *)fBufN_exp[0];
   1847 
   1848                 for (n = 0; n < maxSmoothLength; n++)
   1849                 {
   1850                     fBuf_exp[n]  = fBuf_exp[n+1];
   1851                     fBufN_exp[n] = fBufN_exp[n+1];
   1852                 }
   1853 
   1854                 fBuf_exp[maxSmoothLength]  = ptrReal;
   1855                 fBufN_exp[maxSmoothLength] = ptrImag;
   1856             }
   1857 
   1858         }   /*  for-loop (l) */
   1859 
   1860 
   1861     }
   1862     else        /*   ----  if ( band_nrg_tone_detector) ---- */
   1863     {
   1864 
   1865         /*
   1866          *          Application
   1867          */
   1868 
   1869         for (l = (frame_info[1+i] << 1); l < (frame_info[2+i] << 1); l++)
   1870         {
   1871             ptrReal = (aBufR + l * SBR_NUM_BANDS);
   1872             ptrImag = (aBufI + l * SBR_NUM_BANDS);
   1873 
   1874             if (filter_history <= maxSmoothLength)     /* no more update is needed as buffer will have same info */
   1875             {
   1876                 pv_memmove(fBuf_man[maxSmoothLength], nrg_gain_man, noSubbands*sizeof(*nrg_gain_man));
   1877                 pv_memmove(fBuf_exp[maxSmoothLength], nrg_gain_exp, noSubbands*sizeof(*nrg_gain_exp));
   1878                 pv_memmove(fBufN_man[maxSmoothLength], noise_level_man, noSubbands*sizeof(*noise_level_man));
   1879                 pv_memmove(fBufN_exp[maxSmoothLength], noise_level_exp, noSubbands*sizeof(*noise_level_exp));
   1880             }
   1881 
   1882             /*
   1883              *  nrg_gain_max bounded to 1.584893192*1e5, which requires (32-bit) Q14 notation
   1884              */
   1885             for (k = 0; k < noSubbands; k++)
   1886             {
   1887                 if (smooth_length == 0)     /* no filter-smooth needed */
   1888                 {
   1889                     sb_gain_man = nrg_gain_man[k];
   1890                     sb_gain_exp = nrg_gain_exp[k];
   1891 
   1892                     sb_noise_man = noise_level_man[k];
   1893                     sb_noise_exp = noise_level_exp[k];
   1894 
   1895                 }
   1896                 else
   1897                 {   /* else  smooth_length == 4  and fir_4 filter is being used */
   1898 
   1899                     sb_gain_exp = fBuf_exp[maxSmoothLength][k];
   1900 
   1901                     sb_noise_exp = fBufN_exp[maxSmoothLength][k];
   1902 
   1903                     for (n = maxSmoothLength - smooth_length; n < maxSmoothLength; n++)
   1904                     {
   1905                         if (sb_gain_exp  < fBuf_exp[n][k])
   1906                         {
   1907                             sb_gain_exp = fBuf_exp[n][k];
   1908                         }
   1909 
   1910                         if (sb_noise_exp  < fBufN_exp[n][k])
   1911                         {
   1912                             sb_noise_exp = fBufN_exp[n][k];
   1913                         }
   1914                     }
   1915 
   1916                     sb_gain_man = fxp_mul32_Q30(fBuf_man[maxSmoothLength][k], Q30fmt(0.33333333333333f));
   1917                     sb_gain_man  = sb_gain_man >> (sb_gain_exp - fBuf_exp[maxSmoothLength][k]);
   1918 
   1919                     sb_noise_man = fxp_mul32_Q30(fBufN_man[maxSmoothLength][k], Q30fmt(0.33333333333333f));
   1920                     sb_noise_man = sb_noise_man >> (sb_noise_exp - fBufN_exp[maxSmoothLength][k]);
   1921 
   1922                     n = maxSmoothLength - smooth_length;
   1923 
   1924                     tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.03183050093751f));
   1925                     sb_gain_man  += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]);
   1926 
   1927                     tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.03183050093751f));
   1928                     sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n++][k]);
   1929 
   1930                     tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.11516383427084f));
   1931                     sb_gain_man  += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]);
   1932 
   1933                     tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.11516383427084f));
   1934                     sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n++][k]);
   1935 
   1936                     tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.21816949906249f));
   1937                     sb_gain_man  += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]);
   1938 
   1939                     tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.21816949906249f));
   1940                     sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n++][k]);
   1941 
   1942                     tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.30150283239582f));
   1943                     sb_gain_man  += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]);
   1944 
   1945                     tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.30150283239582f));
   1946                     sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n][k]);
   1947 
   1948                 }
   1949 
   1950 
   1951 
   1952                 /*
   1953                  *    *ptrReal  = *ptrReal * sb_gain ;
   1954                  *    *ptrImag  = *ptrImag * sb_gain;
   1955                  */
   1956                 aux1 = *ptrReal;
   1957                 aux2 = *ptrImag;
   1958                 sb_gain_exp += 32;
   1959                 aux1 = fxp_mul32_Q31(aux1, sb_gain_man);
   1960                 aux2 = fxp_mul32_Q31(aux2, sb_gain_man);
   1961 
   1962 
   1963 
   1964                 /*
   1965                  *     if ( sb_noise != 0)
   1966                  *     {
   1967                  *         *ptrReal += sb_noise * rP[*phase_index][0];
   1968                  *         *ptrImag += sb_noise * rP[*phase_index][1];
   1969                  *     }
   1970                  */
   1971 
   1972 
   1973                 if (sb_gain_exp < 0)
   1974                 {
   1975                     if (sb_gain_exp > -32)
   1976                     {
   1977                         if (sb_gain_exp > -10)
   1978                         {
   1979                             *ptrReal = aux1 << (10 + sb_gain_exp);
   1980                             *ptrImag = aux2 << (10 + sb_gain_exp);
   1981                         }
   1982                         else
   1983                         {
   1984                             *ptrReal = aux1 >> (-sb_gain_exp - 10);
   1985                             *ptrImag = aux2 >> (-sb_gain_exp - 10);
   1986                         }
   1987                     }
   1988                 }
   1989                 else
   1990                 {
   1991                     *ptrReal = aux1 << (sb_gain_exp + 10);
   1992                     *ptrImag = aux2 << (sb_gain_exp + 10);
   1993                 }
   1994 
   1995 
   1996 
   1997 
   1998                 /*
   1999                  *     if ( sb_noise != 0)
   2000                  *     {
   2001                  *         *ptrReal += sb_noise * rP[*phase_index][0];
   2002                  *         *ptrImag += sb_noise * rP[*phase_index][1];
   2003                  *     }
   2004                  */
   2005                 *phase_index = (*phase_index + 1) & 511;
   2006 
   2007                 if (!noNoiseFlag)
   2008                 {
   2009 
   2010                     Int32 tmp = rPxx[*phase_index];
   2011                     sb_noise_exp += 1;
   2012                     tmp_q1 = fxp_mul32_by_16t(sb_noise_man, tmp);
   2013                     tmp_q2 = fxp_mul32_by_16b(sb_noise_man, tmp);
   2014 
   2015                     if (sb_noise_exp < 0)
   2016                     {
   2017                         if (sb_noise_exp > -32)
   2018                         {
   2019                             if (sb_noise_exp > -10)
   2020                             {
   2021                                 *ptrReal += tmp_q1 << (10 + sb_noise_exp);
   2022                                 *ptrImag += tmp_q2 << (10 + sb_noise_exp);
   2023                             }
   2024                             else
   2025                             {
   2026                                 *ptrReal += tmp_q1 >> (-sb_noise_exp - 10);
   2027                                 *ptrImag += tmp_q2 >> (-sb_noise_exp - 10);
   2028                             }
   2029                         }
   2030                     }
   2031                     else
   2032                     {
   2033                         *ptrReal += tmp_q1 << (sb_noise_exp + 10);
   2034                         *ptrImag += tmp_q2 << (sb_noise_exp + 10);
   2035                     }
   2036                 }
   2037 
   2038                 ptrReal++;
   2039                 ptrImag++;
   2040 
   2041 
   2042             }    /*  for-loop (k) */
   2043 
   2044 
   2045             *harm_index = (*harm_index + 1) & 3;
   2046 
   2047             /*
   2048              *  Update smoothing filter history
   2049              */
   2050 
   2051             if (filter_history++ < maxSmoothLength)     /* no more update is needed as buffer will have same info */
   2052             {
   2053                 /*
   2054                  *  mantissas
   2055                  */
   2056 
   2057                 ptrReal = (Int32 *)fBuf_man[0];
   2058                 ptrImag = (Int32 *)fBufN_man[0];
   2059 
   2060                 for (n = 0; n < maxSmoothLength; n++)
   2061                 {
   2062                     fBuf_man[n]  = fBuf_man[n+1];
   2063                     fBufN_man[n] = fBufN_man[n+1];
   2064                 }
   2065 
   2066                 fBuf_man[maxSmoothLength]  = ptrReal;
   2067                 fBufN_man[maxSmoothLength] = ptrImag;
   2068 
   2069                 /*
   2070                  *  exponents
   2071                  */
   2072                 ptrReal = (Int32 *)fBuf_exp[0];
   2073                 ptrImag = (Int32 *)fBufN_exp[0];
   2074 
   2075                 for (n = 0; n < maxSmoothLength; n++)
   2076                 {
   2077                     fBuf_exp[n]  = fBuf_exp[n+1];
   2078                     fBufN_exp[n] = fBufN_exp[n+1];
   2079                 }
   2080 
   2081                 fBuf_exp[maxSmoothLength]  = ptrReal;
   2082                 fBufN_exp[maxSmoothLength] = ptrImag;
   2083             }
   2084 
   2085         }   /*  for-loop (l) */
   2086 
   2087     }       /*  if ( band_nrg_tone_detector) */
   2088 
   2089 }
   2090 
   2091 
   2092 /*----------------------------------------------------------------------------
   2093 ; FUNCTION CODE
   2094 ----------------------------------------------------------------------------*/
   2095 
   2096 void energy_estimation(Int32 *aBufR,
   2097                        Int32 *aBufI,
   2098                        Int32 *nrg_est_man,
   2099                        Int32 *nrg_est_exp,
   2100                        const Int32 *frame_info,
   2101                        Int32 i,
   2102                        Int32 k,
   2103                        Int32 c,
   2104                        Int32 ui2)
   2105 {
   2106 
   2107     Int32  aux1;
   2108     Int32  aux2;
   2109     Int32  l;
   2110 
   2111 
   2112 
   2113     int64_t nrg_h = 0;
   2114     Int32 tmp1;
   2115     Int32 tmp2;
   2116 
   2117     aux1 = aBufR[ui2*SBR_NUM_BANDS + k];
   2118     aux2 = aBufI[ui2*SBR_NUM_BANDS + k];
   2119     for (l = ui2 + 1; l < (frame_info[2+i] << 1);  l++)
   2120     {
   2121         nrg_h = fxp_mac64_Q31(nrg_h, aux1, aux1);
   2122         nrg_h = fxp_mac64_Q31(nrg_h, aux2, aux2);
   2123         aux1 = aBufR[l*SBR_NUM_BANDS + k];
   2124         aux2 = aBufI[l*SBR_NUM_BANDS + k];
   2125     }
   2126     nrg_h = fxp_mac64_Q31(nrg_h, aux1, aux1);
   2127     nrg_h = fxp_mac64_Q31(nrg_h, aux2, aux2);
   2128 
   2129 
   2130     /*
   2131      *  Check for overflow and saturate if needed
   2132      */
   2133     if (nrg_h < 0)
   2134     {
   2135         nrg_h = 0x7fffffff;
   2136     }
   2137 
   2138     if (nrg_h)
   2139     {
   2140 
   2141         aux1 = (UInt32)(nrg_h >> 32);
   2142         if (aux1)
   2143         {
   2144             aux2 = pv_normalize(aux1);
   2145             if (aux2)
   2146             {
   2147                 aux2 -= 1;                  /*  ensure Q30 */
   2148                 nrg_h = (nrg_h << aux2) >> 33;
   2149                 tmp2 = (UInt32)(nrg_h);
   2150                 nrg_est_exp[c] = 33 - aux2;
   2151             }
   2152             else
   2153             {
   2154                 tmp2 = (UInt32)(aux1 >> 1);
   2155                 nrg_est_exp[c] = 33 ;
   2156 
   2157 
   2158             }
   2159         }
   2160         else
   2161         {
   2162             aux1 = (UInt32)(nrg_h >> 1);
   2163             aux2 = pv_normalize(aux1);
   2164 
   2165             tmp2 = (aux1 << aux2);
   2166             nrg_est_exp[c] =  -aux2 + 1;
   2167 
   2168 
   2169         }
   2170 
   2171 
   2172 
   2173         tmp1 = (l - ui2);
   2174         aux2 = pow2[tmp1];
   2175         if (tmp1 == (tmp1 & (-tmp1)))
   2176         {
   2177             nrg_est_man[c] = tmp2 >> aux2;
   2178         }
   2179         else
   2180         {
   2181             nrg_est_man[c] = fxp_mul32_by_16(tmp2, aux2);
   2182         }
   2183     }
   2184     else
   2185     {
   2186         nrg_est_man[c] = 0;
   2187         nrg_est_exp[c] = -100;
   2188     }
   2189 
   2190 
   2191 }
   2192 
   2193 
   2194 
   2195 
   2196 
   2197 #endif
   2198 
   2199 
   2200 #endif
   2201 
   2202 
   2203 
   2204