16cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/* ----------------------------------------------------------------------------- 26cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKSoftware License for The Fraunhofer FDK AAC Codec Library for Android 36cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 46cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK© Copyright 1995 - 2018 Fraunhofer-Gesellschaft zur Förderung der angewandten 56cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKForschung e.V. All rights reserved. 66cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 76cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1. INTRODUCTION 86cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKThe Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software 96cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthat implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding 106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKscheme for digital audio. This FDK AAC Codec software is intended to be used on 116cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKa wide variety of Android devices. 126cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 136cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKAAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient 146cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKgeneral perceptual audio codecs. AAC-ELD is considered the best-performing 156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKfull-bandwidth communications codec by independent studies and is widely 166cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKdeployed. AAC has been standardized by ISO and IEC as part of the MPEG 176cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKspecifications. 186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 196cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKPatent licenses for necessary patent claims for the FDK AAC Codec (including 206cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthose of Fraunhofer) may be obtained through Via Licensing 216cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK(www.vialicensing.com) or through the respective patent owners individually for 226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthe purpose of encoding or decoding bit streams in products that are compliant 236cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKwith the ISO/IEC MPEG audio standards. Please note that most manufacturers of 246cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKAndroid devices already license these patent claims through Via Licensing or 256cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKdirectly from the patent owners, and therefore FDK AAC Codec software may 266cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKalready be covered under those patent licenses when it is used for those 276cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKlicensed purposes only. 286cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKCommercially-licensed AAC software libraries, including floating-point versions 306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKwith enhanced sound quality, are also available from Fraunhofer. Users are 316cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKencouraged to check the Fraunhofer website for additional applications 326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKinformation and documentation. 336cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 346cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK2. COPYRIGHT LICENSE 356cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 366cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKRedistribution and use in source and binary forms, with or without modification, 376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKare permitted without payment of copyright license fees provided that you 386cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKsatisfy the following conditions: 396cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 406cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKYou must retain the complete text of this software license in redistributions of 416cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthe FDK AAC Codec or your modifications thereto in source code form. 426cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 436cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKYou must retain the complete text of this software license in the documentation 446cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKand/or other materials provided with redistributions of the FDK AAC Codec or 456cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKyour modifications thereto in binary form. You must make available free of 466cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKcharge copies of the complete source code of the FDK AAC Codec and your 476cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKmodifications thereto to recipients of copies in binary form. 486cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 496cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKThe name of Fraunhofer may not be used to endorse or promote products derived 506cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKfrom this library without prior written permission. 516cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 526cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKYou may not charge copyright license fees for anyone to use, copy or distribute 536cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthe FDK AAC Codec software or your modifications thereto. 546cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 556cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKYour modified versions of the FDK AAC Codec must carry prominent notices stating 566cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthat you changed the software and the date of any change. For modified versions 576cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKof the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android" 586cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKmust be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK 596cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKAAC Codec Library for Android." 606cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 616cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK3. NO PATENT LICENSE 626cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 636cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKNO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without 646cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKlimitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE. 656cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKFraunhofer provides no warranty of patent non-infringement with respect to this 666cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKsoftware. 676cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 686cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKYou may use this FDK AAC Codec software or modifications thereto only for 696cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKpurposes that are authorized by appropriate patent licenses. 706cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 716cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK4. DISCLAIMER 726cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 736cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKThis FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright 746cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKholders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, 756cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKincluding but not limited to the implied warranties of merchantability and 766cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKfitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 776cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKCONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary, 786cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKor consequential damages, including but not limited to procurement of substitute 796cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKgoods or services; loss of use, data, or profits, or business interruption, 806cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKhowever caused and on any theory of liability, whether in contract, strict 816cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKliability, or tort (including negligence), arising in any way out of the use of 826cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKthis software, even if advised of the possibility of such damage. 836cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 846cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK5. CONTACT INFORMATION 856cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 866cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKFraunhofer Institute for Integrated Circuits IIS 876cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKAttention: Audio and Multimedia Departments - FDK AAC LL 886cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKAm Wolfsmantel 33 896cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK91058 Erlangen, Germany 906cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 916cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKwww.iis.fraunhofer.de/amm 926cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKamm-info@iis.fraunhofer.de 936cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK----------------------------------------------------------------------------- */ 946cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 956cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/*********************** MPEG surround encoder library ************************* 966cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 976cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK Author(s): M. Luis Valero 986cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 996cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK Description: Enhanced Time Domain Downmix 1006cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1016cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK*******************************************************************************/ 1026cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1036cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/* Includes ******************************************************************/ 1046cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#include "sacenc_dmx_tdom_enh.h" 1056cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1066cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#include "FDK_matrixCalloc.h" 1076cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#include "FDK_trigFcts.h" 1086cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#include "fixpoint_math.h" 1096cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/* Defines *******************************************************************/ 1116cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#define PI_FLT 3.1415926535897931f 1126cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#define ALPHA_FLT 0.0001f 1136cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1146cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#define PI_E (2) 1156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#define PI_M (FL2FXCONST_DBL(PI_FLT / (1 << PI_E))) 1166cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1176cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#define ALPHA_E (13) 1186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#define ALPHA_M (FL2FXCONST_DBL(ALPHA_FLT * (1 << ALPHA_E))) 1196cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1206cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKenum { L = 0, R = 1 }; 1216cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/* Data Types ****************************************************************/ 1236cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKtypedef struct T_ENHANCED_TIME_DOMAIN_DMX { 1246cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK int maxFramelength; 1256cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1266cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK int framelength; 1276cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1286cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL prev_gain_m[2]; 1296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK INT prev_gain_e; 1306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL prev_H1_m[2]; 1316cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK INT prev_H1_e; 1326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1336cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL *sinusWindow_m; 1346cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK SCHAR sinusWindow_e; 1356cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1366cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL prev_Left_m; 1376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK INT prev_Left_e; 1386cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL prev_Right_m; 1396cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK INT prev_Right_e; 1406cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL prev_XNrg_m; 1416cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK INT prev_XNrg_e; 1426cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1436cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL lin_bbCld_weight_m; 1446cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK INT lin_bbCld_weight_e; 1456cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL gain_weight_m[2]; 1466cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK INT gain_weight_e; 1476cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1486cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK} ENHANCED_TIME_DOMAIN_DMX; 1496cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1506cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/* Constants *****************************************************************/ 1516cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1526cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/* Function / Class Declarations *********************************************/ 1536cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKstatic void calculateRatio(const FIXP_DBL sqrt_linCld_m, 1546cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const INT sqrt_linCld_e, const FIXP_DBL lin_Cld_m, 1556cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const INT lin_Cld_e, const FIXP_DBL Icc_m, 1566cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const INT Icc_e, FIXP_DBL G_m[2], INT *G_e); 1576cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1586cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKstatic void calculateDmxGains(const FIXP_DBL lin_Cld_m, const INT lin_Cld_e, 1596cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const FIXP_DBL lin_Cld2_m, const INT lin_Cld2_e, 1606cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const FIXP_DBL Icc_m, const INT Icc_e, 1616cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const FIXP_DBL G_m[2], const INT G_e, 1626cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL H1_m[2], INT *pH1_e); 1636cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1646cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/* Function / Class Definition ***********************************************/ 1656cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKstatic FIXP_DBL invSqrtNorm2(const FIXP_DBL op_m, const INT op_e, 1666cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK INT *const result_e) { 1676cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL src_m = op_m; 1686cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK int src_e = op_e; 1696cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1706cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if (src_e & 1) { 1716cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK src_m >>= 1; 1726cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK src_e += 1; 1736cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 1746cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1756cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK src_m = invSqrtNorm2(src_m, result_e); 1766cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK *result_e = (*result_e) - (src_e >> 1); 1776cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1786cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK return src_m; 1796cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK} 1806cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1816cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKstatic FIXP_DBL sqrtFixp(const FIXP_DBL op_m, const INT op_e, 1826cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK INT *const result_e) { 1836cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL src_m = op_m; 1846cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK int src_e = op_e; 1856cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1866cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if (src_e & 1) { 1876cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK src_m >>= 1; 1886cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK src_e += 1; 1896cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 1906cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1916cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK *result_e = (src_e >> 1); 1926cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK return sqrtFixp(src_m); 1936cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK} 1946cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1956cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKstatic FIXP_DBL fixpAdd(const FIXP_DBL src1_m, const INT src1_e, 1966cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const FIXP_DBL src2_m, const INT src2_e, 1976cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK INT *const dst_e) { 1986cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL dst_m; 1996cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 2006cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if (src1_m == FL2FXCONST_DBL(0.f)) { 2016cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK *dst_e = src2_e; 2026cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK dst_m = src2_m; 2036cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } else if (src2_m == FL2FXCONST_DBL(0.f)) { 2046cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK *dst_e = src1_e; 2056cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK dst_m = src1_m; 2066cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } else { 2076cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK *dst_e = fixMax(src1_e, src2_e) + 1; 2086cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK dst_m = 2096cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK scaleValue(src1_m, fixMax((src1_e - (*dst_e)), -(DFRACT_BITS - 1))) + 2106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK scaleValue(src2_m, fixMax((src2_e - (*dst_e)), -(DFRACT_BITS - 1))); 2116cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 2126cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK return dst_m; 2136cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK} 2146cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 2156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK/** 2166cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * \brief Sum up fixpoint values with best possible accuracy. 2176cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 2186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * \param value1 First input value. 2196cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * \param q1 Scaling factor of first input value. 2206cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * \param pValue2 Pointer to second input value, will be modified on 2216cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * return. 2226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * \param pQ2 Pointer to second scaling factor, will be modified on 2236cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * return. 2246cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 2256cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * \return void 2266cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK */ 2276cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKstatic void fixpAddNorm(const FIXP_DBL value1, const INT q1, 2286cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL *const pValue2, INT *const pQ2) { 2296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const int headroom1 = fNormz(fixp_abs(value1)) - 1; 2306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const int headroom2 = fNormz(fixp_abs(*pValue2)) - 1; 2316cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK int resultScale = fixMax(q1 - headroom1, (*pQ2) - headroom2); 2326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 2336cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if ((value1 != FL2FXCONST_DBL(0.f)) && (*pValue2 != FL2FXCONST_DBL(0.f))) { 2346cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK resultScale++; 2356cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 2366cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 2376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK *pValue2 = 2386cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK scaleValue(value1, q1 - resultScale) + 2396cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK scaleValue(*pValue2, fixMax(-(DFRACT_BITS - 1), ((*pQ2) - resultScale))); 2406cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK *pQ2 = (*pValue2 != (FIXP_DBL)0) ? resultScale : DFRACT_BITS - 1; 2416cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK} 2426cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 2436cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKFDK_SACENC_ERROR fdk_sacenc_open_enhancedTimeDomainDmx( 2446cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK HANDLE_ENHANCED_TIME_DOMAIN_DMX *phEnhancedTimeDmx, const INT framelength) { 2456cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FDK_SACENC_ERROR error = SACENC_OK; 2466cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK HANDLE_ENHANCED_TIME_DOMAIN_DMX hEnhancedTimeDmx = NULL; 2476cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 2486cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if (NULL == phEnhancedTimeDmx) { 2496cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK error = SACENC_INVALID_HANDLE; 2506cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } else { 2516cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FDK_ALLOCATE_MEMORY_1D(hEnhancedTimeDmx, 1, ENHANCED_TIME_DOMAIN_DMX); 2526cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FDK_ALLOCATE_MEMORY_1D(hEnhancedTimeDmx->sinusWindow_m, 1 + framelength, 2536cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL); 2546cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->maxFramelength = framelength; 2556cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK *phEnhancedTimeDmx = hEnhancedTimeDmx; 2566cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 2576cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK return error; 2586cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 2596cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKbail: 2606cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fdk_sacenc_close_enhancedTimeDomainDmx(&hEnhancedTimeDmx); 2616cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK return ((SACENC_OK == error) ? SACENC_MEMORY_ERROR : error); 2626cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK} 2636cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 2646cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKFDK_SACENC_ERROR fdk_sacenc_init_enhancedTimeDomainDmx( 2656cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK HANDLE_ENHANCED_TIME_DOMAIN_DMX hEnhancedTimeDmx, 2666cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const FIXP_DBL *const pInputGain_m, const INT inputGain_e, 2676cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const FIXP_DBL outputGain_m, const INT outputGain_e, 2686cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const INT framelength) { 2696cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FDK_SACENC_ERROR error = SACENC_OK; 2706cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 2716cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if (hEnhancedTimeDmx == NULL) { 2726cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK error = SACENC_INVALID_HANDLE; 2736cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } else { 2746cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK int smp; 2756cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if (framelength > hEnhancedTimeDmx->maxFramelength) { 2766cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK error = SACENC_INIT_ERROR; 2776cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK goto bail; 2786cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 2796cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 2806cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->framelength = framelength; 2816cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 2826cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK INT deltax_e; 2836cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL deltax_m; 2846cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 2856cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK deltax_m = fDivNormHighPrec( 2866cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK PI_M, (FIXP_DBL)(2 * hEnhancedTimeDmx->framelength), &deltax_e); 2876cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK deltax_m = scaleValue(deltax_m, PI_E + deltax_e - (DFRACT_BITS - 1) - 1); 2886cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK deltax_e = 1; 2896cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 2906cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK for (smp = 0; smp < hEnhancedTimeDmx->framelength + 1; smp++) { 2916cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->sinusWindow_m[smp] = 2926cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fMult(ALPHA_M, fPow2(fixp_sin(smp * deltax_m, deltax_e))); 2936cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 2946cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->sinusWindow_e = -ALPHA_E; 2956cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 2966cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_Left_m = hEnhancedTimeDmx->prev_Right_m = 2976cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_XNrg_m = FL2FXCONST_DBL(0.f); 2986cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_Left_e = hEnhancedTimeDmx->prev_Right_e = 2996cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_XNrg_e = DFRACT_BITS - 1; 3006cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 3016cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->lin_bbCld_weight_m = 3026cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fDivNormHighPrec(fPow2(pInputGain_m[L]), fPow2(pInputGain_m[R]), 3036cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK &hEnhancedTimeDmx->lin_bbCld_weight_e); 3046cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 3056cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->gain_weight_m[L] = fMult(pInputGain_m[L], outputGain_m); 3066cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->gain_weight_m[R] = fMult(pInputGain_m[R], outputGain_m); 3076cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->gain_weight_e = 3086cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK -fNorm(fixMax(hEnhancedTimeDmx->gain_weight_m[L], 3096cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->gain_weight_m[R])); 3106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 3116cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->gain_weight_m[L] = scaleValue( 3126cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->gain_weight_m[L], -hEnhancedTimeDmx->gain_weight_e); 3136cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->gain_weight_m[R] = scaleValue( 3146cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->gain_weight_m[R], -hEnhancedTimeDmx->gain_weight_e); 3156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->gain_weight_e += inputGain_e + outputGain_e; 3166cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 3176cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_gain_m[L] = hEnhancedTimeDmx->gain_weight_m[L] >> 1; 3186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_gain_m[R] = hEnhancedTimeDmx->gain_weight_m[R] >> 1; 3196cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_gain_e = hEnhancedTimeDmx->gain_weight_e + 1; 3206cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 3216cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_H1_m[L] = 3226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK scaleValue(hEnhancedTimeDmx->gain_weight_m[L], -4); 3236cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_H1_m[R] = 3246cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK scaleValue(hEnhancedTimeDmx->gain_weight_m[R], -4); 3256cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_H1_e = 2 + 2 + hEnhancedTimeDmx->gain_weight_e; 3266cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 3276cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKbail: 3286cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK return error; 3296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK} 3306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 3316cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKFDK_SACENC_ERROR fdk_sacenc_apply_enhancedTimeDomainDmx( 3326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK HANDLE_ENHANCED_TIME_DOMAIN_DMX hEnhancedTimeDmx, 3336cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const INT_PCM *const *const inputTime, INT_PCM *const outputTimeDmx, 3346cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const INT InputDelay) { 3356cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FDK_SACENC_ERROR error = SACENC_OK; 3366cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 3376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if ((NULL == hEnhancedTimeDmx) || (NULL == inputTime) || 3386cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK (NULL == inputTime[L]) || (NULL == inputTime[R]) || 3396cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK (NULL == outputTimeDmx)) { 3406cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK error = SACENC_INVALID_HANDLE; 3416cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } else { 3426cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK int smp; 3436cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL lin_bbCld_m, lin_Cld_m, bbCorr_m, sqrt_linCld_m, G_m[2], H1_m[2], 3446cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK gainLeft_m, gainRight_m; 3456cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL bbNrgLeft_m, bbNrgRight_m, bbXNrg_m, nrgLeft_m, nrgRight_m, nrgX_m; 3466cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK INT lin_bbCld_e, lin_Cld_e, bbCorr_e, sqrt_linCld_e, G_e, H1_e; 3476cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK INT bbNrgLeft_e, bbNrgRight_e, bbXNrg_e, nrgLeft_e, nrgRight_e, nrgX_e; 3486cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 3496cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /* Increase energy time resolution with shorter processing blocks. 128 is an 3506cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * empiric value. */ 3516cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const int granuleLength = fixMin(128, hEnhancedTimeDmx->framelength); 3526cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK int granuleShift = 3536cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK (granuleLength > 1) 3546cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK ? ((DFRACT_BITS - 1) - fNorm((FIXP_DBL)(granuleLength - 1))) 3556cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK : 0; 3566cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK granuleShift = fixMax( 3576cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 3, granuleShift + 3586cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1); /* one bit more headroom for worst case accumulation */ 3596cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 3606cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK smp = 0; 3616cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 3626cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /* Prevent division by zero. */ 3636cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK bbNrgLeft_m = bbNrgRight_m = bbXNrg_m = (FIXP_DBL)(1); 3646cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK bbNrgLeft_e = bbNrgRight_e = bbXNrg_e = 0; 3656cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 3666cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK do { 3676cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const int offset = smp; 3686cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL partialL, partialR, partialX; 3696cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK partialL = partialR = partialX = FL2FXCONST_DBL(0.f); 3706cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 3716cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK int in_margin = FDKmin( 3726cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK getScalefactorPCM( 3736cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK &inputTime[L][offset], 3746cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fixMin(offset + granuleLength, hEnhancedTimeDmx->framelength) - 3756cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK offset, 3766cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1), 3776cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK getScalefactorPCM( 3786cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK &inputTime[R][offset], 3796cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fixMin(offset + granuleLength, hEnhancedTimeDmx->framelength) - 3806cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK offset, 3816cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1)); 3826cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 3836cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /* partial energy */ 3846cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK for (smp = offset; 3856cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK smp < fixMin(offset + granuleLength, hEnhancedTimeDmx->framelength); 3866cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK smp++) { 3876cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_PCM inputL = 3886cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK scaleValue((FIXP_PCM)inputTime[L][smp], in_margin - 1); 3896cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_PCM inputR = 3906cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK scaleValue((FIXP_PCM)inputTime[R][smp], in_margin - 1); 3916cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 3926cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK partialL += fPow2Div2(inputL) >> (granuleShift - 3); 3936cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK partialR += fPow2Div2(inputR) >> (granuleShift - 3); 3946cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK partialX += fMultDiv2(inputL, inputR) >> (granuleShift - 3); 3956cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 3966cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 3976cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fixpAddNorm(partialL, granuleShift - 2 * in_margin, &bbNrgLeft_m, 3986cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK &bbNrgLeft_e); 3996cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fixpAddNorm(partialR, granuleShift - 2 * in_margin, &bbNrgRight_m, 4006cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK &bbNrgRight_e); 4016cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fixpAddNorm(partialX, granuleShift - 2 * in_margin, &bbXNrg_m, &bbXNrg_e); 4026cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } while (smp < hEnhancedTimeDmx->framelength); 4036cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 4046cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK nrgLeft_m = 4056cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fixpAdd(hEnhancedTimeDmx->prev_Left_m, hEnhancedTimeDmx->prev_Left_e, 4066cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK bbNrgLeft_m, bbNrgLeft_e, &nrgLeft_e); 4076cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK nrgRight_m = 4086cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fixpAdd(hEnhancedTimeDmx->prev_Right_m, hEnhancedTimeDmx->prev_Right_e, 4096cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK bbNrgRight_m, bbNrgRight_e, &nrgRight_e); 4106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK nrgX_m = 4116cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fixpAdd(hEnhancedTimeDmx->prev_XNrg_m, hEnhancedTimeDmx->prev_XNrg_e, 4126cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK bbXNrg_m, bbXNrg_e, &nrgX_e); 4136cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 4146cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK lin_bbCld_m = fMult(hEnhancedTimeDmx->lin_bbCld_weight_m, 4156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fDivNorm(nrgLeft_m, nrgRight_m, &lin_bbCld_e)); 4166cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK lin_bbCld_e += 4176cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->lin_bbCld_weight_e + nrgLeft_e - nrgRight_e; 4186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 4196cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK bbCorr_m = fMult(nrgX_m, invSqrtNorm2(fMult(nrgLeft_m, nrgRight_m), 4206cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK nrgLeft_e + nrgRight_e, &bbCorr_e)); 4216cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK bbCorr_e += nrgX_e; 4226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 4236cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_Left_m = bbNrgLeft_m; 4246cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_Left_e = bbNrgLeft_e; 4256cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_Right_m = bbNrgRight_m; 4266cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_Right_e = bbNrgRight_e; 4276cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_XNrg_m = bbXNrg_m; 4286cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_XNrg_e = bbXNrg_e; 4296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 4306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /* 4316cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK bbCld = 10.f*log10(lin_bbCld) 4326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 4336cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK lin_Cld = pow(10,bbCld/20) 4346cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK = pow(10,10.f*log10(lin_bbCld)/20.f) 4356cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK = sqrt(lin_bbCld) 4366cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 4376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK lin_Cld2 = lin_Cld*lin_Cld 4386cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK = sqrt(lin_bbCld)*sqrt(lin_bbCld) 4396cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK = lin_bbCld 4406cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK */ 4416cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK lin_Cld_m = sqrtFixp(lin_bbCld_m, lin_bbCld_e, &lin_Cld_e); 4426cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK sqrt_linCld_m = sqrtFixp(lin_Cld_m, lin_Cld_e, &sqrt_linCld_e); 4436cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 4446cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /*calculate how much right and how much left signal, to avoid signal 4456cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * cancellations*/ 4466cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK calculateRatio(sqrt_linCld_m, sqrt_linCld_e, lin_Cld_m, lin_Cld_e, bbCorr_m, 4476cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK bbCorr_e, G_m, &G_e); 4486cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 4496cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /*calculate downmix gains*/ 4506cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK calculateDmxGains(lin_Cld_m, lin_Cld_e, lin_bbCld_m, lin_bbCld_e, bbCorr_m, 4516cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK bbCorr_e, G_m, G_e, H1_m, &H1_e); 4526cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 4536cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /*adapt output gains*/ 4546cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK H1_m[L] = fMult(H1_m[L], hEnhancedTimeDmx->gain_weight_m[L]); 4556cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK H1_m[R] = fMult(H1_m[R], hEnhancedTimeDmx->gain_weight_m[R]); 4566cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK H1_e += hEnhancedTimeDmx->gain_weight_e; 4576cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 4586cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK gainLeft_m = hEnhancedTimeDmx->prev_gain_m[L]; 4596cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK gainRight_m = hEnhancedTimeDmx->prev_gain_m[R]; 4606cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 4616cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK INT intermediate_gain_e = 4626cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK +hEnhancedTimeDmx->sinusWindow_e + H1_e - hEnhancedTimeDmx->prev_gain_e; 4636cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 4646cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK for (smp = 0; smp < hEnhancedTimeDmx->framelength; smp++) { 4656cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const INT N = hEnhancedTimeDmx->framelength; 4666cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL intermediate_gainLeft_m, intermediate_gainRight_m, tmp; 4676cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 4686cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK intermediate_gainLeft_m = 4696cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK scaleValue((fMult(hEnhancedTimeDmx->sinusWindow_m[smp], H1_m[L]) + 4706cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fMult(hEnhancedTimeDmx->sinusWindow_m[N - smp], 4716cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_H1_m[L])), 4726cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK intermediate_gain_e); 4736cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK intermediate_gainRight_m = 4746cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK scaleValue((fMult(hEnhancedTimeDmx->sinusWindow_m[smp], H1_m[R]) + 4756cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fMult(hEnhancedTimeDmx->sinusWindow_m[N - smp], 4766cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_H1_m[R])), 4776cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK intermediate_gain_e); 4786cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 4796cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK gainLeft_m = intermediate_gainLeft_m + 4806cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fMult(FL2FXCONST_DBL(1.f - ALPHA_FLT), gainLeft_m); 4816cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK gainRight_m = intermediate_gainRight_m + 4826cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fMult(FL2FXCONST_DBL(1.f - ALPHA_FLT), gainRight_m); 4836cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 4846cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK tmp = fMultDiv2(gainLeft_m, (FIXP_PCM)inputTime[L][smp + InputDelay]) + 4856cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fMultDiv2(gainRight_m, (FIXP_PCM)inputTime[R][smp + InputDelay]); 4866cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK outputTimeDmx[smp] = (INT_PCM)SATURATE_SHIFT( 4876cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK tmp, 4886cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK -(hEnhancedTimeDmx->prev_gain_e + 1 - (DFRACT_BITS - SAMPLE_BITS)), 4896cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK SAMPLE_BITS); 4906cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 4916cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 4926cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_gain_m[L] = gainLeft_m; 4936cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_gain_m[R] = gainRight_m; 4946cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 4956cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_H1_m[L] = H1_m[L]; 4966cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_H1_m[R] = H1_m[R]; 4976cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK hEnhancedTimeDmx->prev_H1_e = H1_e; 4986cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 4996cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 5006cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK return error; 5016cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK} 5026cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 5036cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKstatic void calculateRatio(const FIXP_DBL sqrt_linCld_m, 5046cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const INT sqrt_linCld_e, const FIXP_DBL lin_Cld_m, 5056cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const INT lin_Cld_e, const FIXP_DBL Icc_m, 5066cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const INT Icc_e, FIXP_DBL G_m[2], INT *G_e) { 5076cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#define G_SCALE_FACTOR (2) 5086cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 5096cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if (Icc_m >= FL2FXCONST_DBL(0.f)) { 5106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK G_m[0] = G_m[1] = FL2FXCONST_DBL(1.f / (float)(1 << G_SCALE_FACTOR)); 5116cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK G_e[0] = G_SCALE_FACTOR; 5126cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } else { 5136cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const FIXP_DBL max_gain_factor = 5146cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FL2FXCONST_DBL(2.f / (float)(1 << G_SCALE_FACTOR)); 5156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL tmp1_m, tmp2_m, numerator_m, denominator_m, r_m, r4_m, q; 5166cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK INT tmp1_e, tmp2_e, numerator_e, denominator_e, r_e, r4_e; 5176cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 5186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /* r = (lin_Cld + 1 + 2*Icc*sqrt_linCld) / (lin_Cld + 1 - 5196cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * 2*Icc*sqrt_linCld) = (tmp1 + tmp2) / (tmp1 - tmp2) 5206cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK */ 5216cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK tmp1_m = 5226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fixpAdd(lin_Cld_m, lin_Cld_e, FL2FXCONST_DBL(1.f / 2.f), 1, &tmp1_e); 5236cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 5246cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK tmp2_m = fMult(Icc_m, sqrt_linCld_m); 5256cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK tmp2_e = 1 + Icc_e + sqrt_linCld_e; 5266cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK numerator_m = fixpAdd(tmp1_m, tmp1_e, tmp2_m, tmp2_e, &numerator_e); 5276cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK denominator_m = fixpAdd(tmp1_m, tmp1_e, -tmp2_m, tmp2_e, &denominator_e); 5286cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 5296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if ((numerator_m > FL2FXCONST_DBL(0.f)) && 5306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK (denominator_m > FL2FXCONST_DBL(0.f))) { 5316cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK r_m = fDivNorm(numerator_m, denominator_m, &r_e); 5326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK r_e += numerator_e - denominator_e; 5336cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 5346cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /* r_4 = sqrt( sqrt( r ) ) */ 5356cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK r4_m = sqrtFixp(r_m, r_e, &r4_e); 5366cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK r4_m = sqrtFixp(r4_m, r4_e, &r4_e); 5376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 5386cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK r4_e -= G_SCALE_FACTOR; 5396cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 5406cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /* q = min(r4_m, max_gain_factor) */ 5416cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK q = ((r4_e >= 0) && (r4_m >= (max_gain_factor >> r4_e))) 5426cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK ? max_gain_factor 5436cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK : scaleValue(r4_m, r4_e); 5446cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } else { 5456cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK q = FL2FXCONST_DBL(0.f); 5466cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 5476cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 5486cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK G_m[0] = max_gain_factor - q; 5496cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK G_m[1] = q; 5506cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 5516cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK *G_e = G_SCALE_FACTOR; 5526cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 5536cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK} 5546cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 5556cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKstatic void calculateDmxGains(const FIXP_DBL lin_Cld_m, const INT lin_Cld_e, 5566cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const FIXP_DBL lin_Cld2_m, const INT lin_Cld2_e, 5576cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const FIXP_DBL Icc_m, const INT Icc_e, 5586cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const FIXP_DBL G_m[2], const INT G_e, 5596cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL H1_m[2], INT *pH1_e) { 5606cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK#define H1_SCALE_FACTOR (2) 5616cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK const FIXP_DBL max_gain_factor = 5626cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FL2FXCONST_DBL(2.f / (float)(1 << H1_SCALE_FACTOR)); 5636cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 5646cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FIXP_DBL nrgRight_m, nrgLeft_m, crossNrg_m, inv_weight_num_m, 5656cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK inv_weight_denom_m, inverse_weight_m, inverse_weight_limited; 5666cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK INT nrgRight_e, nrgLeft_e, crossNrg_e, inv_weight_num_e, inv_weight_denom_e, 5676cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK inverse_weight_e; 5686cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 5696cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /* nrgRight = sqrt(1/(lin_Cld2 + 1) */ 5706cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK nrgRight_m = fixpAdd(lin_Cld2_m, lin_Cld2_e, FL2FXCONST_DBL(1.f / 2.f), 1, 5716cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK &nrgRight_e); 5726cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK nrgRight_m = invSqrtNorm2(nrgRight_m, nrgRight_e, &nrgRight_e); 5736cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 5746cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /* nrgLeft = lin_Cld * nrgRight */ 5756cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK nrgLeft_m = fMult(lin_Cld_m, nrgRight_m); 5766cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK nrgLeft_e = lin_Cld_e + nrgRight_e; 5776cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 5786cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /* crossNrg = sqrt(nrgLeft*nrgRight) */ 5796cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK crossNrg_m = sqrtFixp(fMult(nrgLeft_m, nrgRight_m), nrgLeft_e + nrgRight_e, 5806cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK &crossNrg_e); 5816cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 5826cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /* inverse_weight = sqrt((nrgLeft + nrgRight) / ( (G[0]*G[0]*nrgLeft) + 5836cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * (G[1]*G[1]*nrgRight) + 2*G[0]*G[1]*Icc*crossNrg)) = sqrt(inv_weight_num / 5846cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK * inv_weight_denom) 5856cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK */ 5866cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK inv_weight_num_m = 5876cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fixpAdd(nrgRight_m, nrgRight_e, nrgLeft_m, nrgLeft_e, &inv_weight_num_e); 5886cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 5896cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK inv_weight_denom_m = 5906cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fixpAdd(fMult(fPow2(G_m[0]), nrgLeft_m), 2 * G_e + nrgLeft_e, 5916cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fMult(fPow2(G_m[1]), nrgRight_m), 2 * G_e + nrgRight_e, 5926cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK &inv_weight_denom_e); 5936cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 5946cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK inv_weight_denom_m = 5956cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fixpAdd(fMult(fMult(fMult(G_m[0], G_m[1]), crossNrg_m), Icc_m), 5966cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 1 + 2 * G_e + crossNrg_e + Icc_e, inv_weight_denom_m, 5976cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK inv_weight_denom_e, &inv_weight_denom_e); 5986cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 5996cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if (inv_weight_denom_m > FL2FXCONST_DBL(0.f)) { 6006cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK inverse_weight_m = 6016cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK fDivNorm(inv_weight_num_m, inv_weight_denom_m, &inverse_weight_e); 6026cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK inverse_weight_m = 6036cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK sqrtFixp(inverse_weight_m, 6046cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK inverse_weight_e + inv_weight_num_e - inv_weight_denom_e, 6056cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK &inverse_weight_e); 6066cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK inverse_weight_e -= H1_SCALE_FACTOR; 6076cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 6086cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK /* inverse_weight_limited = min(max_gain_factor, inverse_weight) */ 6096cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK inverse_weight_limited = 6106cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK ((inverse_weight_e >= 0) && 6116cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK (inverse_weight_m >= (max_gain_factor >> inverse_weight_e))) 6126cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK ? max_gain_factor 6136cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK : scaleValue(inverse_weight_m, inverse_weight_e); 6146cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } else { 6156cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK inverse_weight_limited = max_gain_factor; 6166cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 6176cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 6186cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK H1_m[0] = fMult(G_m[0], inverse_weight_limited); 6196cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK H1_m[1] = fMult(G_m[1], inverse_weight_limited); 6206cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 6216cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK *pH1_e = G_e + H1_SCALE_FACTOR; 6226cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK} 6236cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 6246cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDKFDK_SACENC_ERROR fdk_sacenc_close_enhancedTimeDomainDmx( 6256cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK HANDLE_ENHANCED_TIME_DOMAIN_DMX *phEnhancedTimeDmx) { 6266cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FDK_SACENC_ERROR error = SACENC_OK; 6276cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK 6286cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if (phEnhancedTimeDmx == NULL) { 6296cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK error = SACENC_INVALID_HANDLE; 6306cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } else { 6316cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if (*phEnhancedTimeDmx != NULL) { 6326cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK if ((*phEnhancedTimeDmx)->sinusWindow_m != NULL) { 6336cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FDK_FREE_MEMORY_1D((*phEnhancedTimeDmx)->sinusWindow_m); 6346cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 6356cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK FDK_FREE_MEMORY_1D(*phEnhancedTimeDmx); 6366cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 6376cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK } 6386cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK return error; 6396cfabd35363c3ef5e3b209b867169a500b3ccc3cFraunhofer IIS FDK} 640