mh_det.cpp revision 2228e360595641dd906bf1773307f43d304f5b2
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 "mh_det.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 892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#include "genericStds.h" 912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define SFM_SHIFT 2 /* Attention: SFM_SCALE depends on SFM_SHIFT */ 932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project#define SFM_SCALE (MAXVAL_DBL >> SFM_SHIFT) /* 1.0 >> SFM_SHIFT */ 942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!< Detector Parameters for AAC core codec. */ 972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const DETECTOR_PARAMETERS_MH paramsAac = { 982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project9, /*!< deltaTime */ 992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 1002228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(20.0f*RELAXATION_FLOAT), /*!< thresHoldDiff */ 1012228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(1.26f*RELAXATION_FLOAT), /*!< thresHoldDiffGuide */ 1022228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(15.0f*RELAXATION_FLOAT), /*!< thresHoldTone */ 1032228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL((1.0f/15.0f)*RELAXATION_FLOAT), /*!< invThresHoldTone */ 1042228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(1.26f*RELAXATION_FLOAT), /*!< thresHoldToneGuide */ 1052228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(0.3f)>>SFM_SHIFT, /*!< sfmThresSbr */ 1062228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(0.1f)>>SFM_SHIFT, /*!< sfmThresOrig */ 1072228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(0.3f), /*!< decayGuideOrig */ 1082228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(0.5f), /*!< decayGuideDiff */ 1092228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(-0.000112993269), /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresMaxLD64 */ 1102228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(-0.000112993269), /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresBelowLD64 */ 1112228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(-0.005030126483f) /* LD64(FL2FXCONST_DBL(0.8f)) */ /*!< derivThresAboveLD64 */ 1122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}, 1132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project50 /*!< maxComp */ 1142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}; 1152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*!< Detector Parameters for AAC LD core codec. */ 1172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic const DETECTOR_PARAMETERS_MH paramsAacLd = { 1182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project16, /*!< Delta time. */ 1192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 1202228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(25.0f*RELAXATION_FLOAT), /*!< thresHoldDiff */ 1212228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(1.26f*RELAXATION_FLOAT), /*!< tresHoldDiffGuide */ 1222228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(15.0f*RELAXATION_FLOAT), /*!< thresHoldTone */ 1232228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL((1.0f/15.0f)*RELAXATION_FLOAT), /*!< invThresHoldTone */ 1242228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(1.26f*RELAXATION_FLOAT), /*!< thresHoldToneGuide */ 1252228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(0.3f)>>SFM_SHIFT, /*!< sfmThresSbr */ 1262228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(0.1f)>>SFM_SHIFT, /*!< sfmThresOrig */ 1272228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(0.3f), /*!< decayGuideOrig */ 1282228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(0.2f), /*!< decayGuideDiff */ 1292228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(-0.000112993269), /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresMaxLD64 */ 1302228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(-0.000112993269), /* LD64(FL2FXCONST_DBL(0.995f)) */ /*!< derivThresBelowLD64 */ 1312228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFL2FXCONST_DBL(-0.005030126483f) /* LD64(FL2FXCONST_DBL(0.8f)) */ /*!< derivThresAboveLD64 */ 1322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}, 1332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project50 /*!< maxComp */ 1342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project}; 1352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 1382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 1392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Calculates the difference in tonality between original and SBR 1402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for a given time and frequency region. 1412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project The values for pDiffMapped2Scfb are scaled by RELAXATION 1432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return none. 1452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 1472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 1482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void diff(FIXP_DBL *RESTRICT pTonalityOrig, 1492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *pDiffMapped2Scfb, 1502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UCHAR *RESTRICT pFreqBandTable, 1512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nScfb, 1522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *indexVector) 1532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 1542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR i, ll, lu, k; 1552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL maxValOrig, maxValSbr, tmp; 1562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT scale; 1572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0; i < nScfb; i++){ 1592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ll = pFreqBandTable[i]; 1602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project lu = pFreqBandTable[i+1]; 1612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxValOrig = FL2FXCONST_DBL(0.0f); 1632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxValSbr = FL2FXCONST_DBL(0.0f); 1642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(k=ll;k<lu;k++){ 1662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxValOrig = fixMax(maxValOrig, pTonalityOrig[k]); 1672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxValSbr = fixMax(maxValSbr, pTonalityOrig[indexVector[k]]); 1682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ((maxValSbr >= RELAXATION)) { 1712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp = fDivNorm(maxValOrig, maxValSbr, &scale); 1722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDiffMapped2Scfb[i] = scaleValue(fMult(tmp,RELAXATION_FRACT), fixMax(-(DFRACT_BITS-1),(scale-RELAXATION_SHIFT))); 1732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 1752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDiffMapped2Scfb[i] = maxValOrig; 1762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 1782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 1792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 1822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 1832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Calculates a flatness measure of the tonality measures. 1842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Calculation of the power function and using scalefactor for basis: 1862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Using log2: 1872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project z = (2^k * x)^y; 1882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project z' = CalcLd(z) = y*CalcLd(x) + y*k; 1892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project z = CalcInvLd(z'); 1902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Using ld64: 1922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project z = (2^k * x)^y; 1932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project z' = CalcLd64(z) = y*CalcLd64(x)/64 + y*k/64; 1942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project z = CalcInvLd64(z'); 1952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project The values pSfmOrigVec and pSfmSbrVec are scaled by the factor 1/4.0 1972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return none. 1992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 2012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 2022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void calculateFlatnessMeasure(FIXP_DBL *pQuotaBuffer, 2032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *indexVector, 2042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *pSfmOrigVec, 2052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *pSfmSbrVec, 2062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UCHAR *pFreqBandTable, 2072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nSfb) 2082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 2092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT i,j; 2102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL invBands,tmp1,tmp2; 2112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT shiftFac0,shiftFacSum0; 2122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT shiftFac1,shiftFacSum1; 2132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL accu; 2142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0;i<nSfb;i++) 2162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project { 2172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT ll = pFreqBandTable[i]; 2182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT lu = pFreqBandTable[i+1]; 2192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSfmOrigVec[i] = (FIXP_DBL)(MAXVAL_DBL>>2); 2202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSfmSbrVec[i] = (FIXP_DBL)(MAXVAL_DBL>>2); 2212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(lu - ll > 1){ 2232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL amOrig,amTransp,gmOrig,gmTransp,sfmOrig,sfmTransp; 2242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project invBands = GetInvInt(lu-ll); 2252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project shiftFacSum0 = 0; 2262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project shiftFacSum1 = 0; 2272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project amOrig = amTransp = FL2FXCONST_DBL(0.0f); 2282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project gmOrig = gmTransp = (FIXP_DBL)MAXVAL_DBL; 2292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(j= ll; j<lu; j++) { 2312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sfmOrig = pQuotaBuffer[j]; 2322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sfmTransp = pQuotaBuffer[indexVector[j]]; 2332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project amOrig += fMult(sfmOrig, invBands); 2352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project amTransp += fMult(sfmTransp, invBands); 2362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project shiftFac0 = CountLeadingBits(sfmOrig); 2382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project shiftFac1 = CountLeadingBits(sfmTransp); 2392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project gmOrig = fMult(gmOrig, sfmOrig<<shiftFac0); 2412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project gmTransp = fMult(gmTransp, sfmTransp<<shiftFac1); 2422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project shiftFacSum0 += shiftFac0; 2442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project shiftFacSum1 += shiftFac1; 2452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (gmOrig > FL2FXCONST_DBL(0.0f)) { 2482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp1 = CalcLdData(gmOrig); /* CalcLd64(x)/64 */ 2502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp1 = fMult(invBands, tmp1); /* y*CalcLd64(x)/64 */ 2512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* y*k/64 */ 2532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project accu = (FIXP_DBL)-shiftFacSum0 << (DFRACT_BITS-1-8); 2542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp2 = fMultDiv2(invBands, accu) << (2+1); 2552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp2 = tmp1 + tmp2; /* y*CalcLd64(x)/64 + y*k/64 */ 2572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project gmOrig = CalcInvLdData(tmp2); /* CalcInvLd64(z'); */ 2582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 2602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project gmOrig = FL2FXCONST_DBL(0.0f); 2612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (gmTransp > FL2FXCONST_DBL(0.0f)) { 2642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp1 = CalcLdData(gmTransp); /* CalcLd64(x)/64 */ 2662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp1 = fMult(invBands, tmp1); /* y*CalcLd64(x)/64 */ 2672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* y*k/64 */ 2692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project accu = (FIXP_DBL)-shiftFacSum1 << (DFRACT_BITS-1-8); 2702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp2 = fMultDiv2(invBands, accu) << (2+1); 2712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp2 = tmp1 + tmp2; /* y*CalcLd64(x)/64 + y*k/64 */ 2732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project gmTransp = CalcInvLdData(tmp2); /* CalcInvLd64(z'); */ 2742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 2762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project gmTransp = FL2FXCONST_DBL(0.0f); 2772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( amOrig != FL2FXCONST_DBL(0.0f) ) 2792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSfmOrigVec[i] = FDKsbrEnc_LSI_divide_scale_fract(gmOrig,amOrig,SFM_SCALE); 2802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( amTransp != FL2FXCONST_DBL(0.0f) ) 2822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSfmSbrVec[i] = FDKsbrEnc_LSI_divide_scale_fract(gmTransp,amTransp,SFM_SCALE); 2832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 2852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 2862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 2882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 2892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Calculates the input to the missing harmonics detection. 2902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return none. 2932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 2942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 2952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 2962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void calculateDetectorInput(FIXP_DBL **RESTRICT pQuotaBuffer, /*!< Pointer to tonality matrix. */ 2972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR *RESTRICT indexVector, 2982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL **RESTRICT tonalityDiff, 2992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL **RESTRICT pSfmOrig, 3002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL **RESTRICT pSfmSbr, 3012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UCHAR *freqBandTable, 3022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nSfb, 3032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT noEstPerFrame, 3042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT move) 3052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 3062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT est; 3072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 3092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project New estimate. 3102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 3112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (est=0; est < noEstPerFrame; est++) { 3122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project diff(pQuotaBuffer[est+move], 3142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tonalityDiff[est+move], 3152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project freqBandTable, 3162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nSfb, 3172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project indexVector); 3182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project calculateFlatnessMeasure(pQuotaBuffer[est+ move], 3202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project indexVector, 3212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSfmOrig[est + move], 3222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSfmSbr[est + move], 3232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project freqBandTable, 3242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nSfb); 3252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 3272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 3302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 3312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Checks that the detection is not due to a LP filter 3322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project This function determines if a newly detected missing harmonics is not 3342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project in fact just a low-pass filtere input signal. If so, the detection is 3352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project removed. 3362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return none. 3382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 3402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 3412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void removeLowPassDetection(UCHAR *RESTRICT pAddHarmSfb, 3422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR **RESTRICT pDetectionVectors, 3432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT start, 3442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT stop, 3452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nSfb, 3462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UCHAR *RESTRICT pFreqBandTable, 3472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *RESTRICT pNrgVector, 3482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project THRES_HOLDS mhThresh) 3492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 3512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT i,est; 3522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT maxDerivPos = pFreqBandTable[nSfb]; 3532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT numBands = pFreqBandTable[nSfb]; 3542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL nrgLow,nrgHigh; 3552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL nrgLD64,nrgLowLD64,nrgHighLD64,nrgDiffLD64; 3562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL valLD64,maxValLD64,maxValAboveLD64; 3572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT bLPsignal = 0; 3582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxValLD64 = FL2FXCONST_DBL(-1.0f); 3602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i = numBands - 1 - 2; i > pFreqBandTable[0];i--){ 3612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgLow = pNrgVector[i]; 3622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgHigh = pNrgVector[i + 2]; 3632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(nrgLow != FL2FXCONST_DBL(0.0f) && nrgLow > nrgHigh){ 3652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgLowLD64 = CalcLdData(nrgLow>>1); 3662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgDiffLD64 = CalcLdData((nrgLow>>1)-(nrgHigh>>1)); 3672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project valLD64 = nrgDiffLD64-nrgLowLD64; 3682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(valLD64 > maxValLD64){ 3692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxDerivPos = i; 3702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxValLD64 = valLD64; 3712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(maxValLD64 > mhThresh.derivThresMaxLD64) { 3732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 3742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Find the largest "gradient" above. (should be relatively flat, hence we expect a low value 3792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if the signal is LP.*/ 3802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxValAboveLD64 = FL2FXCONST_DBL(-1.0f); 3812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i = numBands - 1 - 2; i > maxDerivPos + 2;i--){ 3822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgLow = pNrgVector[i]; 3832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgHigh = pNrgVector[i + 2]; 3842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 3852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(nrgLow != FL2FXCONST_DBL(0.0f) && nrgLow > nrgHigh){ 3862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgLowLD64 = CalcLdData(nrgLow>>1); 3872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgDiffLD64 = CalcLdData((nrgLow>>1)-(nrgHigh>>1)); 3882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project valLD64 = nrgDiffLD64-nrgLowLD64; 3892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(valLD64 > maxValAboveLD64){ 3902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxValAboveLD64 = valLD64; 3912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 3932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 3942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(nrgHigh != FL2FXCONST_DBL(0.0f) && nrgHigh > nrgLow){ 3952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgHighLD64 = CalcLdData(nrgHigh>>1); 3962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgDiffLD64 = CalcLdData((nrgHigh>>1)-(nrgLow>>1)); 3972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project valLD64 = nrgDiffLD64-nrgHighLD64; 3982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(valLD64 > maxValAboveLD64){ 3992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxValAboveLD64 = valLD64; 4002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(maxValLD64 > mhThresh.derivThresMaxLD64 && maxValAboveLD64 < mhThresh.derivThresAboveLD64){ 4062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bLPsignal = 1; 4072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i = maxDerivPos - 1; i > maxDerivPos - 5 && i >= 0 ; i--){ 4092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(pNrgVector[i] != FL2FXCONST_DBL(0.0f) && pNrgVector[i] > pNrgVector[maxDerivPos + 2]){ 4102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgDiffLD64 = CalcLdData((pNrgVector[i]>>1)-(pNrgVector[maxDerivPos + 2]>>1)); 4112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nrgLD64 = CalcLdData(pNrgVector[i]>>1); 4122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project valLD64 = nrgDiffLD64-nrgLD64; 4132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(valLD64 < mhThresh.derivThresBelowLD64) { 4142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bLPsignal = 0; 4152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 4162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else{ 4192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project bLPsignal = 0; 4202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 4212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(bLPsignal){ 4262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0;i<nSfb;i++){ 4272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(maxDerivPos >= pFreqBandTable[i] && maxDerivPos < pFreqBandTable[i+1]) 4282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 4292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(pAddHarmSfb[i]){ 4322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAddHarmSfb[i] = 0; 4332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(est = start; est < stop ; est++){ 4342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDetectionVectors[est][i] = 0; 4352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 4392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 4412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 4422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Checks if it is allowed to detect a missing tone, that wasn't 4432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project detected previously. 4442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return newDetectionAllowed flag. 4472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 4492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 4502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic INT isDetectionOfNewToneAllowed(const SBR_FRAME_INFO *pFrameInfo, 4512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT *pDetectionStartPos, 4522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT noEstPerFrame, 4532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT prevTransientFrame, 4542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT prevTransientPos, 4552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT prevTransientFlag, 4562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT transientPosOffset, 4572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT transientFlag, 4582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT transientPos, 4592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT deltaTime, 4602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_MISSING_HARMONICS_DETECTOR h_sbrMissingHarmonicsDetector) 4612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 4622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT transientFrame, newDetectionAllowed; 4632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Determine if this is a frame where a transient starts... 4662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * If the transient flag was set the previous frame but not the 4672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * transient frame flag, the transient frame flag is set in the current frame. 4682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *****************************************************************************/ 4692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project transientFrame = 0; 4702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(transientFlag){ 4712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(transientPos + transientPosOffset < pFrameInfo->borders[pFrameInfo->nEnvelopes]) 4722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project transientFrame = 1; 4732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(noEstPerFrame > 1){ 4742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(transientPos + transientPosOffset > h_sbrMissingHarmonicsDetector->timeSlots >> 1){ 4752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pDetectionStartPos = noEstPerFrame; 4762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else{ 4782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pDetectionStartPos = noEstPerFrame >> 1; 4792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else{ 4832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pDetectionStartPos = noEstPerFrame; 4842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else{ 4872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(prevTransientFlag && !prevTransientFrame){ 4882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project transientFrame = 1; 4892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pDetectionStartPos = 0; 4902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 4922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 4932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 4942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Determine if detection of new missing harmonics are allowed. 4952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * If the frame contains a transient it's ok. If the previous 4962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * frame contained a transient it needs to be sufficiently close 4972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * to the start of the current frame. 4982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ****************************************************************/ 4992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project newDetectionAllowed = 0; 5002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(transientFrame){ 5012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project newDetectionAllowed = 1; 5022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 5042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(prevTransientFrame && 5052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project fixp_abs(pFrameInfo->borders[0] - (prevTransientPos + transientPosOffset - 5062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_sbrMissingHarmonicsDetector->timeSlots)) < deltaTime) 5072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project newDetectionAllowed = 1; 5082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pDetectionStartPos = 0; 5092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_sbrMissingHarmonicsDetector->previousTransientFlag = transientFlag; 5122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_sbrMissingHarmonicsDetector->previousTransientFrame = transientFrame; 5132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_sbrMissingHarmonicsDetector->previousTransientPos = transientPos; 5142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return (newDetectionAllowed); 5162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 5172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 5202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 5212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Cleans up the detection after a transient. 5222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return none. 5252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 5272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 5282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void transientCleanUp(FIXP_DBL **quotaBuffer, 5292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nSfb, 5302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR **detectionVectors, 5312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *pAddHarmSfb, 5322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *pPrevAddHarmSfb, 5332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT ** signBuffer, 5342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UCHAR *pFreqBandTable, 5352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT start, 5362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT stop, 5372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT newDetectionAllowed, 5382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *pNrgVector, 5392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project THRES_HOLDS mhThresh) 5402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 5412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT i,j,li, ui,est; 5422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(est=start; est < stop; est++) { 5442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0; i<nSfb; i++) { 5452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAddHarmSfb[i] = pAddHarmSfb[i] || detectionVectors[est][i]; 5462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(newDetectionAllowed == 1){ 5502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 5512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Check for duplication of sines located 5522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * on the border of two scf-bands. 5532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *************************************************/ 5542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0;i<nSfb-1;i++) { 5552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project li = pFreqBandTable[i]; 5562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = pFreqBandTable[i+1]; 5572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* detection in adjacent channels.*/ 5592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(pAddHarmSfb[i] && pAddHarmSfb[i+1]) { 5602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL maxVal1, maxVal2; 5612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT maxPos1, maxPos2, maxPosTime1, maxPosTime2; 5622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project li = pFreqBandTable[i]; 5642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = pFreqBandTable[i+1]; 5652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Find maximum tonality in the the two scf bands.*/ 5672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxPosTime1 = start; 5682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxPos1 = li; 5692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxVal1 = quotaBuffer[start][li]; 5702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(est = start; est < stop; est++){ 5712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(j = li; j<ui; j++){ 5722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(quotaBuffer[est][j] > maxVal1){ 5732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxVal1 = quotaBuffer[est][j]; 5742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxPos1 = j; 5752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxPosTime1 = est; 5762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project li = pFreqBandTable[i+1]; 5812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ui = pFreqBandTable[i+2]; 5822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Find maximum tonality in the the two scf bands.*/ 5842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxPosTime2 = start; 5852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxPos2 = li; 5862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxVal2 = quotaBuffer[start][li]; 5872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(est = start; est < stop; est++){ 5882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(j = li; j<ui; j++){ 5892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(quotaBuffer[est][j] > maxVal2){ 5902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxVal2 = quotaBuffer[est][j]; 5912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxPos2 = j; 5922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxPosTime2 = est; 5932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 5962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 5972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* If the maximum values are in adjacent QMF-channels, we need to remove 5982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project the lowest of the two.*/ 5992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(maxPos2-maxPos1 < 2){ 6002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(pPrevAddHarmSfb[i] == 1 && pPrevAddHarmSfb[i+1] == 0){ 6022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Keep the lower, remove the upper.*/ 6032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAddHarmSfb[i+1] = 0; 6042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(est=start; est<stop; est++){ 6052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project detectionVectors[est][i+1] = 0; 6062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else{ 6092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(pPrevAddHarmSfb[i] == 0 && pPrevAddHarmSfb[i+1] == 1){ 6102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Keep the upper, remove the lower.*/ 6112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAddHarmSfb[i] = 0; 6122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(est=start; est<stop; est++){ 6132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project detectionVectors[est][i] = 0; 6142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else{ 6172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* If the maximum values are in adjacent QMF-channels, and if the signs indicate that it is the same sine, 6182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project we need to remove the lowest of the two.*/ 6192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(maxVal1 > maxVal2){ 6202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(signBuffer[maxPosTime1][maxPos2] < 0 && signBuffer[maxPosTime1][maxPos1] > 0){ 6212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Keep the lower, remove the upper.*/ 6222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAddHarmSfb[i+1] = 0; 6232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(est=start; est<stop; est++){ 6242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project detectionVectors[est][i+1] = 0; 6252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else{ 6292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(signBuffer[maxPosTime2][maxPos2] < 0 && signBuffer[maxPosTime2][maxPos1] > 0){ 6302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Keep the upper, remove the lower.*/ 6312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAddHarmSfb[i] = 0; 6322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(est=start; est<stop; est++){ 6332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project detectionVectors[est][i] = 0; 6342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Make sure that the detection is not the cut-off of a low pass filter. */ 6442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project removeLowPassDetection(pAddHarmSfb, 6452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project detectionVectors, 6462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project start, 6472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project stop, 6482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nSfb, 6492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFreqBandTable, 6502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pNrgVector, 6512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project mhThresh); 6522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 6542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 6552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * If a missing harmonic wasn't missing the previous frame 6562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * the transient-flag needs to be set in order to be allowed to detect it. 6572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *************************************************************************/ 6582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0;i<nSfb;i++){ 6592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(pAddHarmSfb[i] - pPrevAddHarmSfb[i] > 0) 6602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAddHarmSfb[i] = 0; 6612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 6632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 6642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 6672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 6682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Do detection for one tonality estimate. 6692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return none. 6722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 6742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 6752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void detection(FIXP_DBL *quotaBuffer, 6762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *pDiffVecScfb, 6772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nSfb, 6782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *pHarmVec, 6792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UCHAR *pFreqBandTable, 6802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *sfmOrig, 6812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *sfmSbr, 6822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project GUIDE_VECTORS guideVectors, 6832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project GUIDE_VECTORS newGuideVectors, 6842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project THRES_HOLDS mhThresh) 6852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 6862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT i,j,ll, lu; 6882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL thresTemp,thresOrig; 6892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 6912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Do detection on the difference vector, i.e. the difference between 6922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * the original and the transposed. 6932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *********************************************************************/ 6942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0;i<nSfb;i++){ 6952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 6962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project thresTemp = (guideVectors.guideVectorDiff[i] != FL2FXCONST_DBL(0.0f)) 6972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ? fixMax(fMult(mhThresh.decayGuideDiff,guideVectors.guideVectorDiff[i]), mhThresh.thresHoldDiffGuide) 6982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project : mhThresh.thresHoldDiff; 6992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project thresTemp = fixMin(thresTemp, mhThresh.thresHoldDiff); 7012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(pDiffVecScfb[i] > thresTemp){ 7032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHarmVec[i] = 1; 7042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project newGuideVectors.guideVectorDiff[i] = pDiffVecScfb[i]; 7052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else{ 7072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* If the guide wasn't zero, but the current level is to low, 7082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project start tracking the decay on the tone in the original rather 7092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project than the difference.*/ 7102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(guideVectors.guideVectorDiff[i] != FL2FXCONST_DBL(0.0f)){ 7112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project guideVectors.guideVectorOrig[i] = mhThresh.thresHoldToneGuide; 7122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 7172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Trace tones in the original signal that at one point 7182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * have been detected because they will be replaced by 7192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * multiple tones in the sbr signal. 7202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ****************************************************/ 7212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0;i<nSfb;i++){ 7232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ll = pFreqBandTable[i]; 7242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project lu = pFreqBandTable[i+1]; 7252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project thresOrig = fixMax(fMult(guideVectors.guideVectorOrig[i], mhThresh.decayGuideOrig), mhThresh.thresHoldToneGuide); 7272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project thresOrig = fixMin(thresOrig, mhThresh.thresHoldTone); 7282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(guideVectors.guideVectorOrig[i] != FL2FXCONST_DBL(0.0f)){ 7302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(j= ll;j<lu;j++){ 7312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(quotaBuffer[j] > thresOrig){ 7322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHarmVec[i] = 1; 7332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project newGuideVectors.guideVectorOrig[i] = quotaBuffer[j]; 7342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 7402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Check for multiple sines in the transposed signal, 7412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * where there is only one in the original. 7422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ****************************************************/ 7432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project thresOrig = mhThresh.thresHoldTone; 7442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0;i<nSfb;i++){ 7462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ll = pFreqBandTable[i]; 7472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project lu = pFreqBandTable[i+1]; 7482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(pHarmVec[i] == 0){ 7502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(lu -ll > 1){ 7512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(j= ll;j<lu;j++){ 7522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(quotaBuffer[j] > thresOrig && (sfmSbr[i] > mhThresh.sfmThresSbr && sfmOrig[i] < mhThresh.sfmThresOrig)){ 7532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHarmVec[i] = 1; 7542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project newGuideVectors.guideVectorOrig[i] = quotaBuffer[j]; 7552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else{ 7592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(i < nSfb -1){ 7602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ll = pFreqBandTable[i]; 7612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(i>0){ 7632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(quotaBuffer[ll] > mhThresh.thresHoldTone && (pDiffVecScfb[i+1] < mhThresh.invThresHoldTone || pDiffVecScfb[i-1] < mhThresh.invThresHoldTone)){ 7642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHarmVec[i] = 1; 7652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project newGuideVectors.guideVectorOrig[i] = quotaBuffer[ll]; 7662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else{ 7692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(quotaBuffer[ll] > mhThresh.thresHoldTone && pDiffVecScfb[i+1] < mhThresh.invThresHoldTone){ 7702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pHarmVec[i] = 1; 7712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project newGuideVectors.guideVectorOrig[i] = quotaBuffer[ll]; 7722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 7782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 7792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 7822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 7832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Do detection for every tonality estimate, using forward prediction. 7842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return none. 7872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 7882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 7892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 7902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void detectionWithPrediction(FIXP_DBL **quotaBuffer, 7912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL **pDiffVecScfb, 7922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT ** signBuffer, 7932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nSfb, 7942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UCHAR* pFreqBandTable, 7952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL **sfmOrig, 7962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL **sfmSbr, 7972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR **detectionVectors, 7982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *pPrevAddHarmSfb, 7992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project GUIDE_VECTORS *guideVectors, 8002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT noEstPerFrame, 8012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT detectionStart, 8022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT totNoEst, 8032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT newDetectionAllowed, 8042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT *pAddHarmFlag, 8052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *pAddHarmSfb, 8062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *pNrgVector, 8072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const DETECTOR_PARAMETERS_MH *mhParams) 8082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 8092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT est = 0,i; 8102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT start; 8112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(pAddHarmSfb,nSfb*sizeof(UCHAR)); 8132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(newDetectionAllowed){ 8152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(totNoEst > 1){ 8172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project start = detectionStart; 8182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (start != 0) { 8202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(guideVectors[start].guideVectorDiff,guideVectors[0].guideVectorDiff,nSfb*sizeof(FIXP_DBL)); 8212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(guideVectors[start].guideVectorOrig,guideVectors[0].guideVectorOrig,nSfb*sizeof(FIXP_DBL)); 8222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(guideVectors[start-1].guideVectorDetected,nSfb*sizeof(UCHAR)); 8232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else{ 8262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project start = 0; 8272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else{ 8302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project start = 0; 8312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(est = start; est < totNoEst; est++){ 8352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 8372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Do detection on the current frame using 8382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * guide-info from the previous. 8392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *******************************************/ 8402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(est > 0){ 8412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(guideVectors[est].guideVectorDetected,detectionVectors[est-1],nSfb*sizeof(UCHAR)); 8422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(detectionVectors[est], nSfb*sizeof(UCHAR)); 8452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(est < totNoEst-1){ 8472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(guideVectors[est+1].guideVectorDiff,nSfb*sizeof(FIXP_DBL)); 8482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(guideVectors[est+1].guideVectorOrig,nSfb*sizeof(FIXP_DBL)); 8492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(guideVectors[est+1].guideVectorDetected,nSfb*sizeof(UCHAR)); 8502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project detection(quotaBuffer[est], 8522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDiffVecScfb[est], 8532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nSfb, 8542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project detectionVectors[est], 8552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFreqBandTable, 8562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sfmOrig[est], 8572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sfmSbr[est], 8582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project guideVectors[est], 8592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project guideVectors[est+1], 8602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project mhParams->thresHolds); 8612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else{ 8632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(guideVectors[est].guideVectorDiff,nSfb*sizeof(FIXP_DBL)); 8642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(guideVectors[est].guideVectorOrig,nSfb*sizeof(FIXP_DBL)); 8652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(guideVectors[est].guideVectorDetected,nSfb*sizeof(UCHAR)); 8662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project detection(quotaBuffer[est], 8682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pDiffVecScfb[est], 8692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nSfb, 8702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project detectionVectors[est], 8712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFreqBandTable, 8722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sfmOrig[est], 8732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sfmSbr[est], 8742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project guideVectors[est], 8752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project guideVectors[est], 8762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project mhParams->thresHolds); 8772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 8792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Clean up the detection.*/ 8822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project transientCleanUp(quotaBuffer, 8832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nSfb, 8842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project detectionVectors, 8852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAddHarmSfb, 8862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pPrevAddHarmSfb, 8872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project signBuffer, 8882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pFreqBandTable, 8892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project start, 8902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project totNoEst, 8912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project newDetectionAllowed, 8922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pNrgVector, 8932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project mhParams->thresHolds); 8942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 8962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Set flag... */ 8972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pAddHarmFlag = 0; 8982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0; i<nSfb; i++){ 8992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(pAddHarmSfb[i]){ 9002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *pAddHarmFlag = 1; 9012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 9022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(pPrevAddHarmSfb, pAddHarmSfb, nSfb*sizeof(UCHAR)); 9062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(guideVectors[0].guideVectorDetected,pAddHarmSfb,nSfb*sizeof(INT)); 9072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0; i<nSfb ; i++){ 9092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project guideVectors[0].guideVectorDiff[i] = FL2FXCONST_DBL(0.0f); 9112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project guideVectors[0].guideVectorOrig[i] = FL2FXCONST_DBL(0.0f); 9122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(pAddHarmSfb[i] == 1){ 9142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* If we had a detection use the guide-value in the next frame from the last estimate were the detection 9152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project was done.*/ 9162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(est=start; est < totNoEst; est++){ 9172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(guideVectors[est].guideVectorDiff[i] != FL2FXCONST_DBL(0.0f)){ 9182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project guideVectors[0].guideVectorDiff[i] = guideVectors[est].guideVectorDiff[i]; 9192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(guideVectors[est].guideVectorOrig[i] != FL2FXCONST_DBL(0.0f)){ 9212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project guideVectors[0].guideVectorOrig[i] = guideVectors[est].guideVectorOrig[i]; 9222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 9282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 9312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 9322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Calculates a compensation vector for the energy data. 9332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project This function calculates a compensation vector for the energy data (i.e. 9352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project envelope data) that is calculated elsewhere. This is since, one sine on 9362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project the border of two scalefactor bands, will be replace by one sine in the 9372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project middle of either scalefactor band. However, since the sine that is replaced 9382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project will influence the energy estimate in both scalefactor bands (in the envelops 9392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project calculation function) a compensation value is required in order to avoid 9402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project noise substitution in the decoder next to the synthetic sine. 9412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return none. 9432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 9452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 9462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectstatic void calculateCompVector(UCHAR *pAddHarmSfb, 9472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL **pTonalityMatrix, 9482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT ** pSignMatrix, 9492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *pEnvComp, 9502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nSfb, 9512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UCHAR *freqBandTable, 9522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT totNoEst, 9532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT maxComp, 9542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR *pPrevEnvComp, 9552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT newDetectionAllowed) 9562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 9572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT scfBand,est,l,ll,lu,maxPosF,maxPosT; 9592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL maxVal; 9602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT compValue; 9612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL tmp; 9622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear(pEnvComp,nSfb*sizeof(UCHAR)); 9642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(scfBand=0; scfBand < nSfb; scfBand++){ 9662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(pAddHarmSfb[scfBand]){ /* A missing sine was detected */ 9682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ll = freqBandTable[scfBand]; 9692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project lu = freqBandTable[scfBand+1]; 9702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxPosF = 0; /* First find the maximum*/ 9722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxPosT = 0; 9732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxVal = FL2FXCONST_DBL(0.0f); 9742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(est=0;est<totNoEst;est++){ 9762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(l=ll; l<lu; l++){ 9772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(pTonalityMatrix[est][l] > maxVal){ 9782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxVal = pTonalityMatrix[est][l]; 9792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxPosF = l; 9802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxPosT = est; 9812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 9842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 9852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 9862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * If the maximum tonality is at the lower border of the 9872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * scalefactor band, we check the sign of the adjacent channels 9882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * to see if this sine is shared by the lower channel. If so, the 9892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * energy of the single sine will be present in two scalefactor bands 9902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * in the SBR data, which will cause problems in the decoder, when we 9912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * add a sine to just one of the channels. 9922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project *********************************************************************/ 9932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(maxPosF == ll && scfBand){ 9942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(!pAddHarmSfb[scfBand - 1]) { /* No detection below*/ 9952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (pSignMatrix[maxPosT][maxPosF - 1] > 0 && pSignMatrix[maxPosT][maxPosF] < 0) { 9962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* The comp value is calulated as the tonallity value, i.e we want to 9972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project reduce the envelope data for this channel with as much as the tonality 9982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project that is spread from the channel above. (ld64(RELAXATION) = 0.31143075889) */ 9992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp = fixp_abs((FIXP_DBL)CalcLdData(pTonalityMatrix[maxPosT][maxPosF - 1]) + RELAXATION_LD64); 10002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp = (tmp >> (DFRACT_BITS-1-LD_DATA_SHIFT-1)) + (FIXP_DBL)1; /* shift one bit less for rounding */ 10012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project compValue = ((INT)(LONG)tmp) >> 1; 10022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* limit the comp-value*/ 10042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (compValue > maxComp) 10052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project compValue = maxComp; 10062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pEnvComp[scfBand-1] = compValue; 10082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 10132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project * Same as above, but for the upper end of the scalefactor-band. 10142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ***************************************************************/ 10152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(maxPosF == lu-1 && scfBand+1 < nSfb){ /* Upper border*/ 10162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(!pAddHarmSfb[scfBand + 1]) { 10172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (pSignMatrix[maxPosT][maxPosF] > 0 && pSignMatrix[maxPosT][maxPosF + 1] < 0) { 10182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp = fixp_abs((FIXP_DBL)CalcLdData(pTonalityMatrix[maxPosT][maxPosF + 1]) + RELAXATION_LD64); 10192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tmp = (tmp >> (DFRACT_BITS-1-LD_DATA_SHIFT-1)) + (FIXP_DBL)1; /* shift one bit less for rounding */ 10202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project compValue = ((INT)(LONG)tmp) >> 1; 10212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (compValue > maxComp) 10232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project compValue = maxComp; 10242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pEnvComp[scfBand+1] = compValue; 10262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(newDetectionAllowed == 0){ 10332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(scfBand=0;scfBand<nSfb;scfBand++){ 10342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if(pEnvComp[scfBand] != 0 && pPrevEnvComp[scfBand] == 0) 10352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pEnvComp[scfBand] = 0; 10362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 10382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* remember the value for the next frame.*/ 10402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(pPrevEnvComp,pEnvComp,nSfb*sizeof(UCHAR)); 10412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 10422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 10452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 10462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Detects where strong tonal components will be missing after 10472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HFR in the decoder. 10482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return none. 10512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 10532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 10542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid 10552228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_SbrMissingHarmonicsDetectorQmf(HANDLE_SBR_MISSING_HARMONICS_DETECTOR h_sbrMHDet, 10562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL ** pQuotaBuffer, 10572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT ** pSignBuffer, 10582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project SCHAR* indexVector, 10592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const SBR_FRAME_INFO *pFrameInfo, 10602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UCHAR* pTranInfo, 10612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT* pAddHarmonicsFlag, 10622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR* pAddHarmonicsScaleFactorBands, 10632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project const UCHAR* freqBandTable, 10642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nSfb, 10652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR* envelopeCompensation, 10662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *pNrgVector) 10672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 10682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT transientFlag = pTranInfo[1]; 10692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT transientPos = pTranInfo[0]; 10702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT newDetectionAllowed; 10712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT transientDetStart = 0; 10722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR ** detectionVectors = h_sbrMHDet->detectionVectors; 10742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT move = h_sbrMHDet->move; 10752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT noEstPerFrame = h_sbrMHDet->noEstPerFrame; 10762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT totNoEst = h_sbrMHDet->totNoEst; 10772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT prevTransientFlag = h_sbrMHDet->previousTransientFlag; 10782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT prevTransientFrame = h_sbrMHDet->previousTransientFrame; 10792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT transientPosOffset = h_sbrMHDet->transientPosOffset; 10802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT prevTransientPos = h_sbrMHDet->previousTransientPos; 10812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project GUIDE_VECTORS* guideVectors = h_sbrMHDet->guideVectors; 10822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT deltaTime = h_sbrMHDet->mhParams->deltaTime; 10832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT maxComp = h_sbrMHDet->mhParams->maxComp; 10842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int est; 10862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* 10882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project Buffer values. 10892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project */ 10902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(move<=(MAX_NO_OF_ESTIMATES>>1)); 10912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(noEstPerFrame<=(MAX_NO_OF_ESTIMATES>>1)); 10922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *sfmSbr[MAX_NO_OF_ESTIMATES]; 10942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *sfmOrig[MAX_NO_OF_ESTIMATES]; 10952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *tonalityDiff[MAX_NO_OF_ESTIMATES]; 10962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 10972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (est=0; est < MAX_NO_OF_ESTIMATES/2; est++) { 10982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sfmSbr[est] = h_sbrMHDet->sfmSbr[est]; 10992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sfmOrig[est] = h_sbrMHDet->sfmOrig[est]; 11002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tonalityDiff[est] = h_sbrMHDet->tonalityDiff[est]; 11012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project C_ALLOC_SCRATCH_START(scratch_mem, FIXP_DBL, (3*MAX_NO_OF_ESTIMATES/2*MAX_FREQ_COEFFS)); 11042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL *scratch = scratch_mem; 11052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (; est < MAX_NO_OF_ESTIMATES; est++) { 11062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sfmSbr[est] = scratch; scratch+=MAX_FREQ_COEFFS; 11072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sfmOrig[est] = scratch; scratch+=MAX_FREQ_COEFFS; 11082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tonalityDiff[est] = scratch; scratch+=MAX_FREQ_COEFFS; 11092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Determine if we're allowed to detect "missing harmonics" that wasn't detected before. 11142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project In order to be allowed to do new detection, there must be a transient in the current 11152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project frame, or a transient in the previous frame sufficiently close to the current frame. */ 11162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project newDetectionAllowed = isDetectionOfNewToneAllowed(pFrameInfo, 11172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project &transientDetStart, 11182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project noEstPerFrame, 11192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project prevTransientFrame, 11202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project prevTransientPos, 11212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project prevTransientFlag, 11222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project transientPosOffset, 11232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project transientFlag, 11242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project transientPos, 11252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project deltaTime, 11262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_sbrMHDet); 11272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Calulate the variables that will be used subsequently for the actual detection */ 11292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project calculateDetectorInput(pQuotaBuffer, 11302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project indexVector, 11312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tonalityDiff, 11322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sfmOrig, 11332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sfmSbr, 11342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project freqBandTable, 11352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nSfb, 11362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project noEstPerFrame, 11372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project move); 11382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Do the actual detection using information from previous detections */ 11402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project detectionWithPrediction(pQuotaBuffer, 11412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project tonalityDiff, 11422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSignBuffer, 11432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nSfb, 11442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project freqBandTable, 11452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sfmOrig, 11462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project sfmSbr, 11472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project detectionVectors, 11482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_sbrMHDet->guideScfb, 11492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project guideVectors, 11502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project noEstPerFrame, 11512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project transientDetStart, 11522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project totNoEst, 11532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project newDetectionAllowed, 11542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAddHarmonicsFlag, 11552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pAddHarmonicsScaleFactorBands, 11562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pNrgVector, 11572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_sbrMHDet->mhParams); 11582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project /* Calculate the comp vector, so that the energy can be 11602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project compensated for a sine between two QMF-bands. */ 11612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project calculateCompVector(pAddHarmonicsScaleFactorBands, 11622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pQuotaBuffer, 11632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project pSignBuffer, 11642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project envelopeCompensation, 11652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nSfb, 11662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project freqBandTable, 11672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project totNoEst, 11682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project maxComp, 11692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project h_sbrMHDet->prevEnvelopeCompensation, 11702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project newDetectionAllowed); 11712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for (est=0; est < move; est++) { 11732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(tonalityDiff[est], tonalityDiff[est + noEstPerFrame], sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); 11742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(sfmOrig[est], sfmOrig[est + noEstPerFrame], sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); 11752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy(sfmSbr[est], sfmSbr[est + noEstPerFrame], sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); 11762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 11772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project C_ALLOC_SCRATCH_END(scratch, FIXP_DBL, (3*MAX_NO_OF_ESTIMATES/2*MAX_FREQ_COEFFS)); 11782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 11812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 11832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 11842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Initialize an instance of the missing harmonics detector. 11852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return errorCode, noError if OK. 11882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 11902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 11912228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT 11922228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_CreateSbrMissingHarmonicsDetector ( 11932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet, 11942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT chan) 11952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 11962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_MISSING_HARMONICS_DETECTOR hs = hSbrMHDet; 11972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT i; 11982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 11992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR* detectionVectors = GetRam_Sbr_detectionVectors(chan); 12002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR* guideVectorDetected = GetRam_Sbr_guideVectorDetected(chan); 12012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL* guideVectorDiff = GetRam_Sbr_guideVectorDiff(chan); 12022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL* guideVectorOrig = GetRam_Sbr_guideVectorOrig(chan); 12032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear (hs,sizeof(SBR_MISSING_HARMONICS_DETECTOR)); 12052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->prevEnvelopeCompensation = GetRam_Sbr_prevEnvelopeCompensation(chan); 12072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->guideScfb = GetRam_Sbr_guideScfb(chan); 12082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0; i<MAX_NO_OF_ESTIMATES; i++) { 12102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->guideVectors[i].guideVectorDiff = guideVectorDiff + (i*MAX_FREQ_COEFFS); 12112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->guideVectors[i].guideVectorOrig = guideVectorOrig + (i*MAX_FREQ_COEFFS); 12122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->detectionVectors[i] = detectionVectors + (i*MAX_FREQ_COEFFS); 12132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->guideVectors[i].guideVectorDetected = guideVectorDetected + (i*MAX_FREQ_COEFFS); 12142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 12172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 12182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 12212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 12222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Initialize an instance of the missing harmonics detector. 12232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return errorCode, noError if OK. 12262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 12282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 12292228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT 12302228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_InitSbrMissingHarmonicsDetector ( 12312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet, 12322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT sampleFreq, 12332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT frameSize, 12342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nSfb, 12352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT qmfNoChannels, 12362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT totNoEst, 12372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT move, 12382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT noEstPerFrame, 12392228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UINT sbrSyntaxFlags 12402228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project ) 12412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 12422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_MISSING_HARMONICS_DETECTOR hs = hSbrMHDet; 12432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i; 12442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDK_ASSERT(totNoEst <= MAX_NO_OF_ESTIMATES); 12462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project switch(frameSize){ 12482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 2048: 12492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->transientPosOffset = FRAME_MIDDLE_SLOT_2048; 12502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->timeSlots = NUMBER_TIME_SLOTS_2048; 12512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 12522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 1920: 12532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->transientPosOffset = FRAME_MIDDLE_SLOT_1920; 12542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->timeSlots = NUMBER_TIME_SLOTS_1920; 12552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 12562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 1024: 12572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->transientPosOffset = FRAME_MIDDLE_SLOT_512LD; 12582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->timeSlots = 16; 12592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 12602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project case 960: 12612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->transientPosOffset = FRAME_MIDDLE_SLOT_512LD; 12622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->timeSlots = 15; 12632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project break; 12642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project default: 12652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return -1; 12662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (sbrSyntaxFlags & SBR_SYNTAX_LOW_DELAY) { 12692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->mhParams = ¶msAacLd; 12702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } else 12712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->mhParams = ¶msAac; 12722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->qmfNoChannels = qmfNoChannels; 12742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->sampleFreq = sampleFreq; 12752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->nSfb = nSfb; 12762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->totNoEst = totNoEst; 12782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->move = move; 12792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->noEstPerFrame = noEstPerFrame; 12802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0; i<totNoEst; i++) { 12822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear (hs->guideVectors[i].guideVectorDiff,sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); 12832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear (hs->guideVectors[i].guideVectorOrig,sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); 12842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear (hs->detectionVectors[i],sizeof(UCHAR)*MAX_FREQ_COEFFS); 12852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear (hs->guideVectors[i].guideVectorDetected,sizeof(UCHAR)*MAX_FREQ_COEFFS); 12862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project //for(i=0; i<totNoEst/2; i++) { 12892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for(i=0; i<MAX_NO_OF_ESTIMATES/2; i++) { 12902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear (hs->tonalityDiff[i],sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); 12912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear (hs->sfmOrig[i],sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); 12922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear (hs->sfmSbr[i],sizeof(FIXP_DBL)*MAX_FREQ_COEFFS); 12932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 12942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear ( hs->prevEnvelopeCompensation, sizeof(UCHAR)*MAX_FREQ_COEFFS); 12962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemclear ( hs->guideScfb, sizeof(UCHAR)*MAX_FREQ_COEFFS); 12972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 12982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->previousTransientFlag = 0; 12992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->previousTransientFrame = 0; 13002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hs->previousTransientPos = 0; 13012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return (0); 13032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 13042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 13062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 13072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Deletes an instance of the missing harmonics detector. 13082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return none. 13112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 13132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 13142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Projectvoid 13152228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_DeleteSbrMissingHarmonicsDetector(HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMHDet) 13162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 13172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (hSbrMHDet) { 13182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project HANDLE_SBR_MISSING_HARMONICS_DETECTOR hs = hSbrMHDet; 13192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FreeRam_Sbr_detectionVectors(&hs->detectionVectors[0]); 13212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FreeRam_Sbr_guideVectorDetected(&hs->guideVectors[0].guideVectorDetected); 13222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FreeRam_Sbr_guideVectorDiff(&hs->guideVectors[0].guideVectorDiff); 13232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FreeRam_Sbr_guideVectorOrig(&hs->guideVectors[0].guideVectorOrig); 13242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FreeRam_Sbr_prevEnvelopeCompensation(&hs->prevEnvelopeCompensation); 13252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FreeRam_Sbr_guideScfb(&hs->guideScfb); 13262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 13292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 13312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/*! 13322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \brief Resets an instance of the missing harmonics detector. 13332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project \return error code, noError if OK. 13362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project*/ 13382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project/**************************************************************************/ 13392228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectINT 13402228e360595641dd906bf1773307f43d304f5b2The Android Open Source ProjectFDKsbrEnc_ResetSbrMissingHarmonicsDetector (HANDLE_SBR_MISSING_HARMONICS_DETECTOR hSbrMissingHarmonicsDetector, 13412228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nSfb) 13422228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project{ 13432228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project int i; 13442228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FIXP_DBL tempGuide[MAX_FREQ_COEFFS]; 13452228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project UCHAR tempGuideInt[MAX_FREQ_COEFFS]; 13462228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project INT nSfbPrev; 13472228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13482228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project nSfbPrev = hSbrMissingHarmonicsDetector->nSfb; 13492228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrMissingHarmonicsDetector->nSfb = nSfb; 13502228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13512228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy( tempGuideInt, hSbrMissingHarmonicsDetector->guideScfb, nSfbPrev * sizeof(UCHAR) ); 13522228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13532228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( nSfb > nSfbPrev ) { 13542228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( i = 0; i < (nSfb - nSfbPrev); i++ ) { 13552228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrMissingHarmonicsDetector->guideScfb[i] = 0; 13562228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13572228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13582228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( i = 0; i < nSfbPrev; i++ ) { 13592228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrMissingHarmonicsDetector->guideScfb[i + (nSfb - nSfbPrev)] = tempGuideInt[i]; 13602228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13612228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13622228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 13632228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( i = 0; i < nSfb; i++ ) { 13642228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrMissingHarmonicsDetector->guideScfb[i] = tempGuideInt[i + (nSfbPrev-nSfb)]; 13652228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13662228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13672228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13682228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy ( tempGuide, hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff, nSfbPrev * sizeof(FIXP_DBL) ); 13692228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13702228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if (nSfb > nSfbPrev ) { 13712228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( i = 0; i < (nSfb - nSfbPrev); i++ ) { 13722228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff[i] = FL2FXCONST_DBL(0.0f); 13732228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13742228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13752228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( i = 0; i < nSfbPrev; i++ ) { 13762228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff[i + (nSfb - nSfbPrev)] = tempGuide[i]; 13772228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13782228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13792228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 13802228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( i = 0; i < nSfb; i++ ) { 13812228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDiff[i] = tempGuide[i + (nSfbPrev-nSfb)]; 13822228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13832228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13842228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13852228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy ( tempGuide, hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig, nSfbPrev * sizeof(FIXP_DBL) ); 13862228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13872228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( nSfb > nSfbPrev ) { 13882228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( i = 0; i< (nSfb - nSfbPrev); i++ ) { 13892228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig[i] = FL2FXCONST_DBL(0.0f); 13902228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13912228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 13922228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( i = 0; i < nSfbPrev; i++ ) { 13932228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig[i + (nSfb - nSfbPrev)] = tempGuide[i]; 13942228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13952228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 13962228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 13972228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( i = 0; i < nSfb; i++ ) { 13982228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorOrig[i] = tempGuide[i + (nSfbPrev-nSfb)]; 13992228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14002228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14012228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14022228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy ( tempGuideInt, hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDetected, nSfbPrev * sizeof(UCHAR) ); 14032228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14042228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( nSfb > nSfbPrev ) { 14052228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( i = 0; i < (nSfb - nSfbPrev); i++ ) { 14062228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDetected[i] = 0; 14072228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14082228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14092228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( i = 0; i < nSfbPrev; i++ ) { 14102228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDetected[i + (nSfb - nSfbPrev)] = tempGuideInt[i]; 14112228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14122228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14132228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 14142228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( i = 0; i < nSfb; i++ ) { 14152228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrMissingHarmonicsDetector->guideVectors[0].guideVectorDetected[i] = tempGuideInt[i + (nSfbPrev-nSfb)]; 14162228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14172228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14182228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14192228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project FDKmemcpy ( tempGuideInt, hSbrMissingHarmonicsDetector->prevEnvelopeCompensation, nSfbPrev * sizeof(UCHAR) ); 14202228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14212228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project if ( nSfb > nSfbPrev ) { 14222228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( i = 0; i < (nSfb - nSfbPrev); i++ ) { 14232228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrMissingHarmonicsDetector->prevEnvelopeCompensation[i] = 0; 14242228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14252228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14262228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( i = 0; i < nSfbPrev; i++ ) { 14272228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrMissingHarmonicsDetector->prevEnvelopeCompensation[i + (nSfb - nSfbPrev)] = tempGuideInt[i]; 14282228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14292228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14302228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project else { 14312228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project for ( i = 0; i < nSfb; i++ ) { 14322228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project hSbrMissingHarmonicsDetector->prevEnvelopeCompensation[i] = tempGuideInt[i + (nSfbPrev-nSfb)]; 14332228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14342228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project } 14352228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 14362228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project return 0; 14372228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project} 14382228e360595641dd906bf1773307f43d304f5b2The Android Open Source Project 1439