12228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
22228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* -----------------------------------------------------------------------------------------------------------
32228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectSoftware License for The Fraunhofer FDK AAC Codec Library for Android
42228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
52228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project� Copyright  1995 - 2012 Fraunhofer-Gesellschaft zur F�rderung der angewandten Forschung e.V.
62228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  All rights reserved.
72228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
82228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1.    INTRODUCTION
92228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software that implements
102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe MPEG Advanced Audio Coding ("AAC") encoding and decoding scheme for digital audio.
112228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is intended to be used on a wide variety of Android devices.
122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
132228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient general perceptual
142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectaudio codecs. AAC-ELD is considered the best-performing full-bandwidth communications codec by
152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindependent studies and is widely deployed. AAC has been standardized by ISO and IEC as part
162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof the MPEG specifications.
172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
182228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectPatent licenses for necessary patent claims for the FDK AAC Codec (including those of Fraunhofer)
192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmay be obtained through Via Licensing (www.vialicensing.com) or through the respective patent owners
202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectindividually for the purpose of encoding or decoding bit streams in products that are compliant with
212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthe ISO/IEC MPEG audio standards. Please note that most manufacturers of Android devices already license
222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectthese patent claims through Via Licensing or directly from the patent owners, and therefore FDK AAC Codec
232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware may already be covered under those patent licenses when it is used for those licensed purposes only.
242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
252228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCommercially-licensed AAC software libraries, including floating-point versions with enhanced sound quality,
262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectare also available from Fraunhofer. Users are encouraged to check the Fraunhofer website for additional
272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectapplications information and documentation.
282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project2.    COPYRIGHT LICENSE
302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
312228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectRedistribution and use in source and binary forms, with or without modification, are permitted without
322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectpayment of copyright license fees provided that you satisfy the following conditions:
332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
342228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in redistributions of the FDK AAC Codec or
352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectyour modifications thereto in source code form.
362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
372228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must retain the complete text of this software license in the documentation and/or other materials
382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprovided with redistributions of the FDK AAC Codec or your modifications thereto in binary form.
392228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou must make available free of charge copies of the complete source code of the FDK AAC Codec and your
402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectmodifications thereto to recipients of copies in binary form.
412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
422228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThe name of Fraunhofer may not be used to endorse or promote products derived from this library without
432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectprior written permission.
442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
452228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may not charge copyright license fees for anyone to use, copy or distribute the FDK AAC Codec
462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectsoftware or your modifications thereto.
472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
482228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYour modified versions of the FDK AAC Codec must carry prominent notices stating that you changed the software
492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectand the date of any change. For modified versions of the FDK AAC Codec, the term
502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Fraunhofer FDK AAC Codec Library for Android" must be replaced by the term
512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"Third-Party Modified Version of the Fraunhofer FDK AAC Codec Library for Android."
522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project3.    NO PATENT LICENSE
542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
552228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectNO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without limitation the patents of Fraunhofer,
562228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectARE GRANTED BY THIS SOFTWARE LICENSE. Fraunhofer provides no warranty of patent non-infringement with
572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectrespect to this software.
582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
592228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectYou may use this FDK AAC Codec software or modifications thereto only for purposes that are authorized
602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectby appropriate patent licenses.
612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project4.    DISCLAIMER
632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
642228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectThis FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright holders and contributors
652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project"AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, including but not limited to the implied warranties
662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectof merchantability and fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
672228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectCONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, or consequential damages,
682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectincluding but not limited to procurement of substitute goods or services; loss of use, data, or profits,
692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projector business interruption, however caused and on any theory of liability, whether in contract, strict
702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectliability, or tort (including negligence), arising in any way out of the use of this software, even if
712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectadvised of the possibility of such damage.
722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project5.    CONTACT INFORMATION
742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
752228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFraunhofer Institute for Integrated Circuits IIS
762228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAttention: Audio and Multimedia Departments - FDK AAC LL
772228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectAm Wolfsmantel 33
782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project91058 Erlangen, Germany
792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectwww.iis.fraunhofer.de/amm
812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectamm-info@iis.fraunhofer.de
822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project----------------------------------------------------------------------------------------------------------- */
832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "ton_corr.h"
852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "sbr_ram.h"
872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "sbr_misc.h"
882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "genericStds.h"
892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "autocorr2nd.h"
902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/***************************************************************************
942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  Send autoCorrSecondOrder to mlfile
962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project****************************************************************************/
982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/
1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
1012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief Calculates the tonal to noise ration for different frequency bands
1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   and time segments.
1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   The ratio between the predicted energy (tonal energy A) and the total
1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   energy (A + B) is calculated. This is converted to the ratio between
1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   the predicted energy (tonal energy A) and the non-predictable energy
1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   (noise energy B). Hence the quota-matrix contains A/B = q/(1-q).
1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   The samples in nrgVector are scaled by 1.0/16.0
1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project		The samples in pNrgVectorFreq	are scaled by 1.0/2.0
1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   The samples in quotaMatrix are scaled by RELAXATION
1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return none.
1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/
1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid
1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_CalculateTonalityQuotas( HANDLE_SBR_TON_CORR_EST hTonCorr,      /*!< Handle to SBR_TON_CORR struct. */
1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   FIXP_DBL **RESTRICT sourceBufferReal,  /*!< The real part of the QMF-matrix.  */
1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   FIXP_DBL **RESTRICT sourceBufferImag,  /*!< The imaginary part of the QMF-matrix. */
1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   INT usb,                               /*!< upper side band, highest + 1 QMF band in the SBR range. */
1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   INT qmfScale                       /*!< sclefactor of QMF subsamples */
1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 )
1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
1262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT     i, k, r, r2, timeIndex, autoCorrScaling;
1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT     startIndexMatrix  = hTonCorr->startIndexMatrix;
1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT     totNoEst          = hTonCorr->numberOfEstimates;
1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT     noEstPerFrame     = hTonCorr->numberOfEstimatesPerFrame;
1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT     move              = hTonCorr->move;
1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT     noQmfChannels     = hTonCorr->noQmfChannels;     /* Numer of Bands */
1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT     buffLen           = hTonCorr->bufferLength;      /* Numer of Slots */
1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT     stepSize          = hTonCorr->stepSize;
1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT    *pBlockLength      = hTonCorr->lpcLength;
1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT**   RESTRICT signMatrix        = hTonCorr->signMatrix;
1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL* RESTRICT  nrgVector      = hTonCorr->nrgVector;
1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL** RESTRICT quotaMatrix    = hTonCorr->quotaMatrix;
1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL*  RESTRICT pNrgVectorFreq = hTonCorr->nrgVectorFreq;
1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define BAND_V_SIZE QMF_MAX_TIME_SLOTS
1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define NUM_V_COMBINE 8 /* Must be a divisor of 64 and fulfill the ASSERTs below */
1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL *realBuf;
1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL *imagBuf;
1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL  alphar[2],alphai[2],fac;
1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  C_ALLOC_SCRATCH_START(ac, ACORR_COEFS, 1);
1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  C_ALLOC_SCRATCH_START(realBufRef, FIXP_DBL, 2*BAND_V_SIZE*NUM_V_COMBINE);
1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  realBuf = realBufRef;
1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  imagBuf = realBuf + BAND_V_SIZE*NUM_V_COMBINE;
1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDK_ASSERT(buffLen <= BAND_V_SIZE);
1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDK_ASSERT(sizeof(FIXP_DBL)*NUM_V_COMBINE*BAND_V_SIZE*2 < (1024*sizeof(FIXP_DBL)-sizeof(ACORR_COEFS)) );
1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*
1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   * Buffering of the quotaMatrix and the quotaMatrixTransp.
1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   *********************************************************/
1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for(i =  0 ; i < move; i++){
1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemcpy(quotaMatrix[i],quotaMatrix[i + noEstPerFrame],noQmfChannels * sizeof(FIXP_DBL));
1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemcpy(signMatrix[i],signMatrix[i + noEstPerFrame],noQmfChannels * sizeof(INT));
1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemmove(nrgVector,nrgVector+noEstPerFrame,move*sizeof(FIXP_DBL));
1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear(nrgVector+startIndexMatrix,(totNoEst-startIndexMatrix)*sizeof(FIXP_DBL));
1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear(pNrgVectorFreq,noQmfChannels * sizeof(FIXP_DBL));
1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*
1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   * Calculate the quotas for the current time steps.
1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   **************************************************/
1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (r = 0; r < usb; r++)
1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    int blockLength;
1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    k = hTonCorr->nextSample; /* startSample */
1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    timeIndex = startIndexMatrix;
1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Copy as many as possible Band accross all Slots at once */
1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (realBuf != realBufRef) {
1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      realBuf -= BAND_V_SIZE;
1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      imagBuf -= BAND_V_SIZE;
1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } else {
1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      realBuf += BAND_V_SIZE*(NUM_V_COMBINE-1);
1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      imagBuf += BAND_V_SIZE*(NUM_V_COMBINE-1);
1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      for (i = 0; i < buffLen; i++) {
1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        int v;
1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FIXP_DBL *ptr;
1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        ptr = realBuf+i;
1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        for (v=0; v<NUM_V_COMBINE; v++)
1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        {
1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          ptr[0] = sourceBufferReal[i][r+v];
1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          ptr[0+BAND_V_SIZE*NUM_V_COMBINE] = sourceBufferImag[i][r+v];
1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          ptr -= BAND_V_SIZE;
1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    blockLength = pBlockLength[0];
2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    while(k <= buffLen - blockLength)
2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    {
2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      autoCorrScaling = fixMin(getScalefactor(&realBuf[k-LPC_ORDER], LPC_ORDER+blockLength), getScalefactor(&imagBuf[k-LPC_ORDER], LPC_ORDER+blockLength));
2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      autoCorrScaling = fixMax(0, autoCorrScaling-1);
2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      scaleValues(&realBuf[k-LPC_ORDER], LPC_ORDER+blockLength, autoCorrScaling);
2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      scaleValues(&imagBuf[k-LPC_ORDER], LPC_ORDER+blockLength, autoCorrScaling);
2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      autoCorrScaling <<= 1; /* consider qmf buffer scaling twice */
2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      autoCorrScaling += autoCorr2nd_cplx ( ac, realBuf+k, imagBuf+k, blockLength );
2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if(ac->det == FL2FXCONST_DBL(0.0f)){
2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        alphar[1] = alphai[1] = FL2FXCONST_DBL(0.0f);
2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        alphar[0] = (ac->r01r)>>2;
2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        alphai[0] = (ac->r01i)>>2;
2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        fac = fMultDiv2(ac->r00r, ac->r11r)>>1;
2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      else{
2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        alphar[1] = (fMultDiv2(ac->r01r, ac->r12r)>>1) - (fMultDiv2(ac->r01i, ac->r12i)>>1) - (fMultDiv2(ac->r02r, ac->r11r)>>1);
2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        alphai[1] = (fMultDiv2(ac->r01i, ac->r12r)>>1) + (fMultDiv2(ac->r01r, ac->r12i)>>1) - (fMultDiv2(ac->r02i, ac->r11r)>>1);
2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        alphar[0] = (fMultDiv2(ac->r01r, ac->det)>>(ac->det_scale+1)) + fMult(alphar[1], ac->r12r) + fMult(alphai[1], ac->r12i);
2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        alphai[0] = (fMultDiv2(ac->r01i, ac->det)>>(ac->det_scale+1)) + fMult(alphai[1], ac->r12r) - fMult(alphar[1], ac->r12i);
2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        fac = fMultDiv2(ac->r00r, fMult(ac->det, ac->r11r))>>(ac->det_scale+1);
2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if(fac == FL2FXCONST_DBL(0.0f)){
2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        quotaMatrix[timeIndex][r] = FL2FXCONST_DBL(0.0f);
2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        signMatrix[timeIndex][r] = 0;
2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      else {
2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        /* quotaMatrix is scaled with the factor RELAXATION
2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           parse RELAXATION in fractional part and shift factor: 1/(1/0.524288 * 2^RELAXATION_SHIFT) */
2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        FIXP_DBL tmp,num,denom;
2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT numShift,denomShift,commonShift;
2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        INT sign;
2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        num = fMultDiv2(alphar[0], ac->r01r) + fMultDiv2(alphai[0], ac->r01i) - fMultDiv2(alphar[1], fMult(ac->r02r, ac->r11r)) - fMultDiv2(alphai[1], fMult(ac->r02i, ac->r11r));
2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        num = fixp_abs(num);
2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        denom = (fac>>1) + (fMultDiv2(fac,RELAXATION_FRACT)>>RELAXATION_SHIFT) - num;
2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        denom = fixp_abs(denom);
2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        num = fMult(num,RELAXATION_FRACT);
2512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        numShift = CountLeadingBits(num) - 2;
2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        num = scaleValue(num, numShift);
2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        denomShift = CountLeadingBits(denom);
2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        denom = (FIXP_DBL)denom << denomShift;
2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if ((num > FL2FXCONST_DBL(0.0f)) && (denom != FL2FXCONST_DBL(0.0f))) {
2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          commonShift = fixMin(numShift - denomShift + RELAXATION_SHIFT, DFRACT_BITS-1);
2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (commonShift < 0) {
2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            commonShift = -commonShift;
2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            tmp = schur_div(num,denom,16);
2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            commonShift = fixMin(commonShift,CountLeadingBits(tmp));
2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            quotaMatrix[timeIndex][r] = tmp << commonShift;
2652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          else {
2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            quotaMatrix[timeIndex][r] = schur_div(num,denom,16) >> commonShift;
2682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
2702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        else {
2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          quotaMatrix[timeIndex][r] = FL2FXCONST_DBL(0.0f);
2722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
2732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if (ac->r11r != FL2FXCONST_DBL(0.0f)) {
2752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          if (  ( (ac->r01r >= FL2FXCONST_DBL(0.0f) ) && ( ac->r11r >= FL2FXCONST_DBL(0.0f) ) )
2762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project              ||( (ac->r01r <  FL2FXCONST_DBL(0.0f) ) && ( ac->r11r <  FL2FXCONST_DBL(0.0f) ) )  ) {
2772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            sign = 1;
2782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
2792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          else {
2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project            sign = -1;
2812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          }
2822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
2832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        else {
2842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          sign = 1;
2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
2862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        if(sign < 0) {
2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          r2 = r;       /* (INT) pow(-1, band); */
2892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
2902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        else {
2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project          r2 = r + 1;   /* (INT) pow(-1, band+1); */
2922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        }
2932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        signMatrix[timeIndex][r] = 1 - 2*(r2 & 0x1);
2942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
2952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      nrgVector[timeIndex] += ((ac->r00r) >> fixMin(DFRACT_BITS-1,(2*qmfScale+autoCorrScaling + SCALE_NRGVEC)));
2972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* pNrgVectorFreq[r] finally has to be divided by noEstPerFrame, replaced division by shifting with one */
2982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      pNrgVectorFreq[r] = pNrgVectorFreq[r] + ((ac->r00r) >> fixMin(DFRACT_BITS-1,(2*qmfScale+autoCorrScaling + SCALE_NRGVEC)));
2992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      blockLength = pBlockLength[1];
3012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      k += stepSize;
3022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      timeIndex++;
3032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDK_ASSERT(noEstPerFrame == 2);
3072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  C_ALLOC_SCRATCH_END(realBuf, FIXP_DBL, 2*BAND_V_SIZE*NUM_V_COMBINE);
3102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  C_ALLOC_SCRATCH_END(ac, ACORR_COEFS, 1);
3112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
3122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/
3142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
3152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief Extracts the parameters required in the decoder to obtain the
3162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  correct tonal to noise ratio after SBR.
3172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  Estimates the tonal to noise ratio of the original signal (using LPC).
3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  Predicts the tonal to noise ration of the SBR signal (in the decoder) by
3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  patching the tonal to noise ratio values similar to the patching of the
3212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  lowband in the decoder. Given the tonal to noise ratio of the original
3222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  and the SBR signal, it estimates the required amount of inverse filtering,
3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  additional noise as well as any additional sines.
3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return none.
3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/
3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid
3302228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_TonCorrParamExtr(HANDLE_SBR_TON_CORR_EST hTonCorr,/*!< Handle to SBR_TON_CORR struct. */
3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           INVF_MODE* infVec,               /*!< Vector where the inverse filtering levels will be stored. */
3322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           FIXP_DBL * noiseLevels,          /*!< Vector where the noise levels will be stored. */
3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           INT* missingHarmonicFlag,        /*!< Flag set to one or zero, dependent on if any strong sines are missing.*/
3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           UCHAR * missingHarmonicsIndex,   /*!< Vector indicating where sines are missing. */
3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           UCHAR * envelopeCompensation,    /*!< Vector to store compensation values for the energies in. */
3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           const SBR_FRAME_INFO *frameInfo, /*!< Frame info struct, contains the time and frequency grid of the current frame.*/
3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           UCHAR* transientInfo,            /*!< Transient info.*/
3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           UCHAR* freqBandTable,            /*!< Frequency band tables for high-res.*/
3392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           INT nSfb,                        /*!< Number of scalefactor bands for high-res. */
3402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           XPOS_MODE xposType,              /*!< Type of transposer used in the decoder.*/
3412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           UINT sbrSyntaxFlags
3422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           )
3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT band;
3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT transientFlag = transientInfo[1] ;    /*!< Flag indicating if a transient is present in the current frame. */
3462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT transientPos  = transientInfo[0];     /*!< Position of the transient.*/
3472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT transientFrame, transientFrameInvfEst;
3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INVF_MODE* infVecPtr;
3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Determine if this is a frame where a transient starts...
3522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  The detection of noise-floor, missing harmonics and invf_est, is not in sync for the
3542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  non-buf-opt decoder such as AAC. Hence we need to keep track on the transient in the
3552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  present frame as well as in the next.
3562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  */
3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  transientFrame = 0;
3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(hTonCorr->transientNextFrame){       /* The transient was detected in the previous frame, but is actually */
3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    transientFrame = 1;
3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hTonCorr->transientNextFrame = 0;
3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if(transientFlag){
3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if(transientPos + hTonCorr->transientPosOffset >= frameInfo->borders[frameInfo->nEnvelopes]){
3642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hTonCorr->transientNextFrame = 1;
3652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else{
3692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if(transientFlag){
3702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      if(transientPos + hTonCorr->transientPosOffset < frameInfo->borders[frameInfo->nEnvelopes]){
3712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        transientFrame = 1;
3722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hTonCorr->transientNextFrame = 0;
3732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
3742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      else{
3752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project        hTonCorr->transientNextFrame = 1;
3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      }
3772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
3782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  transientFrameInvfEst = transientFrame;
3802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*
3832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    Estimate the required invese filtereing level.
3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  */
3852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (hTonCorr->switchInverseFilt)
3862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKsbrEnc_qmfInverseFilteringDetector(&hTonCorr->sbrInvFilt,
3872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          hTonCorr->quotaMatrix,
3882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          hTonCorr->nrgVector,
3892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          hTonCorr->indexVector,
3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          hTonCorr->frameStartIndexInvfEst,
3912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          hTonCorr->numberOfEstimatesPerFrame + hTonCorr->frameStartIndexInvfEst,
3922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          transientFrameInvfEst,
3932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                          infVec);
3942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*
3962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      Detect what tones will be missing.
3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   */
3982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (xposType == XPOS_LC ){
3992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKsbrEnc_SbrMissingHarmonicsDetectorQmf(&hTonCorr->sbrMissingHarmonicsDetector,
4002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             hTonCorr->quotaMatrix,
4012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             hTonCorr->signMatrix,
4022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             hTonCorr->indexVector,
4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             frameInfo,
4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             transientInfo,
4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             missingHarmonicFlag,
4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             missingHarmonicsIndex,
4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             freqBandTable,
4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             nSfb,
4092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             envelopeCompensation,
4102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                             hTonCorr->nrgVectorFreq);
4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  else{
4132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    *missingHarmonicFlag = 0;
4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear(missingHarmonicsIndex,nSfb*sizeof(UCHAR));
4152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*
4202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    Noise floor estimation
4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  */
4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  infVecPtr = hTonCorr->sbrInvFilt.prevInvfMode;
4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKsbrEnc_sbrNoiseFloorEstimateQmf(&hTonCorr->sbrNoiseFloorEstimate,
4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     frameInfo,
4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     noiseLevels,
4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     hTonCorr->quotaMatrix,
4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     hTonCorr->indexVector,
4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     *missingHarmonicFlag,
4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     hTonCorr->frameStartIndex,
4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     hTonCorr->numberOfEstimatesPerFrame,
4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     transientFrame,
4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     infVecPtr,
4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                     sbrSyntaxFlags);
4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Store the invfVec data for the next frame...*/
4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for(band = 0 ; band < hTonCorr->sbrInvFilt.noDetectorBands; band++){
4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hTonCorr->sbrInvFilt.prevInvfMode[band] = infVec[band];
4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/
4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief     Searches for the closest match in the frequency master table.
4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return   closest entry.
4512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
4532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/
4542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT
4552228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectfindClosestEntry(INT goalSb,
4562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 UCHAR *v_k_master,
4572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 INT numMaster,
4582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                 INT direction)
4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT index;
4612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if( goalSb <= v_k_master[0] )
4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return v_k_master[0];
4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if( goalSb >= v_k_master[numMaster] )
4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return v_k_master[numMaster];
4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(direction) {
4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    index = 0;
4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    while( v_k_master[index] < goalSb ) {
4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      index++;
4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } else {
4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    index = numMaster;
4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    while( v_k_master[index] > goalSb ) {
4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      index--;
4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return v_k_master[index];
4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/
4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief     resets the patch
4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return   errorCode, noError if successful.
4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/
4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT
4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectresetPatch(HANDLE_SBR_TON_CORR_EST hTonCorr,  /*!< Handle to SBR_TON_CORR struct. */
4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           INT xposctrl,                      /*!< Different patch modes. */
4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           INT highBandStartSb,               /*!< Start band of the SBR range. */
4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           UCHAR *v_k_master,                   /*!< Master frequency table from which all other table are derived.*/
4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           INT numMaster,                     /*!< Number of elements in the master table. */
5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           INT fs,                            /*!< Sampling frequency. */
5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project           INT noChannels)                    /*!< Number of QMF-channels. */
5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT patch,k,i;
5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT targetStopBand;
5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  PATCH_PARAM  *patchParam = hTonCorr->patchParam;
5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT sbGuard = hTonCorr->guard;
5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT sourceStartBand;
5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT patchDistance;
5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT numBandsInPatch;
5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT lsb = v_k_master[0];                           /* Lowest subband related to the synthesis filterbank */
5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT usb = v_k_master[numMaster];                   /* Stop subband related to the synthesis filterbank */
5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT xoverOffset = highBandStartSb - v_k_master[0]; /* Calculate distance in subbands between k0 and kx */
5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT goalSb;
5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*
5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   * Initialize the patching parameter
5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   */
5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (xposctrl == 1) {
5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    lsb += xoverOffset;
5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    xoverOffset = 0;
5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  goalSb = (INT)( (2 * noChannels * 16000 + (fs>>1)) / fs ); /* 16 kHz band */
5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  goalSb = findClosestEntry(goalSb, v_k_master, numMaster, 1); /* Adapt region to master-table */
5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* First patch */
5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  sourceStartBand = hTonCorr->shiftStartSb + xoverOffset;
5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  targetStopBand = lsb + xoverOffset;
5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* even (odd) numbered channel must be patched to even (odd) numbered channel */
5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  patch = 0;
5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  while(targetStopBand < usb) {
5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* To many patches */
5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (patch >= MAX_NUM_PATCHES)
5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      return(1); /*Number of patches to high */
5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    patchParam[patch].guardStartBand = targetStopBand;
5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    targetStopBand += sbGuard;
5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    patchParam[patch].targetStartBand = targetStopBand;
5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    numBandsInPatch = goalSb - targetStopBand;                   /* get the desired range of the patch */
5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if ( numBandsInPatch >= lsb - sourceStartBand ) {
5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      /* desired number bands are not available -> patch whole source range */
5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      patchDistance   = targetStopBand - sourceStartBand;        /* get the targetOffset */
5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      patchDistance   = patchDistance & ~1;                      /* rounding off odd numbers and make all even */
5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      numBandsInPatch = lsb - (targetStopBand - patchDistance);
5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      numBandsInPatch = findClosestEntry(targetStopBand + numBandsInPatch, v_k_master, numMaster, 0) -
5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                        targetStopBand;  /* Adapt region to master-table */
5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* desired number bands are available -> get the minimal even patching distance */
5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    patchDistance   = numBandsInPatch + targetStopBand - lsb;  /* get minimal distance */
5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    patchDistance   = (patchDistance + 1) & ~1;                /* rounding up odd numbers and make all even */
5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if (numBandsInPatch <= 0) {
5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      patch--;
5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    } else {
5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      patchParam[patch].sourceStartBand = targetStopBand - patchDistance;
5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      patchParam[patch].targetBandOffs  = patchDistance;
5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      patchParam[patch].numBandsInPatch = numBandsInPatch;
5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      patchParam[patch].sourceStopBand  = patchParam[patch].sourceStartBand + numBandsInPatch;
5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      targetStopBand += patchParam[patch].numBandsInPatch;
5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* All patches but first */
5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    sourceStartBand = hTonCorr->shiftStartSb;
5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    /* Check if we are close to goalSb */
5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    if( fixp_abs(targetStopBand - goalSb) < 3) {
5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      goalSb = usb;
5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    patch++;
5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  patch--;
5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* if highest patch contains less than three subband: skip it */
5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if ( patchParam[patch].numBandsInPatch < 3 && patch > 0 ) {
5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    patch--;
5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    targetStopBand = patchParam[patch].targetStartBand + patchParam[patch].numBandsInPatch;
5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hTonCorr->noOfPatches = patch + 1;
5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Assign the index-vector, so we know where to look for the high-band.
5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project     -1 represents a guard-band. */
5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for(k = 0; k < hTonCorr->patchParam[0].guardStartBand; k++)
6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hTonCorr->indexVector[k] = k;
6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for(i = 0; i < hTonCorr->noOfPatches; i++)
6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  {
6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT sourceStart    = hTonCorr->patchParam[i].sourceStartBand;
6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT targetStart    = hTonCorr->patchParam[i].targetStartBand;
6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT numberOfBands  = hTonCorr->patchParam[i].numBandsInPatch;
6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    INT startGuardBand = hTonCorr->patchParam[i].guardStartBand;
6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for(k = 0; k < (targetStart- startGuardBand); k++)
6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hTonCorr->indexVector[startGuardBand+k] = -1;
6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    for(k = 0; k < numberOfBands; k++)
6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hTonCorr->indexVector[targetStart+k] = sourceStart+k;
6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return (0);
6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/
6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief     Creates an instance of the tonality correction parameter module.
6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  The module includes modules for inverse filtering level estimation,
6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  missing harmonics detection and noise floor level estimation.
6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return   errorCode, noError if successful.
6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/
6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT
6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_CreateTonCorrParamExtr(HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Pointer to handle to SBR_TON_CORR struct. */
6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 INT                     chan)     /*!< Channel index, needed for mem allocation */
6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT i;
6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FIXP_DBL* quotaMatrix = GetRam_Sbr_quotaMatrix(chan);
6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT*      signMatrix  = GetRam_Sbr_signMatrix(chan);
6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKmemclear(hTonCorr, sizeof(SBR_TON_CORR_EST));
6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0; i<MAX_NO_OF_ESTIMATES; i++) {
6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hTonCorr->quotaMatrix[i] = quotaMatrix + (i*QMF_CHANNELS);
6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hTonCorr->signMatrix[i]  = signMatrix  + (i*QMF_CHANNELS);
6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  FDKsbrEnc_CreateSbrMissingHarmonicsDetector (&hTonCorr->sbrMissingHarmonicsDetector, chan);
6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return 0;
6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/
6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief     Initialize an instance of the tonality correction parameter module.
6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  The module includes modules for inverse filtering level estimation,
6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  missing harmonics detection and noise floor level estimation.
6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return   errorCode, noError if successful.
6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/
6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT
6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_InitTonCorrParamExtr (INT frameSize,                     /*!< Current SBR frame size. */
6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                HANDLE_SBR_TON_CORR_EST hTonCorr,  /*!< Pointer to handle to SBR_TON_CORR struct. */
6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                HANDLE_SBR_CONFIG_DATA sbrCfg,     /*!< Pointer to SBR configuration parameters. */
6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                INT timeSlots,                     /*!< Number of time-slots per frame */
6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                INT xposCtrl,                      /*!< Different patch modes. */
6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                INT ana_max_level,                 /*!< Maximum level of the adaptive noise. */
6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                INT noiseBands,                    /*!< Number of noise bands per octave. */
6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                INT noiseFloorOffset,              /*!< Noise floor offset. */
6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                UINT useSpeechConfig)              /*!< Speech or music tuning. */
6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT nCols = sbrCfg->noQmfSlots;
6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT fs    = sbrCfg->sampleFreq;
6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT noQmfChannels = sbrCfg->noQmfBands;
6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT highBandStartSb = sbrCfg->freqBandTable[LOW_RES][0];
6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR *v_k_master   = sbrCfg->v_k_master;
6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT numMaster       = sbrCfg->num_Master;
6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  UCHAR **freqBandTable   = sbrCfg->freqBandTable;
6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT    *nSfb            = sbrCfg->nSfb;
6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  INT i;
6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*
6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  Reset the patching and allocate memory for the quota matrix.
6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  Assing parameters for the LPC analysis.
6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  */
6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (sbrCfg->sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) {
6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    switch (timeSlots) {
6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case NUMBER_TIME_SLOTS_1920:
6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hTonCorr->lpcLength[0]              = 8 - LPC_ORDER;
6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hTonCorr->lpcLength[1]              = 7 - LPC_ORDER;
6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hTonCorr->numberOfEstimates         = NO_OF_ESTIMATES_LD;
6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hTonCorr->numberOfEstimatesPerFrame = sbrCfg->noQmfSlots / 7;
6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hTonCorr->frameStartIndexInvfEst    = 0;
6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hTonCorr->transientPosOffset        = FRAME_MIDDLE_SLOT_512LD;
6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
6992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    case NUMBER_TIME_SLOTS_2048:
7002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hTonCorr->lpcLength[0]              = 8 - LPC_ORDER;
7012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hTonCorr->lpcLength[1]              = 8 - LPC_ORDER;
7022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hTonCorr->numberOfEstimates         = NO_OF_ESTIMATES_LD;
7032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hTonCorr->numberOfEstimatesPerFrame = sbrCfg->noQmfSlots / 8;
7042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hTonCorr->frameStartIndexInvfEst    = 0;
7052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      hTonCorr->transientPosOffset        = FRAME_MIDDLE_SLOT_512LD;
7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project      break;
7072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    }
7082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  } else
7092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  switch (timeSlots) {
7102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case NUMBER_TIME_SLOTS_2048:
7112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hTonCorr->lpcLength[0]              = 16 - LPC_ORDER; /* blockLength[0] */
7122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hTonCorr->lpcLength[1]              = 16 - LPC_ORDER; /* blockLength[0] */
7132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hTonCorr->numberOfEstimates         = NO_OF_ESTIMATES_LC;
7142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hTonCorr->numberOfEstimatesPerFrame = sbrCfg->noQmfSlots / 16;
7152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hTonCorr->frameStartIndexInvfEst    = 0;
7162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hTonCorr->transientPosOffset        = FRAME_MIDDLE_SLOT_2048;
7172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
7182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  case NUMBER_TIME_SLOTS_1920:
7192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hTonCorr->lpcLength[0]              = 15 - LPC_ORDER; /* blockLength[0] */
7202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hTonCorr->lpcLength[1]              = 15 - LPC_ORDER; /* blockLength[0] */
7212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hTonCorr->numberOfEstimates         = NO_OF_ESTIMATES_LC;
7222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hTonCorr->numberOfEstimatesPerFrame = sbrCfg->noQmfSlots / 15;
7232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hTonCorr->frameStartIndexInvfEst    = 0;
7242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    hTonCorr->transientPosOffset        = FRAME_MIDDLE_SLOT_1920;
7252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    break;
7262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  default:
7272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return -1;
7282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
7292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hTonCorr->bufferLength              = nCols;
7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hTonCorr->stepSize                  = hTonCorr->lpcLength[0] + LPC_ORDER; /* stepSize[0] implicitly 0. */
7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hTonCorr->nextSample                = LPC_ORDER; /* firstSample */
7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hTonCorr->move                      = hTonCorr->numberOfEstimates - hTonCorr->numberOfEstimatesPerFrame;    /* Number of estimates to move when buffering.*/
7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hTonCorr->startIndexMatrix          = hTonCorr->numberOfEstimates - hTonCorr->numberOfEstimatesPerFrame;    /* Where to store the latest estimations in the tonality Matrix.*/
7362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hTonCorr->frameStartIndex           = 0;                      /* Where in the tonality matrix the current frame (to be sent to the decoder) starts. */
7372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hTonCorr->prevTransientFlag = 0;
7382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hTonCorr->transientNextFrame = 0;
7392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hTonCorr->noQmfChannels = noQmfChannels;
7412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  for (i=0; i<hTonCorr->numberOfEstimates; i++) {
7432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear (hTonCorr->quotaMatrix[i] , sizeof(FIXP_DBL)*noQmfChannels);
7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    FDKmemclear (hTonCorr->signMatrix[i] , sizeof(INT)*noQmfChannels);
7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   /* Reset the patch.*/
7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hTonCorr->guard = 0;
7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hTonCorr->shiftStartSb = 1;
7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(resetPatch(hTonCorr,
7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                xposCtrl,
7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                highBandStartSb,
7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                v_k_master,
7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                numMaster,
7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                fs,
7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                noQmfChannels))
7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return(1);
7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(FDKsbrEnc_InitSbrNoiseFloorEstimate (&hTonCorr->sbrNoiseFloorEstimate,
7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   ana_max_level,
7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   freqBandTable[LO],
7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   nSfb[LO],
7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   noiseBands,
7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   noiseFloorOffset,
7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   timeSlots,
7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                   useSpeechConfig))
7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return(1);
7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(FDKsbrEnc_initInvFiltDetector(&hTonCorr->sbrInvFilt,
7722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            hTonCorr->sbrNoiseFloorEstimate.freqBandTableQmf,
7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            hTonCorr->sbrNoiseFloorEstimate.noNoiseBands,
7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                            useSpeechConfig))
7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return(1);
7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(FDKsbrEnc_InitSbrMissingHarmonicsDetector(
7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                        &hTonCorr->sbrMissingHarmonicsDetector,
7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                        fs,
7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                        frameSize,
7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                        nSfb[HI],
7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                        noQmfChannels,
7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                        hTonCorr->numberOfEstimates,
7862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                        hTonCorr->move,
7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                        hTonCorr->numberOfEstimatesPerFrame,
7882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                        sbrCfg->sbrSyntaxFlags))
7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return(1);
7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return (0);
7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/
7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief     resets tonality correction parameter module.
8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return   errorCode, noError if successful.
8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/
8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT
8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_ResetTonCorrParamExtr(HANDLE_SBR_TON_CORR_EST hTonCorr, /*!< Handle to SBR_TON_CORR struct. */
8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      INT xposctrl,                     /*!< Different patch modes. */
8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      INT highBandStartSb,              /*!< Start band of the SBR range. */
8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      UCHAR *v_k_master,        /*!< Master frequency table from which all other table are derived.*/
8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      INT numMaster,                    /*!< Number of elements in the master table. */
8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      INT fs,                           /*!< Sampling frequency (of the SBR part). */
8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      UCHAR ** freqBandTable,   /*!< Frequency band table for low-res and high-res. */
8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      INT* nSfb,                        /*!< Number of frequency bands (hig-res and low-res). */
8172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      INT noQmfChannels                 /*!< Number of QMF channels. */
8182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                      )
8192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Reset the patch.*/
8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hTonCorr->guard = 0;
8232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  hTonCorr->shiftStartSb = 1;
8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(resetPatch(hTonCorr,
8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                xposctrl,
8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                highBandStartSb,
8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                v_k_master,
8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                numMaster,
8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                fs,
8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                noQmfChannels))
8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return(1);
8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /* Reset the noise floor estimate.*/
8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(FDKsbrEnc_resetSbrNoiseFloorEstimate (&hTonCorr->sbrNoiseFloorEstimate,
8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 freqBandTable[LO],
8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                 nSfb[LO]))
8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return(1);
8412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  /*
8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  Reset the inveerse filtereing detector.
8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  */
8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(FDKsbrEnc_resetInvFiltDetector(&hTonCorr->sbrInvFilt,
8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           hTonCorr->sbrNoiseFloorEstimate.freqBandTableQmf,
8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                           hTonCorr->sbrNoiseFloorEstimate.noNoiseBands))
8482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return(1);
8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/* Reset the missing harmonics detector. */
8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if(FDKsbrEnc_ResetSbrMissingHarmonicsDetector (&hTonCorr->sbrMissingHarmonicsDetector,
8512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project                                       nSfb[HI]))
8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project    return(1);
8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  return (0);
8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/
8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!
8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \brief  Deletes the tonality correction paramtere module.
8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  \return   none
8682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/
8702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/
8712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid
8722228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_DeleteTonCorrParamExtr (HANDLE_SBR_TON_CORR_EST hTonCorr) /*!< Handle to SBR_TON_CORR struct. */
8732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{
8742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  if (hTonCorr) {
8762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FreeRam_Sbr_quotaMatrix(hTonCorr->quotaMatrix);
8782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FreeRam_Sbr_signMatrix(hTonCorr->signMatrix);
8802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project
8812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project   FDKsbrEnc_DeleteSbrMissingHarmonicsDetector (&hTonCorr->sbrMissingHarmonicsDetector);
8822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project  }
8832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}
884