Home | History | Annotate | Download | only in src
      1 /* -----------------------------------------------------------------------------
      2 Software License for The Fraunhofer FDK AAC Codec Library for Android
      3 
      4  Copyright  1995 - 2019 Fraunhofer-Gesellschaft zur Frderung der angewandten
      5 Forschung e.V. All rights reserved.
      6 
      7  1.    INTRODUCTION
      8 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
      9 that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
     10 scheme for digital audio. This FDK AAC Codec software is intended to be used on
     11 a wide variety of Android devices.
     12 
     13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
     14 general perceptual audio codecs. AAC-ELD is considered the best-performing
     15 full-bandwidth communications codec by independent studies and is widely
     16 deployed. AAC has been standardized by ISO and IEC as part of the MPEG
     17 specifications.
     18 
     19 Patent licenses for necessary patent claims for the FDK AAC Codec (including
     20 those of Fraunhofer) may be obtained through Via Licensing
     21 (www.vialicensing.com) or through the respective patent owners individually for
     22 the purpose of encoding or decoding bit streams in products that are compliant
     23 with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
     24 Android devices already license these patent claims through Via Licensing or
     25 directly from the patent owners, and therefore FDK AAC Codec software may
     26 already be covered under those patent licenses when it is used for those
     27 licensed purposes only.
     28 
     29 Commercially-licensed AAC software libraries, including floating-point versions
     30 with enhanced sound quality, are also available from Fraunhofer. Users are
     31 encouraged to check the Fraunhofer website for additional applications
     32 information and documentation.
     33 
     34 2.    COPYRIGHT LICENSE
     35 
     36 Redistribution and use in source and binary forms, with or without modification,
     37 are permitted without payment of copyright license fees provided that you
     38 satisfy the following conditions:
     39 
     40 You must retain the complete text of this software license in redistributions of
     41 the FDK AAC Codec or your modifications thereto in source code form.
     42 
     43 You must retain the complete text of this software license in the documentation
     44 and/or other materials provided with redistributions of the FDK AAC Codec or
     45 your modifications thereto in binary form. You must make available free of
     46 charge copies of the complete source code of the FDK AAC Codec and your
     47 modifications thereto to recipients of copies in binary form.
     48 
     49 The name of Fraunhofer may not be used to endorse or promote products derived
     50 from this library without prior written permission.
     51 
     52 You may not charge copyright license fees for anyone to use, copy or distribute
     53 the FDK AAC Codec software or your modifications thereto.
     54 
     55 Your modified versions of the FDK AAC Codec must carry prominent notices stating
     56 that you changed the software and the date of any change. For modified versions
     57 of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
     58 must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
     59 AAC Codec Library for Android."
     60 
     61 3.    NO PATENT LICENSE
     62 
     63 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
     64 limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
     65 Fraunhofer provides no warranty of patent non-infringement with respect to this
     66 software.
     67 
     68 You may use this FDK AAC Codec software or modifications thereto only for
     69 purposes that are authorized by appropriate patent licenses.
     70 
     71 4.    DISCLAIMER
     72 
     73 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
     74 holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
     75 including but not limited to the implied warranties of merchantability and
     76 fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
     77 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
     78 or consequential damages, including but not limited to procurement of substitute
     79 goods or services; loss of use, data, or profits, or business interruption,
     80 however caused and on any theory of liability, whether in contract, strict
     81 liability, or tort (including negligence), arising in any way out of the use of
     82 this software, even if advised of the possibility of such damage.
     83 
     84 5.    CONTACT INFORMATION
     85 
     86 Fraunhofer Institute for Integrated Circuits IIS
     87 Attention: Audio and Multimedia Departments - FDK AAC LL
     88 Am Wolfsmantel 33
     89 91058 Erlangen, Germany
     90 
     91 www.iis.fraunhofer.de/amm
     92 amm-info (at) iis.fraunhofer.de
     93 ----------------------------------------------------------------------------- */
     94 
     95 /**************************** SBR decoder library ******************************
     96 
     97    Author(s):
     98 
     99    Description:
    100 
    101 *******************************************************************************/
    102 
    103 /*!
    104   \file
    105   \brief  Envelope calculation
    106 
    107   The envelope adjustor compares the energies present in the transposed
    108   highband to the reference energies conveyed with the bitstream.
    109   The highband is amplified (sometimes) or attenuated (mostly) to the
    110   desired level.
    111 
    112   The spectral shape of the reference energies can be changed several times per
    113   frame if necessary. Each set of energy values corresponding to a certain range
    114   in time will be called an <em>envelope</em> here.
    115   The bitstream supports several frequency scales and two resolutions. Normally,
    116   one or more QMF-subbands are grouped to one SBR-band. An envelope contains
    117   reference energies for each SBR-band.
    118   In addition to the energy envelopes, noise envelopes are transmitted that
    119   define the ratio of energy which is generated by adding noise instead of
    120   transposing the lowband. The noise envelopes are given in a coarser time
    121   and frequency resolution.
    122   If a signal contains strong tonal components, synthetic sines can be
    123   generated in individual SBR bands.
    124 
    125   An overlap buffer of 6 QMF-timeslots is used to allow a more
    126   flexible alignment of the envelopes in time that is not restricted to the
    127   core codec's frame borders.
    128   Therefore the envelope adjustor has access to the spectral data of the
    129   current frame as well as the last 6 QMF-timeslots of the previous frame.
    130   However, in average only the data of 1 frame is being processed as
    131   the adjustor is called once per frame.
    132 
    133   Depending on the frequency range set in the bitstream, only QMF-subbands
    134   between <em>lowSubband</em> and <em>highSubband</em> are adjusted.
    135 
    136   Scaling of spectral data to maximize SNR (see #QMF_SCALE_FACTOR) as well as a
    137   special Mantissa-Exponent format ( see  calculateSbrEnvelope() ) are being
    138   used. The main entry point for this modules is calculateSbrEnvelope().
    139 
    140   \sa sbr_scale.h, #QMF_SCALE_FACTOR, calculateSbrEnvelope(), \ref
    141   documentationOverview
    142 */
    143 
    144 #include "env_calc.h"
    145 
    146 #include "sbrdec_freq_sca.h"
    147 #include "env_extr.h"
    148 #include "transcendent.h"
    149 #include "sbr_ram.h"
    150 #include "sbr_rom.h"
    151 
    152 #include "genericStds.h" /* need FDKpow() for debug outputs */
    153 
    154 typedef struct {
    155   FIXP_DBL nrgRef[MAX_FREQ_COEFFS];
    156   FIXP_DBL nrgEst[MAX_FREQ_COEFFS];
    157   FIXP_DBL nrgGain[MAX_FREQ_COEFFS];
    158   FIXP_DBL noiseLevel[MAX_FREQ_COEFFS];
    159   FIXP_DBL nrgSine[MAX_FREQ_COEFFS];
    160 
    161   SCHAR nrgRef_e[MAX_FREQ_COEFFS];
    162   SCHAR nrgEst_e[MAX_FREQ_COEFFS];
    163   SCHAR nrgGain_e[MAX_FREQ_COEFFS];
    164   SCHAR noiseLevel_e[MAX_FREQ_COEFFS];
    165   SCHAR nrgSine_e[MAX_FREQ_COEFFS];
    166   /* yet another exponent [0]: for ts < no_cols; [1]: for ts >= no_cols */
    167   SCHAR exponent[2];
    168 } ENV_CALC_NRGS;
    169 
    170 static void equalizeFiltBufferExp(FIXP_DBL *filtBuffer, SCHAR *filtBuffer_e,
    171                                   FIXP_DBL *NrgGain, SCHAR *NrgGain_e,
    172                                   int subbands);
    173 
    174 static void calcNrgPerSubband(FIXP_DBL **analysBufferReal,
    175                               FIXP_DBL **analysBufferImag, int lowSubband,
    176                               int highSubband, int start_pos, int next_pos,
    177                               SCHAR frameExp, FIXP_DBL *nrgEst,
    178                               SCHAR *nrgEst_e);
    179 
    180 static void calcNrgPerSfb(FIXP_DBL **analysBufferReal,
    181                           FIXP_DBL **analysBufferImag, int nSfb,
    182                           UCHAR *freqBandTable, int start_pos, int next_pos,
    183                           SCHAR input_e, FIXP_DBL *nrg_est, SCHAR *nrg_est_e);
    184 
    185 static void calcSubbandGain(FIXP_DBL nrgRef, SCHAR nrgRef_e,
    186                             ENV_CALC_NRGS *nrgs, int c, FIXP_DBL tmpNoise,
    187                             SCHAR tmpNoise_e, UCHAR sinePresentFlag,
    188                             UCHAR sineMapped, int noNoiseFlag);
    189 
    190 static void calcAvgGain(ENV_CALC_NRGS *nrgs, int lowSubband, int highSubband,
    191                         FIXP_DBL *sumRef_m, SCHAR *sumRef_e,
    192                         FIXP_DBL *ptrAvgGain_m, SCHAR *ptrAvgGain_e);
    193 
    194 static void adjustTimeSlot_EldGrid(FIXP_DBL *ptrReal, ENV_CALC_NRGS *nrgs,
    195                                    UCHAR *ptrHarmIndex, int lowSubbands,
    196                                    int noSubbands, int scale_change,
    197                                    int noNoiseFlag, int *ptrPhaseIndex,
    198                                    int scale_diff_low);
    199 
    200 static void adjustTimeSlotLC(FIXP_DBL *ptrReal, ENV_CALC_NRGS *nrgs,
    201                              UCHAR *ptrHarmIndex, int lowSubbands,
    202                              int noSubbands, int scale_change, int noNoiseFlag,
    203                              int *ptrPhaseIndex);
    204 
    205 /**
    206  * \brief Variant of adjustTimeSlotHQ() which only regards gain and noise but no
    207  * additional harmonics
    208  */
    209 static void adjustTimeSlotHQ_GainAndNoise(
    210     FIXP_DBL *ptrReal, FIXP_DBL *ptrImag,
    211     HANDLE_SBR_CALCULATE_ENVELOPE h_sbr_cal_env, ENV_CALC_NRGS *nrgs,
    212     int lowSubbands, int noSubbands, int scale_change, FIXP_SGL smooth_ratio,
    213     int noNoiseFlag, int filtBufferNoiseShift);
    214 /**
    215  * \brief Variant of adjustTimeSlotHQ() which only adds the additional harmonics
    216  */
    217 static void adjustTimeSlotHQ_AddHarmonics(
    218     FIXP_DBL *ptrReal, FIXP_DBL *ptrImag,
    219     HANDLE_SBR_CALCULATE_ENVELOPE h_sbr_cal_env, ENV_CALC_NRGS *nrgs,
    220     int lowSubbands, int noSubbands, int scale_change);
    221 
    222 static void adjustTimeSlotHQ(FIXP_DBL *ptrReal, FIXP_DBL *ptrImag,
    223                              HANDLE_SBR_CALCULATE_ENVELOPE h_sbr_cal_env,
    224                              ENV_CALC_NRGS *nrgs, int lowSubbands,
    225                              int noSubbands, int scale_change,
    226                              FIXP_SGL smooth_ratio, int noNoiseFlag,
    227                              int filtBufferNoiseShift);
    228 
    229 /*!
    230   \brief     Map sine flags from bitstream to QMF bands
    231 
    232   The bitstream carries only 1 sine flag per band (Sfb) and frame.
    233   This function maps every sine flag from the bitstream to a specific QMF
    234   subband and to a specific envelope where the sine shall start. The result is
    235   stored in the vector sineMapped which contains one entry per QMF subband. The
    236   value of an entry specifies the envelope where a sine shall start. A value of
    237   32 indicates that no sine is present in the subband. The missing harmonics
    238   flags from the previous frame (harmFlagsPrev) determine if a sine starts at
    239   the beginning of the frame or at the transient position. Additionally, the
    240   flags in harmFlagsPrev are being updated by this function for the next frame.
    241 */
    242 static void mapSineFlags(
    243     UCHAR *freqBandTable, /*!< Band borders (there's only 1 flag per band) */
    244     int nSfb,             /*!< Number of bands in the table */
    245     ULONG *addHarmonics,  /*!< Packed addHarmonics of current frame (aligned to
    246                              the MSB) */
    247     ULONG *harmFlagsPrev, /*!< Packed addHarmonics of previous frame (aligned to
    248                              the LSB) */
    249     ULONG *harmFlagsPrevActive, /*!< Packed sineMapped of previous frame
    250                                    (aligned to the LSB) */
    251     int tranEnv,                /*!< Transient position */
    252     SCHAR *sineMapped) /*!< Resulting vector of sine start positions for each
    253                           QMF band */
    254 
    255 {
    256   int i;
    257   int bitcount = 31;
    258   ULONG harmFlagsQmfBands[ADD_HARMONICS_FLAGS_SIZE] = {0};
    259   ULONG *curFlags = addHarmonics;
    260 
    261   /*
    262     Format of addHarmonics (aligned to MSB):
    263 
    264       Up to MAX_FREQ_COEFFS sfb bands can be flagged for a sign.
    265       first word  = flags for lowest 32 sfb bands in use
    266       second word = flags for higest 32 sfb bands (if present)
    267 
    268     Format of harmFlagsPrev (aligned to LSB):
    269 
    270       Index is absolute (not relative to lsb) so it is correct even if lsb
    271     changes first word  = flags for lowest 32 qmf bands (0...31) second word =
    272     flags for next higher 32 qmf bands (32...63)
    273 
    274   */
    275 
    276   /* Reset the output vector first */
    277   FDKmemset(sineMapped, 32,
    278             MAX_FREQ_COEFFS * sizeof(SCHAR)); /* 32 means 'no sine' */
    279   FDKmemclear(harmFlagsPrevActive, ADD_HARMONICS_FLAGS_SIZE * sizeof(ULONG));
    280   for (i = 0; i < nSfb; i++) {
    281     ULONG maskSfb =
    282         1 << bitcount; /* mask to extract addHarmonics flag of current Sfb */
    283 
    284     if (*curFlags & maskSfb) {          /* There is a sine in this band */
    285       const int lsb = freqBandTable[0]; /* start of sbr range */
    286       /* qmf band to which sine should be added */
    287       const int qmfBand = (freqBandTable[i] + freqBandTable[i + 1]) >> 1;
    288       const int qmfBandDiv32 = qmfBand >> 5;
    289       const int maskQmfBand =
    290           1 << (qmfBand &
    291                 31); /* mask to extract harmonic flag from prevFlags */
    292 
    293       /* mapping of sfb with sine to a certain qmf band -> for harmFlagsPrev */
    294       harmFlagsQmfBands[qmfBandDiv32] |= maskQmfBand;
    295 
    296       /*
    297         If there was a sine in the last frame, let it continue from the first
    298         envelope on else start at the transient position. Indexing of sineMapped
    299         starts relative to lsb.
    300       */
    301       sineMapped[qmfBand - lsb] =
    302           (harmFlagsPrev[qmfBandDiv32] & maskQmfBand) ? 0 : tranEnv;
    303       if (sineMapped[qmfBand - lsb] < PVC_NTIMESLOT) {
    304         harmFlagsPrevActive[qmfBandDiv32] |= maskQmfBand;
    305       }
    306     }
    307 
    308     if (bitcount-- == 0) {
    309       bitcount = 31;
    310       curFlags++;
    311     }
    312   }
    313   FDKmemcpy(harmFlagsPrev, harmFlagsQmfBands,
    314             sizeof(ULONG) * ADD_HARMONICS_FLAGS_SIZE);
    315 }
    316 
    317 /*!
    318   \brief     Restore sineMapped of previous frame
    319 
    320   For PVC it might happen that the PVC framing (always 0) is out of sync with
    321   the SBR framing. The adding of additional harmonics is done based on the SBR
    322   framing. If the SBR framing is trailing the PVC framing the sine mapping of
    323   the previous SBR frame needs to be used for the overlapping time slots.
    324 */
    325 /*static*/ void mapSineFlagsPvc(
    326     UCHAR *freqBandTable,       /*!< Band borders (there's only 1 flag per
    327                                    band) */
    328     int nSfb,                   /*!< Number of bands in the table */
    329     ULONG *harmFlagsPrev,       /*!< Packed addHarmonics of previous frame
    330                                    (aligned to the MSB) */
    331     ULONG *harmFlagsPrevActive, /*!< Packed sineMapped of previous
    332                                    frame (aligned to the LSB) */
    333     SCHAR *sineMapped,          /*!< Resulting vector of sine start positions
    334                                    for each QMF band */
    335     int sinusoidalPos,          /*!< sinusoidal position */
    336     SCHAR *sinusoidalPosPrev,   /*!< sinusoidal position of previous
    337                                    frame */
    338     int trailingSbrFrame)       /*!< indication if the SBR framing is
    339                                    trailing the PVC framing */
    340 {
    341   /* Reset the output vector first */
    342   FDKmemset(sineMapped, 32, MAX_FREQ_COEFFS); /* 32 means 'no sine' */
    343 
    344   if (trailingSbrFrame) {
    345     /* restore sineMapped[] of previous frame */
    346     int i;
    347     const int lsb = freqBandTable[0];
    348     const int usb = freqBandTable[nSfb];
    349     for (i = lsb; i < usb; i++) {
    350       const int qmfBandDiv32 = i >> 5;
    351       const int maskQmfBand =
    352           1 << (i & 31); /* mask to extract harmonic flag from prevFlags */
    353 
    354       /* Two cases need to be distinguished ... */
    355       if (harmFlagsPrevActive[qmfBandDiv32] & maskQmfBand) {
    356         /* the sine mapping already started last PVC frame -> seamlessly
    357          * continue */
    358         sineMapped[i - lsb] = 0;
    359       } else if (harmFlagsPrev[qmfBandDiv32] & maskQmfBand) {
    360         /* sinusoidalPos of prev PVC frame was >= PVC_NTIMESLOT -> sine starts
    361          * in this frame */
    362         sineMapped[i - lsb] =
    363             *sinusoidalPosPrev - PVC_NTIMESLOT; /* we are 16 sbr time slots
    364                                                    ahead of last frame now */
    365       }
    366     }
    367   }
    368   *sinusoidalPosPrev = sinusoidalPos;
    369 }
    370 
    371 /*!
    372   \brief     Reduce gain-adjustment induced aliasing for real valued filterbank.
    373 */
    374 /*static*/ void aliasingReduction(
    375     FIXP_DBL *degreeAlias, /*!< estimated aliasing for each QMF
    376                               channel */
    377     ENV_CALC_NRGS *nrgs,
    378     UCHAR *useAliasReduction, /*!< synthetic sine energy for each
    379                                  subband, used as flag */
    380     int noSubbands)           /*!< number of QMF channels to process */
    381 {
    382   FIXP_DBL *nrgGain = nrgs->nrgGain; /*!< subband gains to be modified */
    383   SCHAR *nrgGain_e =
    384       nrgs->nrgGain_e; /*!< subband gains to be modified (exponents) */
    385   FIXP_DBL *nrgEst = nrgs->nrgEst; /*!< subband energy before amplification */
    386   SCHAR *nrgEst_e =
    387       nrgs->nrgEst_e; /*!< subband energy before amplification (exponents) */
    388   int grouping = 0, index = 0, noGroups, k;
    389   int groupVector[MAX_FREQ_COEFFS];
    390 
    391   /* Calculate grouping*/
    392   for (k = 0; k < noSubbands - 1; k++) {
    393     if ((degreeAlias[k + 1] != FL2FXCONST_DBL(0.0f)) && useAliasReduction[k]) {
    394       if (grouping == 0) {
    395         groupVector[index++] = k;
    396         grouping = 1;
    397       } else {
    398         if (groupVector[index - 1] + 3 == k) {
    399           groupVector[index++] = k + 1;
    400           grouping = 0;
    401         }
    402       }
    403     } else {
    404       if (grouping) {
    405         if (useAliasReduction[k])
    406           groupVector[index++] = k + 1;
    407         else
    408           groupVector[index++] = k;
    409         grouping = 0;
    410       }
    411     }
    412   }
    413 
    414   if (grouping) {
    415     groupVector[index++] = noSubbands;
    416   }
    417   noGroups = index >> 1;
    418 
    419   /*Calculate new gain*/
    420   for (int group = 0; group < noGroups; group++) {
    421     FIXP_DBL nrgOrig = FL2FXCONST_DBL(
    422         0.0f); /* Original signal energy in current group of bands */
    423     SCHAR nrgOrig_e = 0;
    424     FIXP_DBL nrgAmp = FL2FXCONST_DBL(
    425         0.0f); /* Amplified signal energy in group (using current gains) */
    426     SCHAR nrgAmp_e = 0;
    427     FIXP_DBL nrgMod = FL2FXCONST_DBL(
    428         0.0f); /* Signal energy in group when applying modified gains */
    429     SCHAR nrgMod_e = 0;
    430     FIXP_DBL groupGain; /* Total energy gain in group */
    431     SCHAR groupGain_e;
    432     FIXP_DBL compensation; /* Compensation factor for the energy change when
    433                               applying modified gains */
    434     SCHAR compensation_e;
    435 
    436     int startGroup = groupVector[2 * group];
    437     int stopGroup = groupVector[2 * group + 1];
    438 
    439     /* Calculate total energy in group before and after amplification with
    440      * current gains: */
    441     for (k = startGroup; k < stopGroup; k++) {
    442       /* Get original band energy */
    443       FIXP_DBL tmp = nrgEst[k];
    444       SCHAR tmp_e = nrgEst_e[k];
    445 
    446       FDK_add_MantExp(tmp, tmp_e, nrgOrig, nrgOrig_e, &nrgOrig, &nrgOrig_e);
    447 
    448       /* Multiply band energy with current gain */
    449       tmp = fMult(tmp, nrgGain[k]);
    450       tmp_e = tmp_e + nrgGain_e[k];
    451 
    452       FDK_add_MantExp(tmp, tmp_e, nrgAmp, nrgAmp_e, &nrgAmp, &nrgAmp_e);
    453     }
    454 
    455     /* Calculate total energy gain in group */
    456     FDK_divide_MantExp(nrgAmp, nrgAmp_e, nrgOrig, nrgOrig_e, &groupGain,
    457                        &groupGain_e);
    458 
    459     for (k = startGroup; k < stopGroup; k++) {
    460       FIXP_DBL tmp;
    461       SCHAR tmp_e;
    462 
    463       FIXP_DBL alpha = degreeAlias[k];
    464       if (k < noSubbands - 1) {
    465         if (degreeAlias[k + 1] > alpha) alpha = degreeAlias[k + 1];
    466       }
    467 
    468       /* Modify gain depending on the degree of aliasing */
    469       FDK_add_MantExp(
    470           fMult(alpha, groupGain), groupGain_e,
    471           fMult(/*FL2FXCONST_DBL(1.0f)*/ (FIXP_DBL)MAXVAL_DBL - alpha,
    472                 nrgGain[k]),
    473           nrgGain_e[k], &nrgGain[k], &nrgGain_e[k]);
    474 
    475       /* Apply modified gain to original energy */
    476       tmp = fMult(nrgGain[k], nrgEst[k]);
    477       tmp_e = nrgGain_e[k] + nrgEst_e[k];
    478 
    479       /* Accumulate energy with modified gains applied */
    480       FDK_add_MantExp(tmp, tmp_e, nrgMod, nrgMod_e, &nrgMod, &nrgMod_e);
    481     }
    482 
    483     /* Calculate compensation factor to retain the energy of the amplified
    484      * signal */
    485     FDK_divide_MantExp(nrgAmp, nrgAmp_e, nrgMod, nrgMod_e, &compensation,
    486                        &compensation_e);
    487 
    488     /* Apply compensation factor to all gains of the group */
    489     for (k = startGroup; k < stopGroup; k++) {
    490       nrgGain[k] = fMult(nrgGain[k], compensation);
    491       nrgGain_e[k] = nrgGain_e[k] + compensation_e;
    492     }
    493   }
    494 }
    495 
    496 #define INTER_TES_SF_CHANGE 4
    497 
    498 typedef struct {
    499   FIXP_DBL subsample_power_low[(((1024) / (32) * (4) / 2) + (3 * (4)))];
    500   FIXP_DBL subsample_power_high[(((1024) / (32) * (4) / 2) + (3 * (4)))];
    501   FIXP_DBL gain[(((1024) / (32) * (4) / 2) + (3 * (4)))];
    502   SCHAR subsample_power_low_sf[(((1024) / (32) * (4) / 2) + (3 * (4)))];
    503   SCHAR subsample_power_high_sf[(((1024) / (32) * (4) / 2) + (3 * (4)))];
    504 } ITES_TEMP;
    505 
    506 static void apply_inter_tes(FIXP_DBL **qmfReal, FIXP_DBL **qmfImag,
    507                             const QMF_SCALE_FACTOR *sbrScaleFactor,
    508                             const SCHAR exp[2], const int RATE,
    509                             const int startPos, const int stopPos,
    510                             const int lowSubband, const int nbSubband,
    511                             const UCHAR gamma_idx) {
    512   int highSubband = lowSubband + nbSubband;
    513   FIXP_DBL *subsample_power_high, *subsample_power_low;
    514   SCHAR *subsample_power_high_sf, *subsample_power_low_sf;
    515   FIXP_DBL total_power_high = (FIXP_DBL)0;
    516   FIXP_DBL total_power_low = (FIXP_DBL)0;
    517   FIXP_DBL *gain;
    518   int gain_sf[(((1024) / (32) * (4) / 2) + (3 * (4)))];
    519 
    520   /* gamma[gamma_idx] = {0.0f, 1.0f, 2.0f, 4.0f} */
    521   int gamma_sf =
    522       (int)gamma_idx - 1; /* perhaps +1 to save one bit? (0.99999f vs 1.f) */
    523 
    524   int nbSubsample = stopPos - startPos;
    525   int i, j;
    526 
    527   C_ALLOC_SCRATCH_START(pTmp, ITES_TEMP, 1);
    528   subsample_power_high = pTmp->subsample_power_high;
    529   subsample_power_low = pTmp->subsample_power_low;
    530   subsample_power_high_sf = pTmp->subsample_power_high_sf;
    531   subsample_power_low_sf = pTmp->subsample_power_low_sf;
    532   gain = pTmp->gain;
    533 
    534   if (gamma_idx > 0) {
    535     int preShift2 = 32 - fNormz((FIXP_DBL)nbSubsample);
    536     int total_power_low_sf = 1 - DFRACT_BITS;
    537     int total_power_high_sf = 1 - DFRACT_BITS;
    538 
    539     for (i = 0; i < nbSubsample; ++i) {
    540       FIXP_DBL bufferReal[(((1024) / (32) * (4) / 2) + (3 * (4)))];
    541       FIXP_DBL bufferImag[(((1024) / (32) * (4) / 2) + (3 * (4)))];
    542       FIXP_DBL maxVal = (FIXP_DBL)0;
    543 
    544       int ts = startPos + i;
    545 
    546       int low_sf = (ts < 3 * RATE) ? sbrScaleFactor->ov_lb_scale
    547                                    : sbrScaleFactor->lb_scale;
    548       low_sf = 15 - low_sf;
    549 
    550       for (j = 0; j < lowSubband; ++j) {
    551         bufferImag[j] = qmfImag[startPos + i][j];
    552         maxVal |= (FIXP_DBL)((LONG)(bufferImag[j]) ^
    553                              ((LONG)bufferImag[j] >> (DFRACT_BITS - 1)));
    554         bufferReal[j] = qmfReal[startPos + i][j];
    555         maxVal |= (FIXP_DBL)((LONG)(bufferReal[j]) ^
    556                              ((LONG)bufferReal[j] >> (DFRACT_BITS - 1)));
    557       }
    558 
    559       subsample_power_low[i] = (FIXP_DBL)0;
    560       subsample_power_low_sf[i] = 0;
    561 
    562       if (maxVal != FL2FXCONST_DBL(0.f)) {
    563         /* multiply first, then shift for safe summation */
    564         int preShift = 1 - CntLeadingZeros(maxVal);
    565         int postShift = 32 - fNormz((FIXP_DBL)lowSubband);
    566 
    567         /* reduce preShift because otherwise we risk to square -1.f */
    568         if (preShift != 0) preShift++;
    569 
    570         subsample_power_low_sf[i] += (low_sf + preShift) * 2 + postShift + 1;
    571 
    572         scaleValues(bufferReal, lowSubband, -preShift);
    573         scaleValues(bufferImag, lowSubband, -preShift);
    574         for (j = 0; j < lowSubband; ++j) {
    575           FIXP_DBL addme;
    576           addme = fPow2Div2(bufferReal[j]);
    577           subsample_power_low[i] += addme >> postShift;
    578           addme = fPow2Div2(bufferImag[j]);
    579           subsample_power_low[i] += addme >> postShift;
    580         }
    581       }
    582 
    583       /* now get high */
    584 
    585       maxVal = (FIXP_DBL)0;
    586 
    587       int high_sf = exp[(ts < 16 * RATE) ? 0 : 1];
    588 
    589       for (j = lowSubband; j < highSubband; ++j) {
    590         bufferImag[j] = qmfImag[startPos + i][j];
    591         maxVal |= (FIXP_DBL)((LONG)(bufferImag[j]) ^
    592                              ((LONG)bufferImag[j] >> (DFRACT_BITS - 1)));
    593         bufferReal[j] = qmfReal[startPos + i][j];
    594         maxVal |= (FIXP_DBL)((LONG)(bufferReal[j]) ^
    595                              ((LONG)bufferReal[j] >> (DFRACT_BITS - 1)));
    596       }
    597 
    598       subsample_power_high[i] = (FIXP_DBL)0;
    599       subsample_power_high_sf[i] = 0;
    600 
    601       if (maxVal != FL2FXCONST_DBL(0.f)) {
    602         int preShift = 1 - CntLeadingZeros(maxVal);
    603         /* reduce preShift because otherwise we risk to square -1.f */
    604         if (preShift != 0) preShift++;
    605 
    606         int postShift = 32 - fNormz((FIXP_DBL)(highSubband - lowSubband));
    607         subsample_power_high_sf[i] += (high_sf + preShift) * 2 + postShift + 1;
    608 
    609         scaleValues(&bufferReal[lowSubband], highSubband - lowSubband,
    610                     -preShift);
    611         scaleValues(&bufferImag[lowSubband], highSubband - lowSubband,
    612                     -preShift);
    613         for (j = lowSubband; j < highSubband; j++) {
    614           subsample_power_high[i] += fPow2Div2(bufferReal[j]) >> postShift;
    615           subsample_power_high[i] += fPow2Div2(bufferImag[j]) >> postShift;
    616         }
    617       }
    618 
    619       /* sum all together */
    620       FIXP_DBL new_summand = subsample_power_low[i];
    621       int new_summand_sf = subsample_power_low_sf[i];
    622 
    623       /* make sure the current sum, and the new summand have the same SF */
    624       if (new_summand_sf > total_power_low_sf) {
    625         int diff = fMin(DFRACT_BITS - 1, new_summand_sf - total_power_low_sf);
    626         total_power_low >>= diff;
    627         total_power_low_sf = new_summand_sf;
    628       } else if (new_summand_sf < total_power_low_sf) {
    629         new_summand >>=
    630             fMin(DFRACT_BITS - 1, total_power_low_sf - new_summand_sf);
    631       }
    632 
    633       total_power_low += (new_summand >> preShift2);
    634 
    635       new_summand = subsample_power_high[i];
    636       new_summand_sf = subsample_power_high_sf[i];
    637       if (new_summand_sf > total_power_high_sf) {
    638         total_power_high >>=
    639             fMin(DFRACT_BITS - 1, new_summand_sf - total_power_high_sf);
    640         total_power_high_sf = new_summand_sf;
    641       } else if (new_summand_sf < total_power_high_sf) {
    642         new_summand >>=
    643             fMin(DFRACT_BITS - 1, total_power_high_sf - new_summand_sf);
    644       }
    645 
    646       total_power_high += (new_summand >> preShift2);
    647     }
    648 
    649     total_power_low_sf += preShift2;
    650     total_power_high_sf += preShift2;
    651 
    652     /* gain[i] = e_LOW[i] */
    653     for (i = 0; i < nbSubsample; ++i) {
    654       int sf2;
    655       FIXP_DBL mult =
    656           fMultNorm(subsample_power_low[i], (FIXP_DBL)nbSubsample, &sf2);
    657       int mult_sf = subsample_power_low_sf[i] + DFRACT_BITS - 1 + sf2;
    658 
    659       if (total_power_low != FIXP_DBL(0)) {
    660         gain[i] = fDivNorm(mult, total_power_low, &sf2);
    661         gain_sf[i] = mult_sf - total_power_low_sf + sf2;
    662         gain[i] = sqrtFixp_lookup(gain[i], &gain_sf[i]);
    663         if (gain_sf[i] < 0) {
    664           gain[i] >>= -gain_sf[i];
    665           gain_sf[i] = 0;
    666         }
    667       } else {
    668         if (mult == FIXP_DBL(0)) {
    669           gain[i] = FIXP_DBL(0);
    670           gain_sf[i] = 0;
    671         } else {
    672           gain[i] = (FIXP_DBL)MAXVAL_DBL;
    673           gain_sf[i] = 0;
    674         }
    675       }
    676     }
    677 
    678     FIXP_DBL total_power_high_after = (FIXP_DBL)0;
    679     int total_power_high_after_sf = 1 - DFRACT_BITS;
    680 
    681     /* gain[i] = g_inter[i] */
    682     for (i = 0; i < nbSubsample; ++i) {
    683       if (gain_sf[i] < 0) {
    684         gain[i] >>= -gain_sf[i];
    685         gain_sf[i] = 0;
    686       }
    687 
    688       /* calculate: gain[i] = 1.0f + gamma * (gain[i] - 1.0f); */
    689       FIXP_DBL one = (FIXP_DBL)MAXVAL_DBL >>
    690                      gain_sf[i]; /* to substract this from gain[i] */
    691 
    692       /* gamma is actually always 1 according to the table, so skip the
    693        * fMultDiv2 */
    694       FIXP_DBL mult = (gain[i] - one) >> 1;
    695       int mult_sf = gain_sf[i] + gamma_sf;
    696 
    697       one = FL2FXCONST_DBL(0.5f) >> mult_sf;
    698       gain[i] = one + mult;
    699       gain_sf[i] += gamma_sf + 1; /* +1 because of fMultDiv2() */
    700 
    701       /* set gain to at least 0.2f */
    702       FIXP_DBL point_two = FL2FXCONST_DBL(0.8f); /* scaled up by 2 */
    703       int point_two_sf = -2;
    704 
    705       FIXP_DBL tmp = gain[i];
    706       if (point_two_sf < gain_sf[i]) {
    707         point_two >>= gain_sf[i] - point_two_sf;
    708       } else {
    709         tmp >>= point_two_sf - gain_sf[i];
    710       }
    711 
    712       /* limit and calculate gain[i]^2 too */
    713       FIXP_DBL gain_pow2;
    714       int gain_pow2_sf;
    715       if (tmp < point_two) {
    716         gain[i] = FL2FXCONST_DBL(0.8f);
    717         gain_sf[i] = -2;
    718         gain_pow2 = FL2FXCONST_DBL(0.64f);
    719         gain_pow2_sf = -4;
    720       } else {
    721         /* this upscaling seems quite important */
    722         int r = CountLeadingBits(gain[i]);
    723         gain[i] <<= r;
    724         gain_sf[i] -= r;
    725 
    726         gain_pow2 = fPow2(gain[i]);
    727         gain_pow2_sf = gain_sf[i] << 1;
    728       }
    729 
    730       int room;
    731       subsample_power_high[i] =
    732           fMultNorm(subsample_power_high[i], gain_pow2, &room);
    733       subsample_power_high_sf[i] =
    734           subsample_power_high_sf[i] + gain_pow2_sf + room;
    735 
    736       int new_summand_sf = subsample_power_high_sf[i]; /* + gain_pow2_sf; */
    737       if (new_summand_sf > total_power_high_after_sf) {
    738         total_power_high_after >>=
    739             fMin(DFRACT_BITS - 1, new_summand_sf - total_power_high_after_sf);
    740         total_power_high_after_sf = new_summand_sf;
    741       } else if (new_summand_sf < total_power_high_after_sf) {
    742         subsample_power_high[i] >>= total_power_high_after_sf - new_summand_sf;
    743       }
    744       total_power_high_after += subsample_power_high[i] >> preShift2;
    745     }
    746 
    747     total_power_high_after_sf += preShift2;
    748 
    749     int sf2 = 0;
    750     FIXP_DBL gain_adj_2 = FL2FX_DBL(0.5f);
    751     int gain_adj_2_sf = 1;
    752 
    753     if ((total_power_high != (FIXP_DBL)0) &&
    754         (total_power_high_after != (FIXP_DBL)0)) {
    755       gain_adj_2 = fDivNorm(total_power_high, total_power_high_after, &sf2);
    756       gain_adj_2_sf = total_power_high_sf - total_power_high_after_sf + sf2;
    757     }
    758 
    759     FIXP_DBL gain_adj = sqrtFixp_lookup(gain_adj_2, &gain_adj_2_sf);
    760     int gain_adj_sf = gain_adj_2_sf;
    761 
    762     for (i = 0; i < nbSubsample; ++i) {
    763       gain[i] = fMult(gain[i], gain_adj);
    764       gain_sf[i] += gain_adj_sf;
    765 
    766       /* limit gain */
    767       if (gain_sf[i] > INTER_TES_SF_CHANGE) {
    768         gain[i] = (FIXP_DBL)MAXVAL_DBL;
    769         gain_sf[i] = INTER_TES_SF_CHANGE;
    770       }
    771     }
    772 
    773     for (i = 0; i < nbSubsample; ++i) {
    774       /* equalize gain[]'s scale factors */
    775       gain[i] >>= INTER_TES_SF_CHANGE - gain_sf[i];
    776 
    777       for (j = lowSubband; j < highSubband; j++) {
    778         qmfReal[startPos + i][j] = fMult(qmfReal[startPos + i][j], gain[i]);
    779         qmfImag[startPos + i][j] = fMult(qmfImag[startPos + i][j], gain[i]);
    780       }
    781     }
    782   } else { /* gamma_idx == 0 */
    783     /* Inter-TES is not active. Still perform the scale change to have a
    784      * consistent scaling for all envelopes of this frame. */
    785     for (i = 0; i < nbSubsample; ++i) {
    786       for (j = lowSubband; j < highSubband; j++) {
    787         qmfReal[startPos + i][j] >>= INTER_TES_SF_CHANGE;
    788         qmfImag[startPos + i][j] >>= INTER_TES_SF_CHANGE;
    789       }
    790     }
    791   }
    792   C_ALLOC_SCRATCH_END(pTmp, ITES_TEMP, 1);
    793 }
    794 
    795 /*!
    796   \brief  Apply spectral envelope to subband samples
    797 
    798   This function is called from sbr_dec.cpp in each frame.
    799 
    800   To enhance accuracy and due to the usage of tables for squareroots and
    801   inverse, some calculations are performed with the operands being split
    802   into mantissa and exponent. The variable names in the source code carry
    803   the suffixes <em>_m</em> and  <em>_e</em> respectively. The control data
    804   in #hFrameData containts envelope data which is represented by this format but
    805   stored in single words. (See requantizeEnvelopeData() for details). This data
    806   is unpacked within calculateSbrEnvelope() to follow the described suffix
    807   convention.
    808 
    809   The actual value (comparable to the corresponding float-variable in the
    810   research-implementation) of a mantissa/exponent-pair can be calculated as
    811 
    812   \f$ value = value\_m * 2^{value\_e} \f$
    813 
    814   All energies and noise levels decoded from the bitstream suit for an
    815   original signal magnitude of \f$\pm 32768 \f$ rather than \f$ \pm 1\f$.
    816   Therefore, the scale factor <em>hb_scale</em> passed into this function will
    817   be converted to an 'input exponent' (#input_e), which fits the internal
    818   representation.
    819 
    820   Before the actual processing, an exponent #adj_e for resulting adjusted
    821   samples is derived from the maximum reference energy.
    822 
    823   Then, for each envelope, the following steps are performed:
    824 
    825   \li Calculate energy in the signal to be adjusted. Depending on the the value
    826   of #interpolFreq (interpolation mode), this is either done seperately for each
    827   QMF-subband or for each SBR-band. The resulting energies are stored in
    828   #nrgEst_m[#MAX_FREQ_COEFFS] (mantissas) and #nrgEst_e[#MAX_FREQ_COEFFS]
    829   (exponents). \li Calculate gain and noise level for each subband:<br> \f$ gain
    830   = \sqrt{ \frac{nrgRef}{nrgEst} \cdot (1 - noiseRatio) } \hspace{2cm} noise =
    831   \sqrt{ nrgRef \cdot noiseRatio } \f$<br> where <em>noiseRatio</em> and
    832   <em>nrgRef</em> are extracted from the bitstream and <em>nrgEst</em> is the
    833   subband energy before adjustment. The resulting gains are stored in
    834   #nrgGain_m[#MAX_FREQ_COEFFS] (mantissas) and #nrgGain_e[#MAX_FREQ_COEFFS]
    835   (exponents), the noise levels are stored in #noiseLevel_m[#MAX_FREQ_COEFFS]
    836   and #noiseLevel_e[#MAX_FREQ_COEFFS] (exponents). The sine levels are stored in
    837   #nrgSine_m[#MAX_FREQ_COEFFS] and #nrgSine_e[#MAX_FREQ_COEFFS]. \li Noise
    838   limiting: The gain for each subband is limited both absolutely and relatively
    839   compared to the total gain over all subbands. \li Boost gain: Calculate and
    840   apply boost factor for each limiter band in order to compensate for the energy
    841   loss imposed by the limiting. \li Apply gains and add noise: The gains and
    842   noise levels are applied to all timeslots of the current envelope. A short
    843   FIR-filter (length 4 QMF-timeslots) can be used to smooth the sudden change at
    844   the envelope borders. Each complex subband sample of the current timeslot is
    845   multiplied by the smoothed gain, then random noise with the calculated level
    846   is added.
    847 
    848   \note
    849   To reduce the stack size, some of the local arrays could be located within
    850   the time output buffer. Of the 512 samples temporarily available there,
    851   about half the size is already used by #SBR_FRAME_DATA. A pointer to the
    852   remaining free memory could be supplied by an additional argument to
    853   calculateSbrEnvelope() in sbr_dec:
    854 
    855   \par
    856   \code
    857     calculateSbrEnvelope (&hSbrDec->sbrScaleFactor,
    858                           &hSbrDec->SbrCalculateEnvelope,
    859                           hHeaderData,
    860                           hFrameData,
    861                           QmfBufferReal,
    862                           QmfBufferImag,
    863                           timeOutPtr + sizeof(SBR_FRAME_DATA)/sizeof(Float) +
    864   1); \endcode
    865 
    866   \par
    867   Within calculateSbrEnvelope(), some pointers could be defined instead of the
    868   arrays #nrgRef_m, #nrgRef_e, #nrgEst_m, #nrgEst_e, #noiseLevel_m:
    869 
    870   \par
    871   \code
    872     fract*        nrgRef_m = timeOutPtr;
    873     SCHAR*        nrgRef_e = nrgRef_m + MAX_FREQ_COEFFS;
    874     fract*        nrgEst_m = nrgRef_e + MAX_FREQ_COEFFS;
    875     SCHAR*        nrgEst_e = nrgEst_m + MAX_FREQ_COEFFS;
    876     fract*        noiseLevel_m = nrgEst_e + MAX_FREQ_COEFFS;
    877   \endcode
    878 
    879   <br>
    880 */
    881 void calculateSbrEnvelope(
    882     QMF_SCALE_FACTOR *sbrScaleFactor, /*!< Scaling factors */
    883     HANDLE_SBR_CALCULATE_ENVELOPE
    884         h_sbr_cal_env, /*!< Handle to struct filled by the create-function */
    885     HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */
    886     HANDLE_SBR_FRAME_DATA hFrameData,   /*!< Control data of current frame */
    887     PVC_DYNAMIC_DATA *pPvcDynamicData,
    888     FIXP_DBL *
    889         *analysBufferReal, /*!< Real part of subband samples to be processed */
    890     FIXP_DBL *
    891         *analysBufferImag, /*!< Imag part of subband samples to be processed */
    892     const int useLP,
    893     FIXP_DBL *degreeAlias, /*!< Estimated aliasing for each QMF channel */
    894     const UINT flags, const int frameErrorFlag) {
    895   int c, i, i_stop, j, envNoise = 0;
    896   UCHAR *borders = hFrameData->frameInfo.borders;
    897   UCHAR *bordersPvc = hFrameData->frameInfo.pvcBorders;
    898   int pvc_mode = pPvcDynamicData->pvc_mode;
    899   int first_start =
    900       ((pvc_mode > 0) ? bordersPvc[0] : borders[0]) * hHeaderData->timeStep;
    901   FIXP_SGL *noiseLevels = hFrameData->sbrNoiseFloorLevel;
    902   HANDLE_FREQ_BAND_DATA hFreq = &hHeaderData->freqBandData;
    903   UCHAR **pFreqBandTable = hFreq->freqBandTable;
    904   UCHAR *pFreqBandTableNoise = hFreq->freqBandTableNoise;
    905 
    906   int lowSubband = hFreq->lowSubband;
    907   int highSubband = hFreq->highSubband;
    908   int noSubbands = highSubband - lowSubband;
    909 
    910   /* old high subband before headerchange
    911      we asume no headerchange here        */
    912   int ov_highSubband = hFreq->highSubband;
    913 
    914   int noNoiseBands = hFreq->nNfb;
    915   UCHAR *noSubFrameBands = hFreq->nSfb;
    916   int no_cols = hHeaderData->numberTimeSlots * hHeaderData->timeStep;
    917 
    918   SCHAR sineMapped[MAX_FREQ_COEFFS];
    919   SCHAR ov_adj_e = SCALE2EXP(sbrScaleFactor->ov_hb_scale);
    920   SCHAR adj_e = 0;
    921   SCHAR output_e;
    922   SCHAR final_e = 0;
    923   /* inter-TES is active in one or more envelopes of the current SBR frame */
    924   const int iTES_enable = hFrameData->iTESactive;
    925   const int iTES_scale_change = (iTES_enable) ? INTER_TES_SF_CHANGE : 0;
    926   SCHAR maxGainLimit_e = (frameErrorFlag) ? MAX_GAIN_CONCEAL_EXP : MAX_GAIN_EXP;
    927 
    928   UCHAR smooth_length = 0;
    929 
    930   FIXP_SGL *pIenv = hFrameData->iEnvelope;
    931 
    932   C_ALLOC_SCRATCH_START(useAliasReduction, UCHAR, 64)
    933 
    934   /* if values differ we had a headerchange; if old highband is bigger then new
    935      one we need to patch overlap-highband-scaling for this frame (see use of
    936      ov_highSubband) as overlap contains higher frequency components which would
    937      get lost */
    938   if (hFreq->highSubband < hFreq->ov_highSubband) {
    939     ov_highSubband = hFreq->ov_highSubband;
    940   }
    941 
    942   if (pvc_mode > 0) {
    943     if (hFrameData->frameInfo.bordersNoise[0] > bordersPvc[0]) {
    944       /* noise envelope of previous frame is trailing into current PVC frame */
    945       envNoise = -1;
    946       noiseLevels = h_sbr_cal_env->prevSbrNoiseFloorLevel;
    947       noNoiseBands = h_sbr_cal_env->prevNNfb;
    948       noSubFrameBands = h_sbr_cal_env->prevNSfb;
    949       lowSubband = h_sbr_cal_env->prevLoSubband;
    950       highSubband = h_sbr_cal_env->prevHiSubband;
    951 
    952       noSubbands = highSubband - lowSubband;
    953       ov_highSubband = highSubband;
    954       if (highSubband < h_sbr_cal_env->prev_ov_highSubband) {
    955         ov_highSubband = h_sbr_cal_env->prev_ov_highSubband;
    956       }
    957 
    958       pFreqBandTable[0] = h_sbr_cal_env->prevFreqBandTableLo;
    959       pFreqBandTable[1] = h_sbr_cal_env->prevFreqBandTableHi;
    960       pFreqBandTableNoise = h_sbr_cal_env->prevFreqBandTableNoise;
    961     }
    962 
    963     mapSineFlagsPvc(pFreqBandTable[1], noSubFrameBands[1],
    964                     h_sbr_cal_env->harmFlagsPrev,
    965                     h_sbr_cal_env->harmFlagsPrevActive, sineMapped,
    966                     hFrameData->sinusoidal_position,
    967                     &h_sbr_cal_env->sinusoidal_positionPrev,
    968                     (borders[0] > bordersPvc[0]) ? 1 : 0);
    969   } else {
    970     /*
    971       Extract sine flags for all QMF bands
    972     */
    973     mapSineFlags(pFreqBandTable[1], noSubFrameBands[1],
    974                  hFrameData->addHarmonics, h_sbr_cal_env->harmFlagsPrev,
    975                  h_sbr_cal_env->harmFlagsPrevActive,
    976                  hFrameData->frameInfo.tranEnv, sineMapped);
    977   }
    978 
    979   /*
    980     Scan for maximum in bufferd noise levels.
    981     This is needed in case that we had strong noise in the previous frame
    982     which is smoothed into the current frame.
    983     The resulting exponent is used as start value for the maximum search
    984     in reference energies
    985   */
    986   if (!useLP)
    987     adj_e = h_sbr_cal_env->filtBufferNoise_e -
    988             getScalefactor(h_sbr_cal_env->filtBufferNoise, noSubbands);
    989 
    990   /*
    991     Scan for maximum reference energy to be able
    992     to select appropriate values for adj_e and final_e.
    993   */
    994   if (pvc_mode > 0) {
    995     INT maxSfbNrg_e = pPvcDynamicData->predEsg_expMax;
    996 
    997     /* Energy -> magnitude (sqrt halfens exponent) */
    998     maxSfbNrg_e =
    999         (maxSfbNrg_e + 1) >> 1; /* +1 to go safe (round to next higher int) */
   1000 
   1001     /* Some safety margin is needed for 2 reasons:
   1002        - The signal energy is not equally spread over all subband samples in
   1003          a specific sfb of an envelope (Nrg could be too high by a factor of
   1004          envWidth * sfbWidth)
   1005        - Smoothing can smear high gains of the previous envelope into the
   1006        current
   1007     */
   1008     maxSfbNrg_e += 6;
   1009 
   1010     adj_e = maxSfbNrg_e;
   1011     // final_e should not exist for PVC fixfix framing
   1012   } else {
   1013     for (i = 0; i < hFrameData->frameInfo.nEnvelopes; i++) {
   1014       INT maxSfbNrg_e =
   1015           -FRACT_BITS + NRG_EXP_OFFSET; /* start value for maximum search */
   1016 
   1017       /* Fetch frequency resolution for current envelope: */
   1018       for (j = noSubFrameBands[hFrameData->frameInfo.freqRes[i]]; j != 0; j--) {
   1019         maxSfbNrg_e = fixMax(maxSfbNrg_e, (INT)((LONG)(*pIenv++) & MASK_E));
   1020       }
   1021       maxSfbNrg_e -= NRG_EXP_OFFSET;
   1022 
   1023       /* Energy -> magnitude (sqrt halfens exponent) */
   1024       maxSfbNrg_e =
   1025           (maxSfbNrg_e + 1) >> 1; /* +1 to go safe (round to next higher int) */
   1026 
   1027       /* Some safety margin is needed for 2 reasons:
   1028          - The signal energy is not equally spread over all subband samples in
   1029            a specific sfb of an envelope (Nrg could be too high by a factor of
   1030            envWidth * sfbWidth)
   1031          - Smoothing can smear high gains of the previous envelope into the
   1032          current
   1033       */
   1034       maxSfbNrg_e += 6;
   1035 
   1036       if (borders[i] < hHeaderData->numberTimeSlots)
   1037         /* This envelope affects timeslots that belong to the output frame */
   1038         adj_e = fMax(maxSfbNrg_e, adj_e);
   1039 
   1040       if (borders[i + 1] > hHeaderData->numberTimeSlots)
   1041         /* This envelope affects timeslots after the output frame */
   1042         final_e = fMax(maxSfbNrg_e, final_e);
   1043     }
   1044   }
   1045   /*
   1046     Calculate adjustment factors and apply them for every envelope.
   1047   */
   1048   pIenv = hFrameData->iEnvelope;
   1049 
   1050   if (pvc_mode > 0) {
   1051     /* iterate over SBR time slots starting with bordersPvc[i] */
   1052     i = bordersPvc[0]; /* usually 0; can be >0 if switching from legacy SBR to
   1053                           PVC */
   1054     i_stop = PVC_NTIMESLOT;
   1055     FDK_ASSERT(bordersPvc[hFrameData->frameInfo.nEnvelopes] == PVC_NTIMESLOT);
   1056   } else {
   1057     /* iterate over SBR envelopes starting with 0 */
   1058     i = 0;
   1059     i_stop = hFrameData->frameInfo.nEnvelopes;
   1060   }
   1061   for (; i < i_stop; i++) {
   1062     int k, noNoiseFlag;
   1063     SCHAR noise_e, input_e = SCALE2EXP(sbrScaleFactor->hb_scale);
   1064     C_ALLOC_SCRATCH_START(pNrgs, ENV_CALC_NRGS, 1);
   1065 
   1066     /*
   1067       Helper variables.
   1068     */
   1069     int start_pos, stop_pos, freq_res;
   1070     if (pvc_mode > 0) {
   1071       start_pos =
   1072           hHeaderData->timeStep *
   1073           i; /* Start-position in time (subband sample) for current envelope. */
   1074       stop_pos = hHeaderData->timeStep * (i + 1); /* Stop-position in time
   1075                                                      (subband sample) for
   1076                                                      current envelope. */
   1077       freq_res =
   1078           hFrameData->frameInfo
   1079               .freqRes[0]; /* Frequency resolution for current envelope. */
   1080       FDK_ASSERT(
   1081           freq_res ==
   1082           hFrameData->frameInfo.freqRes[hFrameData->frameInfo.nEnvelopes - 1]);
   1083     } else {
   1084       start_pos = hHeaderData->timeStep *
   1085                   borders[i]; /* Start-position in time (subband sample) for
   1086                                  current envelope. */
   1087       stop_pos = hHeaderData->timeStep *
   1088                  borders[i + 1]; /* Stop-position in time (subband sample) for
   1089                                     current envelope. */
   1090       freq_res =
   1091           hFrameData->frameInfo
   1092               .freqRes[i]; /* Frequency resolution for current envelope. */
   1093     }
   1094 
   1095     /* Always fully initialize the temporary energy table. This prevents
   1096        negative energies and extreme gain factors in cases where the number of
   1097        limiter bands exceeds the number of subbands. The latter can be caused by
   1098        undetected bit errors and is tested by some streams from the
   1099        certification set. */
   1100     FDKmemclear(pNrgs, sizeof(ENV_CALC_NRGS));
   1101 
   1102     if (pvc_mode > 0) {
   1103       /* get predicted energy values from PVC module */
   1104       expandPredEsg(pPvcDynamicData, i, (int)MAX_FREQ_COEFFS, pNrgs->nrgRef,
   1105                     pNrgs->nrgRef_e);
   1106 
   1107       if (i == borders[0]) {
   1108         mapSineFlags(pFreqBandTable[1], noSubFrameBands[1],
   1109                      hFrameData->addHarmonics, h_sbr_cal_env->harmFlagsPrev,
   1110                      h_sbr_cal_env->harmFlagsPrevActive,
   1111                      hFrameData->sinusoidal_position, sineMapped);
   1112       }
   1113 
   1114       if (i >= hFrameData->frameInfo.bordersNoise[envNoise + 1]) {
   1115         if (envNoise >= 0) {
   1116           noiseLevels += noNoiseBands; /* The noise floor data is stored in a
   1117                                           row [noiseFloor1 noiseFloor2...].*/
   1118         } else {
   1119           /* leave trailing noise envelope of past frame */
   1120           noNoiseBands = hFreq->nNfb;
   1121           noSubFrameBands = hFreq->nSfb;
   1122           noiseLevels = hFrameData->sbrNoiseFloorLevel;
   1123 
   1124           lowSubband = hFreq->lowSubband;
   1125           highSubband = hFreq->highSubband;
   1126 
   1127           noSubbands = highSubband - lowSubband;
   1128           ov_highSubband = highSubband;
   1129           if (highSubband < hFreq->ov_highSubband) {
   1130             ov_highSubband = hFreq->ov_highSubband;
   1131           }
   1132 
   1133           pFreqBandTable[0] = hFreq->freqBandTableLo;
   1134           pFreqBandTable[1] = hFreq->freqBandTableHi;
   1135           pFreqBandTableNoise = hFreq->freqBandTableNoise;
   1136         }
   1137         envNoise++;
   1138       }
   1139     } else {
   1140       /* If the start-pos of the current envelope equals the stop pos of the
   1141          current noise envelope, increase the pointer (i.e. choose the next
   1142          noise-floor).*/
   1143       if (borders[i] == hFrameData->frameInfo.bordersNoise[envNoise + 1]) {
   1144         noiseLevels += noNoiseBands; /* The noise floor data is stored in a row
   1145                                         [noiseFloor1 noiseFloor2...].*/
   1146         envNoise++;
   1147       }
   1148     }
   1149     if (i == hFrameData->frameInfo.tranEnv ||
   1150         i == h_sbr_cal_env->prevTranEnv) /* attack */
   1151     {
   1152       noNoiseFlag = 1;
   1153       if (!useLP) smooth_length = 0; /* No smoothing on attacks! */
   1154     } else {
   1155       noNoiseFlag = 0;
   1156       if (!useLP)
   1157         smooth_length = (1 - hHeaderData->bs_data.smoothingLength)
   1158                         << 2; /* can become either 0 or 4 */
   1159     }
   1160 
   1161     /*
   1162       Energy estimation in transposed highband.
   1163     */
   1164     if (hHeaderData->bs_data.interpolFreq)
   1165       calcNrgPerSubband(analysBufferReal, (useLP) ? NULL : analysBufferImag,
   1166                         lowSubband, highSubband, start_pos, stop_pos, input_e,
   1167                         pNrgs->nrgEst, pNrgs->nrgEst_e);
   1168     else
   1169       calcNrgPerSfb(analysBufferReal, (useLP) ? NULL : analysBufferImag,
   1170                     noSubFrameBands[freq_res], pFreqBandTable[freq_res],
   1171                     start_pos, stop_pos, input_e, pNrgs->nrgEst,
   1172                     pNrgs->nrgEst_e);
   1173 
   1174     /*
   1175       Calculate subband gains
   1176     */
   1177     {
   1178       UCHAR *table = pFreqBandTable[freq_res];
   1179       UCHAR *pUiNoise =
   1180           &pFreqBandTableNoise[1]; /*! Upper limit of the current noise floor
   1181                                       band. */
   1182 
   1183       FIXP_SGL *pNoiseLevels = noiseLevels;
   1184 
   1185       FIXP_DBL tmpNoise =
   1186           FX_SGL2FX_DBL((FIXP_SGL)((LONG)(*pNoiseLevels) & MASK_M));
   1187       SCHAR tmpNoise_e =
   1188           (UCHAR)((LONG)(*pNoiseLevels++) & MASK_E) - NOISE_EXP_OFFSET;
   1189 
   1190       int cc = 0;
   1191       c = 0;
   1192       if (pvc_mode > 0) {
   1193         for (j = 0; j < noSubFrameBands[freq_res]; j++) {
   1194           UCHAR sinePresentFlag = 0;
   1195           int li = table[j];
   1196           int ui = table[j + 1];
   1197 
   1198           for (k = li; k < ui; k++) {
   1199             sinePresentFlag |= (i >= sineMapped[cc]);
   1200             cc++;
   1201           }
   1202 
   1203           for (k = li; k < ui; k++) {
   1204             FIXP_DBL refNrg = pNrgs->nrgRef[k - lowSubband];
   1205             SCHAR refNrg_e = pNrgs->nrgRef_e[k - lowSubband];
   1206 
   1207             if (k >= *pUiNoise) {
   1208               tmpNoise =
   1209                   FX_SGL2FX_DBL((FIXP_SGL)((LONG)(*pNoiseLevels) & MASK_M));
   1210               tmpNoise_e =
   1211                   (SCHAR)((LONG)(*pNoiseLevels++) & MASK_E) - NOISE_EXP_OFFSET;
   1212 
   1213               pUiNoise++;
   1214             }
   1215 
   1216             FDK_ASSERT(k >= lowSubband);
   1217 
   1218             if (useLP) useAliasReduction[k - lowSubband] = !sinePresentFlag;
   1219 
   1220             pNrgs->nrgSine[c] = FL2FXCONST_DBL(0.0f);
   1221             pNrgs->nrgSine_e[c] = 0;
   1222 
   1223             calcSubbandGain(refNrg, refNrg_e, pNrgs, c, tmpNoise, tmpNoise_e,
   1224                             sinePresentFlag, i >= sineMapped[c], noNoiseFlag);
   1225 
   1226             c++;
   1227           }
   1228         }
   1229       } else {
   1230         for (j = 0; j < noSubFrameBands[freq_res]; j++) {
   1231           FIXP_DBL refNrg = FX_SGL2FX_DBL((FIXP_SGL)((LONG)(*pIenv) & MASK_M));
   1232           SCHAR refNrg_e = (SCHAR)((LONG)(*pIenv) & MASK_E) - NRG_EXP_OFFSET;
   1233 
   1234           UCHAR sinePresentFlag = 0;
   1235           int li = table[j];
   1236           int ui = table[j + 1];
   1237 
   1238           for (k = li; k < ui; k++) {
   1239             sinePresentFlag |= (i >= sineMapped[cc]);
   1240             cc++;
   1241           }
   1242 
   1243           for (k = li; k < ui; k++) {
   1244             if (k >= *pUiNoise) {
   1245               tmpNoise =
   1246                   FX_SGL2FX_DBL((FIXP_SGL)((LONG)(*pNoiseLevels) & MASK_M));
   1247               tmpNoise_e =
   1248                   (SCHAR)((LONG)(*pNoiseLevels++) & MASK_E) - NOISE_EXP_OFFSET;
   1249 
   1250               pUiNoise++;
   1251             }
   1252 
   1253             FDK_ASSERT(k >= lowSubband);
   1254 
   1255             if (useLP) useAliasReduction[k - lowSubband] = !sinePresentFlag;
   1256 
   1257             pNrgs->nrgSine[c] = FL2FXCONST_DBL(0.0f);
   1258             pNrgs->nrgSine_e[c] = 0;
   1259 
   1260             calcSubbandGain(refNrg, refNrg_e, pNrgs, c, tmpNoise, tmpNoise_e,
   1261                             sinePresentFlag, i >= sineMapped[c], noNoiseFlag);
   1262 
   1263             pNrgs->nrgRef[c] = refNrg;
   1264             pNrgs->nrgRef_e[c] = refNrg_e;
   1265 
   1266             c++;
   1267           }
   1268           pIenv++;
   1269         }
   1270       }
   1271     }
   1272 
   1273     /*
   1274       Noise limiting
   1275     */
   1276 
   1277     for (c = 0; c < hFreq->noLimiterBands; c++) {
   1278       FIXP_DBL sumRef, boostGain, maxGain;
   1279       FIXP_DBL accu = FL2FXCONST_DBL(0.0f);
   1280       SCHAR sumRef_e, boostGain_e, maxGain_e, accu_e = 0;
   1281       int maxGainLimGainSum_e = 0;
   1282 
   1283       calcAvgGain(pNrgs, hFreq->limiterBandTable[c],
   1284                   hFreq->limiterBandTable[c + 1], &sumRef, &sumRef_e, &maxGain,
   1285                   &maxGain_e);
   1286 
   1287       /* Multiply maxGain with limiterGain: */
   1288       maxGain = fMult(
   1289           maxGain,
   1290           FDK_sbrDecoder_sbr_limGains_m[hHeaderData->bs_data.limiterGains]);
   1291       /* maxGain_e +=
   1292        * FDK_sbrDecoder_sbr_limGains_e[hHeaderData->bs_data.limiterGains]; */
   1293       /* The addition of maxGain_e and FDK_sbrDecoder_sbr_limGains_e[3] might
   1294          yield values greater than 127 which doesn't fit into an SCHAR! In these
   1295          rare situations limit maxGain_e to 127.
   1296       */
   1297       maxGainLimGainSum_e =
   1298           maxGain_e +
   1299           FDK_sbrDecoder_sbr_limGains_e[hHeaderData->bs_data.limiterGains];
   1300       maxGain_e =
   1301           (maxGainLimGainSum_e > 127) ? (SCHAR)127 : (SCHAR)maxGainLimGainSum_e;
   1302 
   1303       /* Scale mantissa of MaxGain into range between 0.5 and 1: */
   1304       if (maxGain == FL2FXCONST_DBL(0.0f))
   1305         maxGain_e = -FRACT_BITS;
   1306       else {
   1307         SCHAR charTemp = CountLeadingBits(maxGain);
   1308         maxGain_e -= charTemp;
   1309         maxGain <<= (int)charTemp;
   1310       }
   1311 
   1312       if (maxGain_e >= maxGainLimit_e) { /* upper limit (e.g. 96 dB) */
   1313         maxGain = FL2FXCONST_DBL(0.5f);
   1314         maxGain_e = maxGainLimit_e;
   1315       }
   1316 
   1317       /* Every subband gain is compared to the scaled "average gain"
   1318          and limited if necessary: */
   1319       for (k = hFreq->limiterBandTable[c]; k < hFreq->limiterBandTable[c + 1];
   1320            k++) {
   1321         if ((pNrgs->nrgGain_e[k] > maxGain_e) ||
   1322             (pNrgs->nrgGain_e[k] == maxGain_e && pNrgs->nrgGain[k] > maxGain)) {
   1323           FIXP_DBL noiseAmp;
   1324           SCHAR noiseAmp_e;
   1325 
   1326           FDK_divide_MantExp(maxGain, maxGain_e, pNrgs->nrgGain[k],
   1327                              pNrgs->nrgGain_e[k], &noiseAmp, &noiseAmp_e);
   1328           pNrgs->noiseLevel[k] = fMult(pNrgs->noiseLevel[k], noiseAmp);
   1329           pNrgs->noiseLevel_e[k] += noiseAmp_e;
   1330           pNrgs->nrgGain[k] = maxGain;
   1331           pNrgs->nrgGain_e[k] = maxGain_e;
   1332         }
   1333       }
   1334 
   1335       /* -- Boost gain
   1336         Calculate and apply boost factor for each limiter band:
   1337         1. Check how much energy would be present when using the limited gain
   1338         2. Calculate boost factor by comparison with reference energy
   1339         3. Apply boost factor to compensate for the energy loss due to limiting
   1340       */
   1341       for (k = hFreq->limiterBandTable[c]; k < hFreq->limiterBandTable[c + 1];
   1342            k++) {
   1343         /* 1.a  Add energy of adjusted signal (using preliminary gain) */
   1344         FIXP_DBL tmp = fMult(pNrgs->nrgGain[k], pNrgs->nrgEst[k]);
   1345         SCHAR tmp_e = pNrgs->nrgGain_e[k] + pNrgs->nrgEst_e[k];
   1346         FDK_add_MantExp(tmp, tmp_e, accu, accu_e, &accu, &accu_e);
   1347 
   1348         /* 1.b  Add sine energy (if present) */
   1349         if (pNrgs->nrgSine[k] != FL2FXCONST_DBL(0.0f)) {
   1350           FDK_add_MantExp(pNrgs->nrgSine[k], pNrgs->nrgSine_e[k], accu, accu_e,
   1351                           &accu, &accu_e);
   1352         } else {
   1353           /* 1.c  Add noise energy (if present) */
   1354           if (noNoiseFlag == 0) {
   1355             FDK_add_MantExp(pNrgs->noiseLevel[k], pNrgs->noiseLevel_e[k], accu,
   1356                             accu_e, &accu, &accu_e);
   1357           }
   1358         }
   1359       }
   1360 
   1361       /* 2.a  Calculate ratio of wanted energy and accumulated energy */
   1362       if (accu == (FIXP_DBL)0) { /* If divisor is 0, limit quotient to +4 dB */
   1363         boostGain = FL2FXCONST_DBL(0.6279716f);
   1364         boostGain_e = 2;
   1365       } else {
   1366         INT div_e;
   1367         boostGain = fDivNorm(sumRef, accu, &div_e);
   1368         boostGain_e = sumRef_e - accu_e + div_e;
   1369       }
   1370 
   1371       /* 2.b Result too high? --> Limit the boost factor to +4 dB */
   1372       if ((boostGain_e > 3) ||
   1373           (boostGain_e == 2 && boostGain > FL2FXCONST_DBL(0.6279716f)) ||
   1374           (boostGain_e == 3 && boostGain > FL2FXCONST_DBL(0.3139858f))) {
   1375         boostGain = FL2FXCONST_DBL(0.6279716f);
   1376         boostGain_e = 2;
   1377       }
   1378       /* 3.  Multiply all signal components with the boost factor */
   1379       for (k = hFreq->limiterBandTable[c]; k < hFreq->limiterBandTable[c + 1];
   1380            k++) {
   1381         pNrgs->nrgGain[k] = fMultDiv2(pNrgs->nrgGain[k], boostGain);
   1382         pNrgs->nrgGain_e[k] = pNrgs->nrgGain_e[k] + boostGain_e + 1;
   1383 
   1384         pNrgs->nrgSine[k] = fMultDiv2(pNrgs->nrgSine[k], boostGain);
   1385         pNrgs->nrgSine_e[k] = pNrgs->nrgSine_e[k] + boostGain_e + 1;
   1386 
   1387         pNrgs->noiseLevel[k] = fMultDiv2(pNrgs->noiseLevel[k], boostGain);
   1388         pNrgs->noiseLevel_e[k] = pNrgs->noiseLevel_e[k] + boostGain_e + 1;
   1389       }
   1390     }
   1391     /* End of noise limiting */
   1392 
   1393     if (useLP)
   1394       aliasingReduction(degreeAlias + lowSubband, pNrgs, useAliasReduction,
   1395                         noSubbands);
   1396 
   1397     /* For the timeslots within the range for the output frame,
   1398        use the same scale for the noise levels.
   1399        Drawback: If the envelope exceeds the frame border, the noise levels
   1400                  will have to be rescaled later to fit final_e of
   1401                  the gain-values.
   1402     */
   1403     noise_e = (start_pos < no_cols) ? adj_e : final_e;
   1404 
   1405     /*
   1406       Convert energies to amplitude levels
   1407     */
   1408     for (k = 0; k < noSubbands; k++) {
   1409       FDK_sqrt_MantExp(&pNrgs->nrgSine[k], &pNrgs->nrgSine_e[k], &noise_e);
   1410       FDK_sqrt_MantExp(&pNrgs->nrgGain[k], &pNrgs->nrgGain_e[k],
   1411                        &pNrgs->nrgGain_e[k]);
   1412       FDK_sqrt_MantExp(&pNrgs->noiseLevel[k], &pNrgs->noiseLevel_e[k],
   1413                        &noise_e);
   1414     }
   1415 
   1416     /*
   1417       Apply calculated gains and adaptive noise
   1418     */
   1419 
   1420     /* assembleHfSignals() */
   1421     {
   1422       int scale_change, sc_change;
   1423       FIXP_SGL smooth_ratio;
   1424       int filtBufferNoiseShift = 0;
   1425 
   1426       /* Initialize smoothing buffers with the first valid values */
   1427       if (h_sbr_cal_env->startUp) {
   1428         if (!useLP) {
   1429           h_sbr_cal_env->filtBufferNoise_e = noise_e;
   1430 
   1431           FDKmemcpy(h_sbr_cal_env->filtBuffer_e, pNrgs->nrgGain_e,
   1432                     noSubbands * sizeof(SCHAR));
   1433           FDKmemcpy(h_sbr_cal_env->filtBufferNoise, pNrgs->noiseLevel,
   1434                     noSubbands * sizeof(FIXP_DBL));
   1435           FDKmemcpy(h_sbr_cal_env->filtBuffer, pNrgs->nrgGain,
   1436                     noSubbands * sizeof(FIXP_DBL));
   1437         }
   1438         h_sbr_cal_env->startUp = 0;
   1439       }
   1440 
   1441       if (!useLP) {
   1442         equalizeFiltBufferExp(h_sbr_cal_env->filtBuffer,   /* buffered */
   1443                               h_sbr_cal_env->filtBuffer_e, /* buffered */
   1444                               pNrgs->nrgGain,              /* current  */
   1445                               pNrgs->nrgGain_e,            /* current  */
   1446                               noSubbands);
   1447 
   1448         /* Adapt exponent of buffered noise levels to the current exponent
   1449            so they can easily be smoothed */
   1450         if ((h_sbr_cal_env->filtBufferNoise_e - noise_e) >= 0) {
   1451           int shift = fixMin(DFRACT_BITS - 1,
   1452                              (int)(h_sbr_cal_env->filtBufferNoise_e - noise_e));
   1453           for (k = 0; k < noSubbands; k++)
   1454             h_sbr_cal_env->filtBufferNoise[k] <<= shift;
   1455         } else {
   1456           int shift =
   1457               fixMin(DFRACT_BITS - 1,
   1458                      -(int)(h_sbr_cal_env->filtBufferNoise_e - noise_e));
   1459           for (k = 0; k < noSubbands; k++)
   1460             h_sbr_cal_env->filtBufferNoise[k] >>= shift;
   1461         }
   1462 
   1463         h_sbr_cal_env->filtBufferNoise_e = noise_e;
   1464       }
   1465 
   1466       /* find best scaling! */
   1467       scale_change = -(DFRACT_BITS - 1);
   1468       for (k = 0; k < noSubbands; k++) {
   1469         scale_change = fixMax(scale_change, (int)pNrgs->nrgGain_e[k]);
   1470       }
   1471       sc_change = (start_pos < no_cols) ? adj_e - input_e : final_e - input_e;
   1472 
   1473       if ((scale_change - sc_change + 1) < 0)
   1474         scale_change -= (scale_change - sc_change + 1);
   1475 
   1476       scale_change = (scale_change - sc_change) + 1;
   1477 
   1478       for (k = 0; k < noSubbands; k++) {
   1479         int sc = scale_change - pNrgs->nrgGain_e[k] + (sc_change - 1);
   1480         pNrgs->nrgGain[k] >>= sc;
   1481         pNrgs->nrgGain_e[k] += sc;
   1482       }
   1483 
   1484       if (!useLP) {
   1485         for (k = 0; k < noSubbands; k++) {
   1486           int sc =
   1487               scale_change - h_sbr_cal_env->filtBuffer_e[k] + (sc_change - 1);
   1488           h_sbr_cal_env->filtBuffer[k] >>= sc;
   1489         }
   1490       }
   1491 
   1492       for (j = start_pos; j < stop_pos; j++) {
   1493         /* This timeslot is located within the first part of the processing
   1494            buffer and will be fed into the QMF-synthesis for the current frame.
   1495                adj_e - input_e
   1496            This timeslot will not yet be fed into the QMF so we do not care
   1497            about the adj_e.
   1498                sc_change = final_e - input_e
   1499         */
   1500         if ((j == no_cols) && (start_pos < no_cols)) {
   1501           int shift = (int)(noise_e - final_e);
   1502           if (!useLP)
   1503             filtBufferNoiseShift = shift; /* shifting of
   1504                                              h_sbr_cal_env->filtBufferNoise[k]
   1505                                              will be applied in function
   1506                                              adjustTimeSlotHQ() */
   1507           if (shift >= 0) {
   1508             shift = fixMin(DFRACT_BITS - 1, shift);
   1509             for (k = 0; k < noSubbands; k++) {
   1510               pNrgs->nrgSine[k] <<= shift;
   1511               pNrgs->noiseLevel[k] <<= shift;
   1512               /*
   1513               if (!useLP)
   1514                 h_sbr_cal_env->filtBufferNoise[k]  <<= shift;
   1515               */
   1516             }
   1517           } else {
   1518             shift = fixMin(DFRACT_BITS - 1, -shift);
   1519             for (k = 0; k < noSubbands; k++) {
   1520               pNrgs->nrgSine[k] >>= shift;
   1521               pNrgs->noiseLevel[k] >>= shift;
   1522               /*
   1523               if (!useLP)
   1524                 h_sbr_cal_env->filtBufferNoise[k]  >>= shift;
   1525               */
   1526             }
   1527           }
   1528 
   1529           /* update noise scaling */
   1530           noise_e = final_e;
   1531           if (!useLP)
   1532             h_sbr_cal_env->filtBufferNoise_e =
   1533                 noise_e; /* scaling value unused! */
   1534 
   1535           /* update gain buffer*/
   1536           sc_change -= (final_e - input_e);
   1537 
   1538           if (sc_change < 0) {
   1539             for (k = 0; k < noSubbands; k++) {
   1540               pNrgs->nrgGain[k] >>= -sc_change;
   1541               pNrgs->nrgGain_e[k] += -sc_change;
   1542             }
   1543             if (!useLP) {
   1544               for (k = 0; k < noSubbands; k++) {
   1545                 h_sbr_cal_env->filtBuffer[k] >>= -sc_change;
   1546               }
   1547             }
   1548           } else {
   1549             scale_change += sc_change;
   1550           }
   1551 
   1552         } /* if */
   1553 
   1554         if (!useLP) {
   1555           /* Prevent the smoothing filter from running on constant levels */
   1556           if (j - start_pos < smooth_length)
   1557             smooth_ratio = FDK_sbrDecoder_sbr_smoothFilter[j - start_pos];
   1558           else
   1559             smooth_ratio = FL2FXCONST_SGL(0.0f);
   1560 
   1561           if (iTES_enable) {
   1562             /* adjustTimeSlotHQ() without adding of additional harmonics */
   1563             adjustTimeSlotHQ_GainAndNoise(
   1564                 &analysBufferReal[j][lowSubband],
   1565                 &analysBufferImag[j][lowSubband], h_sbr_cal_env, pNrgs,
   1566                 lowSubband, noSubbands, fMin(scale_change, DFRACT_BITS - 1),
   1567                 smooth_ratio, noNoiseFlag, filtBufferNoiseShift);
   1568           } else {
   1569             adjustTimeSlotHQ(&analysBufferReal[j][lowSubband],
   1570                              &analysBufferImag[j][lowSubband], h_sbr_cal_env,
   1571                              pNrgs, lowSubband, noSubbands,
   1572                              fMin(scale_change, DFRACT_BITS - 1), smooth_ratio,
   1573                              noNoiseFlag, filtBufferNoiseShift);
   1574           }
   1575         } else {
   1576           FDK_ASSERT(!iTES_enable); /* not supported */
   1577           if (flags & SBRDEC_ELD_GRID) {
   1578             /* FDKmemset(analysBufferReal[j], 0, 64 * sizeof(FIXP_DBL)); */
   1579             adjustTimeSlot_EldGrid(&analysBufferReal[j][lowSubband], pNrgs,
   1580                                    &h_sbr_cal_env->harmIndex, lowSubband,
   1581                                    noSubbands,
   1582                                    fMin(scale_change, DFRACT_BITS - 1),
   1583                                    noNoiseFlag, &h_sbr_cal_env->phaseIndex,
   1584                                    EXP2SCALE(adj_e) - sbrScaleFactor->lb_scale);
   1585           } else {
   1586             adjustTimeSlotLC(&analysBufferReal[j][lowSubband], pNrgs,
   1587                              &h_sbr_cal_env->harmIndex, lowSubband, noSubbands,
   1588                              fMin(scale_change, DFRACT_BITS - 1), noNoiseFlag,
   1589                              &h_sbr_cal_env->phaseIndex);
   1590           }
   1591         }
   1592         /* In case the envelope spans accross the no_cols border both exponents
   1593          * are needed. */
   1594         /* nrgGain_e[0...(noSubbands-1)] are equalized by
   1595          * equalizeFiltBufferExp() */
   1596         pNrgs->exponent[(j < no_cols) ? 0 : 1] =
   1597             (SCHAR)((15 - sbrScaleFactor->hb_scale) + pNrgs->nrgGain_e[0] + 1 -
   1598                     scale_change);
   1599       } /* for */
   1600 
   1601       if (iTES_enable) {
   1602         apply_inter_tes(
   1603             analysBufferReal, /* pABufR, */
   1604             analysBufferImag, /* pABufI, */
   1605             sbrScaleFactor, pNrgs->exponent, hHeaderData->timeStep, start_pos,
   1606             stop_pos, lowSubband, noSubbands,
   1607             hFrameData
   1608                 ->interTempShapeMode[i] /* frameData->interTempShapeMode[env] */
   1609         );
   1610 
   1611         /* add additional harmonics */
   1612         for (j = start_pos; j < stop_pos; j++) {
   1613           /* match exponent of additional harmonics to scale change of QMF data
   1614            * caused by apply_inter_tes() */
   1615           scale_change = 0;
   1616 
   1617           if ((start_pos <= no_cols) && (stop_pos > no_cols)) {
   1618             /* Scaling of analysBuffers was potentially changed within this
   1619                envelope. The pNrgs->nrgSine_e match the second part of the
   1620                envelope. For (j<=no_cols) the exponent of the sine energies has
   1621                to be adapted. */
   1622             scale_change = pNrgs->exponent[1] - pNrgs->exponent[0];
   1623           }
   1624 
   1625           adjustTimeSlotHQ_AddHarmonics(
   1626               &analysBufferReal[j][lowSubband],
   1627               &analysBufferImag[j][lowSubband], h_sbr_cal_env, pNrgs,
   1628               lowSubband, noSubbands,
   1629               -iTES_scale_change + ((j < no_cols) ? scale_change : 0));
   1630         }
   1631       }
   1632 
   1633       if (!useLP) {
   1634         /* Update time-smoothing-buffers for gains and noise levels
   1635            The gains and the noise values of the current envelope are copied
   1636            into the buffer. This has to be done at the end of each envelope as
   1637            the values are required for a smooth transition to the next envelope.
   1638          */
   1639         FDKmemcpy(h_sbr_cal_env->filtBuffer, pNrgs->nrgGain,
   1640                   noSubbands * sizeof(FIXP_DBL));
   1641         FDKmemcpy(h_sbr_cal_env->filtBuffer_e, pNrgs->nrgGain_e,
   1642                   noSubbands * sizeof(SCHAR));
   1643         FDKmemcpy(h_sbr_cal_env->filtBufferNoise, pNrgs->noiseLevel,
   1644                   noSubbands * sizeof(FIXP_DBL));
   1645       }
   1646     }
   1647     C_ALLOC_SCRATCH_END(pNrgs, ENV_CALC_NRGS, 1);
   1648   }
   1649 
   1650   /* adapt adj_e to the scale change caused by apply_inter_tes() */
   1651   adj_e += iTES_scale_change;
   1652 
   1653   /* Rescale output samples */
   1654   {
   1655     FIXP_DBL maxVal;
   1656     int ov_reserve, reserve;
   1657 
   1658     /* Determine headroom in old adjusted samples */
   1659     maxVal =
   1660         maxSubbandSample(analysBufferReal, (useLP) ? NULL : analysBufferImag,
   1661                          lowSubband, ov_highSubband, 0, first_start);
   1662 
   1663     ov_reserve = fNorm(maxVal);
   1664 
   1665     /* Determine headroom in new adjusted samples */
   1666     maxVal =
   1667         maxSubbandSample(analysBufferReal, (useLP) ? NULL : analysBufferImag,
   1668                          lowSubband, highSubband, first_start, no_cols);
   1669 
   1670     reserve = fNorm(maxVal);
   1671 
   1672     /* Determine common output exponent */
   1673     output_e = fMax(ov_adj_e - ov_reserve, adj_e - reserve);
   1674 
   1675     /* Rescale old samples */
   1676     rescaleSubbandSamples(analysBufferReal, (useLP) ? NULL : analysBufferImag,
   1677                           lowSubband, ov_highSubband, 0, first_start,
   1678                           ov_adj_e - output_e);
   1679 
   1680     /* Rescale new samples */
   1681     rescaleSubbandSamples(analysBufferReal, (useLP) ? NULL : analysBufferImag,
   1682                           lowSubband, highSubband, first_start, no_cols,
   1683                           adj_e - output_e);
   1684   }
   1685 
   1686   /* Update hb_scale */
   1687   sbrScaleFactor->hb_scale = EXP2SCALE(output_e);
   1688 
   1689   /* Save the current final exponent for the next frame: */
   1690   /* adapt final_e to the scale change caused by apply_inter_tes() */
   1691   sbrScaleFactor->ov_hb_scale = EXP2SCALE(final_e + iTES_scale_change);
   1692 
   1693   /* We need to remember to the next frame that the transient
   1694      will occur in the first envelope (if tranEnv == nEnvelopes). */
   1695   if (hFrameData->frameInfo.tranEnv == hFrameData->frameInfo.nEnvelopes)
   1696     h_sbr_cal_env->prevTranEnv = 0;
   1697   else
   1698     h_sbr_cal_env->prevTranEnv = -1;
   1699 
   1700   if (pvc_mode > 0) {
   1701     /* Not more than just the last noise envelope reaches into the next PVC
   1702        frame! This should be true because bs_noise_position is <= 15 */
   1703     FDK_ASSERT(hFrameData->frameInfo
   1704                    .bordersNoise[hFrameData->frameInfo.nNoiseEnvelopes - 1] <
   1705                PVC_NTIMESLOT);
   1706     if (hFrameData->frameInfo
   1707             .bordersNoise[hFrameData->frameInfo.nNoiseEnvelopes] >
   1708         PVC_NTIMESLOT) {
   1709       FDK_ASSERT(noiseLevels ==
   1710                  (hFrameData->sbrNoiseFloorLevel +
   1711                   (hFrameData->frameInfo.nNoiseEnvelopes - 1) * noNoiseBands));
   1712       h_sbr_cal_env->prevNNfb = noNoiseBands;
   1713 
   1714       h_sbr_cal_env->prevNSfb[0] = noSubFrameBands[0];
   1715       h_sbr_cal_env->prevNSfb[1] = noSubFrameBands[1];
   1716 
   1717       h_sbr_cal_env->prevLoSubband = lowSubband;
   1718       h_sbr_cal_env->prevHiSubband = highSubband;
   1719       h_sbr_cal_env->prev_ov_highSubband = ov_highSubband;
   1720 
   1721       FDKmemcpy(h_sbr_cal_env->prevFreqBandTableLo, pFreqBandTable[0],
   1722                 noSubFrameBands[0] + 1);
   1723       FDKmemcpy(h_sbr_cal_env->prevFreqBandTableHi, pFreqBandTable[1],
   1724                 noSubFrameBands[1] + 1);
   1725       FDKmemcpy(h_sbr_cal_env->prevFreqBandTableNoise,
   1726                 hFreq->freqBandTableNoise, sizeof(hFreq->freqBandTableNoise));
   1727 
   1728       FDKmemcpy(h_sbr_cal_env->prevSbrNoiseFloorLevel, noiseLevels,
   1729                 MAX_NOISE_COEFFS * sizeof(FIXP_SGL));
   1730     }
   1731   }
   1732 
   1733   C_ALLOC_SCRATCH_END(useAliasReduction, UCHAR, 64)
   1734 }
   1735 
   1736 /*!
   1737   \brief   Create envelope instance
   1738 
   1739   Must be called once for each channel before calculateSbrEnvelope() can be
   1740   used.
   1741 
   1742   \return  errorCode, 0 if successful
   1743 */
   1744 SBR_ERROR
   1745 createSbrEnvelopeCalc(
   1746     HANDLE_SBR_CALCULATE_ENVELOPE hs, /*!< pointer to envelope instance */
   1747     HANDLE_SBR_HEADER_DATA
   1748         hHeaderData, /*!< static SBR control data, initialized with defaults */
   1749     const int chan,  /*!< Channel for which to assign buffers */
   1750     const UINT flags) {
   1751   SBR_ERROR err = SBRDEC_OK;
   1752   int i;
   1753 
   1754   /* Clear previous missing harmonics flags */
   1755   for (i = 0; i < ADD_HARMONICS_FLAGS_SIZE; i++) {
   1756     hs->harmFlagsPrev[i] = 0;
   1757     hs->harmFlagsPrevActive[i] = 0;
   1758   }
   1759   hs->harmIndex = 0;
   1760 
   1761   FDKmemclear(hs->prevSbrNoiseFloorLevel, sizeof(hs->prevSbrNoiseFloorLevel));
   1762   hs->prevNNfb = 0;
   1763   FDKmemclear(hs->prevFreqBandTableNoise, sizeof(hs->prevFreqBandTableNoise));
   1764   hs->sinusoidal_positionPrev = 0;
   1765 
   1766   /*
   1767     Setup pointers for time smoothing.
   1768     The buffer itself will be initialized later triggered by the startUp-flag.
   1769   */
   1770   hs->prevTranEnv = -1;
   1771 
   1772   /* initialization */
   1773   resetSbrEnvelopeCalc(hs);
   1774 
   1775   if (chan == 0) { /* do this only once */
   1776     err = resetFreqBandTables(hHeaderData, flags);
   1777   }
   1778 
   1779   return err;
   1780 }
   1781 
   1782 /*!
   1783   \brief   Create envelope instance
   1784 
   1785   Must be called once for each channel before calculateSbrEnvelope() can be
   1786   used.
   1787 
   1788   \return  errorCode, 0 if successful
   1789 */
   1790 int deleteSbrEnvelopeCalc(HANDLE_SBR_CALCULATE_ENVELOPE hs) { return 0; }
   1791 
   1792 /*!
   1793   \brief   Reset envelope instance
   1794 
   1795   This function must be called for each channel on a change of configuration.
   1796   Note that resetFreqBandTables should also be called in this case.
   1797 
   1798   \return  errorCode, 0 if successful
   1799 */
   1800 void resetSbrEnvelopeCalc(
   1801     HANDLE_SBR_CALCULATE_ENVELOPE hCalEnv) /*!< pointer to envelope instance */
   1802 {
   1803   hCalEnv->phaseIndex = 0;
   1804 
   1805   /* Noise exponent needs to be reset because the output exponent for the next
   1806    * frame depends on it */
   1807   hCalEnv->filtBufferNoise_e = 0;
   1808 
   1809   hCalEnv->startUp = 1;
   1810 }
   1811 
   1812 /*!
   1813   \brief  Equalize exponents of the buffered gain values and the new ones
   1814 
   1815   After equalization of exponents, the FIR-filter addition for smoothing
   1816   can be performed.
   1817   This function is called once for each envelope before adjusting.
   1818 */
   1819 static void equalizeFiltBufferExp(
   1820     FIXP_DBL *filtBuffer, /*!< bufferd gains */
   1821     SCHAR *filtBuffer_e,  /*!< exponents of bufferd gains */
   1822     FIXP_DBL *nrgGain,    /*!< gains for current envelope */
   1823     SCHAR *nrgGain_e,     /*!< exponents of gains for current envelope */
   1824     int subbands)         /*!< Number of QMF subbands */
   1825 {
   1826   int band;
   1827   int diff;
   1828 
   1829   for (band = 0; band < subbands; band++) {
   1830     diff = (int)(nrgGain_e[band] - filtBuffer_e[band]);
   1831     if (diff > 0) {
   1832       filtBuffer[band] >>=
   1833           diff; /* Compensate for the scale change by shifting the mantissa. */
   1834       filtBuffer_e[band] += diff; /* New gain is bigger, use its exponent */
   1835     } else if (diff < 0) {
   1836       /* The buffered gains seem to be larger, but maybe there
   1837          are some unused bits left in the mantissa */
   1838 
   1839       int reserve = CntLeadingZeros(fixp_abs(filtBuffer[band])) - 1;
   1840 
   1841       if ((-diff) <= reserve) {
   1842         /* There is enough space in the buffered mantissa so
   1843            that we can take the new exponent as common.
   1844         */
   1845         filtBuffer[band] <<= (-diff);
   1846         filtBuffer_e[band] += diff; /* becomes equal to *ptrNewExp */
   1847       } else {
   1848         filtBuffer[band] <<=
   1849             reserve; /* Shift the mantissa as far as possible: */
   1850         filtBuffer_e[band] -= reserve; /* Compensate in the exponent: */
   1851 
   1852         /* For the remaining difference, change the new gain value */
   1853         diff = fixMin(-(reserve + diff), DFRACT_BITS - 1);
   1854         nrgGain[band] >>= diff;
   1855         nrgGain_e[band] += diff;
   1856       }
   1857     }
   1858   }
   1859 }
   1860 
   1861 /*!
   1862   \brief  Shift left the mantissas of all subband samples
   1863           in the giventime and frequency range by the specified number of bits.
   1864 
   1865   This function is used to rescale the audio data in the overlap buffer
   1866   which has already been envelope adjusted with the last frame.
   1867 */
   1868 void rescaleSubbandSamples(
   1869     FIXP_DBL **re,   /*!< Real part of input and output subband samples */
   1870     FIXP_DBL **im,   /*!< Imaginary part of input and output subband samples */
   1871     int lowSubband,  /*!< Begin of frequency range to process */
   1872     int highSubband, /*!< End of frequency range to process */
   1873     int start_pos,   /*!< Begin of time rage (QMF-timeslot) */
   1874     int next_pos,    /*!< End of time rage (QMF-timeslot) */
   1875     int shift)       /*!< number of bits to shift */
   1876 {
   1877   int width = highSubband - lowSubband;
   1878 
   1879   if ((width > 0) && (shift != 0)) {
   1880     if (im != NULL) {
   1881       for (int l = start_pos; l < next_pos; l++) {
   1882         scaleValues(&re[l][lowSubband], width, shift);
   1883         scaleValues(&im[l][lowSubband], width, shift);
   1884       }
   1885     } else {
   1886       for (int l = start_pos; l < next_pos; l++) {
   1887         scaleValues(&re[l][lowSubband], width, shift);
   1888       }
   1889     }
   1890   }
   1891 }
   1892 
   1893 static inline FIXP_DBL FDK_get_maxval_real(FIXP_DBL maxVal, FIXP_DBL *reTmp,
   1894                                            INT width) {
   1895   maxVal = (FIXP_DBL)0;
   1896   while (width-- != 0) {
   1897     FIXP_DBL tmp = *(reTmp++);
   1898     maxVal |= (FIXP_DBL)((LONG)(tmp) ^ ((LONG)tmp >> (DFRACT_BITS - 1)));
   1899   }
   1900 
   1901   return maxVal;
   1902 }
   1903 
   1904 /*!
   1905   \brief   Determine headroom for shifting
   1906 
   1907   Determine by how much the spectrum can be shifted left
   1908   for better accuracy in later processing.
   1909 
   1910   \return  Number of free bits in the biggest spectral value
   1911 */
   1912 
   1913 FIXP_DBL maxSubbandSample(
   1914     FIXP_DBL **re,   /*!< Real part of input and output subband samples */
   1915     FIXP_DBL **im,   /*!< Real part of input and output subband samples */
   1916     int lowSubband,  /*!< Begin of frequency range to process */
   1917     int highSubband, /*!< Number of QMF bands to process */
   1918     int start_pos,   /*!< Begin of time rage (QMF-timeslot) */
   1919     int next_pos     /*!< End of time rage (QMF-timeslot) */
   1920 ) {
   1921   FIXP_DBL maxVal = FL2FX_DBL(0.0f);
   1922   unsigned int width = highSubband - lowSubband;
   1923 
   1924   FDK_ASSERT(width <= (64));
   1925 
   1926   if (width > 0) {
   1927     if (im != NULL) {
   1928       for (int l = start_pos; l < next_pos; l++) {
   1929         int k = width;
   1930         FIXP_DBL *reTmp = &re[l][lowSubband];
   1931         FIXP_DBL *imTmp = &im[l][lowSubband];
   1932         do {
   1933           FIXP_DBL tmp1 = *(reTmp++);
   1934           FIXP_DBL tmp2 = *(imTmp++);
   1935           maxVal |=
   1936               (FIXP_DBL)((LONG)(tmp1) ^ ((LONG)tmp1 >> (DFRACT_BITS - 1)));
   1937           maxVal |=
   1938               (FIXP_DBL)((LONG)(tmp2) ^ ((LONG)tmp2 >> (DFRACT_BITS - 1)));
   1939         } while (--k != 0);
   1940       }
   1941     } else {
   1942       for (int l = start_pos; l < next_pos; l++) {
   1943         maxVal |= FDK_get_maxval_real(maxVal, &re[l][lowSubband], width);
   1944       }
   1945     }
   1946   }
   1947 
   1948   if (maxVal > (FIXP_DBL)0) {
   1949     /* For negative input values, maxVal is too small by 1. Add 1 only when
   1950      * necessary: if maxVal is a power of 2 */
   1951     FIXP_DBL lowerPow2 =
   1952         (FIXP_DBL)(1 << (DFRACT_BITS - 1 - CntLeadingZeros(maxVal)));
   1953     if (maxVal == lowerPow2) maxVal += (FIXP_DBL)1;
   1954   }
   1955 
   1956   return (maxVal);
   1957 }
   1958 
   1959 /* #define SHIFT_BEFORE_SQUARE (3) */ /* (7/2) */
   1960 /* Avoid assertion failures triggerd by overflows which occured in robustness
   1961    tests. Setting the SHIFT_BEFORE_SQUARE to 4 has negligible effect on (USAC)
   1962    conformance results. */
   1963 #define SHIFT_BEFORE_SQUARE (4) /* ((8 - 0) / 2) */
   1964 
   1965 /*!<
   1966   If the accumulator does not provide enough overflow bits or
   1967   does not provide a high dynamic range, the below energy calculation
   1968   requires an additional shift operation for each sample.
   1969   On the other hand, doing the shift allows using a single-precision
   1970   multiplication for the square (at least 16bit x 16bit).
   1971   For even values of OVRFLW_BITS (0, 2, 4, 6), saturated arithmetic
   1972   is required for the energy accumulation.
   1973   Theoretically, the sample-squares can sum up to a value of 76,
   1974   requiring 7 overflow bits. However since such situations are *very*
   1975   rare, accu can be limited to 64.
   1976   In case native saturated arithmetic is not available, overflows
   1977   can be prevented by replacing the above #define by
   1978     #define SHIFT_BEFORE_SQUARE ((8 - OVRFLW_BITS) / 2)
   1979   which will result in slightly reduced accuracy.
   1980 */
   1981 
   1982 /*!
   1983   \brief  Estimates the mean energy of each filter-bank channel for the
   1984           duration of the current envelope
   1985 
   1986   This function is used when interpolFreq is true.
   1987 */
   1988 static void calcNrgPerSubband(
   1989     FIXP_DBL **analysBufferReal, /*!< Real part of subband samples */
   1990     FIXP_DBL **analysBufferImag, /*!< Imaginary part of subband samples */
   1991     int lowSubband,              /*!< Begin of the SBR frequency range */
   1992     int highSubband,             /*!< High end of the SBR frequency range */
   1993     int start_pos,               /*!< First QMF-slot of current envelope */
   1994     int next_pos,                /*!< Last QMF-slot of current envelope + 1 */
   1995     SCHAR frameExp,              /*!< Common exponent for all input samples */
   1996     FIXP_DBL *nrgEst,            /*!< resulting Energy (0..1) */
   1997     SCHAR *nrgEst_e)             /*!< Exponent of resulting Energy */
   1998 {
   1999   FIXP_SGL invWidth;
   2000   SCHAR preShift;
   2001   SCHAR shift;
   2002   FIXP_DBL sum;
   2003   int k;
   2004 
   2005   /* Divide by width of envelope later: */
   2006   invWidth = FX_DBL2FX_SGL(GetInvInt(next_pos - start_pos));
   2007   /* The common exponent needs to be doubled because all mantissas are squared:
   2008    */
   2009   frameExp = frameExp << 1;
   2010 
   2011   for (k = lowSubband; k < highSubband; k++) {
   2012     FIXP_DBL bufferReal[(((1024) / (32) * (4) / 2) + (3 * (4)))];
   2013     FIXP_DBL bufferImag[(((1024) / (32) * (4) / 2) + (3 * (4)))];
   2014     FIXP_DBL maxVal;
   2015 
   2016     if (analysBufferImag != NULL) {
   2017       int l;
   2018       maxVal = FL2FX_DBL(0.0f);
   2019       for (l = start_pos; l < next_pos; l++) {
   2020         bufferImag[l] = analysBufferImag[l][k];
   2021         maxVal |= (FIXP_DBL)((LONG)(bufferImag[l]) ^
   2022                              ((LONG)bufferImag[l] >> (DFRACT_BITS - 1)));
   2023         bufferReal[l] = analysBufferReal[l][k];
   2024         maxVal |= (FIXP_DBL)((LONG)(bufferReal[l]) ^
   2025                              ((LONG)bufferReal[l] >> (DFRACT_BITS - 1)));
   2026       }
   2027     } else {
   2028       int l;
   2029       maxVal = FL2FX_DBL(0.0f);
   2030       for (l = start_pos; l < next_pos; l++) {
   2031         bufferReal[l] = analysBufferReal[l][k];
   2032         maxVal |= (FIXP_DBL)((LONG)(bufferReal[l]) ^
   2033                              ((LONG)bufferReal[l] >> (DFRACT_BITS - 1)));
   2034       }
   2035     }
   2036 
   2037     if (maxVal != FL2FXCONST_DBL(0.f)) {
   2038       /* If the accu does not provide enough overflow bits, we cannot
   2039          shift the samples up to the limit.
   2040          Instead, keep up to 3 free bits in each sample, i.e. up to
   2041          6 bits after calculation of square.
   2042          Please note the comment on saturated arithmetic above!
   2043       */
   2044       FIXP_DBL accu;
   2045       preShift = CntLeadingZeros(maxVal) - 1;
   2046       preShift -= SHIFT_BEFORE_SQUARE;
   2047 
   2048       /* Limit preShift to a maximum value to prevent accumulator overflow in
   2049          exceptional situations where the signal in the analysis-buffer is very
   2050          small (small maxVal).
   2051       */
   2052       preShift = fMin(preShift, (SCHAR)25);
   2053 
   2054       accu = FL2FXCONST_DBL(0.0f);
   2055       if (preShift >= 0) {
   2056         int l;
   2057         if (analysBufferImag != NULL) {
   2058           for (l = start_pos; l < next_pos; l++) {
   2059             FIXP_DBL temp1 = bufferReal[l] << (int)preShift;
   2060             FIXP_DBL temp2 = bufferImag[l] << (int)preShift;
   2061             accu = fPow2AddDiv2(accu, temp1);
   2062             accu = fPow2AddDiv2(accu, temp2);
   2063           }
   2064         } else {
   2065           for (l = start_pos; l < next_pos; l++) {
   2066             FIXP_DBL temp = bufferReal[l] << (int)preShift;
   2067             accu = fPow2AddDiv2(accu, temp);
   2068           }
   2069         }
   2070       } else { /* if negative shift value */
   2071         int l;
   2072         int negpreShift = -preShift;
   2073         if (analysBufferImag != NULL) {
   2074           for (l = start_pos; l < next_pos; l++) {
   2075             FIXP_DBL temp1 = bufferReal[l] >> (int)negpreShift;
   2076             FIXP_DBL temp2 = bufferImag[l] >> (int)negpreShift;
   2077             accu = fPow2AddDiv2(accu, temp1);
   2078             accu = fPow2AddDiv2(accu, temp2);
   2079           }
   2080         } else {
   2081           for (l = start_pos; l < next_pos; l++) {
   2082             FIXP_DBL temp = bufferReal[l] >> (int)negpreShift;
   2083             accu = fPow2AddDiv2(accu, temp);
   2084           }
   2085         }
   2086       }
   2087       accu <<= 1;
   2088 
   2089       /* Convert double precision to Mantissa/Exponent: */
   2090       shift = fNorm(accu);
   2091       sum = accu << (int)shift;
   2092 
   2093       /* Divide by width of envelope and apply frame scale: */
   2094       *nrgEst++ = fMult(sum, invWidth);
   2095       shift += 2 * preShift;
   2096       if (analysBufferImag != NULL)
   2097         *nrgEst_e++ = frameExp - shift;
   2098       else
   2099         *nrgEst_e++ = frameExp - shift + 1; /* +1 due to missing imag. part */
   2100     }                                       /* maxVal!=0 */
   2101     else {
   2102       /* Prevent a zero-mantissa-number from being misinterpreted
   2103          due to its exponent. */
   2104       *nrgEst++ = FL2FXCONST_DBL(0.0f);
   2105       *nrgEst_e++ = 0;
   2106     }
   2107   }
   2108 }
   2109 
   2110 /*!
   2111   \brief   Estimates the mean energy of each Scale factor band for the
   2112            duration of the current envelope.
   2113 
   2114   This function is used when interpolFreq is false.
   2115 */
   2116 static void calcNrgPerSfb(
   2117     FIXP_DBL **analysBufferReal, /*!< Real part of subband samples */
   2118     FIXP_DBL **analysBufferImag, /*!< Imaginary part of subband samples */
   2119     int nSfb,                    /*!< Number of scale factor bands */
   2120     UCHAR *freqBandTable,        /*!< First Subband for each Sfb */
   2121     int start_pos,               /*!< First QMF-slot of current envelope */
   2122     int next_pos,                /*!< Last QMF-slot of current envelope + 1 */
   2123     SCHAR input_e,               /*!< Common exponent for all input samples */
   2124     FIXP_DBL *nrgEst,            /*!< resulting Energy (0..1) */
   2125     SCHAR *nrgEst_e)             /*!< Exponent of resulting Energy */
   2126 {
   2127   FIXP_SGL invWidth;
   2128   FIXP_DBL temp;
   2129   SCHAR preShift;
   2130   SCHAR shift, sum_e;
   2131   FIXP_DBL sum;
   2132 
   2133   int j, k, l, li, ui;
   2134   FIXP_DBL sumAll, sumLine; /* Single precision would be sufficient,
   2135                              but overflow bits are required for accumulation */
   2136 
   2137   /* Divide by width of envelope later: */
   2138   invWidth = FX_DBL2FX_SGL(GetInvInt(next_pos - start_pos));
   2139   /* The common exponent needs to be doubled because all mantissas are squared:
   2140    */
   2141   input_e = input_e << 1;
   2142 
   2143   for (j = 0; j < nSfb; j++) {
   2144     li = freqBandTable[j];
   2145     ui = freqBandTable[j + 1];
   2146 
   2147     FIXP_DBL maxVal = maxSubbandSample(analysBufferReal, analysBufferImag, li,
   2148                                        ui, start_pos, next_pos);
   2149 
   2150     if (maxVal != FL2FXCONST_DBL(0.f)) {
   2151       preShift = CntLeadingZeros(maxVal) - 1;
   2152 
   2153       /* If the accu does not provide enough overflow bits, we cannot
   2154          shift the samples up to the limit.
   2155          Instead, keep up to 3 free bits in each sample, i.e. up to
   2156          6 bits after calculation of square.
   2157          Please note the comment on saturated arithmetic above!
   2158       */
   2159       preShift -= SHIFT_BEFORE_SQUARE;
   2160 
   2161       sumAll = FL2FXCONST_DBL(0.0f);
   2162 
   2163       for (k = li; k < ui; k++) {
   2164         sumLine = FL2FXCONST_DBL(0.0f);
   2165 
   2166         if (analysBufferImag != NULL) {
   2167           if (preShift >= 0) {
   2168             for (l = start_pos; l < next_pos; l++) {
   2169               temp = analysBufferReal[l][k] << (int)preShift;
   2170               sumLine += fPow2Div2(temp);
   2171               temp = analysBufferImag[l][k] << (int)preShift;
   2172               sumLine += fPow2Div2(temp);
   2173             }
   2174           } else {
   2175             for (l = start_pos; l < next_pos; l++) {
   2176               temp = analysBufferReal[l][k] >> -(int)preShift;
   2177               sumLine += fPow2Div2(temp);
   2178               temp = analysBufferImag[l][k] >> -(int)preShift;
   2179               sumLine += fPow2Div2(temp);
   2180             }
   2181           }
   2182         } else {
   2183           if (preShift >= 0) {
   2184             for (l = start_pos; l < next_pos; l++) {
   2185               temp = analysBufferReal[l][k] << (int)preShift;
   2186               sumLine += fPow2Div2(temp);
   2187             }
   2188           } else {
   2189             for (l = start_pos; l < next_pos; l++) {
   2190               temp = analysBufferReal[l][k] >> -(int)preShift;
   2191               sumLine += fPow2Div2(temp);
   2192             }
   2193           }
   2194         }
   2195 
   2196         /* The number of QMF-channels per SBR bands may be up to 15.
   2197            Shift right to avoid overflows in sum over all channels. */
   2198         sumLine = sumLine >> (4 - 1);
   2199         sumAll += sumLine;
   2200       }
   2201 
   2202       /* Convert double precision to Mantissa/Exponent: */
   2203       shift = fNorm(sumAll);
   2204       sum = sumAll << (int)shift;
   2205 
   2206       /* Divide by width of envelope: */
   2207       sum = fMult(sum, invWidth);
   2208 
   2209       /* Divide by width of Sfb: */
   2210       sum = fMult(sum, FX_DBL2FX_SGL(GetInvInt(ui - li)));
   2211 
   2212       /* Set all Subband energies in the Sfb to the average energy: */
   2213       if (analysBufferImag != NULL)
   2214         sum_e = input_e + 4 - shift; /* -4 to compensate right-shift */
   2215       else
   2216         sum_e = input_e + 4 + 1 -
   2217                 shift; /* -4 to compensate right-shift; +1 due to missing
   2218                           imag. part */
   2219 
   2220       sum_e -= 2 * preShift;
   2221     } /* maxVal!=0 */
   2222     else {
   2223       /* Prevent a zero-mantissa-number from being misinterpreted
   2224          due to its exponent. */
   2225       sum = FL2FXCONST_DBL(0.0f);
   2226       sum_e = 0;
   2227     }
   2228 
   2229     for (k = li; k < ui; k++) {
   2230       *nrgEst++ = sum;
   2231       *nrgEst_e++ = sum_e;
   2232     }
   2233   }
   2234 }
   2235 
   2236 /*!
   2237   \brief  Calculate gain, noise, and additional sine level for one subband.
   2238 
   2239   The resulting energy gain is given by mantissa and exponent.
   2240 */
   2241 static void calcSubbandGain(
   2242     FIXP_DBL nrgRef, /*!< Reference Energy according to envelope data */
   2243     SCHAR
   2244         nrgRef_e, /*!< Reference Energy according to envelope data (exponent) */
   2245     ENV_CALC_NRGS *nrgs, int i, FIXP_DBL tmpNoise, /*!< Relative noise level */
   2246     SCHAR tmpNoise_e,      /*!< Relative noise level (exponent) */
   2247     UCHAR sinePresentFlag, /*!< Indicates if sine is present on band */
   2248     UCHAR sineMapped,      /*!< Indicates if sine must be added */
   2249     int noNoiseFlag)       /*!< Flag to suppress noise addition */
   2250 {
   2251   FIXP_DBL nrgEst = nrgs->nrgEst[i]; /*!< Energy in transposed signal */
   2252   SCHAR nrgEst_e =
   2253       nrgs->nrgEst_e[i]; /*!< Energy in transposed signal (exponent) */
   2254   FIXP_DBL *ptrNrgGain = &nrgs->nrgGain[i]; /*!< Resulting energy gain */
   2255   SCHAR *ptrNrgGain_e =
   2256       &nrgs->nrgGain_e[i]; /*!< Resulting energy gain (exponent) */
   2257   FIXP_DBL *ptrNoiseLevel =
   2258       &nrgs->noiseLevel[i]; /*!< Resulting absolute noise energy */
   2259   SCHAR *ptrNoiseLevel_e =
   2260       &nrgs->noiseLevel_e[i]; /*!< Resulting absolute noise energy (exponent) */
   2261   FIXP_DBL *ptrNrgSine = &nrgs->nrgSine[i]; /*!< Additional sine energy */
   2262   SCHAR *ptrNrgSine_e =
   2263       &nrgs->nrgSine_e[i]; /*!< Additional sine energy (exponent) */
   2264 
   2265   FIXP_DBL a, b, c;
   2266   SCHAR a_e, b_e, c_e;
   2267 
   2268   /*
   2269      This addition of 1 prevents divisions by zero in the reference code.
   2270      For very small energies in nrgEst, it prevents the gains from becoming
   2271      very high which could cause some trouble due to the smoothing.
   2272   */
   2273   b_e = (int)(nrgEst_e - 1);
   2274   if (b_e >= 0) {
   2275     nrgEst = (FL2FXCONST_DBL(0.5f) >> (INT)fixMin(b_e + 1, DFRACT_BITS - 1)) +
   2276              (nrgEst >> 1);
   2277     nrgEst_e += 1; /* shift by 1 bit to avoid overflow */
   2278 
   2279   } else {
   2280     nrgEst = (nrgEst >> (INT)(fixMin(-b_e + 1, DFRACT_BITS - 1))) +
   2281              (FL2FXCONST_DBL(0.5f) >> 1);
   2282     nrgEst_e = 2; /* shift by 1 bit to avoid overflow */
   2283   }
   2284 
   2285   /*  A = NrgRef * TmpNoise */
   2286   a = fMult(nrgRef, tmpNoise);
   2287   a_e = nrgRef_e + tmpNoise_e;
   2288 
   2289   /*  B = 1 + TmpNoise */
   2290   b_e = (int)(tmpNoise_e - 1);
   2291   if (b_e >= 0) {
   2292     b = (FL2FXCONST_DBL(0.5f) >> (INT)fixMin(b_e + 1, DFRACT_BITS - 1)) +
   2293         (tmpNoise >> 1);
   2294     b_e = tmpNoise_e + 1; /* shift by 1 bit to avoid overflow */
   2295   } else {
   2296     b = (tmpNoise >> (INT)(fixMin(-b_e + 1, DFRACT_BITS - 1))) +
   2297         (FL2FXCONST_DBL(0.5f) >> 1);
   2298     b_e = 2; /* shift by 1 bit to avoid overflow */
   2299   }
   2300 
   2301   /*  noiseLevel = A / B = (NrgRef * TmpNoise) / (1 + TmpNoise) */
   2302   FDK_divide_MantExp(a, a_e, b, b_e, ptrNoiseLevel, ptrNoiseLevel_e);
   2303 
   2304   if (sinePresentFlag) {
   2305     /*  C = (1 + TmpNoise) * NrgEst */
   2306     c = fMult(b, nrgEst);
   2307     c_e = b_e + nrgEst_e;
   2308 
   2309     /*  gain = A / C = (NrgRef * TmpNoise) / (1 + TmpNoise) * NrgEst */
   2310     FDK_divide_MantExp(a, a_e, c, c_e, ptrNrgGain, ptrNrgGain_e);
   2311 
   2312     if (sineMapped) {
   2313       /*  sineLevel = nrgRef/ (1 + TmpNoise) */
   2314       FDK_divide_MantExp(nrgRef, nrgRef_e, b, b_e, ptrNrgSine, ptrNrgSine_e);
   2315     }
   2316   } else {
   2317     if (noNoiseFlag) {
   2318       /*  B = NrgEst */
   2319       b = nrgEst;
   2320       b_e = nrgEst_e;
   2321     } else {
   2322       /*  B = NrgEst * (1 + TmpNoise) */
   2323       b = fMult(b, nrgEst);
   2324       b_e = b_e + nrgEst_e;
   2325     }
   2326 
   2327     /*  gain = nrgRef / B */
   2328     INT result_exp = 0;
   2329     *ptrNrgGain = fDivNorm(nrgRef, b, &result_exp);
   2330     *ptrNrgGain_e = (SCHAR)result_exp + (nrgRef_e - b_e);
   2331 
   2332     /* There could be a one bit diffs. This is important to compensate,
   2333        because later in the code values are compared by exponent only. */
   2334     int headroom = CountLeadingBits(*ptrNrgGain);
   2335     *ptrNrgGain <<= headroom;
   2336     *ptrNrgGain_e -= headroom;
   2337   }
   2338 }
   2339 
   2340 /*!
   2341   \brief  Calculate "average gain" for the specified subband range.
   2342 
   2343   This is rather a gain of the average magnitude than the average
   2344   of gains!
   2345   The result is used as a relative limit for all gains within the
   2346   current "limiter band" (a certain frequency range).
   2347 */
   2348 static void calcAvgGain(
   2349     ENV_CALC_NRGS *nrgs, int lowSubband, /*!< Begin of the limiter band */
   2350     int highSubband,                     /*!< High end of the limiter band */
   2351     FIXP_DBL *ptrSumRef, SCHAR *ptrSumRef_e,
   2352     FIXP_DBL *ptrAvgGain, /*!< Resulting overall gain (mantissa) */
   2353     SCHAR *ptrAvgGain_e)  /*!< Resulting overall gain (exponent) */
   2354 {
   2355   FIXP_DBL *nrgRef =
   2356       nrgs->nrgRef; /*!< Reference Energy according to envelope data */
   2357   SCHAR *nrgRef_e =
   2358       nrgs->nrgRef_e; /*!< Reference Energy according to envelope data
   2359                          (exponent) */
   2360   FIXP_DBL *nrgEst = nrgs->nrgEst; /*!< Energy in transposed signal */
   2361   SCHAR *nrgEst_e =
   2362       nrgs->nrgEst_e; /*!< Energy in transposed signal (exponent) */
   2363 
   2364   FIXP_DBL sumRef = 1;
   2365   FIXP_DBL sumEst = 1;
   2366   SCHAR sumRef_e = -FRACT_BITS;
   2367   SCHAR sumEst_e = -FRACT_BITS;
   2368   int k;
   2369 
   2370   for (k = lowSubband; k < highSubband; k++) {
   2371     /* Add nrgRef[k] to sumRef: */
   2372     FDK_add_MantExp(sumRef, sumRef_e, nrgRef[k], nrgRef_e[k], &sumRef,
   2373                     &sumRef_e);
   2374 
   2375     /* Add nrgEst[k] to sumEst: */
   2376     FDK_add_MantExp(sumEst, sumEst_e, nrgEst[k], nrgEst_e[k], &sumEst,
   2377                     &sumEst_e);
   2378   }
   2379 
   2380   FDK_divide_MantExp(sumRef, sumRef_e, sumEst, sumEst_e, ptrAvgGain,
   2381                      ptrAvgGain_e);
   2382 
   2383   *ptrSumRef = sumRef;
   2384   *ptrSumRef_e = sumRef_e;
   2385 }
   2386 
   2387 static void adjustTimeSlot_EldGrid(
   2388     FIXP_DBL *RESTRICT
   2389         ptrReal, /*!< Subband samples to be adjusted, real part */
   2390     ENV_CALC_NRGS *nrgs, UCHAR *ptrHarmIndex, /*!< Harmonic index */
   2391     int lowSubband, /*!< Lowest QMF-channel in the currently used SBR range. */
   2392     int noSubbands, /*!< Number of QMF subbands */
   2393     int scale_change,   /*!< Number of bits to shift adjusted samples */
   2394     int noNoiseFlag,    /*!< Flag to suppress noise addition */
   2395     int *ptrPhaseIndex, /*!< Start index to random number array */
   2396     int scale_diff_low) /*!<  */
   2397 
   2398 {
   2399   int k;
   2400   FIXP_DBL signalReal, sbNoise;
   2401   int tone_count = 0;
   2402 
   2403   FIXP_DBL *pGain = nrgs->nrgGain; /*!< Gains of current envelope */
   2404   FIXP_DBL *RESTRICT pNoiseLevel =
   2405       nrgs->noiseLevel; /*!< Noise levels of current envelope */
   2406   FIXP_DBL *RESTRICT pSineLevel = nrgs->nrgSine; /*!< Sine levels */
   2407 
   2408   int phaseIndex = *ptrPhaseIndex;
   2409   UCHAR harmIndex = *ptrHarmIndex;
   2410 
   2411   static const INT harmonicPhase[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
   2412 
   2413   static const FIXP_DBL harmonicPhaseX[4][2] = {
   2414       {FL2FXCONST_DBL(2.0 * 1.245183154539139e-001),
   2415        FL2FXCONST_DBL(2.0 * 1.245183154539139e-001)},
   2416       {FL2FXCONST_DBL(2.0 * -1.123767859325028e-001),
   2417        FL2FXCONST_DBL(2.0 * 1.123767859325028e-001)},
   2418       {FL2FXCONST_DBL(2.0 * -1.245183154539139e-001),
   2419        FL2FXCONST_DBL(2.0 * -1.245183154539139e-001)},
   2420       {FL2FXCONST_DBL(2.0 * 1.123767859325028e-001),
   2421        FL2FXCONST_DBL(2.0 * -1.123767859325028e-001)}};
   2422 
   2423   const FIXP_DBL *p_harmonicPhaseX = &harmonicPhaseX[harmIndex][0];
   2424   const INT *p_harmonicPhase = &harmonicPhase[harmIndex][0];
   2425 
   2426   *(ptrReal - 1) = fAddSaturate(
   2427       *(ptrReal - 1),
   2428       SATURATE_SHIFT(fMultDiv2(p_harmonicPhaseX[lowSubband & 1], pSineLevel[0]),
   2429                      scale_diff_low, DFRACT_BITS));
   2430   FIXP_DBL pSineLevel_prev = (FIXP_DBL)0;
   2431 
   2432   int idx_k = lowSubband & 1;
   2433 
   2434   for (k = 0; k < noSubbands; k++) {
   2435     FIXP_DBL sineLevel_curr = *pSineLevel++;
   2436     phaseIndex = (phaseIndex + 1) & (SBR_NF_NO_RANDOM_VAL - 1);
   2437 
   2438     signalReal = fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change);
   2439     sbNoise = *pNoiseLevel++;
   2440     if (((INT)sineLevel_curr | noNoiseFlag) == 0) {
   2441       signalReal +=
   2442           fMult(FDK_sbrDecoder_sbr_randomPhase[phaseIndex][0], sbNoise);
   2443     }
   2444     signalReal += sineLevel_curr * p_harmonicPhase[0];
   2445     signalReal =
   2446         fMultAddDiv2(signalReal, pSineLevel_prev, p_harmonicPhaseX[idx_k]);
   2447     pSineLevel_prev = sineLevel_curr;
   2448     idx_k = !idx_k;
   2449     if (k < noSubbands - 1) {
   2450       signalReal =
   2451           fMultAddDiv2(signalReal, pSineLevel[0], p_harmonicPhaseX[idx_k]);
   2452     } else /* (k == noSubbands - 1)  */
   2453     {
   2454       if (k + lowSubband + 1 < 63) {
   2455         *(ptrReal + 1) += fMultDiv2(pSineLevel_prev, p_harmonicPhaseX[idx_k]);
   2456       }
   2457     }
   2458     *ptrReal++ = signalReal;
   2459 
   2460     if (pSineLevel_prev != FL2FXCONST_DBL(0.0f)) {
   2461       if (++tone_count == 16) {
   2462         k++;
   2463         break;
   2464       }
   2465     }
   2466   }
   2467   /* Run again, if previous loop got breaked with tone_count = 16 */
   2468   for (; k < noSubbands; k++) {
   2469     FIXP_DBL sineLevel_curr = *pSineLevel++;
   2470     phaseIndex = (phaseIndex + 1) & (SBR_NF_NO_RANDOM_VAL - 1);
   2471 
   2472     signalReal = fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change);
   2473     sbNoise = *pNoiseLevel++;
   2474     if (((INT)sineLevel_curr | noNoiseFlag) == 0) {
   2475       signalReal +=
   2476           fMult(FDK_sbrDecoder_sbr_randomPhase[phaseIndex][0], sbNoise);
   2477     }
   2478     signalReal += sineLevel_curr * p_harmonicPhase[0];
   2479     *ptrReal++ = signalReal;
   2480   }
   2481 
   2482   *ptrHarmIndex = (harmIndex + 1) & 3;
   2483   *ptrPhaseIndex = phaseIndex & (SBR_NF_NO_RANDOM_VAL - 1);
   2484 }
   2485 
   2486 /*!
   2487   \brief   Amplify one timeslot of the signal with the calculated gains
   2488            and add the noisefloor.
   2489 */
   2490 
   2491 static void adjustTimeSlotLC(
   2492     FIXP_DBL *ptrReal, /*!< Subband samples to be adjusted, real part */
   2493     ENV_CALC_NRGS *nrgs, UCHAR *ptrHarmIndex, /*!< Harmonic index */
   2494     int lowSubband, /*!< Lowest QMF-channel in the currently used SBR range. */
   2495     int noSubbands, /*!< Number of QMF subbands */
   2496     int scale_change,   /*!< Number of bits to shift adjusted samples */
   2497     int noNoiseFlag,    /*!< Flag to suppress noise addition */
   2498     int *ptrPhaseIndex) /*!< Start index to random number array */
   2499 {
   2500   FIXP_DBL *pGain = nrgs->nrgGain; /*!< Gains of current envelope */
   2501   FIXP_DBL *pNoiseLevel =
   2502       nrgs->noiseLevel;                 /*!< Noise levels of current envelope */
   2503   FIXP_DBL *pSineLevel = nrgs->nrgSine; /*!< Sine levels */
   2504 
   2505   int k;
   2506   int index = *ptrPhaseIndex;
   2507   UCHAR harmIndex = *ptrHarmIndex;
   2508   UCHAR freqInvFlag = (lowSubband & 1);
   2509   FIXP_DBL signalReal, sineLevel, sineLevelNext, sineLevelPrev;
   2510   int tone_count = 0;
   2511   int sineSign = 1;
   2512 
   2513 #define C1 ((FIXP_SGL)FL2FXCONST_SGL(2.f * 0.00815f))
   2514 #define C1_CLDFB ((FIXP_SGL)FL2FXCONST_SGL(2.f * 0.16773f))
   2515 
   2516   /*
   2517     First pass for k=0 pulled out of the loop:
   2518   */
   2519 
   2520   index = (index + 1) & (SBR_NF_NO_RANDOM_VAL - 1);
   2521 
   2522   /*
   2523     The next multiplication constitutes the actual envelope adjustment
   2524     of the signal and should be carried out with full accuracy
   2525     (supplying #FRACT_BITS valid bits).
   2526   */
   2527   signalReal = fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change);
   2528   sineLevel = *pSineLevel++;
   2529   sineLevelNext = (noSubbands > 1) ? pSineLevel[0] : FL2FXCONST_DBL(0.0f);
   2530 
   2531   if (sineLevel != FL2FXCONST_DBL(0.0f))
   2532     tone_count++;
   2533   else if (!noNoiseFlag)
   2534     /* Add noisefloor to the amplified signal */
   2535     signalReal +=
   2536         fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0]);
   2537 
   2538   {
   2539     if (!(harmIndex & 0x1)) {
   2540       /* harmIndex 0,2 */
   2541       signalReal += (harmIndex & 0x2) ? -sineLevel : sineLevel;
   2542       *ptrReal++ = signalReal;
   2543     } else {
   2544       /* harmIndex 1,3 in combination with freqInvFlag */
   2545       int shift = (int)(scale_change + 1);
   2546       shift = (shift >= 0) ? fixMin(DFRACT_BITS - 1, shift)
   2547                            : fixMax(-(DFRACT_BITS - 1), shift);
   2548 
   2549       FIXP_DBL tmp1 = (shift >= 0) ? (fMultDiv2(C1, sineLevel) >> shift)
   2550                                    : (fMultDiv2(C1, sineLevel) << (-shift));
   2551       FIXP_DBL tmp2 = fMultDiv2(C1, sineLevelNext);
   2552 
   2553       /* save switch and compare operations and reduce to XOR statement */
   2554       if (((harmIndex >> 1) & 0x1) ^ freqInvFlag) {
   2555         *(ptrReal - 1) += tmp1;
   2556         signalReal -= tmp2;
   2557       } else {
   2558         *(ptrReal - 1) -= tmp1;
   2559         signalReal += tmp2;
   2560       }
   2561       *ptrReal++ = signalReal;
   2562       freqInvFlag = !freqInvFlag;
   2563     }
   2564   }
   2565 
   2566   pNoiseLevel++;
   2567 
   2568   if (noSubbands > 2) {
   2569     if (!(harmIndex & 0x1)) {
   2570       /* harmIndex 0,2 */
   2571       if (!harmIndex) {
   2572         sineSign = 0;
   2573       }
   2574 
   2575       for (k = noSubbands - 2; k != 0; k--) {
   2576         FIXP_DBL sinelevel = *pSineLevel++;
   2577         index++;
   2578         if (((signalReal = (sineSign ? -sinelevel : sinelevel)) ==
   2579              FL2FXCONST_DBL(0.0f)) &&
   2580             !noNoiseFlag) {
   2581           /* Add noisefloor to the amplified signal */
   2582           index &= (SBR_NF_NO_RANDOM_VAL - 1);
   2583           signalReal +=
   2584               fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0]);
   2585         }
   2586 
   2587         /* The next multiplication constitutes the actual envelope adjustment of
   2588          * the signal. */
   2589         signalReal += fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change);
   2590 
   2591         pNoiseLevel++;
   2592         *ptrReal++ = signalReal;
   2593       } /* for ... */
   2594     } else {
   2595       /* harmIndex 1,3 in combination with freqInvFlag */
   2596       if (harmIndex == 1) freqInvFlag = !freqInvFlag;
   2597 
   2598       for (k = noSubbands - 2; k != 0; k--) {
   2599         index++;
   2600         /* The next multiplication constitutes the actual envelope adjustment of
   2601          * the signal. */
   2602         signalReal = fMultDiv2(*ptrReal, *pGain++) << ((int)scale_change);
   2603 
   2604         if (*pSineLevel++ != FL2FXCONST_DBL(0.0f))
   2605           tone_count++;
   2606         else if (!noNoiseFlag) {
   2607           /* Add noisefloor to the amplified signal */
   2608           index &= (SBR_NF_NO_RANDOM_VAL - 1);
   2609           signalReal +=
   2610               fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0]);
   2611         }
   2612 
   2613         pNoiseLevel++;
   2614 
   2615         if (tone_count <= 16) {
   2616           FIXP_DBL addSine = fMultDiv2((pSineLevel[-2] - pSineLevel[0]), C1);
   2617           signalReal += (freqInvFlag) ? (-addSine) : (addSine);
   2618         }
   2619 
   2620         *ptrReal++ = signalReal;
   2621         freqInvFlag = !freqInvFlag;
   2622       } /* for ... */
   2623     }
   2624   }
   2625 
   2626   if (noSubbands > -1) {
   2627     index++;
   2628     /* The next multiplication constitutes the actual envelope adjustment of the
   2629      * signal. */
   2630     signalReal = fMultDiv2(*ptrReal, *pGain) << ((int)scale_change);
   2631     sineLevelPrev = fMultDiv2(pSineLevel[-1], FL2FX_SGL(0.0163f));
   2632     sineLevel = pSineLevel[0];
   2633 
   2634     if (pSineLevel[0] != FL2FXCONST_DBL(0.0f))
   2635       tone_count++;
   2636     else if (!noNoiseFlag) {
   2637       /* Add noisefloor to the amplified signal */
   2638       index &= (SBR_NF_NO_RANDOM_VAL - 1);
   2639       signalReal = signalReal + fMult(FDK_sbrDecoder_sbr_randomPhase[index][0],
   2640                                       pNoiseLevel[0]);
   2641     }
   2642 
   2643     if (!(harmIndex & 0x1)) {
   2644       /* harmIndex 0,2 */
   2645       *ptrReal = signalReal + ((sineSign) ? -sineLevel : sineLevel);
   2646     } else {
   2647       /* harmIndex 1,3 in combination with freqInvFlag */
   2648       if (tone_count <= 16) {
   2649         if (freqInvFlag) {
   2650           *ptrReal++ = signalReal - sineLevelPrev;
   2651           if (noSubbands + lowSubband < 63)
   2652             *ptrReal = *ptrReal + fMultDiv2(C1, sineLevel);
   2653         } else {
   2654           *ptrReal++ = signalReal + sineLevelPrev;
   2655           if (noSubbands + lowSubband < 63)
   2656             *ptrReal = *ptrReal - fMultDiv2(C1, sineLevel);
   2657         }
   2658       } else
   2659         *ptrReal = signalReal;
   2660     }
   2661   }
   2662   *ptrHarmIndex = (harmIndex + 1) & 3;
   2663   *ptrPhaseIndex = index & (SBR_NF_NO_RANDOM_VAL - 1);
   2664 }
   2665 
   2666 static void adjustTimeSlotHQ_GainAndNoise(
   2667     FIXP_DBL *RESTRICT
   2668         ptrReal, /*!< Subband samples to be adjusted, real part */
   2669     FIXP_DBL *RESTRICT
   2670         ptrImag, /*!< Subband samples to be adjusted, imag part */
   2671     HANDLE_SBR_CALCULATE_ENVELOPE h_sbr_cal_env, ENV_CALC_NRGS *nrgs,
   2672     int lowSubband, /*!< Lowest QMF-channel in the currently used SBR range. */
   2673     int noSubbands, /*!< Number of QMF subbands */
   2674     int scale_change,         /*!< Number of bits to shift adjusted samples */
   2675     FIXP_SGL smooth_ratio,    /*!< Impact of last envelope */
   2676     int noNoiseFlag,          /*!< Start index to random number array */
   2677     int filtBufferNoiseShift) /*!< Shift factor of filtBufferNoise */
   2678 {
   2679   FIXP_DBL *RESTRICT gain = nrgs->nrgGain; /*!< Gains of current envelope */
   2680   FIXP_DBL *RESTRICT noiseLevel =
   2681       nrgs->noiseLevel; /*!< Noise levels of current envelope */
   2682   FIXP_DBL *RESTRICT pSineLevel = nrgs->nrgSine; /*!< Sine levels */
   2683 
   2684   FIXP_DBL *RESTRICT filtBuffer =
   2685       h_sbr_cal_env->filtBuffer; /*!< Gains of last envelope */
   2686   FIXP_DBL *RESTRICT filtBufferNoise =
   2687       h_sbr_cal_env->filtBufferNoise; /*!< Noise levels of last envelope */
   2688   int *RESTRICT ptrPhaseIndex =
   2689       &h_sbr_cal_env->phaseIndex; /*!< Start index to random number array */
   2690 
   2691   int k;
   2692   FIXP_DBL signalReal, signalImag;
   2693   FIXP_DBL noiseReal, noiseImag;
   2694   FIXP_DBL smoothedGain, smoothedNoise;
   2695   FIXP_SGL direct_ratio =
   2696       /*FL2FXCONST_SGL(1.0f) */ (FIXP_SGL)MAXVAL_SGL - smooth_ratio;
   2697   int index = *ptrPhaseIndex;
   2698   int shift;
   2699 
   2700   *ptrPhaseIndex = (index + noSubbands) & (SBR_NF_NO_RANDOM_VAL - 1);
   2701 
   2702   filtBufferNoiseShift +=
   2703       1; /* due to later use of fMultDiv2 instead of fMult */
   2704   if (filtBufferNoiseShift < 0) {
   2705     shift = fixMin(DFRACT_BITS - 1, -filtBufferNoiseShift);
   2706   } else {
   2707     shift = fixMin(DFRACT_BITS - 1, filtBufferNoiseShift);
   2708   }
   2709 
   2710   if (smooth_ratio > FL2FXCONST_SGL(0.0f)) {
   2711     for (k = 0; k < noSubbands; k++) {
   2712       /*
   2713         Smoothing: The old envelope has been bufferd and a certain ratio
   2714         of the old gains and noise levels is used.
   2715       */
   2716       smoothedGain =
   2717           fMult(smooth_ratio, filtBuffer[k]) + fMult(direct_ratio, gain[k]);
   2718 
   2719       if (filtBufferNoiseShift < 0) {
   2720         smoothedNoise = (fMultDiv2(smooth_ratio, filtBufferNoise[k]) >> shift) +
   2721                         fMult(direct_ratio, noiseLevel[k]);
   2722       } else {
   2723         smoothedNoise = (fMultDiv2(smooth_ratio, filtBufferNoise[k]) << shift) +
   2724                         fMult(direct_ratio, noiseLevel[k]);
   2725       }
   2726 
   2727       /*
   2728         The next 2 multiplications constitute the actual envelope adjustment
   2729         of the signal and should be carried out with full accuracy
   2730         (supplying #DFRACT_BITS valid bits).
   2731       */
   2732       signalReal = fMultDiv2(*ptrReal, smoothedGain) << ((int)scale_change);
   2733       signalImag = fMultDiv2(*ptrImag, smoothedGain) << ((int)scale_change);
   2734 
   2735       index++;
   2736 
   2737       if ((pSineLevel[k] != FL2FXCONST_DBL(0.0f)) || noNoiseFlag) {
   2738         /* Just the amplified signal is saved */
   2739         *ptrReal++ = signalReal;
   2740         *ptrImag++ = signalImag;
   2741       } else {
   2742         /* Add noisefloor to the amplified signal */
   2743         index &= (SBR_NF_NO_RANDOM_VAL - 1);
   2744         noiseReal =
   2745             fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise);
   2746         noiseImag =
   2747             fMult(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise);
   2748         *ptrReal++ = (signalReal + noiseReal);
   2749         *ptrImag++ = (signalImag + noiseImag);
   2750       }
   2751     }
   2752   } else {
   2753     for (k = 0; k < noSubbands; k++) {
   2754       smoothedGain = gain[k];
   2755       signalReal = fMultDiv2(*ptrReal, smoothedGain) << scale_change;
   2756       signalImag = fMultDiv2(*ptrImag, smoothedGain) << scale_change;
   2757 
   2758       index++;
   2759 
   2760       if ((pSineLevel[k] == FL2FXCONST_DBL(0.0f)) && (noNoiseFlag == 0)) {
   2761         /* Add noisefloor to the amplified signal */
   2762         smoothedNoise = noiseLevel[k];
   2763         index &= (SBR_NF_NO_RANDOM_VAL - 1);
   2764         noiseReal =
   2765             fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise);
   2766         noiseImag =
   2767             fMult(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise);
   2768 
   2769         signalReal += noiseReal;
   2770         signalImag += noiseImag;
   2771       }
   2772       *ptrReal++ = signalReal;
   2773       *ptrImag++ = signalImag;
   2774     }
   2775   }
   2776 }
   2777 
   2778 static void adjustTimeSlotHQ_AddHarmonics(
   2779     FIXP_DBL *RESTRICT
   2780         ptrReal, /*!< Subband samples to be adjusted, real part */
   2781     FIXP_DBL *RESTRICT
   2782         ptrImag, /*!< Subband samples to be adjusted, imag part */
   2783     HANDLE_SBR_CALCULATE_ENVELOPE h_sbr_cal_env, ENV_CALC_NRGS *nrgs,
   2784     int lowSubband,  /*!< Lowest QMF-channel in the currently used SBR range. */
   2785     int noSubbands,  /*!< Number of QMF subbands */
   2786     int scale_change /*!< Scale mismatch between QMF input and sineLevel
   2787                         exponent. */
   2788 ) {
   2789   FIXP_DBL *RESTRICT pSineLevel = nrgs->nrgSine; /*!< Sine levels */
   2790   UCHAR *RESTRICT ptrHarmIndex =
   2791       &h_sbr_cal_env->harmIndex; /*!< Harmonic index */
   2792 
   2793   int k;
   2794   FIXP_DBL signalReal, signalImag;
   2795   UCHAR harmIndex = *ptrHarmIndex;
   2796   int freqInvFlag = (lowSubband & 1);
   2797   FIXP_DBL sineLevel;
   2798 
   2799   *ptrHarmIndex = (harmIndex + 1) & 3;
   2800 
   2801   for (k = 0; k < noSubbands; k++) {
   2802     sineLevel = pSineLevel[k];
   2803     freqInvFlag ^= 1;
   2804     if (sineLevel != FL2FXCONST_DBL(0.f)) {
   2805       signalReal = ptrReal[k];
   2806       signalImag = ptrImag[k];
   2807       sineLevel = scaleValue(sineLevel, scale_change);
   2808       if (harmIndex & 2) {
   2809         /* case 2,3 */
   2810         sineLevel = -sineLevel;
   2811       }
   2812       if (!(harmIndex & 1)) {
   2813         /* case 0,2: */
   2814         ptrReal[k] = signalReal + sineLevel;
   2815       } else {
   2816         /* case 1,3 */
   2817         if (!freqInvFlag) sineLevel = -sineLevel;
   2818         ptrImag[k] = signalImag + sineLevel;
   2819       }
   2820     }
   2821   }
   2822 }
   2823 
   2824 static void adjustTimeSlotHQ(
   2825     FIXP_DBL *RESTRICT
   2826         ptrReal, /*!< Subband samples to be adjusted, real part */
   2827     FIXP_DBL *RESTRICT
   2828         ptrImag, /*!< Subband samples to be adjusted, imag part */
   2829     HANDLE_SBR_CALCULATE_ENVELOPE h_sbr_cal_env, ENV_CALC_NRGS *nrgs,
   2830     int lowSubband, /*!< Lowest QMF-channel in the currently used SBR range. */
   2831     int noSubbands, /*!< Number of QMF subbands */
   2832     int scale_change,         /*!< Number of bits to shift adjusted samples */
   2833     FIXP_SGL smooth_ratio,    /*!< Impact of last envelope */
   2834     int noNoiseFlag,          /*!< Start index to random number array */
   2835     int filtBufferNoiseShift) /*!< Shift factor of filtBufferNoise */
   2836 {
   2837   FIXP_DBL *RESTRICT gain = nrgs->nrgGain; /*!< Gains of current envelope */
   2838   FIXP_DBL *RESTRICT noiseLevel =
   2839       nrgs->noiseLevel; /*!< Noise levels of current envelope */
   2840   FIXP_DBL *RESTRICT pSineLevel = nrgs->nrgSine; /*!< Sine levels */
   2841 
   2842   FIXP_DBL *RESTRICT filtBuffer =
   2843       h_sbr_cal_env->filtBuffer; /*!< Gains of last envelope */
   2844   FIXP_DBL *RESTRICT filtBufferNoise =
   2845       h_sbr_cal_env->filtBufferNoise; /*!< Noise levels of last envelope */
   2846   UCHAR *RESTRICT ptrHarmIndex =
   2847       &h_sbr_cal_env->harmIndex; /*!< Harmonic index */
   2848   int *RESTRICT ptrPhaseIndex =
   2849       &h_sbr_cal_env->phaseIndex; /*!< Start index to random number array */
   2850 
   2851   int k;
   2852   FIXP_DBL signalReal, signalImag;
   2853   FIXP_DBL noiseReal, noiseImag;
   2854   FIXP_DBL smoothedGain, smoothedNoise;
   2855   FIXP_SGL direct_ratio =
   2856       /*FL2FXCONST_SGL(1.0f) */ (FIXP_SGL)MAXVAL_SGL - smooth_ratio;
   2857   int index = *ptrPhaseIndex;
   2858   UCHAR harmIndex = *ptrHarmIndex;
   2859   int freqInvFlag = (lowSubband & 1);
   2860   FIXP_DBL sineLevel;
   2861   int shift;
   2862 
   2863   *ptrPhaseIndex = (index + noSubbands) & (SBR_NF_NO_RANDOM_VAL - 1);
   2864   *ptrHarmIndex = (harmIndex + 1) & 3;
   2865 
   2866   /*
   2867     Possible optimization:
   2868     smooth_ratio and harmIndex stay constant during the loop.
   2869     It might be faster to include a separate loop in each path.
   2870 
   2871     the check for smooth_ratio is now outside the loop and the workload
   2872     of the whole function decreased by about 20 %
   2873   */
   2874 
   2875   filtBufferNoiseShift +=
   2876       1; /* due to later use of fMultDiv2 instead of fMult */
   2877   if (filtBufferNoiseShift < 0)
   2878     shift = fixMin(DFRACT_BITS - 1, -filtBufferNoiseShift);
   2879   else
   2880     shift = fixMin(DFRACT_BITS - 1, filtBufferNoiseShift);
   2881 
   2882   if (smooth_ratio > FL2FXCONST_SGL(0.0f)) {
   2883     for (k = 0; k < noSubbands; k++) {
   2884       /*
   2885         Smoothing: The old envelope has been bufferd and a certain ratio
   2886         of the old gains and noise levels is used.
   2887       */
   2888 
   2889       smoothedGain =
   2890           fMult(smooth_ratio, filtBuffer[k]) + fMult(direct_ratio, gain[k]);
   2891 
   2892       if (filtBufferNoiseShift < 0) {
   2893         smoothedNoise = (fMultDiv2(smooth_ratio, filtBufferNoise[k]) >> shift) +
   2894                         fMult(direct_ratio, noiseLevel[k]);
   2895       } else {
   2896         smoothedNoise = (fMultDiv2(smooth_ratio, filtBufferNoise[k]) << shift) +
   2897                         fMult(direct_ratio, noiseLevel[k]);
   2898       }
   2899 
   2900       /*
   2901         The next 2 multiplications constitute the actual envelope adjustment
   2902         of the signal and should be carried out with full accuracy
   2903         (supplying #DFRACT_BITS valid bits).
   2904       */
   2905       signalReal = fMultDiv2(*ptrReal, smoothedGain) << ((int)scale_change);
   2906       signalImag = fMultDiv2(*ptrImag, smoothedGain) << ((int)scale_change);
   2907 
   2908       index++;
   2909 
   2910       if (pSineLevel[k] != FL2FXCONST_DBL(0.0f)) {
   2911         sineLevel = pSineLevel[k];
   2912 
   2913         switch (harmIndex) {
   2914           case 0:
   2915             *ptrReal++ = (signalReal + sineLevel);
   2916             *ptrImag++ = (signalImag);
   2917             break;
   2918           case 2:
   2919             *ptrReal++ = (signalReal - sineLevel);
   2920             *ptrImag++ = (signalImag);
   2921             break;
   2922           case 1:
   2923             *ptrReal++ = (signalReal);
   2924             if (freqInvFlag)
   2925               *ptrImag++ = (signalImag - sineLevel);
   2926             else
   2927               *ptrImag++ = (signalImag + sineLevel);
   2928             break;
   2929           case 3:
   2930             *ptrReal++ = signalReal;
   2931             if (freqInvFlag)
   2932               *ptrImag++ = (signalImag + sineLevel);
   2933             else
   2934               *ptrImag++ = (signalImag - sineLevel);
   2935             break;
   2936         }
   2937       } else {
   2938         if (noNoiseFlag) {
   2939           /* Just the amplified signal is saved */
   2940           *ptrReal++ = (signalReal);
   2941           *ptrImag++ = (signalImag);
   2942         } else {
   2943           /* Add noisefloor to the amplified signal */
   2944           index &= (SBR_NF_NO_RANDOM_VAL - 1);
   2945           noiseReal =
   2946               fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise);
   2947           noiseImag =
   2948               fMult(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise);
   2949           *ptrReal++ = (signalReal + noiseReal);
   2950           *ptrImag++ = (signalImag + noiseImag);
   2951         }
   2952       }
   2953       freqInvFlag ^= 1;
   2954     }
   2955 
   2956   } else {
   2957     for (k = 0; k < noSubbands; k++) {
   2958       smoothedGain = gain[k];
   2959       signalReal = fMultDiv2(*ptrReal, smoothedGain) << scale_change;
   2960       signalImag = fMultDiv2(*ptrImag, smoothedGain) << scale_change;
   2961 
   2962       index++;
   2963 
   2964       if ((sineLevel = pSineLevel[k]) != FL2FXCONST_DBL(0.0f)) {
   2965         switch (harmIndex) {
   2966           case 0:
   2967             signalReal += sineLevel;
   2968             break;
   2969           case 1:
   2970             if (freqInvFlag)
   2971               signalImag -= sineLevel;
   2972             else
   2973               signalImag += sineLevel;
   2974             break;
   2975           case 2:
   2976             signalReal -= sineLevel;
   2977             break;
   2978           case 3:
   2979             if (freqInvFlag)
   2980               signalImag += sineLevel;
   2981             else
   2982               signalImag -= sineLevel;
   2983             break;
   2984         }
   2985       } else {
   2986         if (noNoiseFlag == 0) {
   2987           /* Add noisefloor to the amplified signal */
   2988           smoothedNoise = noiseLevel[k];
   2989           index &= (SBR_NF_NO_RANDOM_VAL - 1);
   2990           noiseReal =
   2991               fMult(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise);
   2992           noiseImag =
   2993               fMult(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise);
   2994 
   2995           signalReal += noiseReal;
   2996           signalImag += noiseImag;
   2997         }
   2998       }
   2999       *ptrReal++ = signalReal;
   3000       *ptrImag++ = signalImag;
   3001 
   3002       freqInvFlag ^= 1;
   3003     }
   3004   }
   3005 }
   3006 
   3007 /*!
   3008   \brief   Reset limiter bands.
   3009 
   3010   Build frequency band table for the gain limiter dependent on
   3011   the previously generated transposer patch areas.
   3012 
   3013   \return  SBRDEC_OK if ok,  SBRDEC_UNSUPPORTED_CONFIG on error
   3014 */
   3015 SBR_ERROR
   3016 ResetLimiterBands(
   3017     UCHAR *limiterBandTable, /*!< Resulting band borders in QMF channels */
   3018     UCHAR *noLimiterBands,   /*!< Resulting number of limiter band */
   3019     UCHAR *freqBandTable,    /*!< Table with possible band borders */
   3020     int noFreqBands,         /*!< Number of bands in freqBandTable */
   3021     const PATCH_PARAM *patchParam, /*!< Transposer patch parameters */
   3022     int noPatches,                 /*!< Number of transposer patches */
   3023     int limiterBands, /*!< Selected 'band density' from bitstream */
   3024     UCHAR sbrPatchingMode, int xOverQmf[MAX_NUM_PATCHES], int b41Sbr) {
   3025   int i, k, isPatchBorder[2], loLimIndex, hiLimIndex, tempNoLim, nBands;
   3026   UCHAR workLimiterBandTable[MAX_FREQ_COEFFS / 2 + MAX_NUM_PATCHES + 1];
   3027   int patchBorders[MAX_NUM_PATCHES + 1];
   3028   int kx, k2;
   3029 
   3030   int lowSubband = freqBandTable[0];
   3031   int highSubband = freqBandTable[noFreqBands];
   3032 
   3033   /* 1 limiter band. */
   3034   if (limiterBands == 0) {
   3035     limiterBandTable[0] = 0;
   3036     limiterBandTable[1] = highSubband - lowSubband;
   3037     nBands = 1;
   3038   } else {
   3039     if (!sbrPatchingMode && xOverQmf != NULL) {
   3040       noPatches = 0;
   3041 
   3042       if (b41Sbr == 1) {
   3043         for (i = 1; i < MAX_NUM_PATCHES_HBE; i++)
   3044           if (xOverQmf[i] != 0) noPatches++;
   3045       } else {
   3046         for (i = 1; i < MAX_STRETCH_HBE; i++)
   3047           if (xOverQmf[i] != 0) noPatches++;
   3048       }
   3049       for (i = 0; i < noPatches; i++) {
   3050         patchBorders[i] = xOverQmf[i] - lowSubband;
   3051       }
   3052     } else {
   3053       for (i = 0; i < noPatches; i++) {
   3054         patchBorders[i] = patchParam[i].guardStartBand - lowSubband;
   3055       }
   3056     }
   3057     patchBorders[i] = highSubband - lowSubband;
   3058 
   3059     /* 1.2, 2, or 3 limiter bands/octave plus bandborders at patchborders. */
   3060     for (k = 0; k <= noFreqBands; k++) {
   3061       workLimiterBandTable[k] = freqBandTable[k] - lowSubband;
   3062     }
   3063     for (k = 1; k < noPatches; k++) {
   3064       workLimiterBandTable[noFreqBands + k] = patchBorders[k];
   3065     }
   3066 
   3067     tempNoLim = nBands = noFreqBands + noPatches - 1;
   3068     shellsort(workLimiterBandTable, tempNoLim + 1);
   3069 
   3070     loLimIndex = 0;
   3071     hiLimIndex = 1;
   3072 
   3073     while (hiLimIndex <= tempNoLim) {
   3074       FIXP_DBL div_m, oct_m, temp;
   3075       INT div_e = 0, oct_e = 0, temp_e = 0;
   3076 
   3077       k2 = workLimiterBandTable[hiLimIndex] + lowSubband;
   3078       kx = workLimiterBandTable[loLimIndex] + lowSubband;
   3079 
   3080       div_m = fDivNorm(k2, kx, &div_e);
   3081 
   3082       /* calculate number of octaves */
   3083       oct_m = fLog2(div_m, div_e, &oct_e);
   3084 
   3085       /* multiply with limiterbands per octave    */
   3086       /* values 1, 1.2, 2, 3 -> scale factor of 2 */
   3087       temp = fMultNorm(
   3088           oct_m, FDK_sbrDecoder_sbr_limiterBandsPerOctaveDiv4_DBL[limiterBands],
   3089           &temp_e);
   3090 
   3091       /* overall scale factor of temp ist addition of scalefactors from log2
   3092          calculation, limiter bands scalefactor (2) and limiter bands
   3093          multiplication */
   3094       temp_e += oct_e + 2;
   3095 
   3096       /*    div can be a maximum of 64 (k2 = 64 and kx = 1)
   3097          -> oct can be a maximum of 6
   3098          -> temp can be a maximum of 18 (as limiterBandsPerOctoave is a maximum
   3099          factor of 3)
   3100          -> we need a scale factor of 5 for comparisson
   3101       */
   3102       if (temp >> (5 - temp_e) < FL2FXCONST_DBL(0.49f) >> 5) {
   3103         if (workLimiterBandTable[hiLimIndex] ==
   3104             workLimiterBandTable[loLimIndex]) {
   3105           workLimiterBandTable[hiLimIndex] = highSubband;
   3106           nBands--;
   3107           hiLimIndex++;
   3108           continue;
   3109         }
   3110         isPatchBorder[0] = isPatchBorder[1] = 0;
   3111         for (k = 0; k <= noPatches; k++) {
   3112           if (workLimiterBandTable[hiLimIndex] == patchBorders[k]) {
   3113             isPatchBorder[1] = 1;
   3114             break;
   3115           }
   3116         }
   3117         if (!isPatchBorder[1]) {
   3118           workLimiterBandTable[hiLimIndex] = highSubband;
   3119           nBands--;
   3120           hiLimIndex++;
   3121           continue;
   3122         }
   3123         for (k = 0; k <= noPatches; k++) {
   3124           if (workLimiterBandTable[loLimIndex] == patchBorders[k]) {
   3125             isPatchBorder[0] = 1;
   3126             break;
   3127           }
   3128         }
   3129         if (!isPatchBorder[0]) {
   3130           workLimiterBandTable[loLimIndex] = highSubband;
   3131           nBands--;
   3132         }
   3133       }
   3134       loLimIndex = hiLimIndex;
   3135       hiLimIndex++;
   3136     }
   3137     shellsort(workLimiterBandTable, tempNoLim + 1);
   3138 
   3139     /* Test if algorithm exceeded maximum allowed limiterbands */
   3140     if (nBands > MAX_NUM_LIMITERS || nBands <= 0) {
   3141       return SBRDEC_UNSUPPORTED_CONFIG;
   3142     }
   3143 
   3144     /* Copy limiterbands from working buffer into final destination */
   3145     for (k = 0; k <= nBands; k++) {
   3146       limiterBandTable[k] = workLimiterBandTable[k];
   3147     }
   3148   }
   3149   *noLimiterBands = nBands;
   3150 
   3151   return SBRDEC_OK;
   3152 }
   3153