1 2 /* ----------------------------------------------------------------------------------------------------------- 3 Software License for The Fraunhofer FDK AAC Codec Library for Android 4 5 Copyright 1995 - 2015 Fraunhofer-Gesellschaft zur Frderung der angewandten Forschung e.V. 6 All rights reserved. 7 8 1. INTRODUCTION 9 The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements 10 the MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio. 11 This FDK AAC Codec software is intended to be used on a wide variety of Android devices. 12 13 AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual 14 audio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by 15 independent studies and is widely deployed. AAC has been standardized by ISO and IEC as part 16 of the MPEG specifications. 17 18 Patent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer) 19 may be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners 20 individually for the purpose of encoding or decoding bit streams in products that are compliant with 21 the ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license 22 these patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec 23 software may already be covered under those patent licenses when it is used for those licensed purposes only. 24 25 Commercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality, 26 are also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional 27 applications information and documentation. 28 29 2. COPYRIGHT LICENSE 30 31 Redistribution and use in source and binary forms, with or without modification, are permitted without 32 payment of copyright license fees provided that you satisfy the following conditions: 33 34 You must retain the complete text of this software license in redistributions of the FDK AAC Codec or 35 your modifications thereto in source code form. 36 37 You must retain the complete text of this software license in the documentation and/or other materials 38 provided with redistributions of the FDK AAC Codec or your modifications thereto in binary form. 39 You must make available free of charge copies of the complete source code of the FDK AAC Codec and your 40 modifications thereto to recipients of copies in binary form. 41 42 The name of Fraunhofer may not be used to endorse or promote products derived from this library without 43 prior written permission. 44 45 You may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec 46 software or your modifications thereto. 47 48 Your modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software 49 and the date of any change. For modified versions of the FDK AAC Codec, the term 50 "Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term 51 "Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android." 52 53 3. NO PATENT LICENSE 54 55 NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer, 56 ARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with 57 respect to this software. 58 59 You may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized 60 by appropriate patent licenses. 61 62 4. DISCLAIMER 63 64 This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors 65 "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties 66 of merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 67 CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages, 68 including but not limited to procurement of substitute goods or services; loss of use, data, or profits, 69 or business interruption, however caused and on any theory of liability, whether in contract, strict 70 liability, or tort (including negligence), arising in any way out of the use of this software, even if 71 advised of the possibility of such damage. 72 73 5. CONTACT INFORMATION 74 75 Fraunhofer Institute for Integrated Circuits IIS 76 Attention: Audio and Multimedia Departments - FDK AAC LL 77 Am Wolfsmantel 33 78 91058 Erlangen, Germany 79 80 www.iis.fraunhofer.de/amm 81 amm-info (at) iis.fraunhofer.de 82 ----------------------------------------------------------------------------------------------------------- */ 83 84 /*! 85 \file 86 \brief Envelope calculation 87 88 The envelope adjustor compares the energies present in the transposed 89 highband to the reference energies conveyed with the bitstream. 90 The highband is amplified (sometimes) or attenuated (mostly) to the 91 desired level. 92 93 The spectral shape of the reference energies can be changed several times per 94 frame if necessary. Each set of energy values corresponding to a certain range 95 in time will be called an <em>envelope</em> here. 96 The bitstream supports several frequency scales and two resolutions. Normally, 97 one or more QMF-subbands are grouped to one SBR-band. An envelope contains 98 reference energies for each SBR-band. 99 In addition to the energy envelopes, noise envelopes are transmitted that 100 define the ratio of energy which is generated by adding noise instead of 101 transposing the lowband. The noise envelopes are given in a coarser time 102 and frequency resolution. 103 If a signal contains strong tonal components, synthetic sines can be 104 generated in individual SBR bands. 105 106 An overlap buffer of 6 QMF-timeslots is used to allow a more 107 flexible alignment of the envelopes in time that is not restricted to the 108 core codec's frame borders. 109 Therefore the envelope adjustor has access to the spectral data of the 110 current frame as well as the last 6 QMF-timeslots of the previous frame. 111 However, in average only the data of 1 frame is being processed as 112 the adjustor is called once per frame. 113 114 Depending on the frequency range set in the bitstream, only QMF-subbands between 115 <em>lowSubband</em> and <em>highSubband</em> are adjusted. 116 117 Scaling of spectral data to maximize SNR (see #QMF_SCALE_FACTOR) as well as a special Mantissa-Exponent format 118 ( see calculateSbrEnvelope() ) are being used. The main entry point for this modules is calculateSbrEnvelope(). 119 120 \sa sbr_scale.h, #QMF_SCALE_FACTOR, calculateSbrEnvelope(), \ref documentationOverview 121 */ 122 123 124 #include "env_calc.h" 125 126 #include "sbrdec_freq_sca.h" 127 #include "env_extr.h" 128 #include "transcendent.h" 129 #include "sbr_ram.h" 130 #include "sbr_rom.h" 131 132 #include "genericStds.h" /* need FDKpow() for debug outputs */ 133 134 #if defined(__arm__) 135 #include "arm/env_calc_arm.cpp" 136 #endif 137 138 typedef struct 139 { 140 FIXP_DBL nrgRef[MAX_FREQ_COEFFS]; 141 FIXP_DBL nrgEst[MAX_FREQ_COEFFS]; 142 FIXP_DBL nrgGain[MAX_FREQ_COEFFS]; 143 FIXP_DBL noiseLevel[MAX_FREQ_COEFFS]; 144 FIXP_DBL nrgSine[MAX_FREQ_COEFFS]; 145 146 SCHAR nrgRef_e[MAX_FREQ_COEFFS]; 147 SCHAR nrgEst_e[MAX_FREQ_COEFFS]; 148 SCHAR nrgGain_e[MAX_FREQ_COEFFS]; 149 SCHAR noiseLevel_e[MAX_FREQ_COEFFS]; 150 SCHAR nrgSine_e[MAX_FREQ_COEFFS]; 151 } 152 ENV_CALC_NRGS; 153 154 static void equalizeFiltBufferExp(FIXP_DBL *filtBuffer, 155 SCHAR *filtBuffer_e, 156 FIXP_DBL *NrgGain, 157 SCHAR *NrgGain_e, 158 int subbands); 159 160 static void calcNrgPerSubband(FIXP_DBL **analysBufferReal, 161 FIXP_DBL **analysBufferImag, 162 int lowSubband, int highSubband, 163 int start_pos, int next_pos, 164 SCHAR frameExp, 165 FIXP_DBL *nrgEst, 166 SCHAR *nrgEst_e ); 167 168 static void calcNrgPerSfb(FIXP_DBL **analysBufferReal, 169 FIXP_DBL **analysBufferImag, 170 int nSfb, 171 UCHAR *freqBandTable, 172 int start_pos, int next_pos, 173 SCHAR input_e, 174 FIXP_DBL *nrg_est, 175 SCHAR *nrg_est_e ); 176 177 static void calcSubbandGain(FIXP_DBL nrgRef, SCHAR nrgRef_e, ENV_CALC_NRGS* nrgs, int c, 178 FIXP_DBL tmpNoise, SCHAR tmpNoise_e, 179 UCHAR sinePresentFlag, 180 UCHAR sineMapped, 181 int noNoiseFlag); 182 183 static void calcAvgGain(ENV_CALC_NRGS* nrgs, 184 int lowSubband, 185 int highSubband, 186 FIXP_DBL *sumRef_m, 187 SCHAR *sumRef_e, 188 FIXP_DBL *ptrAvgGain_m, 189 SCHAR *ptrAvgGain_e); 190 191 static void adjustTimeSlot_EldGrid(FIXP_DBL *ptrReal, 192 ENV_CALC_NRGS* nrgs, 193 UCHAR *ptrHarmIndex, 194 int lowSubbands, 195 int noSubbands, 196 int scale_change, 197 int noNoiseFlag, 198 int *ptrPhaseIndex, 199 int scale_diff_low); 200 201 static void adjustTimeSlotLC(FIXP_DBL *ptrReal, 202 ENV_CALC_NRGS* nrgs, 203 UCHAR *ptrHarmIndex, 204 int lowSubbands, 205 int noSubbands, 206 int scale_change, 207 int noNoiseFlag, 208 int *ptrPhaseIndex); 209 static void adjustTimeSlotHQ(FIXP_DBL *ptrReal, 210 FIXP_DBL *ptrImag, 211 HANDLE_SBR_CALCULATE_ENVELOPE h_sbr_cal_env, 212 ENV_CALC_NRGS* nrgs, 213 int lowSubbands, 214 int noSubbands, 215 int scale_change, 216 FIXP_SGL smooth_ratio, 217 int noNoiseFlag, 218 int filtBufferNoiseShift); 219 220 221 /*! 222 \brief Map sine flags from bitstream to QMF bands 223 224 The bitstream carries only 1 sine flag per band and frame. 225 This function maps every sine flag from the bitstream to a specific QMF subband 226 and to a specific envelope where the sine shall start. 227 The result is stored in the vector sineMapped which contains one entry per 228 QMF subband. The value of an entry specifies the envelope where a sine 229 shall start. A value of #MAX_ENVELOPES indicates that no sine is present 230 in the subband. 231 The missing harmonics flags from the previous frame (harmFlagsPrev) determine 232 if a sine starts at the beginning of the frame or at the transient position. 233 Additionally, the flags in harmFlagsPrev are being updated by this function 234 for the next frame. 235 */ 236 static void mapSineFlags(UCHAR *freqBandTable, /*!< Band borders (there's only 1 flag per band) */ 237 int nSfb, /*!< Number of bands in the table */ 238 UCHAR *addHarmonics, /*!< vector with 1 flag per sfb */ 239 int *harmFlagsPrev, /*!< Packed 'addHarmonics' */ 240 int tranEnv, /*!< Transient position */ 241 SCHAR *sineMapped) /*!< Resulting vector of sine start positions for each QMF band */ 242 243 { 244 int i; 245 int lowSubband2 = freqBandTable[0]<<1; 246 int bitcount = 0; 247 int oldflags = *harmFlagsPrev; 248 int newflags = 0; 249 250 /* 251 Format of harmFlagsPrev: 252 253 first word = flags for highest 16 sfb bands in use 254 second word = flags for next lower 16 sfb bands (if present) 255 third word = flags for lowest 16 sfb bands (if present) 256 257 Up to MAX_FREQ_COEFFS sfb bands can be flagged for a sign. 258 The lowest bit of the first word corresponds to the _highest_ sfb band in use. 259 This is ensures that each flag is mapped to the same QMF band even after a 260 change of the crossover-frequency. 261 */ 262 263 264 /* Reset the output vector first */ 265 FDKmemset(sineMapped, MAX_ENVELOPES,MAX_FREQ_COEFFS); /* MAX_ENVELOPES means 'no sine' */ 266 267 freqBandTable += nSfb; 268 addHarmonics += nSfb-1; 269 270 for (i=nSfb; i!=0; i--) { 271 int ui = *freqBandTable--; /* Upper limit of the current scale factor band. */ 272 int li = *freqBandTable; /* Lower limit of the current scale factor band. */ 273 274 if ( *addHarmonics-- ) { /* There is a sine in this band */ 275 276 unsigned int mask = 1 << bitcount; 277 newflags |= mask; /* Set flag */ 278 279 /* 280 If there was a sine in the last frame, let it continue from the first envelope on 281 else start at the transient position. 282 */ 283 sineMapped[(ui+li-lowSubband2) >> 1] = ( oldflags & mask ) ? 0 : tranEnv; 284 } 285 286 if ((++bitcount == 16) || i==1) { 287 bitcount = 0; 288 *harmFlagsPrev++ = newflags; 289 oldflags = *harmFlagsPrev; /* Fetch 16 of the old flags */ 290 newflags = 0; 291 } 292 } 293 } 294 295 296 /*! 297 \brief Reduce gain-adjustment induced aliasing for real valued filterbank. 298 */ 299 /*static*/ void 300 aliasingReduction(FIXP_DBL* degreeAlias, /*!< estimated aliasing for each QMF channel */ 301 ENV_CALC_NRGS* nrgs, 302 int* useAliasReduction, /*!< synthetic sine engergy for each subband, used as flag */ 303 int noSubbands) /*!< number of QMF channels to process */ 304 { 305 FIXP_DBL* nrgGain = nrgs->nrgGain; /*!< subband gains to be modified */ 306 SCHAR* nrgGain_e = nrgs->nrgGain_e; /*!< subband gains to be modified (exponents) */ 307 FIXP_DBL* nrgEst = nrgs->nrgEst; /*!< subband energy before amplification */ 308 SCHAR* nrgEst_e = nrgs->nrgEst_e; /*!< subband energy before amplification (exponents) */ 309 int grouping = 0, index = 0, noGroups, k; 310 int groupVector[MAX_FREQ_COEFFS]; 311 312 /* Calculate grouping*/ 313 for (k = 0; k < noSubbands-1; k++ ){ 314 if ( (degreeAlias[k + 1] != FL2FXCONST_DBL(0.0f)) && useAliasReduction[k] ) { 315 if(grouping==0){ 316 groupVector[index++] = k; 317 grouping = 1; 318 } 319 else{ 320 if(groupVector[index-1] + 3 == k){ 321 groupVector[index++] = k + 1; 322 grouping = 0; 323 } 324 } 325 } 326 else{ 327 if(grouping){ 328 if(useAliasReduction[k]) 329 groupVector[index++] = k + 1; 330 else 331 groupVector[index++] = k; 332 grouping = 0; 333 } 334 } 335 } 336 337 if(grouping){ 338 groupVector[index++] = noSubbands; 339 } 340 noGroups = index >> 1; 341 342 343 /*Calculate new gain*/ 344 for (int group = 0; group < noGroups; group ++) { 345 FIXP_DBL nrgOrig = FL2FXCONST_DBL(0.0f); /* Original signal energy in current group of bands */ 346 SCHAR nrgOrig_e = 0; 347 FIXP_DBL nrgAmp = FL2FXCONST_DBL(0.0f); /* Amplified signal energy in group (using current gains) */ 348 SCHAR nrgAmp_e = 0; 349 FIXP_DBL nrgMod = FL2FXCONST_DBL(0.0f); /* Signal energy in group when applying modified gains */ 350 SCHAR nrgMod_e = 0; 351 FIXP_DBL groupGain; /* Total energy gain in group */ 352 SCHAR groupGain_e; 353 FIXP_DBL compensation; /* Compensation factor for the energy change when applying modified gains */ 354 SCHAR compensation_e; 355 356 int startGroup = groupVector[2*group]; 357 int stopGroup = groupVector[2*group+1]; 358 359 /* Calculate total energy in group before and after amplification with current gains: */ 360 for(k = startGroup; k < stopGroup; k++){ 361 /* Get original band energy */ 362 FIXP_DBL tmp = nrgEst[k]; 363 SCHAR tmp_e = nrgEst_e[k]; 364 365 FDK_add_MantExp(tmp, tmp_e, nrgOrig, nrgOrig_e, &nrgOrig, &nrgOrig_e); 366 367 /* Multiply band energy with current gain */ 368 tmp = fMult(tmp,nrgGain[k]); 369 tmp_e = tmp_e + nrgGain_e[k]; 370 371 FDK_add_MantExp(tmp, tmp_e, nrgAmp, nrgAmp_e, &nrgAmp, &nrgAmp_e); 372 } 373 374 /* Calculate total energy gain in group */ 375 FDK_divide_MantExp(nrgAmp, nrgAmp_e, 376 nrgOrig, nrgOrig_e, 377 &groupGain, &groupGain_e); 378 379 for(k = startGroup; k < stopGroup; k++){ 380 FIXP_DBL tmp; 381 SCHAR tmp_e; 382 383 FIXP_DBL alpha = degreeAlias[k]; 384 if (k < noSubbands - 1) { 385 if (degreeAlias[k + 1] > alpha) 386 alpha = degreeAlias[k + 1]; 387 } 388 389 /* Modify gain depending on the degree of aliasing */ 390 FDK_add_MantExp( fMult(alpha,groupGain), groupGain_e, 391 fMult(/*FL2FXCONST_DBL(1.0f)*/ (FIXP_DBL)MAXVAL_DBL - alpha,nrgGain[k]), nrgGain_e[k], 392 &nrgGain[k], &nrgGain_e[k] ); 393 394 /* Apply modified gain to original energy */ 395 tmp = fMult(nrgGain[k],nrgEst[k]); 396 tmp_e = nrgGain_e[k] + nrgEst_e[k]; 397 398 /* Accumulate energy with modified gains applied */ 399 FDK_add_MantExp( tmp, tmp_e, 400 nrgMod, nrgMod_e, 401 &nrgMod, &nrgMod_e ); 402 } 403 404 /* Calculate compensation factor to retain the energy of the amplified signal */ 405 FDK_divide_MantExp(nrgAmp, nrgAmp_e, 406 nrgMod, nrgMod_e, 407 &compensation, &compensation_e); 408 409 /* Apply compensation factor to all gains of the group */ 410 for(k = startGroup; k < stopGroup; k++){ 411 nrgGain[k] = fMult(nrgGain[k],compensation); 412 nrgGain_e[k] = nrgGain_e[k] + compensation_e; 413 } 414 } 415 } 416 417 418 /* Convert headroom bits to exponent */ 419 #define SCALE2EXP(s) (15-(s)) 420 #define EXP2SCALE(e) (15-(e)) 421 422 /*! 423 \brief Apply spectral envelope to subband samples 424 425 This function is called from sbr_dec.cpp in each frame. 426 427 To enhance accuracy and due to the usage of tables for squareroots and 428 inverse, some calculations are performed with the operands being split 429 into mantissa and exponent. The variable names in the source code carry 430 the suffixes <em>_m</em> and <em>_e</em> respectively. The control data 431 in #hFrameData containts envelope data which is represented by this format but 432 stored in single words. (See requantizeEnvelopeData() for details). This data 433 is unpacked within calculateSbrEnvelope() to follow the described suffix convention. 434 435 The actual value (comparable to the corresponding float-variable in the 436 research-implementation) of a mantissa/exponent-pair can be calculated as 437 438 \f$ value = value\_m * 2^{value\_e} \f$ 439 440 All energies and noise levels decoded from the bitstream suit for an 441 original signal magnitude of \f$\pm 32768 \f$ rather than \f$ \pm 1\f$. Therefore, 442 the scale factor <em>hb_scale</em> passed into this function will be converted 443 to an 'input exponent' (#input_e), which fits the internal representation. 444 445 Before the actual processing, an exponent #adj_e for resulting adjusted 446 samples is derived from the maximum reference energy. 447 448 Then, for each envelope, the following steps are performed: 449 450 \li Calculate energy in the signal to be adjusted. Depending on the the value of 451 #interpolFreq (interpolation mode), this is either done seperately 452 for each QMF-subband or for each SBR-band. 453 The resulting energies are stored in #nrgEst_m[#MAX_FREQ_COEFFS] (mantissas) 454 and #nrgEst_e[#MAX_FREQ_COEFFS] (exponents). 455 \li Calculate gain and noise level for each subband:<br> 456 \f$ gain = \sqrt{ \frac{nrgRef}{nrgEst} \cdot (1 - noiseRatio) } 457 \hspace{2cm} 458 noise = \sqrt{ nrgRef \cdot noiseRatio } 459 \f$<br> 460 where <em>noiseRatio</em> and <em>nrgRef</em> are extracted from the 461 bitstream and <em>nrgEst</em> is the subband energy before adjustment. 462 The resulting gains are stored in #nrgGain_m[#MAX_FREQ_COEFFS] 463 (mantissas) and #nrgGain_e[#MAX_FREQ_COEFFS] (exponents), the noise levels 464 are stored in #noiseLevel_m[#MAX_FREQ_COEFFS] and #noiseLevel_e[#MAX_FREQ_COEFFS] 465 (exponents). 466 The sine levels are stored in #nrgSine_m[#MAX_FREQ_COEFFS] 467 and #nrgSine_e[#MAX_FREQ_COEFFS]. 468 \li Noise limiting: The gain for each subband is limited both absolutely 469 and relatively compared to the total gain over all subbands. 470 \li Boost gain: Calculate and apply boost factor for each limiter band 471 in order to compensate for the energy loss imposed by the limiting. 472 \li Apply gains and add noise: The gains and noise levels are applied 473 to all timeslots of the current envelope. A short FIR-filter (length 4 474 QMF-timeslots) can be used to smooth the sudden change at the envelope borders. 475 Each complex subband sample of the current timeslot is multiplied by the 476 smoothed gain, then random noise with the calculated level is added. 477 478 \note 479 To reduce the stack size, some of the local arrays could be located within 480 the time output buffer. Of the 512 samples temporarily available there, 481 about half the size is already used by #SBR_FRAME_DATA. A pointer to the 482 remaining free memory could be supplied by an additional argument to calculateSbrEnvelope() 483 in sbr_dec: 484 485 \par 486 \code 487 calculateSbrEnvelope (&hSbrDec->sbrScaleFactor, 488 &hSbrDec->SbrCalculateEnvelope, 489 hHeaderData, 490 hFrameData, 491 QmfBufferReal, 492 QmfBufferImag, 493 timeOutPtr + sizeof(SBR_FRAME_DATA)/sizeof(Float) + 1); 494 \endcode 495 496 \par 497 Within calculateSbrEnvelope(), some pointers could be defined instead of the arrays 498 #nrgRef_m, #nrgRef_e, #nrgEst_m, #nrgEst_e, #noiseLevel_m: 499 500 \par 501 \code 502 fract* nrgRef_m = timeOutPtr; 503 SCHAR* nrgRef_e = nrgRef_m + MAX_FREQ_COEFFS; 504 fract* nrgEst_m = nrgRef_e + MAX_FREQ_COEFFS; 505 SCHAR* nrgEst_e = nrgEst_m + MAX_FREQ_COEFFS; 506 fract* noiseLevel_m = nrgEst_e + MAX_FREQ_COEFFS; 507 \endcode 508 509 <br> 510 */ 511 void 512 calculateSbrEnvelope (QMF_SCALE_FACTOR *sbrScaleFactor, /*!< Scaling factors */ 513 HANDLE_SBR_CALCULATE_ENVELOPE h_sbr_cal_env, /*!< Handle to struct filled by the create-function */ 514 HANDLE_SBR_HEADER_DATA hHeaderData, /*!< Static control data */ 515 HANDLE_SBR_FRAME_DATA hFrameData, /*!< Control data of current frame */ 516 FIXP_DBL **analysBufferReal, /*!< Real part of subband samples to be processed */ 517 FIXP_DBL **analysBufferImag, /*!< Imag part of subband samples to be processed */ 518 const int useLP, 519 FIXP_DBL *degreeAlias, /*!< Estimated aliasing for each QMF channel */ 520 const UINT flags, 521 const int frameErrorFlag 522 ) 523 { 524 int c, i, j, envNoise = 0; 525 UCHAR* borders = hFrameData->frameInfo.borders; 526 527 FIXP_SGL *noiseLevels = hFrameData->sbrNoiseFloorLevel; 528 HANDLE_FREQ_BAND_DATA hFreq = &hHeaderData->freqBandData; 529 530 int lowSubband = hFreq->lowSubband; 531 int highSubband = hFreq->highSubband; 532 int noSubbands = highSubband - lowSubband; 533 534 int noNoiseBands = hFreq->nNfb; 535 int no_cols = hHeaderData->numberTimeSlots * hHeaderData->timeStep; 536 UCHAR first_start = borders[0] * hHeaderData->timeStep; 537 538 SCHAR sineMapped[MAX_FREQ_COEFFS]; 539 SCHAR ov_adj_e = SCALE2EXP(sbrScaleFactor->ov_hb_scale); 540 SCHAR adj_e = 0; 541 SCHAR output_e; 542 SCHAR final_e = 0; 543 544 SCHAR maxGainLimit_e = (frameErrorFlag) ? MAX_GAIN_CONCEAL_EXP : MAX_GAIN_EXP; 545 546 int useAliasReduction[64]; 547 UCHAR smooth_length = 0; 548 549 FIXP_SGL * pIenv = hFrameData->iEnvelope; 550 551 /* 552 Extract sine flags for all QMF bands 553 */ 554 mapSineFlags(hFreq->freqBandTable[1], 555 hFreq->nSfb[1], 556 hFrameData->addHarmonics, 557 h_sbr_cal_env->harmFlagsPrev, 558 hFrameData->frameInfo.tranEnv, 559 sineMapped); 560 561 562 /* 563 Scan for maximum in bufferd noise levels. 564 This is needed in case that we had strong noise in the previous frame 565 which is smoothed into the current frame. 566 The resulting exponent is used as start value for the maximum search 567 in reference energies 568 */ 569 if (!useLP) 570 adj_e = h_sbr_cal_env->filtBufferNoise_e - getScalefactor(h_sbr_cal_env->filtBufferNoise, noSubbands); 571 572 /* 573 Scan for maximum reference energy to be able 574 to select appropriate values for adj_e and final_e. 575 */ 576 577 for (i = 0; i < hFrameData->frameInfo.nEnvelopes; i++) { 578 INT maxSfbNrg_e = -FRACT_BITS+NRG_EXP_OFFSET; /* start value for maximum search */ 579 580 /* Fetch frequency resolution for current envelope: */ 581 for (j=hFreq->nSfb[hFrameData->frameInfo.freqRes[i]]; j!=0; j--) { 582 maxSfbNrg_e = fixMax(maxSfbNrg_e,(INT)((LONG)(*pIenv++) & MASK_E)); 583 } 584 maxSfbNrg_e -= NRG_EXP_OFFSET; 585 586 /* Energy -> magnitude (sqrt halfens exponent) */ 587 maxSfbNrg_e = (maxSfbNrg_e+1) >> 1; /* +1 to go safe (round to next higher int) */ 588 589 /* Some safety margin is needed for 2 reasons: 590 - The signal energy is not equally spread over all subband samples in 591 a specific sfb of an envelope (Nrg could be too high by a factor of 592 envWidth * sfbWidth) 593 - Smoothing can smear high gains of the previous envelope into the current 594 */ 595 maxSfbNrg_e += 6; 596 597 if (borders[i] < hHeaderData->numberTimeSlots) 598 /* This envelope affects timeslots that belong to the output frame */ 599 adj_e = (maxSfbNrg_e > adj_e) ? maxSfbNrg_e : adj_e; 600 601 if (borders[i+1] > hHeaderData->numberTimeSlots) 602 /* This envelope affects timeslots after the output frame */ 603 final_e = (maxSfbNrg_e > final_e) ? maxSfbNrg_e : final_e; 604 605 } 606 607 /* 608 Calculate adjustment factors and apply them for every envelope. 609 */ 610 pIenv = hFrameData->iEnvelope; 611 612 for (i = 0; i < hFrameData->frameInfo.nEnvelopes; i++) { 613 614 int k, noNoiseFlag; 615 SCHAR noise_e, input_e = SCALE2EXP(sbrScaleFactor->hb_scale); 616 C_ALLOC_SCRATCH_START(pNrgs, ENV_CALC_NRGS, 1); 617 618 /* 619 Helper variables. 620 */ 621 UCHAR start_pos = hHeaderData->timeStep * borders[i]; /* Start-position in time (subband sample) for current envelope. */ 622 UCHAR stop_pos = hHeaderData->timeStep * borders[i+1]; /* Stop-position in time (subband sample) for current envelope. */ 623 UCHAR freq_res = hFrameData->frameInfo.freqRes[i]; /* Frequency resolution for current envelope. */ 624 625 626 /* Always do fully initialize the temporary energy table. This prevents negative energies and extreme gain factors in 627 cases where the number of limiter bands exceeds the number of subbands. The latter can be caused by undetected bit 628 errors and is tested by some streams from the certification set. */ 629 FDKmemclear(pNrgs, sizeof(ENV_CALC_NRGS)); 630 631 /* If the start-pos of the current envelope equals the stop pos of the current 632 noise envelope, increase the pointer (i.e. choose the next noise-floor).*/ 633 if (borders[i] == hFrameData->frameInfo.bordersNoise[envNoise+1]){ 634 noiseLevels += noNoiseBands; /* The noise floor data is stored in a row [noiseFloor1 noiseFloor2...].*/ 635 envNoise++; 636 } 637 638 if(i==hFrameData->frameInfo.tranEnv || i==h_sbr_cal_env->prevTranEnv) /* attack */ 639 { 640 noNoiseFlag = 1; 641 if (!useLP) 642 smooth_length = 0; /* No smoothing on attacks! */ 643 } 644 else { 645 noNoiseFlag = 0; 646 if (!useLP) 647 smooth_length = (1 - hHeaderData->bs_data.smoothingLength) << 2; /* can become either 0 or 4 */ 648 } 649 650 651 /* 652 Energy estimation in transposed highband. 653 */ 654 if (hHeaderData->bs_data.interpolFreq) 655 calcNrgPerSubband(analysBufferReal, 656 (useLP) ? NULL : analysBufferImag, 657 lowSubband, highSubband, 658 start_pos, stop_pos, 659 input_e, 660 pNrgs->nrgEst, 661 pNrgs->nrgEst_e); 662 else 663 calcNrgPerSfb(analysBufferReal, 664 (useLP) ? NULL : analysBufferImag, 665 hFreq->nSfb[freq_res], 666 hFreq->freqBandTable[freq_res], 667 start_pos, stop_pos, 668 input_e, 669 pNrgs->nrgEst, 670 pNrgs->nrgEst_e); 671 672 /* 673 Calculate subband gains 674 */ 675 { 676 UCHAR * table = hFreq->freqBandTable[freq_res]; 677 UCHAR * pUiNoise = &hFreq->freqBandTableNoise[1]; /*! Upper limit of the current noise floor band. */ 678 679 FIXP_SGL * pNoiseLevels = noiseLevels; 680 681 FIXP_DBL tmpNoise = FX_SGL2FX_DBL((FIXP_SGL)((LONG)(*pNoiseLevels) & MASK_M)); 682 SCHAR tmpNoise_e = (UCHAR)((LONG)(*pNoiseLevels++) & MASK_E) - NOISE_EXP_OFFSET; 683 684 int cc = 0; 685 c = 0; 686 for (j = 0; j < hFreq->nSfb[freq_res]; j++) { 687 688 FIXP_DBL refNrg = FX_SGL2FX_DBL((FIXP_SGL)((LONG)(*pIenv) & MASK_M)); 689 SCHAR refNrg_e = (SCHAR)((LONG)(*pIenv) & MASK_E) - NRG_EXP_OFFSET; 690 691 UCHAR sinePresentFlag = 0; 692 int li = table[j]; 693 int ui = table[j+1]; 694 695 for (k=li; k<ui; k++) { 696 sinePresentFlag |= (i >= sineMapped[cc]); 697 cc++; 698 } 699 700 for (k=li; k<ui; k++) { 701 if (k >= *pUiNoise) { 702 tmpNoise = FX_SGL2FX_DBL((FIXP_SGL)((LONG)(*pNoiseLevels) & MASK_M)); 703 tmpNoise_e = (SCHAR)((LONG)(*pNoiseLevels++) & MASK_E) - NOISE_EXP_OFFSET; 704 705 pUiNoise++; 706 } 707 708 FDK_ASSERT(k >= lowSubband); 709 710 if (useLP) 711 useAliasReduction[k-lowSubband] = !sinePresentFlag; 712 713 pNrgs->nrgSine[c] = FL2FXCONST_DBL(0.0f); 714 pNrgs->nrgSine_e[c] = 0; 715 716 calcSubbandGain(refNrg, refNrg_e, pNrgs, c, 717 tmpNoise, tmpNoise_e, 718 sinePresentFlag, i >= sineMapped[c], 719 noNoiseFlag); 720 721 pNrgs->nrgRef[c] = refNrg; 722 pNrgs->nrgRef_e[c] = refNrg_e; 723 724 c++; 725 } 726 pIenv++; 727 } 728 } 729 730 /* 731 Noise limiting 732 */ 733 734 for (c = 0; c < hFreq->noLimiterBands; c++) { 735 736 FIXP_DBL sumRef, boostGain, maxGain; 737 FIXP_DBL accu = FL2FXCONST_DBL(0.0f); 738 SCHAR sumRef_e, boostGain_e, maxGain_e, accu_e = 0; 739 740 calcAvgGain(pNrgs, 741 hFreq->limiterBandTable[c], hFreq->limiterBandTable[c+1], 742 &sumRef, &sumRef_e, 743 &maxGain, &maxGain_e); 744 745 /* Multiply maxGain with limiterGain: */ 746 maxGain = fMult(maxGain, FDK_sbrDecoder_sbr_limGains_m[hHeaderData->bs_data.limiterGains]); 747 maxGain_e += FDK_sbrDecoder_sbr_limGains_e[hHeaderData->bs_data.limiterGains]; 748 749 /* Scale mantissa of MaxGain into range between 0.5 and 1: */ 750 if (maxGain == FL2FXCONST_DBL(0.0f)) 751 maxGain_e = -FRACT_BITS; 752 else { 753 SCHAR charTemp = CountLeadingBits(maxGain); 754 maxGain_e -= charTemp; 755 maxGain <<= (int)charTemp; 756 } 757 758 if (maxGain_e >= maxGainLimit_e) { /* upper limit (e.g. 96 dB) */ 759 maxGain = FL2FXCONST_DBL(0.5f); 760 maxGain_e = maxGainLimit_e; 761 } 762 763 764 /* Every subband gain is compared to the scaled "average gain" 765 and limited if necessary: */ 766 for (k = hFreq->limiterBandTable[c]; k < hFreq->limiterBandTable[c+1]; k++) { 767 if ( (pNrgs->nrgGain_e[k] > maxGain_e) || (pNrgs->nrgGain_e[k] == maxGain_e && pNrgs->nrgGain[k]>maxGain) ) { 768 769 FIXP_DBL noiseAmp; 770 SCHAR noiseAmp_e; 771 772 FDK_divide_MantExp(maxGain, maxGain_e, pNrgs->nrgGain[k], pNrgs->nrgGain_e[k], &noiseAmp, &noiseAmp_e); 773 pNrgs->noiseLevel[k] = fMult(pNrgs->noiseLevel[k],noiseAmp); 774 pNrgs->noiseLevel_e[k] += noiseAmp_e; 775 pNrgs->nrgGain[k] = maxGain; 776 pNrgs->nrgGain_e[k] = maxGain_e; 777 } 778 } 779 780 /* -- Boost gain 781 Calculate and apply boost factor for each limiter band: 782 1. Check how much energy would be present when using the limited gain 783 2. Calculate boost factor by comparison with reference energy 784 3. Apply boost factor to compensate for the energy loss due to limiting 785 */ 786 for (k = hFreq->limiterBandTable[c]; k < hFreq->limiterBandTable[c + 1]; k++) { 787 788 /* 1.a Add energy of adjusted signal (using preliminary gain) */ 789 FIXP_DBL tmp = fMult(pNrgs->nrgGain[k],pNrgs->nrgEst[k]); 790 SCHAR tmp_e = pNrgs->nrgGain_e[k] + pNrgs->nrgEst_e[k]; 791 FDK_add_MantExp(tmp, tmp_e, accu, accu_e, &accu, &accu_e); 792 793 /* 1.b Add sine energy (if present) */ 794 if(pNrgs->nrgSine[k] != FL2FXCONST_DBL(0.0f)) { 795 FDK_add_MantExp(pNrgs->nrgSine[k], pNrgs->nrgSine_e[k], accu, accu_e, &accu, &accu_e); 796 } 797 else { 798 /* 1.c Add noise energy (if present) */ 799 if(noNoiseFlag == 0) { 800 FDK_add_MantExp(pNrgs->noiseLevel[k], pNrgs->noiseLevel_e[k], accu, accu_e, &accu, &accu_e); 801 } 802 } 803 } 804 805 /* 2.a Calculate ratio of wanted energy and accumulated energy */ 806 if (accu == (FIXP_DBL)0) { /* If divisor is 0, limit quotient to +4 dB */ 807 boostGain = FL2FXCONST_DBL(0.6279716f); 808 boostGain_e = 2; 809 } else { 810 INT div_e; 811 boostGain = fDivNorm(sumRef, accu, &div_e); 812 boostGain_e = sumRef_e - accu_e + div_e; 813 } 814 815 816 /* 2.b Result too high? --> Limit the boost factor to +4 dB */ 817 if((boostGain_e > 3) || 818 (boostGain_e == 2 && boostGain > FL2FXCONST_DBL(0.6279716f)) || 819 (boostGain_e == 3 && boostGain > FL2FXCONST_DBL(0.3139858f)) ) 820 { 821 boostGain = FL2FXCONST_DBL(0.6279716f); 822 boostGain_e = 2; 823 } 824 /* 3. Multiply all signal components with the boost factor */ 825 for (k = hFreq->limiterBandTable[c]; k < hFreq->limiterBandTable[c + 1]; k++) { 826 pNrgs->nrgGain[k] = fMultDiv2(pNrgs->nrgGain[k],boostGain); 827 pNrgs->nrgGain_e[k] = pNrgs->nrgGain_e[k] + boostGain_e + 1; 828 829 pNrgs->nrgSine[k] = fMultDiv2(pNrgs->nrgSine[k],boostGain); 830 pNrgs->nrgSine_e[k] = pNrgs->nrgSine_e[k] + boostGain_e + 1; 831 832 pNrgs->noiseLevel[k] = fMultDiv2(pNrgs->noiseLevel[k],boostGain); 833 pNrgs->noiseLevel_e[k] = pNrgs->noiseLevel_e[k] + boostGain_e + 1; 834 } 835 } 836 /* End of noise limiting */ 837 838 if (useLP) 839 aliasingReduction(degreeAlias+lowSubband, 840 pNrgs, 841 useAliasReduction, 842 noSubbands); 843 844 /* For the timeslots within the range for the output frame, 845 use the same scale for the noise levels. 846 Drawback: If the envelope exceeds the frame border, the noise levels 847 will have to be rescaled later to fit final_e of 848 the gain-values. 849 */ 850 noise_e = (start_pos < no_cols) ? adj_e : final_e; 851 852 /* 853 Convert energies to amplitude levels 854 */ 855 for (k=0; k<noSubbands; k++) { 856 FDK_sqrt_MantExp(&pNrgs->nrgSine[k], &pNrgs->nrgSine_e[k], &noise_e); 857 FDK_sqrt_MantExp(&pNrgs->nrgGain[k], &pNrgs->nrgGain_e[k], &pNrgs->nrgGain_e[k]); 858 FDK_sqrt_MantExp(&pNrgs->noiseLevel[k], &pNrgs->noiseLevel_e[k], &noise_e); 859 } 860 861 862 863 /* 864 Apply calculated gains and adaptive noise 865 */ 866 867 /* assembleHfSignals() */ 868 { 869 int scale_change, sc_change; 870 FIXP_SGL smooth_ratio; 871 int filtBufferNoiseShift=0; 872 873 /* Initialize smoothing buffers with the first valid values */ 874 if (h_sbr_cal_env->startUp) 875 { 876 if (!useLP) { 877 h_sbr_cal_env->filtBufferNoise_e = noise_e; 878 879 FDKmemcpy(h_sbr_cal_env->filtBuffer_e, pNrgs->nrgGain_e, noSubbands*sizeof(SCHAR)); 880 FDKmemcpy(h_sbr_cal_env->filtBufferNoise, pNrgs->noiseLevel, noSubbands*sizeof(FIXP_DBL)); 881 FDKmemcpy(h_sbr_cal_env->filtBuffer, pNrgs->nrgGain, noSubbands*sizeof(FIXP_DBL)); 882 883 } 884 h_sbr_cal_env->startUp = 0; 885 } 886 887 if (!useLP) { 888 889 equalizeFiltBufferExp(h_sbr_cal_env->filtBuffer, /* buffered */ 890 h_sbr_cal_env->filtBuffer_e, /* buffered */ 891 pNrgs->nrgGain, /* current */ 892 pNrgs->nrgGain_e, /* current */ 893 noSubbands); 894 895 /* Adapt exponent of buffered noise levels to the current exponent 896 so they can easily be smoothed */ 897 if((h_sbr_cal_env->filtBufferNoise_e - noise_e)>=0) { 898 int shift = fixMin(DFRACT_BITS-1,(int)(h_sbr_cal_env->filtBufferNoise_e - noise_e)); 899 for (k=0; k<noSubbands; k++) 900 h_sbr_cal_env->filtBufferNoise[k] <<= shift; 901 } 902 else { 903 int shift = fixMin(DFRACT_BITS-1,-(int)(h_sbr_cal_env->filtBufferNoise_e - noise_e)); 904 for (k=0; k<noSubbands; k++) 905 h_sbr_cal_env->filtBufferNoise[k] >>= shift; 906 } 907 908 h_sbr_cal_env->filtBufferNoise_e = noise_e; 909 } 910 911 /* find best scaling! */ 912 scale_change = -(DFRACT_BITS-1); 913 for(k=0;k<noSubbands;k++) { 914 scale_change = fixMax(scale_change,(int)pNrgs->nrgGain_e[k]); 915 } 916 sc_change = (start_pos<no_cols)? adj_e - input_e : final_e - input_e; 917 918 if ((scale_change-sc_change+1)<0) 919 scale_change-=(scale_change-sc_change+1); 920 921 scale_change = (scale_change-sc_change)+1; 922 923 for(k=0;k<noSubbands;k++) { 924 int sc = scale_change-pNrgs->nrgGain_e[k] + (sc_change-1); 925 pNrgs->nrgGain[k] >>= sc; 926 pNrgs->nrgGain_e[k] += sc; 927 } 928 929 if (!useLP) { 930 for(k=0;k<noSubbands;k++) { 931 int sc = scale_change-h_sbr_cal_env->filtBuffer_e[k] + (sc_change-1); 932 h_sbr_cal_env->filtBuffer[k] >>= sc; 933 } 934 } 935 936 for (j = start_pos; j < stop_pos; j++) 937 { 938 /* This timeslot is located within the first part of the processing buffer 939 and will be fed into the QMF-synthesis for the current frame. 940 adj_e - input_e 941 This timeslot will not yet be fed into the QMF so we do not care 942 about the adj_e. 943 sc_change = final_e - input_e 944 */ 945 if ( (j==no_cols) && (start_pos<no_cols) ) 946 { 947 int shift = (int) (noise_e - final_e); 948 if (!useLP) 949 filtBufferNoiseShift = shift; /* shifting of h_sbr_cal_env->filtBufferNoise[k] will be applied in function adjustTimeSlotHQ() */ 950 if (shift>=0) { 951 shift = fixMin(DFRACT_BITS-1,shift); 952 for (k=0; k<noSubbands; k++) { 953 pNrgs->nrgSine[k] <<= shift; 954 pNrgs->noiseLevel[k] <<= shift; 955 /* 956 if (!useLP) 957 h_sbr_cal_env->filtBufferNoise[k] <<= shift; 958 */ 959 } 960 } 961 else { 962 shift = fixMin(DFRACT_BITS-1,-shift); 963 for (k=0; k<noSubbands; k++) { 964 pNrgs->nrgSine[k] >>= shift; 965 pNrgs->noiseLevel[k] >>= shift; 966 /* 967 if (!useLP) 968 h_sbr_cal_env->filtBufferNoise[k] >>= shift; 969 */ 970 } 971 } 972 973 /* update noise scaling */ 974 noise_e = final_e; 975 if (!useLP) 976 h_sbr_cal_env->filtBufferNoise_e = noise_e; /* scaling value unused! */ 977 978 /* update gain buffer*/ 979 sc_change -= (final_e - input_e); 980 981 if (sc_change<0) { 982 for(k=0;k<noSubbands;k++) { 983 pNrgs->nrgGain[k] >>= -sc_change; 984 pNrgs->nrgGain_e[k] += -sc_change; 985 } 986 if (!useLP) { 987 for(k=0;k<noSubbands;k++) { 988 h_sbr_cal_env->filtBuffer[k] >>= -sc_change; 989 } 990 } 991 } else { 992 scale_change+=sc_change; 993 } 994 995 } // if 996 997 if (!useLP) { 998 999 /* Prevent the smoothing filter from running on constant levels */ 1000 if (j-start_pos < smooth_length) 1001 smooth_ratio = FDK_sbrDecoder_sbr_smoothFilter[j-start_pos]; 1002 else 1003 smooth_ratio = FL2FXCONST_SGL(0.0f); 1004 1005 adjustTimeSlotHQ(&analysBufferReal[j][lowSubband], 1006 &analysBufferImag[j][lowSubband], 1007 h_sbr_cal_env, 1008 pNrgs, 1009 lowSubband, 1010 noSubbands, 1011 scale_change, 1012 smooth_ratio, 1013 noNoiseFlag, 1014 filtBufferNoiseShift); 1015 } 1016 else 1017 { 1018 if (flags & SBRDEC_ELD_GRID) { 1019 adjustTimeSlot_EldGrid(&analysBufferReal[j][lowSubband], 1020 pNrgs, 1021 &h_sbr_cal_env->harmIndex, 1022 lowSubband, 1023 noSubbands, 1024 scale_change, 1025 noNoiseFlag, 1026 &h_sbr_cal_env->phaseIndex, 1027 EXP2SCALE(adj_e) - sbrScaleFactor->lb_scale); 1028 } else 1029 { 1030 adjustTimeSlotLC(&analysBufferReal[j][lowSubband], 1031 pNrgs, 1032 &h_sbr_cal_env->harmIndex, 1033 lowSubband, 1034 noSubbands, 1035 scale_change, 1036 noNoiseFlag, 1037 &h_sbr_cal_env->phaseIndex); 1038 } 1039 } 1040 } // for 1041 1042 if (!useLP) { 1043 /* Update time-smoothing-buffers for gains and noise levels 1044 The gains and the noise values of the current envelope are copied into the buffer. 1045 This has to be done at the end of each envelope as the values are required for 1046 a smooth transition to the next envelope. */ 1047 FDKmemcpy(h_sbr_cal_env->filtBuffer, pNrgs->nrgGain, noSubbands*sizeof(FIXP_DBL)); 1048 FDKmemcpy(h_sbr_cal_env->filtBuffer_e, pNrgs->nrgGain_e, noSubbands*sizeof(SCHAR)); 1049 FDKmemcpy(h_sbr_cal_env->filtBufferNoise, pNrgs->noiseLevel, noSubbands*sizeof(FIXP_DBL)); 1050 } 1051 1052 } 1053 C_ALLOC_SCRATCH_END(pNrgs, ENV_CALC_NRGS, 1); 1054 } 1055 1056 /* Rescale output samples */ 1057 { 1058 FIXP_DBL maxVal; 1059 int ov_reserve, reserve; 1060 1061 /* Determine headroom in old adjusted samples */ 1062 maxVal = maxSubbandSample( analysBufferReal, 1063 (useLP) ? NULL : analysBufferImag, 1064 lowSubband, 1065 highSubband, 1066 0, 1067 first_start); 1068 1069 ov_reserve = fNorm(maxVal); 1070 1071 /* Determine headroom in new adjusted samples */ 1072 maxVal = maxSubbandSample( analysBufferReal, 1073 (useLP) ? NULL : analysBufferImag, 1074 lowSubband, 1075 highSubband, 1076 first_start, 1077 no_cols); 1078 1079 reserve = fNorm(maxVal); 1080 1081 /* Determine common output exponent */ 1082 if (ov_adj_e - ov_reserve > adj_e - reserve ) /* set output_e to the maximum */ 1083 output_e = ov_adj_e - ov_reserve; 1084 else 1085 output_e = adj_e - reserve; 1086 1087 /* Rescale old samples */ 1088 rescaleSubbandSamples( analysBufferReal, 1089 (useLP) ? NULL : analysBufferImag, 1090 lowSubband, highSubband, 1091 0, first_start, 1092 ov_adj_e - output_e); 1093 1094 /* Rescale new samples */ 1095 rescaleSubbandSamples( analysBufferReal, 1096 (useLP) ? NULL : analysBufferImag, 1097 lowSubband, highSubband, 1098 first_start, no_cols, 1099 adj_e - output_e); 1100 } 1101 1102 /* Update hb_scale */ 1103 sbrScaleFactor->hb_scale = EXP2SCALE(output_e); 1104 1105 /* Save the current final exponent for the next frame: */ 1106 sbrScaleFactor->ov_hb_scale = EXP2SCALE(final_e); 1107 1108 1109 /* We need to remeber to the next frame that the transient 1110 will occur in the first envelope (if tranEnv == nEnvelopes). */ 1111 if(hFrameData->frameInfo.tranEnv == hFrameData->frameInfo.nEnvelopes) 1112 h_sbr_cal_env->prevTranEnv = 0; 1113 else 1114 h_sbr_cal_env->prevTranEnv = -1; 1115 1116 } 1117 1118 1119 /*! 1120 \brief Create envelope instance 1121 1122 Must be called once for each channel before calculateSbrEnvelope() can be used. 1123 1124 \return errorCode, 0 if successful 1125 */ 1126 SBR_ERROR 1127 createSbrEnvelopeCalc (HANDLE_SBR_CALCULATE_ENVELOPE hs, /*!< pointer to envelope instance */ 1128 HANDLE_SBR_HEADER_DATA hHeaderData, /*!< static SBR control data, initialized with defaults */ 1129 const int chan, /*!< Channel for which to assign buffers */ 1130 const UINT flags) 1131 { 1132 SBR_ERROR err = SBRDEC_OK; 1133 int i; 1134 1135 /* Clear previous missing harmonics flags */ 1136 for (i=0; i<(MAX_FREQ_COEFFS+15)>>4; i++) { 1137 hs->harmFlagsPrev[i] = 0; 1138 } 1139 hs->harmIndex = 0; 1140 1141 /* 1142 Setup pointers for time smoothing. 1143 The buffer itself will be initialized later triggered by the startUp-flag. 1144 */ 1145 hs->prevTranEnv = -1; 1146 1147 1148 /* initialization */ 1149 resetSbrEnvelopeCalc(hs); 1150 1151 if (chan==0) { /* do this only once */ 1152 err = resetFreqBandTables(hHeaderData, flags); 1153 } 1154 1155 return err; 1156 } 1157 1158 /*! 1159 \brief Create envelope instance 1160 1161 Must be called once for each channel before calculateSbrEnvelope() can be used. 1162 1163 \return errorCode, 0 if successful 1164 */ 1165 int 1166 deleteSbrEnvelopeCalc (HANDLE_SBR_CALCULATE_ENVELOPE hs) 1167 { 1168 return 0; 1169 } 1170 1171 1172 /*! 1173 \brief Reset envelope instance 1174 1175 This function must be called for each channel on a change of configuration. 1176 Note that resetFreqBandTables should also be called in this case. 1177 1178 \return errorCode, 0 if successful 1179 */ 1180 void 1181 resetSbrEnvelopeCalc (HANDLE_SBR_CALCULATE_ENVELOPE hCalEnv) /*!< pointer to envelope instance */ 1182 { 1183 hCalEnv->phaseIndex = 0; 1184 1185 /* Noise exponent needs to be reset because the output exponent for the next frame depends on it */ 1186 hCalEnv->filtBufferNoise_e = 0; 1187 1188 hCalEnv->startUp = 1; 1189 } 1190 1191 1192 /*! 1193 \brief Equalize exponents of the buffered gain values and the new ones 1194 1195 After equalization of exponents, the FIR-filter addition for smoothing 1196 can be performed. 1197 This function is called once for each envelope before adjusting. 1198 */ 1199 static void equalizeFiltBufferExp(FIXP_DBL *filtBuffer, /*!< bufferd gains */ 1200 SCHAR *filtBuffer_e, /*!< exponents of bufferd gains */ 1201 FIXP_DBL *nrgGain, /*!< gains for current envelope */ 1202 SCHAR *nrgGain_e, /*!< exponents of gains for current envelope */ 1203 int subbands) /*!< Number of QMF subbands */ 1204 { 1205 int band; 1206 int diff; 1207 1208 for (band=0; band<subbands; band++){ 1209 diff = (int) (nrgGain_e[band] - filtBuffer_e[band]); 1210 if (diff>0) { 1211 filtBuffer[band] >>= diff; /* Compensate for the scale change by shifting the mantissa. */ 1212 filtBuffer_e[band] += diff; /* New gain is bigger, use its exponent */ 1213 } 1214 else if (diff<0) { 1215 /* The buffered gains seem to be larger, but maybe there 1216 are some unused bits left in the mantissa */ 1217 1218 int reserve = CntLeadingZeros(fixp_abs(filtBuffer[band]))-1; 1219 1220 if ((-diff) <= reserve) { 1221 /* There is enough space in the buffered mantissa so 1222 that we can take the new exponent as common. 1223 */ 1224 filtBuffer[band] <<= (-diff); 1225 filtBuffer_e[band] += diff; /* becomes equal to *ptrNewExp */ 1226 } 1227 else { 1228 filtBuffer[band] <<= reserve; /* Shift the mantissa as far as possible: */ 1229 filtBuffer_e[band] -= reserve; /* Compensate in the exponent: */ 1230 1231 /* For the remaining difference, change the new gain value */ 1232 diff = fixMin(-(reserve + diff),DFRACT_BITS-1); 1233 nrgGain[band] >>= diff; 1234 nrgGain_e[band] += diff; 1235 } 1236 } 1237 } 1238 } 1239 1240 /*! 1241 \brief Shift left the mantissas of all subband samples 1242 in the giventime and frequency range by the specified number of bits. 1243 1244 This function is used to rescale the audio data in the overlap buffer 1245 which has already been envelope adjusted with the last frame. 1246 */ 1247 void rescaleSubbandSamples(FIXP_DBL ** re, /*!< Real part of input and output subband samples */ 1248 FIXP_DBL ** im, /*!< Imaginary part of input and output subband samples */ 1249 int lowSubband, /*!< Begin of frequency range to process */ 1250 int highSubband, /*!< End of frequency range to process */ 1251 int start_pos, /*!< Begin of time rage (QMF-timeslot) */ 1252 int next_pos, /*!< End of time rage (QMF-timeslot) */ 1253 int shift) /*!< number of bits to shift */ 1254 { 1255 int width = highSubband-lowSubband; 1256 1257 if ( (width > 0) && (shift!=0) ) { 1258 if (im!=NULL) { 1259 for (int l=start_pos; l<next_pos; l++) { 1260 scaleValues(&re[l][lowSubband], width, shift); 1261 scaleValues(&im[l][lowSubband], width, shift); 1262 } 1263 } else 1264 { 1265 for (int l=start_pos; l<next_pos; l++) { 1266 scaleValues(&re[l][lowSubband], width, shift); 1267 } 1268 } 1269 } 1270 } 1271 1272 1273 /*! 1274 \brief Determine headroom for shifting 1275 1276 Determine by how much the spectrum can be shifted left 1277 for better accuracy in later processing. 1278 1279 \return Number of free bits in the biggest spectral value 1280 */ 1281 1282 FIXP_DBL maxSubbandSample( FIXP_DBL ** re, /*!< Real part of input and output subband samples */ 1283 FIXP_DBL ** im, /*!< Real part of input and output subband samples */ 1284 int lowSubband, /*!< Begin of frequency range to process */ 1285 int highSubband, /*!< Number of QMF bands to process */ 1286 int start_pos, /*!< Begin of time rage (QMF-timeslot) */ 1287 int next_pos /*!< End of time rage (QMF-timeslot) */ 1288 ) 1289 { 1290 FIXP_DBL maxVal = FL2FX_DBL(0.0f); 1291 unsigned int width = highSubband - lowSubband; 1292 1293 FDK_ASSERT(width <= (64)); 1294 1295 if ( width > 0 ) { 1296 if (im!=NULL) 1297 { 1298 for (int l=start_pos; l<next_pos; l++) 1299 { 1300 #ifdef FUNCTION_FDK_get_maxval 1301 maxVal = FDK_get_maxval(maxVal, &re[l][lowSubband], &im[l][lowSubband], width); 1302 #else 1303 int k=width; 1304 FIXP_DBL *reTmp = &re[l][lowSubband]; 1305 FIXP_DBL *imTmp = &im[l][lowSubband]; 1306 do{ 1307 FIXP_DBL tmp1 = *(reTmp++); 1308 FIXP_DBL tmp2 = *(imTmp++); 1309 maxVal |= (FIXP_DBL)((LONG)(tmp1)^((LONG)tmp1>>(DFRACT_BITS-1))); 1310 maxVal |= (FIXP_DBL)((LONG)(tmp2)^((LONG)tmp2>>(DFRACT_BITS-1))); 1311 } while(--k!=0); 1312 #endif 1313 } 1314 } else 1315 { 1316 for (int l=start_pos; l<next_pos; l++) { 1317 int k=width; 1318 FIXP_DBL *reTmp = &re[l][lowSubband]; 1319 do{ 1320 FIXP_DBL tmp = *(reTmp++); 1321 maxVal |= (FIXP_DBL)((LONG)(tmp)^((LONG)tmp>>(DFRACT_BITS-1))); 1322 }while(--k!=0); 1323 } 1324 } 1325 } 1326 1327 return(maxVal); 1328 } 1329 1330 #define SHIFT_BEFORE_SQUARE (3) /* (7/2) */ 1331 /*!< 1332 If the accumulator does not provide enough overflow bits or 1333 does not provide a high dynamic range, the below energy calculation 1334 requires an additional shift operation for each sample. 1335 On the other hand, doing the shift allows using a single-precision 1336 multiplication for the square (at least 16bit x 16bit). 1337 For even values of OVRFLW_BITS (0, 2, 4, 6), saturated arithmetic 1338 is required for the energy accumulation. 1339 Theoretically, the sample-squares can sum up to a value of 76, 1340 requiring 7 overflow bits. However since such situations are *very* 1341 rare, accu can be limited to 64. 1342 In case native saturated arithmetic is not available, overflows 1343 can be prevented by replacing the above #define by 1344 #define SHIFT_BEFORE_SQUARE ((8 - OVRFLW_BITS) / 2) 1345 which will result in slightly reduced accuracy. 1346 */ 1347 1348 /*! 1349 \brief Estimates the mean energy of each filter-bank channel for the 1350 duration of the current envelope 1351 1352 This function is used when interpolFreq is true. 1353 */ 1354 static void calcNrgPerSubband(FIXP_DBL **analysBufferReal, /*!< Real part of subband samples */ 1355 FIXP_DBL **analysBufferImag, /*!< Imaginary part of subband samples */ 1356 int lowSubband, /*!< Begin of the SBR frequency range */ 1357 int highSubband, /*!< High end of the SBR frequency range */ 1358 int start_pos, /*!< First QMF-slot of current envelope */ 1359 int next_pos, /*!< Last QMF-slot of current envelope + 1 */ 1360 SCHAR frameExp, /*!< Common exponent for all input samples */ 1361 FIXP_DBL *nrgEst, /*!< resulting Energy (0..1) */ 1362 SCHAR *nrgEst_e ) /*!< Exponent of resulting Energy */ 1363 { 1364 FIXP_SGL invWidth; 1365 SCHAR preShift; 1366 SCHAR shift; 1367 FIXP_DBL sum; 1368 int k,l; 1369 1370 /* Divide by width of envelope later: */ 1371 invWidth = FX_DBL2FX_SGL(GetInvInt(next_pos - start_pos)); 1372 /* The common exponent needs to be doubled because all mantissas are squared: */ 1373 frameExp = frameExp << 1; 1374 1375 for (k=lowSubband; k<highSubband; k++) { 1376 FIXP_DBL bufferReal[(((1024)/(32))+(6))]; 1377 FIXP_DBL bufferImag[(((1024)/(32))+(6))]; 1378 FIXP_DBL maxVal = FL2FX_DBL(0.0f); 1379 1380 if (analysBufferImag!=NULL) 1381 { 1382 for (l=start_pos;l<next_pos;l++) 1383 { 1384 bufferImag[l] = analysBufferImag[l][k]; 1385 maxVal |= (FIXP_DBL)((LONG)(bufferImag[l])^((LONG)bufferImag[l]>>(DFRACT_BITS-1))); 1386 bufferReal[l] = analysBufferReal[l][k]; 1387 maxVal |= (FIXP_DBL)((LONG)(bufferReal[l])^((LONG)bufferReal[l]>>(DFRACT_BITS-1))); 1388 } 1389 } 1390 else 1391 { 1392 for (l=start_pos;l<next_pos;l++) 1393 { 1394 bufferReal[l] = analysBufferReal[l][k]; 1395 maxVal |= (FIXP_DBL)((LONG)(bufferReal[l])^((LONG)bufferReal[l]>>(DFRACT_BITS-1))); 1396 } 1397 } 1398 1399 if (maxVal!=FL2FXCONST_DBL(0.f)) { 1400 1401 1402 /* If the accu does not provide enough overflow bits, we cannot 1403 shift the samples up to the limit. 1404 Instead, keep up to 3 free bits in each sample, i.e. up to 1405 6 bits after calculation of square. 1406 Please note the comment on saturated arithmetic above! 1407 */ 1408 FIXP_DBL accu = FL2FXCONST_DBL(0.0f); 1409 preShift = CntLeadingZeros(maxVal)-1; 1410 preShift -= SHIFT_BEFORE_SQUARE; 1411 1412 if (preShift>=0) { 1413 if (analysBufferImag!=NULL) { 1414 for (l=start_pos; l<next_pos; l++) { 1415 FIXP_DBL temp1 = bufferReal[l] << (int)preShift; 1416 FIXP_DBL temp2 = bufferImag[l] << (int)preShift; 1417 accu = fPow2AddDiv2(accu, temp1); 1418 accu = fPow2AddDiv2(accu, temp2); 1419 } 1420 } else 1421 { 1422 for (l=start_pos; l<next_pos; l++) { 1423 FIXP_DBL temp = bufferReal[l] << (int)preShift; 1424 accu = fPow2AddDiv2(accu, temp); 1425 } 1426 } 1427 } 1428 else { /* if negative shift value */ 1429 int negpreShift = -preShift; 1430 if (analysBufferImag!=NULL) { 1431 for (l=start_pos; l<next_pos; l++) { 1432 FIXP_DBL temp1 = bufferReal[l] >> (int)negpreShift; 1433 FIXP_DBL temp2 = bufferImag[l] >> (int)negpreShift; 1434 accu = fPow2AddDiv2(accu, temp1); 1435 accu = fPow2AddDiv2(accu, temp2); 1436 } 1437 } else 1438 { 1439 for (l=start_pos; l<next_pos; l++) { 1440 FIXP_DBL temp = bufferReal[l] >> (int)negpreShift; 1441 accu = fPow2AddDiv2(accu, temp); 1442 } 1443 } 1444 } 1445 accu <<= 1; 1446 1447 /* Convert double precision to Mantissa/Exponent: */ 1448 shift = fNorm(accu); 1449 sum = accu << (int)shift; 1450 1451 /* Divide by width of envelope and apply frame scale: */ 1452 *nrgEst++ = fMult(sum, invWidth); 1453 shift += 2 * preShift; 1454 if (analysBufferImag!=NULL) 1455 *nrgEst_e++ = frameExp - shift; 1456 else 1457 *nrgEst_e++ = frameExp - shift + 1; /* +1 due to missing imag. part */ 1458 } /* maxVal!=0 */ 1459 else { 1460 1461 /* Prevent a zero-mantissa-number from being misinterpreted 1462 due to its exponent. */ 1463 *nrgEst++ = FL2FXCONST_DBL(0.0f); 1464 *nrgEst_e++ = 0; 1465 } 1466 } 1467 } 1468 1469 /*! 1470 \brief Estimates the mean energy of each Scale factor band for the 1471 duration of the current envelope. 1472 1473 This function is used when interpolFreq is false. 1474 */ 1475 static void calcNrgPerSfb(FIXP_DBL **analysBufferReal, /*!< Real part of subband samples */ 1476 FIXP_DBL **analysBufferImag, /*!< Imaginary part of subband samples */ 1477 int nSfb, /*!< Number of scale factor bands */ 1478 UCHAR *freqBandTable, /*!< First Subband for each Sfb */ 1479 int start_pos, /*!< First QMF-slot of current envelope */ 1480 int next_pos, /*!< Last QMF-slot of current envelope + 1 */ 1481 SCHAR input_e, /*!< Common exponent for all input samples */ 1482 FIXP_DBL *nrgEst, /*!< resulting Energy (0..1) */ 1483 SCHAR *nrgEst_e ) /*!< Exponent of resulting Energy */ 1484 { 1485 FIXP_SGL invWidth; 1486 FIXP_DBL temp; 1487 SCHAR preShift; 1488 SCHAR shift, sum_e; 1489 FIXP_DBL sum; 1490 1491 int j,k,l,li,ui; 1492 FIXP_DBL sumAll, sumLine; /* Single precision would be sufficient, 1493 but overflow bits are required for accumulation */ 1494 1495 /* Divide by width of envelope later: */ 1496 invWidth = FX_DBL2FX_SGL(GetInvInt(next_pos - start_pos)); 1497 /* The common exponent needs to be doubled because all mantissas are squared: */ 1498 input_e = input_e << 1; 1499 1500 for(j=0; j<nSfb; j++) { 1501 li = freqBandTable[j]; 1502 ui = freqBandTable[j+1]; 1503 1504 FIXP_DBL maxVal = maxSubbandSample( analysBufferReal, 1505 analysBufferImag, 1506 li, 1507 ui, 1508 start_pos, 1509 next_pos ); 1510 1511 if (maxVal!=FL2FXCONST_DBL(0.f)) { 1512 1513 preShift = CntLeadingZeros(maxVal)-1; 1514 1515 /* If the accu does not provide enough overflow bits, we cannot 1516 shift the samples up to the limit. 1517 Instead, keep up to 3 free bits in each sample, i.e. up to 1518 6 bits after calculation of square. 1519 Please note the comment on saturated arithmetic above! 1520 */ 1521 preShift -= SHIFT_BEFORE_SQUARE; 1522 1523 sumAll = FL2FXCONST_DBL(0.0f); 1524 1525 1526 for (k=li; k<ui; k++) { 1527 1528 sumLine = FL2FXCONST_DBL(0.0f); 1529 1530 if (analysBufferImag!=NULL) { 1531 if (preShift>=0) { 1532 for (l=start_pos; l<next_pos; l++) { 1533 temp = analysBufferReal[l][k] << (int)preShift; 1534 sumLine += fPow2Div2(temp); 1535 temp = analysBufferImag[l][k] << (int)preShift; 1536 sumLine += fPow2Div2(temp); 1537 1538 } 1539 } else { 1540 for (l=start_pos; l<next_pos; l++) { 1541 temp = analysBufferReal[l][k] >> -(int)preShift; 1542 sumLine += fPow2Div2(temp); 1543 temp = analysBufferImag[l][k] >> -(int)preShift; 1544 sumLine += fPow2Div2(temp); 1545 } 1546 } 1547 } else 1548 { 1549 if (preShift>=0) { 1550 for (l=start_pos; l<next_pos; l++) { 1551 temp = analysBufferReal[l][k] << (int)preShift; 1552 sumLine += fPow2Div2(temp); 1553 } 1554 } else { 1555 for (l=start_pos; l<next_pos; l++) { 1556 temp = analysBufferReal[l][k] >> -(int)preShift; 1557 sumLine += fPow2Div2(temp); 1558 } 1559 } 1560 } 1561 1562 /* The number of QMF-channels per SBR bands may be up to 15. 1563 Shift right to avoid overflows in sum over all channels. */ 1564 sumLine = sumLine >> (4-1); 1565 sumAll += sumLine; 1566 } 1567 1568 /* Convert double precision to Mantissa/Exponent: */ 1569 shift = fNorm(sumAll); 1570 sum = sumAll << (int)shift; 1571 1572 /* Divide by width of envelope: */ 1573 sum = fMult(sum,invWidth); 1574 1575 /* Divide by width of Sfb: */ 1576 sum = fMult(sum, FX_DBL2FX_SGL(GetInvInt(ui-li))); 1577 1578 /* Set all Subband energies in the Sfb to the average energy: */ 1579 if (analysBufferImag!=NULL) 1580 sum_e = input_e + 4 - shift; /* -4 to compensate right-shift */ 1581 else 1582 sum_e = input_e + 4 + 1 - shift; /* -4 to compensate right-shift; +1 due to missing imag. part */ 1583 1584 sum_e -= 2 * preShift; 1585 } /* maxVal!=0 */ 1586 else { 1587 1588 /* Prevent a zero-mantissa-number from being misinterpreted 1589 due to its exponent. */ 1590 sum = FL2FXCONST_DBL(0.0f); 1591 sum_e = 0; 1592 } 1593 1594 for (k=li; k<ui; k++) 1595 { 1596 *nrgEst++ = sum; 1597 *nrgEst_e++ = sum_e; 1598 } 1599 } 1600 } 1601 1602 1603 /*! 1604 \brief Calculate gain, noise, and additional sine level for one subband. 1605 1606 The resulting energy gain is given by mantissa and exponent. 1607 */ 1608 static void calcSubbandGain(FIXP_DBL nrgRef, /*!< Reference Energy according to envelope data */ 1609 SCHAR nrgRef_e, /*!< Reference Energy according to envelope data (exponent) */ 1610 ENV_CALC_NRGS* nrgs, 1611 int i, 1612 FIXP_DBL tmpNoise, /*!< Relative noise level */ 1613 SCHAR tmpNoise_e, /*!< Relative noise level (exponent) */ 1614 UCHAR sinePresentFlag, /*!< Indicates if sine is present on band */ 1615 UCHAR sineMapped, /*!< Indicates if sine must be added */ 1616 int noNoiseFlag) /*!< Flag to suppress noise addition */ 1617 { 1618 FIXP_DBL nrgEst = nrgs->nrgEst[i]; /*!< Energy in transposed signal */ 1619 SCHAR nrgEst_e = nrgs->nrgEst_e[i]; /*!< Energy in transposed signal (exponent) */ 1620 FIXP_DBL *ptrNrgGain = &nrgs->nrgGain[i]; /*!< Resulting energy gain */ 1621 SCHAR *ptrNrgGain_e = &nrgs->nrgGain_e[i]; /*!< Resulting energy gain (exponent) */ 1622 FIXP_DBL *ptrNoiseLevel = &nrgs->noiseLevel[i]; /*!< Resulting absolute noise energy */ 1623 SCHAR *ptrNoiseLevel_e = &nrgs->noiseLevel_e[i]; /*!< Resulting absolute noise energy (exponent) */ 1624 FIXP_DBL *ptrNrgSine = &nrgs->nrgSine[i]; /*!< Additional sine energy */ 1625 SCHAR *ptrNrgSine_e = &nrgs->nrgSine_e[i]; /*!< Additional sine energy (exponent) */ 1626 1627 FIXP_DBL a, b, c; 1628 SCHAR a_e, b_e, c_e; 1629 1630 /* 1631 This addition of 1 prevents divisions by zero in the reference code. 1632 For very small energies in nrgEst, it prevents the gains from becoming 1633 very high which could cause some trouble due to the smoothing. 1634 */ 1635 b_e = (int)(nrgEst_e - 1); 1636 if (b_e>=0) { 1637 nrgEst = (FL2FXCONST_DBL(0.5f) >> (INT)fixMin(b_e+1,DFRACT_BITS-1)) + (nrgEst >> 1); 1638 nrgEst_e += 1; /* shift by 1 bit to avoid overflow */ 1639 1640 } else { 1641 nrgEst = (nrgEst >> (INT)(fixMin(-b_e+1,DFRACT_BITS-1))) + (FL2FXCONST_DBL(0.5f) >> 1); 1642 nrgEst_e = 2; /* shift by 1 bit to avoid overflow */ 1643 } 1644 1645 /* A = NrgRef * TmpNoise */ 1646 a = fMult(nrgRef,tmpNoise); 1647 a_e = nrgRef_e + tmpNoise_e; 1648 1649 /* B = 1 + TmpNoise */ 1650 b_e = (int)(tmpNoise_e - 1); 1651 if (b_e>=0) { 1652 b = (FL2FXCONST_DBL(0.5f) >> (INT)fixMin(b_e+1,DFRACT_BITS-1)) + (tmpNoise >> 1); 1653 b_e = tmpNoise_e + 1; /* shift by 1 bit to avoid overflow */ 1654 } else { 1655 b = (tmpNoise >> (INT)(fixMin(-b_e+1,DFRACT_BITS-1))) + (FL2FXCONST_DBL(0.5f) >> 1); 1656 b_e = 2; /* shift by 1 bit to avoid overflow */ 1657 } 1658 1659 /* noiseLevel = A / B = (NrgRef * TmpNoise) / (1 + TmpNoise) */ 1660 FDK_divide_MantExp( a, a_e, 1661 b, b_e, 1662 ptrNoiseLevel, ptrNoiseLevel_e); 1663 1664 if (sinePresentFlag) { 1665 1666 /* C = (1 + TmpNoise) * NrgEst */ 1667 c = fMult(b,nrgEst); 1668 c_e = b_e + nrgEst_e; 1669 1670 /* gain = A / C = (NrgRef * TmpNoise) / (1 + TmpNoise) * NrgEst */ 1671 FDK_divide_MantExp( a, a_e, 1672 c, c_e, 1673 ptrNrgGain, ptrNrgGain_e); 1674 1675 if (sineMapped) { 1676 1677 /* sineLevel = nrgRef/ (1 + TmpNoise) */ 1678 FDK_divide_MantExp( nrgRef, nrgRef_e, 1679 b, b_e, 1680 ptrNrgSine, ptrNrgSine_e); 1681 } 1682 } 1683 else { 1684 if (noNoiseFlag) { 1685 /* B = NrgEst */ 1686 b = nrgEst; 1687 b_e = nrgEst_e; 1688 } 1689 else { 1690 /* B = NrgEst * (1 + TmpNoise) */ 1691 b = fMult(b,nrgEst); 1692 b_e = b_e + nrgEst_e; 1693 } 1694 1695 1696 /* gain = nrgRef / B */ 1697 FDK_divide_MantExp( nrgRef, nrgRef_e, 1698 b, b_e, 1699 ptrNrgGain, ptrNrgGain_e); 1700 } 1701 } 1702 1703 1704 /*! 1705 \brief Calculate "average gain" for the specified subband range. 1706 1707 This is rather a gain of the average magnitude than the average 1708 of gains! 1709 The result is used as a relative limit for all gains within the 1710 current "limiter band" (a certain frequency range). 1711 */ 1712 static void calcAvgGain(ENV_CALC_NRGS* nrgs, 1713 int lowSubband, /*!< Begin of the limiter band */ 1714 int highSubband, /*!< High end of the limiter band */ 1715 FIXP_DBL *ptrSumRef, 1716 SCHAR *ptrSumRef_e, 1717 FIXP_DBL *ptrAvgGain, /*!< Resulting overall gain (mantissa) */ 1718 SCHAR *ptrAvgGain_e) /*!< Resulting overall gain (exponent) */ 1719 { 1720 FIXP_DBL *nrgRef = nrgs->nrgRef; /*!< Reference Energy according to envelope data */ 1721 SCHAR *nrgRef_e = nrgs->nrgRef_e; /*!< Reference Energy according to envelope data (exponent) */ 1722 FIXP_DBL *nrgEst = nrgs->nrgEst; /*!< Energy in transposed signal */ 1723 SCHAR *nrgEst_e = nrgs->nrgEst_e; /*!< Energy in transposed signal (exponent) */ 1724 1725 FIXP_DBL sumRef = 1; 1726 FIXP_DBL sumEst = 1; 1727 SCHAR sumRef_e = -FRACT_BITS; 1728 SCHAR sumEst_e = -FRACT_BITS; 1729 int k; 1730 1731 for (k=lowSubband; k<highSubband; k++){ 1732 /* Add nrgRef[k] to sumRef: */ 1733 FDK_add_MantExp( sumRef, sumRef_e, 1734 nrgRef[k], nrgRef_e[k], 1735 &sumRef, &sumRef_e ); 1736 1737 /* Add nrgEst[k] to sumEst: */ 1738 FDK_add_MantExp( sumEst, sumEst_e, 1739 nrgEst[k], nrgEst_e[k], 1740 &sumEst, &sumEst_e ); 1741 } 1742 1743 FDK_divide_MantExp(sumRef, sumRef_e, 1744 sumEst, sumEst_e, 1745 ptrAvgGain, ptrAvgGain_e); 1746 1747 *ptrSumRef = sumRef; 1748 *ptrSumRef_e = sumRef_e; 1749 } 1750 1751 static void adjustTimeSlot_EldGrid( 1752 FIXP_DBL *ptrReal, /*!< Subband samples to be adjusted, real part */ 1753 ENV_CALC_NRGS* nrgs, 1754 UCHAR *ptrHarmIndex, /*!< Harmonic index */ 1755 int lowSubband, /*!< Lowest QMF-channel in the currently used SBR range. */ 1756 int noSubbands, /*!< Number of QMF subbands */ 1757 int scale_change, /*!< Number of bits to shift adjusted samples */ 1758 int noNoiseFlag, /*!< Flag to suppress noise addition */ 1759 int *ptrPhaseIndex, /*!< Start index to random number array */ 1760 int scale_diff_low) /*!< */ 1761 { 1762 int k; 1763 FIXP_DBL signalReal, sbNoise; 1764 int tone_count = 0; 1765 1766 FIXP_DBL *pGain = nrgs->nrgGain; /*!< Gains of current envelope */ 1767 FIXP_DBL *pNoiseLevel = nrgs->noiseLevel; /*!< Noise levels of current envelope */ 1768 FIXP_DBL *pSineLevel = nrgs->nrgSine; /*!< Sine levels */ 1769 1770 int phaseIndex = *ptrPhaseIndex; 1771 UCHAR harmIndex = *ptrHarmIndex; 1772 1773 static const INT harmonicPhase [2][4] = { 1774 { 1, 0, -1, 0}, 1775 { 0, 1, 0, -1} 1776 }; 1777 1778 static const FIXP_DBL harmonicPhaseX [2][4] = { 1779 { FL2FXCONST_DBL(2.0*1.245183154539139e-001), FL2FXCONST_DBL(2.0*-1.123767859325028e-001), FL2FXCONST_DBL(2.0*-1.245183154539139e-001), FL2FXCONST_DBL(2.0* 1.123767859325028e-001) }, 1780 { FL2FXCONST_DBL(2.0*1.245183154539139e-001), FL2FXCONST_DBL(2.0* 1.123767859325028e-001), FL2FXCONST_DBL(2.0*-1.245183154539139e-001), FL2FXCONST_DBL(2.0*-1.123767859325028e-001) } 1781 }; 1782 1783 for (k=0; k < noSubbands; k++) { 1784 1785 phaseIndex = (phaseIndex + 1) & (SBR_NF_NO_RANDOM_VAL - 1); 1786 1787 if( (pSineLevel[0] != FL2FXCONST_DBL(0.0f)) || (noNoiseFlag == 1) ){ 1788 sbNoise = FL2FXCONST_DBL(0.0f); 1789 } else { 1790 sbNoise = pNoiseLevel[0]; 1791 } 1792 1793 signalReal = fMultDiv2(*ptrReal,*pGain) << ((int)scale_change); 1794 1795 signalReal += (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[phaseIndex][0], sbNoise)<<4); 1796 1797 signalReal += pSineLevel[0] * harmonicPhase[0][harmIndex]; 1798 1799 *ptrReal = signalReal; 1800 1801 if (k == 0) { 1802 *(ptrReal-1) += scaleValue(fMultDiv2(harmonicPhaseX[lowSubband&1][harmIndex], pSineLevel[0]), -scale_diff_low) ; 1803 if (k < noSubbands - 1) { 1804 *(ptrReal) += fMultDiv2(pSineLevel[1], harmonicPhaseX[(lowSubband+1)&1][harmIndex]); 1805 } 1806 } 1807 if (k > 0 && k < noSubbands - 1 && tone_count < 16) { 1808 *(ptrReal) += fMultDiv2(pSineLevel[- 1], harmonicPhaseX [(lowSubband+k)&1] [harmIndex]); 1809 *(ptrReal) += fMultDiv2(pSineLevel[+ 1], harmonicPhaseX [(lowSubband+k+1)&1][harmIndex]); 1810 } 1811 if (k == noSubbands - 1 && tone_count < 16) { 1812 if (k > 0) { 1813 *(ptrReal) += fMultDiv2(pSineLevel[- 1], harmonicPhaseX [(lowSubband+k)&1][harmIndex]); 1814 } 1815 if (k + lowSubband + 1< 63) { 1816 *(ptrReal+1) += fMultDiv2(pSineLevel[0], harmonicPhaseX[(lowSubband+k+1)&1][harmIndex]); 1817 } 1818 } 1819 1820 if(pSineLevel[0] != FL2FXCONST_DBL(0.0f)){ 1821 tone_count++; 1822 } 1823 ptrReal++; 1824 pNoiseLevel++; 1825 pGain++; 1826 pSineLevel++; 1827 } 1828 1829 *ptrHarmIndex = (harmIndex + 1) & 3; 1830 *ptrPhaseIndex = phaseIndex & (SBR_NF_NO_RANDOM_VAL - 1); 1831 } 1832 1833 /*! 1834 \brief Amplify one timeslot of the signal with the calculated gains 1835 and add the noisefloor. 1836 */ 1837 1838 static void adjustTimeSlotLC(FIXP_DBL *ptrReal, /*!< Subband samples to be adjusted, real part */ 1839 ENV_CALC_NRGS* nrgs, 1840 UCHAR *ptrHarmIndex, /*!< Harmonic index */ 1841 int lowSubband, /*!< Lowest QMF-channel in the currently used SBR range. */ 1842 int noSubbands, /*!< Number of QMF subbands */ 1843 int scale_change, /*!< Number of bits to shift adjusted samples */ 1844 int noNoiseFlag, /*!< Flag to suppress noise addition */ 1845 int *ptrPhaseIndex) /*!< Start index to random number array */ 1846 { 1847 FIXP_DBL *pGain = nrgs->nrgGain; /*!< Gains of current envelope */ 1848 FIXP_DBL *pNoiseLevel = nrgs->noiseLevel; /*!< Noise levels of current envelope */ 1849 FIXP_DBL *pSineLevel = nrgs->nrgSine; /*!< Sine levels */ 1850 1851 int k; 1852 int index = *ptrPhaseIndex; 1853 UCHAR harmIndex = *ptrHarmIndex; 1854 UCHAR freqInvFlag = (lowSubband & 1); 1855 FIXP_DBL signalReal, sineLevel, sineLevelNext, sineLevelPrev; 1856 int tone_count = 0; 1857 int sineSign = 1; 1858 1859 #define C1 ((FIXP_SGL)FL2FXCONST_SGL(2.f*0.00815f)) 1860 #define C1_CLDFB ((FIXP_SGL)FL2FXCONST_SGL(2.f*0.16773f)) 1861 1862 /* 1863 First pass for k=0 pulled out of the loop: 1864 */ 1865 1866 index = (index + 1) & (SBR_NF_NO_RANDOM_VAL - 1); 1867 1868 /* 1869 The next multiplication constitutes the actual envelope adjustment 1870 of the signal and should be carried out with full accuracy 1871 (supplying #FRACT_BITS valid bits). 1872 */ 1873 signalReal = fMultDiv2(*ptrReal,*pGain++) << ((int)scale_change); 1874 sineLevel = *pSineLevel++; 1875 sineLevelNext = (noSubbands > 1) ? pSineLevel[0] : FL2FXCONST_DBL(0.0f); 1876 1877 if (sineLevel!=FL2FXCONST_DBL(0.0f)) tone_count++; 1878 else if (!noNoiseFlag) 1879 /* Add noisefloor to the amplified signal */ 1880 signalReal += (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0])<<4); 1881 1882 { 1883 if (!(harmIndex&0x1)) { 1884 /* harmIndex 0,2 */ 1885 signalReal += (harmIndex&0x2) ? -sineLevel : sineLevel; 1886 *ptrReal++ = signalReal; 1887 } 1888 else { 1889 /* harmIndex 1,3 in combination with freqInvFlag */ 1890 int shift = (int) (scale_change+1); 1891 shift = (shift>=0) ? fixMin(DFRACT_BITS-1,shift) : fixMax(-(DFRACT_BITS-1),shift); 1892 1893 FIXP_DBL tmp1 = (shift>=0) ? ( fMultDiv2(C1, sineLevel) >> shift ) 1894 : ( fMultDiv2(C1, sineLevel) << (-shift) ); 1895 FIXP_DBL tmp2 = fMultDiv2(C1, sineLevelNext); 1896 1897 1898 /* save switch and compare operations and reduce to XOR statement */ 1899 if ( ((harmIndex>>1)&0x1)^freqInvFlag) { 1900 *(ptrReal-1) += tmp1; 1901 signalReal -= tmp2; 1902 } else { 1903 *(ptrReal-1) -= tmp1; 1904 signalReal += tmp2; 1905 } 1906 *ptrReal++ = signalReal; 1907 freqInvFlag = !freqInvFlag; 1908 } 1909 } 1910 1911 pNoiseLevel++; 1912 1913 if ( noSubbands > 2 ) { 1914 if (!(harmIndex&0x1)) { 1915 /* harmIndex 0,2 */ 1916 if(!harmIndex) 1917 { 1918 sineSign = 0; 1919 } 1920 1921 for (k=noSubbands-2; k!=0; k--) { 1922 FIXP_DBL sinelevel = *pSineLevel++; 1923 index++; 1924 if (((signalReal = (sineSign ? -sinelevel : sinelevel)) == FL2FXCONST_DBL(0.0f)) && !noNoiseFlag) 1925 { 1926 /* Add noisefloor to the amplified signal */ 1927 index &= (SBR_NF_NO_RANDOM_VAL - 1); 1928 signalReal += (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0])<<4); 1929 } 1930 1931 /* The next multiplication constitutes the actual envelope adjustment of the signal. */ 1932 signalReal += fMultDiv2(*ptrReal,*pGain++) << ((int)scale_change); 1933 1934 pNoiseLevel++; 1935 *ptrReal++ = signalReal; 1936 } /* for ... */ 1937 } 1938 else { 1939 /* harmIndex 1,3 in combination with freqInvFlag */ 1940 if (harmIndex==1) freqInvFlag = !freqInvFlag; 1941 1942 for (k=noSubbands-2; k!=0; k--) { 1943 index++; 1944 /* The next multiplication constitutes the actual envelope adjustment of the signal. */ 1945 signalReal = fMultDiv2(*ptrReal,*pGain++) << ((int)scale_change); 1946 1947 if (*pSineLevel++!=FL2FXCONST_DBL(0.0f)) tone_count++; 1948 else if (!noNoiseFlag) { 1949 /* Add noisefloor to the amplified signal */ 1950 index &= (SBR_NF_NO_RANDOM_VAL - 1); 1951 signalReal += (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0])<<4); 1952 } 1953 1954 pNoiseLevel++; 1955 1956 if (tone_count <= 16) { 1957 FIXP_DBL addSine = fMultDiv2((pSineLevel[-2] - pSineLevel[0]), C1); 1958 signalReal += (freqInvFlag) ? (-addSine) : (addSine); 1959 } 1960 1961 *ptrReal++ = signalReal; 1962 freqInvFlag = !freqInvFlag; 1963 } /* for ... */ 1964 } 1965 } 1966 1967 if (noSubbands > -1) { 1968 index++; 1969 /* The next multiplication constitutes the actual envelope adjustment of the signal. */ 1970 signalReal = fMultDiv2(*ptrReal,*pGain) << ((int)scale_change); 1971 sineLevelPrev = fMultDiv2(pSineLevel[-1],FL2FX_SGL(0.0163f)); 1972 sineLevel = pSineLevel[0]; 1973 1974 if (pSineLevel[0]!=FL2FXCONST_DBL(0.0f)) tone_count++; 1975 else if (!noNoiseFlag) { 1976 /* Add noisefloor to the amplified signal */ 1977 index &= (SBR_NF_NO_RANDOM_VAL - 1); 1978 signalReal = signalReal + (fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], pNoiseLevel[0])<<4); 1979 } 1980 1981 if (!(harmIndex&0x1)) { 1982 /* harmIndex 0,2 */ 1983 *ptrReal = signalReal + ( (sineSign) ? -sineLevel : sineLevel); 1984 } 1985 else { 1986 /* harmIndex 1,3 in combination with freqInvFlag */ 1987 if(tone_count <= 16){ 1988 if (freqInvFlag) { 1989 *ptrReal++ = signalReal - sineLevelPrev; 1990 if (noSubbands + lowSubband < 63) 1991 *ptrReal = *ptrReal + fMultDiv2(C1, sineLevel); 1992 } 1993 else { 1994 *ptrReal++ = signalReal + sineLevelPrev; 1995 if (noSubbands + lowSubband < 63) 1996 *ptrReal = *ptrReal - fMultDiv2(C1, sineLevel); 1997 } 1998 } 1999 else *ptrReal = signalReal; 2000 } 2001 } 2002 *ptrHarmIndex = (harmIndex + 1) & 3; 2003 *ptrPhaseIndex = index & (SBR_NF_NO_RANDOM_VAL - 1); 2004 } 2005 static void adjustTimeSlotHQ( 2006 FIXP_DBL *RESTRICT ptrReal, /*!< Subband samples to be adjusted, real part */ 2007 FIXP_DBL *RESTRICT ptrImag, /*!< Subband samples to be adjusted, imag part */ 2008 HANDLE_SBR_CALCULATE_ENVELOPE h_sbr_cal_env, 2009 ENV_CALC_NRGS* nrgs, 2010 int lowSubband, /*!< Lowest QMF-channel in the currently used SBR range. */ 2011 int noSubbands, /*!< Number of QMF subbands */ 2012 int scale_change, /*!< Number of bits to shift adjusted samples */ 2013 FIXP_SGL smooth_ratio, /*!< Impact of last envelope */ 2014 int noNoiseFlag, /*!< Start index to random number array */ 2015 int filtBufferNoiseShift) /*!< Shift factor of filtBufferNoise */ 2016 { 2017 2018 FIXP_DBL *RESTRICT gain = nrgs->nrgGain; /*!< Gains of current envelope */ 2019 FIXP_DBL *RESTRICT noiseLevel = nrgs->noiseLevel; /*!< Noise levels of current envelope */ 2020 FIXP_DBL *RESTRICT pSineLevel = nrgs->nrgSine; /*!< Sine levels */ 2021 2022 FIXP_DBL *RESTRICT filtBuffer = h_sbr_cal_env->filtBuffer; /*!< Gains of last envelope */ 2023 FIXP_DBL *RESTRICT filtBufferNoise = h_sbr_cal_env->filtBufferNoise; /*!< Noise levels of last envelope */ 2024 UCHAR *RESTRICT ptrHarmIndex =&h_sbr_cal_env->harmIndex; /*!< Harmonic index */ 2025 int *RESTRICT ptrPhaseIndex =&h_sbr_cal_env->phaseIndex; /*!< Start index to random number array */ 2026 2027 int k; 2028 FIXP_DBL signalReal, signalImag; 2029 FIXP_DBL noiseReal, noiseImag; 2030 FIXP_DBL smoothedGain, smoothedNoise; 2031 FIXP_SGL direct_ratio = /*FL2FXCONST_SGL(1.0f) */ (FIXP_SGL)MAXVAL_SGL - smooth_ratio; 2032 int index = *ptrPhaseIndex; 2033 UCHAR harmIndex = *ptrHarmIndex; 2034 register int freqInvFlag = (lowSubband & 1); 2035 FIXP_DBL sineLevel; 2036 int shift; 2037 2038 *ptrPhaseIndex = (index+noSubbands) & (SBR_NF_NO_RANDOM_VAL - 1); 2039 *ptrHarmIndex = (harmIndex + 1) & 3; 2040 2041 /* 2042 Possible optimization: 2043 smooth_ratio and harmIndex stay constant during the loop. 2044 It might be faster to include a separate loop in each path. 2045 2046 the check for smooth_ratio is now outside the loop and the workload 2047 of the whole function decreased by about 20 % 2048 */ 2049 2050 filtBufferNoiseShift += 1; /* due to later use of fMultDiv2 instead of fMult */ 2051 if (filtBufferNoiseShift<0) 2052 shift = fixMin(DFRACT_BITS-1,-filtBufferNoiseShift); 2053 else 2054 shift = fixMin(DFRACT_BITS-1, filtBufferNoiseShift); 2055 2056 if (smooth_ratio > FL2FXCONST_SGL(0.0f)) { 2057 2058 for (k=0; k<noSubbands; k++) { 2059 /* 2060 Smoothing: The old envelope has been bufferd and a certain ratio 2061 of the old gains and noise levels is used. 2062 */ 2063 2064 smoothedGain = fMult(smooth_ratio,filtBuffer[k]) + 2065 fMult(direct_ratio,gain[k]); 2066 2067 if (filtBufferNoiseShift<0) { 2068 smoothedNoise = (fMultDiv2(smooth_ratio,filtBufferNoise[k])>>shift) + 2069 fMult(direct_ratio,noiseLevel[k]); 2070 } 2071 else { 2072 smoothedNoise = (fMultDiv2(smooth_ratio,filtBufferNoise[k])<<shift) + 2073 fMult(direct_ratio,noiseLevel[k]); 2074 } 2075 2076 /* 2077 The next 2 multiplications constitute the actual envelope adjustment 2078 of the signal and should be carried out with full accuracy 2079 (supplying #DFRACT_BITS valid bits). 2080 */ 2081 signalReal = fMultDiv2(*ptrReal,smoothedGain)<<((int)scale_change); 2082 signalImag = fMultDiv2(*ptrImag,smoothedGain)<<((int)scale_change); 2083 2084 index++; 2085 2086 if (pSineLevel[k] != FL2FXCONST_DBL(0.0f)) { 2087 sineLevel = pSineLevel[k]; 2088 2089 switch(harmIndex) { 2090 case 0: 2091 *ptrReal++ = (signalReal + sineLevel); 2092 *ptrImag++ = (signalImag); 2093 break; 2094 case 2: 2095 *ptrReal++ = (signalReal - sineLevel); 2096 *ptrImag++ = (signalImag); 2097 break; 2098 case 1: 2099 *ptrReal++ = (signalReal); 2100 if (freqInvFlag) 2101 *ptrImag++ = (signalImag - sineLevel); 2102 else 2103 *ptrImag++ = (signalImag + sineLevel); 2104 break; 2105 case 3: 2106 *ptrReal++ = signalReal; 2107 if (freqInvFlag) 2108 *ptrImag++ = (signalImag + sineLevel); 2109 else 2110 *ptrImag++ = (signalImag - sineLevel); 2111 break; 2112 } 2113 } 2114 else { 2115 if (noNoiseFlag) { 2116 /* Just the amplified signal is saved */ 2117 *ptrReal++ = (signalReal); 2118 *ptrImag++ = (signalImag); 2119 } 2120 else { 2121 /* Add noisefloor to the amplified signal */ 2122 index &= (SBR_NF_NO_RANDOM_VAL - 1); 2123 noiseReal = fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise)<<4; 2124 noiseImag = fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise)<<4; 2125 *ptrReal++ = (signalReal + noiseReal); 2126 *ptrImag++ = (signalImag + noiseImag); 2127 } 2128 } 2129 freqInvFlag ^= 1; 2130 } 2131 2132 } 2133 else 2134 { 2135 for (k=0; k<noSubbands; k++) 2136 { 2137 smoothedGain = gain[k]; 2138 signalReal = fMultDiv2(*ptrReal, smoothedGain) << scale_change; 2139 signalImag = fMultDiv2(*ptrImag, smoothedGain) << scale_change; 2140 2141 index++; 2142 2143 if ((sineLevel = pSineLevel[k]) != FL2FXCONST_DBL(0.0f)) 2144 { 2145 switch (harmIndex) 2146 { 2147 case 0: 2148 signalReal += sineLevel; 2149 break; 2150 case 1: 2151 if (freqInvFlag) 2152 signalImag -= sineLevel; 2153 else 2154 signalImag += sineLevel; 2155 break; 2156 case 2: 2157 signalReal -= sineLevel; 2158 break; 2159 case 3: 2160 if (freqInvFlag) 2161 signalImag += sineLevel; 2162 else 2163 signalImag -= sineLevel; 2164 break; 2165 } 2166 } 2167 else 2168 { 2169 if (noNoiseFlag == 0) 2170 { 2171 /* Add noisefloor to the amplified signal */ 2172 smoothedNoise = noiseLevel[k]; 2173 index &= (SBR_NF_NO_RANDOM_VAL - 1); 2174 noiseReal = fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][0], smoothedNoise); 2175 noiseImag = fMultDiv2(FDK_sbrDecoder_sbr_randomPhase[index][1], smoothedNoise); 2176 signalReal += noiseReal<<4; 2177 signalImag += noiseImag<<4; 2178 } 2179 } 2180 *ptrReal++ = signalReal; 2181 *ptrImag++ = signalImag; 2182 2183 freqInvFlag ^= 1; 2184 } 2185 } 2186 } 2187 2188 2189 /*! 2190 \brief Reset limiter bands. 2191 2192 Build frequency band table for the gain limiter dependent on 2193 the previously generated transposer patch areas. 2194 2195 \return SBRDEC_OK if ok, SBRDEC_UNSUPPORTED_CONFIG on error 2196 */ 2197 SBR_ERROR 2198 ResetLimiterBands ( UCHAR *limiterBandTable, /*!< Resulting band borders in QMF channels */ 2199 UCHAR *noLimiterBands, /*!< Resulting number of limiter band */ 2200 UCHAR *freqBandTable, /*!< Table with possible band borders */ 2201 int noFreqBands, /*!< Number of bands in freqBandTable */ 2202 const PATCH_PARAM *patchParam, /*!< Transposer patch parameters */ 2203 int noPatches, /*!< Number of transposer patches */ 2204 int limiterBands) /*!< Selected 'band density' from bitstream */ 2205 { 2206 int i, k, isPatchBorder[2], loLimIndex, hiLimIndex, tempNoLim, nBands; 2207 UCHAR workLimiterBandTable[MAX_FREQ_COEFFS / 2 + MAX_NUM_PATCHES + 1]; 2208 int patchBorders[MAX_NUM_PATCHES + 1]; 2209 int kx, k2; 2210 2211 int lowSubband = freqBandTable[0]; 2212 int highSubband = freqBandTable[noFreqBands]; 2213 2214 /* 1 limiter band. */ 2215 if(limiterBands == 0) { 2216 limiterBandTable[0] = 0; 2217 limiterBandTable[1] = highSubband - lowSubband; 2218 nBands = 1; 2219 } else { 2220 for (i = 0; i < noPatches; i++) { 2221 patchBorders[i] = patchParam[i].guardStartBand - lowSubband; 2222 } 2223 patchBorders[i] = highSubband - lowSubband; 2224 2225 /* 1.2, 2, or 3 limiter bands/octave plus bandborders at patchborders. */ 2226 for (k = 0; k <= noFreqBands; k++) { 2227 workLimiterBandTable[k] = freqBandTable[k] - lowSubband; 2228 } 2229 for (k = 1; k < noPatches; k++) { 2230 workLimiterBandTable[noFreqBands + k] = patchBorders[k]; 2231 } 2232 2233 tempNoLim = nBands = noFreqBands + noPatches - 1; 2234 shellsort(workLimiterBandTable, tempNoLim + 1); 2235 2236 loLimIndex = 0; 2237 hiLimIndex = 1; 2238 2239 2240 while (hiLimIndex <= tempNoLim) { 2241 FIXP_DBL div_m, oct_m, temp; 2242 INT div_e = 0, oct_e = 0, temp_e = 0; 2243 2244 k2 = workLimiterBandTable[hiLimIndex] + lowSubband; 2245 kx = workLimiterBandTable[loLimIndex] + lowSubband; 2246 2247 div_m = fDivNorm(k2, kx, &div_e); 2248 2249 /* calculate number of octaves */ 2250 oct_m = fLog2(div_m, div_e, &oct_e); 2251 2252 /* multiply with limiterbands per octave */ 2253 /* values 1, 1.2, 2, 3 -> scale factor of 2 */ 2254 temp = fMultNorm(oct_m, FDK_sbrDecoder_sbr_limiterBandsPerOctaveDiv4_DBL[limiterBands], &temp_e); 2255 2256 /* overall scale factor of temp ist addition of scalefactors from log2 calculation, 2257 limiter bands scalefactor (2) and limiter bands multiplication */ 2258 temp_e += oct_e + 2; 2259 2260 /* div can be a maximum of 64 (k2 = 64 and kx = 1) 2261 -> oct can be a maximum of 6 2262 -> temp can be a maximum of 18 (as limiterBandsPerOctoave is a maximum factor of 3) 2263 -> we need a scale factor of 5 for comparisson 2264 */ 2265 if (temp >> (5 - temp_e) < FL2FXCONST_DBL (0.49f) >> 5) { 2266 2267 if (workLimiterBandTable[hiLimIndex] == workLimiterBandTable[loLimIndex]) { 2268 workLimiterBandTable[hiLimIndex] = highSubband; 2269 nBands--; 2270 hiLimIndex++; 2271 continue; 2272 } 2273 isPatchBorder[0] = isPatchBorder[1] = 0; 2274 for (k = 0; k <= noPatches; k++) { 2275 if (workLimiterBandTable[hiLimIndex] == patchBorders[k]) { 2276 isPatchBorder[1] = 1; 2277 break; 2278 } 2279 } 2280 if (!isPatchBorder[1]) { 2281 workLimiterBandTable[hiLimIndex] = highSubband; 2282 nBands--; 2283 hiLimIndex++; 2284 continue; 2285 } 2286 for (k = 0; k <= noPatches; k++) { 2287 if (workLimiterBandTable[loLimIndex] == patchBorders[k]) { 2288 isPatchBorder[0] = 1; 2289 break; 2290 } 2291 } 2292 if (!isPatchBorder[0]) { 2293 workLimiterBandTable[loLimIndex] = highSubband; 2294 nBands--; 2295 } 2296 } 2297 loLimIndex = hiLimIndex; 2298 hiLimIndex++; 2299 2300 } 2301 shellsort(workLimiterBandTable, tempNoLim + 1); 2302 2303 /* Test if algorithm exceeded maximum allowed limiterbands */ 2304 if( nBands > MAX_NUM_LIMITERS || nBands <= 0) { 2305 return SBRDEC_UNSUPPORTED_CONFIG; 2306 } 2307 2308 /* Copy limiterbands from working buffer into final destination */ 2309 for (k = 0; k <= nBands; k++) { 2310 limiterBandTable[k] = workLimiterBandTable[k]; 2311 } 2312 } 2313 *noLimiterBands = nBands; 2314 2315 return SBRDEC_OK; 2316 } 2317 2318