1dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* ------------------------------------------------------------------ 2dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Copyright (C) 1998-2009 PacketVideo 3dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 4dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * you may not use this file except in compliance with the License. 6dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * You may obtain a copy of the License at 7dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 8dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 10dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Unless required by applicable law or agreed to in writing, software 11dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * express or implied. 14dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * See the License for the specific language governing permissions 15dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and limitations under the License. 16dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * ------------------------------------------------------------------- 17dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 18dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* 19dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Filename: calc_sbr_envelope.c 20dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY 23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who: Date: MM/DD/YYYY 26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description: 27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS 30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION 35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS 39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES 43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 44dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberSC 29 Software Copyright Licencing Disclaimer: 45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 46dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThis software module was originally developed by 47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Coding Technologies 48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberand edited by 50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber - 51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberin the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3 53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberstandards for reference purposes and its performance may not have been 54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberoptimized. This software module is an implementation of one or more tools as 55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberspecified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards. 56dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberISO/IEC gives users free license to this software module or modifications 57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberthereof for use in products claiming conformance to audiovisual and 58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberimage-coding related ITU Recommendations and/or ISO/IEC International 59dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberStandards. ISO/IEC gives users the same free license to this software module or 60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubermodifications thereof for research purposes and further ISO/IEC standardisation. 61dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThose intending to use this software module in products are advised that its 62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberuse may infringe existing patents. ISO/IEC have no liability for use of this 63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubersoftware module or modifications thereof. Copyright is not released for 64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberproducts that do not conform to audiovisual and image-coding related ITU 65dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberRecommendations and/or ISO/IEC International Standards. 66dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThe original developer retains full right to modify and use the code for its 67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberown purpose, assign or donate the code to a third party and to inhibit third 68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberparties from using the code for products that do not conform to audiovisual and 69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberimage-coding related ITU Recommendations and/or ISO/IEC International Standards. 70dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThis copyright notice must be included in all copies or derivative works. 71dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberCopyright (c) ISO/IEC 2002. 72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE 75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------ 77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/ 78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES 82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef AAC_PLUS 85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "calc_sbr_envelope.h" 88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "sbr_envelope_calc_tbl.h" 89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "sbr_create_limiter_bands.h" 90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "aac_mem_funcs.h" 91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "fxp_mul32.h" 93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_normalize.h" 94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "sbr_aliasing_reduction.h" 96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS 99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here 100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES 105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional 106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also. 107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_sqrt.h" 109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_div.h" 111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "fxp_mul32.h" 112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_normalize.h" 113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define Q30fmt(x) (Int32)(x*((Int32)1<<30) + (x>=0?0.5F:-0.5F)) 115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define Q28fmt(x) (Int32)(x*((Int32)1<<28) + (x>=0?0.5F:-0.5F)) 116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define Q15fmt(x) (Int32)(x*((Int32)1<<15) + (x>=0?0.5F:-0.5F)) 117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS 121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration 122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef __cplusplus 124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberextern "C" 125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber void envelope_application_LC(Int32 *aBufR, 129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_gain_man, 130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_gain_exp, 131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *noise_level_man, 132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *noise_level_exp, 133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_tone_man, 134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_tone_exp, 135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 band_nrg_tone_detector, 136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int32 *frame_info, 137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *harm_index, 138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *phase_index, 139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 i, 140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 lowSubband, 141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 noSubbands, 142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 noNoiseFlag); 143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber void energy_estimation_LC(Int32 *aBufR, 146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_est_man, 147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_est_exp, 148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int32 *frame_info, 149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 i, 150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 k, 151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 c, 152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 ui2); 153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef HQ_SBR 155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber void envelope_application(Int32 *aBufR, 158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *aBufI, 159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_gain_man, 160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_gain_exp, 161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *noise_level_man, 162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *noise_level_exp, 163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_tone_man, 164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_tone_exp, 165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *fBuf_man[64], 166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *fBuf_exp[64], 167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *fBufN_man[64], 168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *fBufN_exp[64], 169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int32 *frame_info, 170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *harm_index, 171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *phase_index, 172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 i, 173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 lowSubband, 174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 noSubbands, 175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 noNoiseFlag, 176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 band_nrg_tone_detector, 177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 maxSmoothLength, 178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 smooth_length); 179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber void energy_estimation(Int32 *aBufR, 182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *aBufI, 183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_est_man, 184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_est_exp, 185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int32 *frame_info, 186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 i, 187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 k, 188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 c, 189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 ui2); 190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef __cplusplus 194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} 195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS 199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module 200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES 204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module 205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES 209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere 210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE 214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid calc_sbr_envelope(SBR_FRAME_DATA *frameData, 217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *aBufR, 218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *aBufI, 219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int freqBandTable1[2][MAX_FREQ_COEFFS + 1], 220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int32 *nSfb, 221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 freqBandTable2[MAX_NOISE_COEFFS + 1], 222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 nNBands, 223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 reset, 224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *degreeAlias, 225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *harm_index, 226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *phase_index, 227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 hFp[64], 228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *sUp, 229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 limSbc[][13], 230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *gateMode, 231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef HQ_SBR 232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *fBuf_man[64], 233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *fBuf_exp[64], 234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *fBufN_man[64], 235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *fBufN_exp[64], 236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 scratch_mem[][64], 238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber struct PATCH Patch, 239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 sqrt_cache[][4], 240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 LC_flag) 241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 c; 244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 li; 245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 ui; 246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 i; 247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 j; 248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 k = 0; 249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 l; 250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int m = 0; 251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int kk = 0; 252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int o; 253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int next = -1; 254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 ui2; 255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int flag; 256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int noNoiseFlag; 257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int *ptr; 258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber UInt32 nrg = 0; 261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 nrg_exp = 0; 262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber struct intg_div quotient; 263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber struct intg_sqrt root_sq; 264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 aux1; 266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nL_man = frameData->sbrNoiseFloorLevel_man; 268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nL_exp = frameData->sbrNoiseFloorLevel_exp; 269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *sfb_nrg_man = frameData->iEnvelope_man; 271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *sfb_nrg_exp = frameData->iEnvelope_exp; 272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp_q1; 274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp_q2; 275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 g_max_man; 277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 g_max_exp; 278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 p_ref_man; 280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 p_ref_exp; 281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 p_est_man; 283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 p_est_exp; 284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 p_adj_man; 286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 p_adj_exp; 287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 avg_gain; 288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 boost_gain_q; 290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 band_nrg_tone_detector; 292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_est_man = scratch_mem[0]; 294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_est_exp = scratch_mem[1]; 295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_ref_man = scratch_mem[2]; 296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_ref_exp = scratch_mem[3]; 297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_gain_man = scratch_mem[4]; 298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_gain_exp = scratch_mem[5]; 299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *noise_level_man = scratch_mem[6]; 300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *noise_level_exp = scratch_mem[7]; 301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_tone_man = scratch_mem[8]; 302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_tone_exp = scratch_mem[9]; 303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *hF = scratch_mem[10]; 304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int32 *frame_info = frameData->frameInfo; 308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 int_mode = frameData->sbr_header.interpolFreq; 309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 dontUseTheseGainValues[64]; 315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef HQ_SBR 317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 n; 319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 smooth_length; 320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 smoothingLength = frameData->sbr_header.smoothingLength; 321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 maxSmoothLength = smoothLengths[0]; 322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 limiterBand = frameData->sbr_header.limiterBands; 326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 limiterGains = frameData->sbr_header.limiterGains; 327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *addHarmonics = frameData->addHarmonics; 328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 lowSubband = freqBandTable1[LOW_RES][0]; 330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 noSubbands = freqBandTable1[LOW_RES][nSfb[LOW_RES]] - lowSubband; 331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 nEnv = frame_info[0]; 332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 sEnv = frame_info[(nEnv + 1)<<1]; 333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* ensure that noSubbands in the range [0,64] */ 335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noSubbands = (noSubbands >> 31) ^ noSubbands; 336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (noSubbands > 64) 337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noSubbands = 64; 339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (reset) 342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *sUp = 1; 344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *phase_index = 0; 345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sbr_create_limiter_bands(limSbc, 346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber gateMode, 347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber freqBandTable1[LOW_RES], 348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Patch, 349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nSfb[LOW_RES]); 350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Mapping. */ 353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memset((void*)hF, 0, (sizeof(*hF) << 6)); 354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptr = freqBandTable1[HI]; 356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber l = *(ptr++); 357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = nSfb[HI]; i != 0; i--) 359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber k = *(ptr++); 361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber j = ((k + l) >> 1) - lowSubband; 362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber l = k; 363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber hF[j] = *(addHarmonics++); 364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Envelope adjustment. */ 368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (i = 0; i < nEnv; i++) 370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (frame_info[1+i] == frame_info[(nEnv<<1)+4+kk]) 373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber kk++, next++; 375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noNoiseFlag = (i == sEnv || i == frameData->prevEnvIsShort) ? 1 : 0; 378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef HQ_SBR 380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber smooth_length = (noNoiseFlag ? 0 : smoothLengths[smoothingLength]); 381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Estimate levels. */ 385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber c = 0; 386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber o = 0; 387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber band_nrg_tone_detector = 0; 389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int kkkk = freqBandTable1[ frame_info[nEnv+2+i] ][0]; 391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (j = 0; j < nSfb[frame_info[nEnv+2+i]]; j++) 393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber li = freqBandTable1[ frame_info[nEnv+2+i] ][j ]; 395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ui = freqBandTable1[ frame_info[nEnv+2+i] ][j + 1]; 396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber flag = 0; 397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (k = li; k < ui; k++) 399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* Calculate the average energy over the current envelope, */ 400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ui2 = (frame_info[1+i] << 1); 401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (LC_flag == ON) 403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber energy_estimation_LC((Int32 *)aBufR, 405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_man, 406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_exp, 407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber frame_info, 408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber i, 409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber k - kkkk, 410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber c, 411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ui2); 412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef HQ_SBR 414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber energy_estimation((Int32 *)aBufR, 418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (Int32 *)aBufI, 419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_man, 420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_exp, 421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber frame_info, 422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber i, 423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber k - kkkk, 424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber c, 425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ui2); 426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber flag = (hF[c] && (i >= sEnv || hFp[c+lowSubband])) ? 1 : flag; 430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber c++; 431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ui2 = freqBandTable2[o+1]; 435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (!int_mode) 437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* If no interpolation is used, */ 438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = -100; 440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (k = c - (ui - li); k < c; k++) 442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp_q1 < nrg_est_exp[k]) 444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = nrg_est_exp[k]; 446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg = 0; 450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (k = c - (ui - li); k < c; k++) 451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* average the energy in all the QMF bands, */ 452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg += nrg_est_man[k] >> (tmp_q1 - nrg_est_exp[k]); /* for the whole scalefactor band. */ 453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg /= (ui - li); 455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_exp = tmp_q1; 456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber c -= (ui - li); 460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (k = 0; k < ui - li; k++) 462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber o = (k + li >= ui2) ? o + 1 : o; 464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ui2 = freqBandTable2[o+1]; 465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * If no interpolation is used, use the averaged energy from above, 467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * otherwise do nothing. 468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (!int_mode) 472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_man[c] = nrg; 474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_exp[c] = nrg_exp; 475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (LC_flag == ON) 478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_exp[c] += 1; 480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (flag) 482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dontUseTheseGainValues[k + li - lowSubband] = 1; 484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dontUseTheseGainValues[k + li - lowSubband] = 0; 488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_ref_man[c] = sfb_nrg_man[m]; 492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_ref_exp[c] = sfb_nrg_exp[m]; 493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * compute nL/(1 + nL); where nL = nL_man*2^nL_exp 496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux1 = next * nNBands + o; 498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = nL_exp[aux1]; 500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp_q1 >= 0) 502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_div(nL_man[aux1], nL_man[aux1] + (0x3FFFFFFF >> tmp_q1), "ient); 504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = nL_man[aux1] >> (-tmp_q1); 508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_div(tmp_q1, tmp_q1 + 0x3FFFFFFF, "ient); 509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * tmp_q1 = nL/(1 + nL)*nrg_ref[c]; 513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q30(quotient.quotient >> quotient.shift_factor, nrg_ref_man[c]); 516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (flag) 518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Calculate levels and gain, dependent on whether a synthetic, a sine is present or not. 521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * 522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * nrg_gain[c]=(float)pv_sqrt( tmp/(nrg_est[c] + 1), sqrt_cache[1] ); 523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_div(tmp_q1, nrg_est_man[c] + 1, "ient); 527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * nrg_est_man[c] is an integer number, while tmp_q1 and quotient.quotient 529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * are fractions in Q30 530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = nrg_ref_exp[c] - nrg_est_exp[c] - quotient.shift_factor - 30; 533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_sqrt(quotient.quotient, tmp_q2, &root_sq, sqrt_cache[1]); 535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_gain_man[c] = root_sq.root; /* in Q28 format */ 536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_gain_exp[c] = root_sq.shift_factor; 537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * nrg_tone[c]=(float)( (hF[c] && (i >= sEnv || hFp[c+lowSubband])) ? 541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * pv_sqrt(nrg_ref[c]/(1+tmp_nL), sqrt_cache[2]) : 0); 542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (hF[c] && (i >= sEnv || hFp[c+lowSubband])) 544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * nrg_ref[c] and nL, as well as quotient.quotient 547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * are fractions in Q30 548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* aux1 == next*nNBands + o */ 551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = nL_exp[aux1]; 553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * nrg_ref[c]/(1+tmp_nL) 555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp_q2 >= 0) 558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_div(nrg_ref_man[c], nL_man[aux1] + (0x3FFFFFFF >> tmp_q2), "ient); 560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = nL_man[aux1] >> (-tmp_q2); 564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_div(nrg_ref_man[c], tmp_q2 + 0x3FFFFFFF, "ient); 565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = 0; /* exponent has been applied to the sum ((man>>exp) + 1) */ 566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = nrg_ref_exp[c] - tmp_q2 - quotient.shift_factor; 569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_sqrt(quotient.quotient, tmp_q2, &root_sq, sqrt_cache[2]); 571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_tone_man[c] = root_sq.root; 572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_tone_exp[c] = root_sq.shift_factor; 573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 574dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 575dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 576dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 577dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_tone_man[c] = 0; 578dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_tone_exp[c] = 0; 579dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 580dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 581dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 582dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 583dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 584dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (noNoiseFlag) 585dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 586dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 587dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * nrg_gain[c] = (float) pv_sqrt(nrg_ref[c] /(nrg_est[c] + 1), sqrt_cache[3]); 588dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 589dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 590dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_div(nrg_ref_man[c], nrg_est_man[c] + 1, "ient); 591dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 592dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 593dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * nrg_est_man[c] is an integer number, while nrg_ref_man[c] and 594dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * quotient.quotient are fractions in Q30 595dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 596dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 597dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = nrg_ref_exp[c] - nrg_est_exp[c] - quotient.shift_factor - 30; 598dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 599dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_sqrt(quotient.quotient, tmp_q2, &root_sq, sqrt_cache[3]); 600dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_gain_man[c] = root_sq.root; 601dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_gain_exp[c] = root_sq.shift_factor; 602dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 603dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 604dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 605dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 606dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 607dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * nrg_gain[c] = (float) pv_sqrt(nrg_ref[c]/((nrg_est[c] + 1)*(1+tmp_nL)), sqrt_cache[4]); 608dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 609dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* aux1 == next*nNBands + o */ 610dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 611dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = nL_exp[aux1]; 612dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 613dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * nrg_ref[c]/((nrg_est[c] + 1)*(1+tmp_nL)) 614dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 615dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 616dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (nrg_est_man[c] == 0) 617dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 618dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = 0; /* avoid division by 0 in next if-else, this could be due to 619dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber rounding noise */ 620dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 621dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 622dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 623dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp_q2 >= 0) 624dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 625dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 626dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = fxp_mul32_Q30(nrg_est_man[c] + 1, nL_man[aux1] + (0x3FFFFFFF >> tmp_q2)); 627dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_div(nrg_ref_man[c], tmp_q2, "ient); 628dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 629dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * nrg_est_man[c] is an integer number, while nrg_ref_man[c] and 630dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * quotient.quotient are fractions in Q30 631dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 632dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = nrg_ref_exp[c] - quotient.shift_factor - 30 - nL_exp[aux1]; 633dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (nrg_est_man[c]) 634dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 635dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 -= nrg_est_exp[c]; 636dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 637dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 638dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = nrg_ref_exp[c] - nrg_est_exp[c] - quotient.shift_factor - 30 - nL_exp[aux1]; 639dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 640dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 641dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 642dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp_q2 > - 10) 643dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 644dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = nL_man[aux1] >> (-tmp_q2); 645dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 646dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = fxp_mul32_Q30(nrg_est_man[c] + 1, tmp_q2 + 0x3FFFFFFF); 647dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 648dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 649dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 650dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = nrg_est_man[c] + 1; 651dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 652dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 653dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 654dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_div(nrg_ref_man[c], tmp_q2, "ient); 655dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 656dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * nrg_est_man[c] is an integer number, while nrg_ref_man[c] and 657dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * quotient.quotient are fractions in Q30 658dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 659dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 660dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = nrg_ref_exp[c] - quotient.shift_factor - 30; 661dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (nrg_est_man[c]) 662dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 663dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 -= nrg_est_exp[c]; 664dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 665dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 666dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 667dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 668dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_sqrt(quotient.quotient, tmp_q2, &root_sq, sqrt_cache[4]); 669dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_gain_man[c] = root_sq.root; 670dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_gain_exp[c] = root_sq.shift_factor; 671dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 672dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 673dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 674dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_tone_man[c] = 0; 675dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_tone_exp[c] = -100; 676dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 677dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 678dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 679dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber band_nrg_tone_detector |= nrg_tone_man[c]; /* detect any tone activity */ 680dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 681dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_sqrt(tmp_q1, nrg_ref_exp[c], &root_sq, sqrt_cache[5]); 682dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noise_level_man[c] = root_sq.root; 683dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noise_level_exp[c] = root_sq.shift_factor; 684dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 685dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber c++; 686dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 687dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* ---- end-for-loop (k) ------ */ 688dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber m++; 689dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 690dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* -------- Estimate levels end-for-loop (j) ----- */ 691dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 692dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 693dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 694dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 695dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Limiter 696dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 697dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 698dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 699dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (c = 0; c < gateMode[limiterBand]; c++) 700dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 701dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 702dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p_ref_man = 0; 703dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p_est_man = 0; 704dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 705dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 706dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * get max exponent for the reference and estimated energy 707dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 708dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p_ref_exp = -100; 709dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p_est_exp = -100; 710dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 711dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (k = limSbc[limiterBand][c]; k < limSbc[limiterBand][c + 1]; k++) 712dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 713dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (p_ref_exp < nrg_ref_exp[k]) 714dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 715dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p_ref_exp = nrg_ref_exp[k]; /* max */ 716dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 717dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (p_est_exp < nrg_est_exp[k]) 718dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 719dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p_est_exp = nrg_est_exp[k]; /* max */ 720dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 721dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 722dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 723dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber k -= limSbc[limiterBand][c]; /* number of element used in the addition */ 724dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 725dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber while (k != 0) /* bit guard protection depends on log2(k) */ 726dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 727dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber k >>= 1; 728dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p_ref_exp++; /* add extra bit-overflow-guard, nrg_ref_exp is in Q30 format */ 729dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 730dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 731dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 732dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (k = limSbc[limiterBand][c]; k < limSbc[limiterBand][c + 1]; k++) 733dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /*Calculate the average gain for the current limiter band.*/ 734dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p_ref_man += (nrg_ref_man[k] >> (p_ref_exp - nrg_ref_exp[k])); 735dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p_est_man += (nrg_est_man[k] >> (p_est_exp - nrg_est_exp[k])); 736dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 737dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 738dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 739dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (p_est_man) 740dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 741dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 742dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * "average gain" (not equal to average of nrg_gain) 743dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 744dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_div(p_ref_man, p_est_man, "ient); 745dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 746dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = p_ref_exp - 30 - p_est_exp - quotient.shift_factor; 747dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 748dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 749dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * avg_gain = sqrt(p_ref/p_est) 750dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 751dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_sqrt(quotient.quotient, tmp_q2, &root_sq, sqrt_cache[6]); 752dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber avg_gain = root_sq.root; 753dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber g_max_exp = root_sq.shift_factor; 754dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 755dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 756dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * maximum gain allowed is calculated from table. 757dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 758dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 759dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 760dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * g_max = avg_gain * limGains[limiterGains]; 761dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 762dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 763dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber g_max_man = fxp_mul32_Q30(avg_gain, limGains[limiterGains]); /* table is in Q30 */ 764dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 765dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (limiterGains == 3) 766dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 767dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber g_max_exp = limGains[4]; 768dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 769dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 770dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = g_max_exp >= 16 ? g_max_exp : 16; 771dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 772dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = g_max_man >> (tmp_q1 - g_max_exp); 773dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = Q28fmt(1.52587890625F) >> (tmp_q1 - 16); 774dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 775dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp_q2 > tmp_q1) 776dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 777dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* upper limit, +100 dB */ 778dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber g_max_man = Q28fmt(1.52587890625F); 779dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber g_max_exp = 16; 780dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 781dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 782dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 783dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 784dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* Qfmt(1.52587890625F) exp = 16 */ 785dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber g_max_man = Q28fmt(1.52587890625F); 786dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber g_max_exp = 16; 787dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 788dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 789dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 790dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Compute Adjusted power p_adj 791dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 792dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (k = limSbc[limiterBand][c]; k < limSbc[limiterBand][c + 1]; k++) 793dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 794dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 795dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = g_max_exp >= nrg_gain_exp[k] ? g_max_exp : nrg_gain_exp[k]; 796dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 797dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = g_max_man >> (tmp_q1 - g_max_exp); 798dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = nrg_gain_man[k] >> (tmp_q1 - nrg_gain_exp[k]); 799dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 800dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * if(g_max <= nrg_gain[k]) 801dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 802dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp_q2 <= tmp_q1) 803dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 804dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q28(noise_level_man[k], g_max_man); 805dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_div(tmp_q1, nrg_gain_man[k], "ient); 806dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noise_level_man[k] = quotient.quotient >> 2; /* in Q28 */ 807dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noise_level_exp[k] = noise_level_exp[k] + g_max_exp - quotient.shift_factor - nrg_gain_exp[k]; 808dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 809dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_gain_man[k] = g_max_man; /* gains with noise supression */ 810dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_gain_exp[k] = g_max_exp; 811dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 812dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 813dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 814dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p_adj_exp = -100; 815dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 816dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (k = limSbc[limiterBand][c]; k < limSbc[limiterBand][c + 1]; k++) 817dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 818dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = nrg_est_exp[k] + (nrg_gain_exp[k] << 1) + 28; /* 28 to match shift down by mult32_Q28 */ 819dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 820dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (p_adj_exp < tmp_q1) 821dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 822dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p_adj_exp = tmp_q1; 823dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 824dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (nrg_tone_man[k]) 825dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 826dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = (nrg_tone_exp[k] << 1); 827dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (p_adj_exp < tmp_q1) 828dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 829dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p_adj_exp = tmp_q1; 830dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 831dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 832dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else if (!noNoiseFlag) 833dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 834dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = (noise_level_exp[k] << 1); 835dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 836dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (p_adj_exp < tmp_q1) 837dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 838dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p_adj_exp = tmp_q1; 839dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 840dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 841dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 842dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 843dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p_adj_exp += 1; /* overflow bit-guard*/ 844dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 845dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p_adj_man = 0; 846dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 847dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (k = limSbc[limiterBand][c]; k < limSbc[limiterBand][c + 1]; k++) 848dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 849dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 850dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * p_adj += nrg_gain[k]*nrg_gain[k]*nrg_est[k]; 851dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 852dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 853dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (p_adj_exp - (nrg_est_exp[k] + (nrg_gain_exp[k] << 1)) < 59) 854dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 855dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q28(nrg_gain_man[k], nrg_gain_man[k]); 856dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q28(tmp_q1, nrg_est_man[k]); 857dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p_adj_man += (tmp_q1 >> (p_adj_exp - (nrg_est_exp[k] + (nrg_gain_exp[k] << 1) + 28))); 858dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 859dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 860dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (nrg_tone_man[k]) 861dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 862dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 863dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * p_adj += nrg_tone[k]*nrg_tone[k]; 864dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 865dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (p_adj_exp - (nrg_tone_exp[k] << 1) < 31) 866dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 867dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q28(nrg_tone_man[k], nrg_tone_man[k]); 868dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p_adj_man += (tmp_q1 >> (p_adj_exp - (nrg_tone_exp[k] << 1))); 869dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 870dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 871dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else if (!noNoiseFlag) 872dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 873dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 874dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * p_adj += noise_level[k]*noise_level[k]; 875dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 876dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 877dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (p_adj_exp - (noise_level_exp[k] << 1) < 31) 878dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 879dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q28(noise_level_man[k], noise_level_man[k]); 880dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber p_adj_man += (tmp_q1 >> (p_adj_exp - (noise_level_exp[k] << 1))); 881dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 882dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 883dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 884dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 885dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 886dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 887dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (p_adj_man) 888dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 889dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_div(p_ref_man, p_adj_man, "ient); 890dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = p_ref_exp - p_adj_exp - 58 - quotient.shift_factor; /* 58 <> Q30 + Q28 */ 891dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 892dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_sqrt(quotient.quotient, tmp_q2, &root_sq, sqrt_cache[7]); 893dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 894dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (root_sq.shift_factor > -28) 895dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 896dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber boost_gain_q = root_sq.root << (root_sq.shift_factor + 28); 897dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 898dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 899dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 900dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber boost_gain_q = root_sq.root >> (-28 - root_sq.shift_factor); 901dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 902dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 903dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = root_sq.shift_factor >= -28 ? root_sq.shift_factor : -28; 904dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 905dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = root_sq.root >> (tmp_q1 - root_sq.shift_factor); 906dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = Q28fmt(1.584893192f) >> (tmp_q1 + 28); 907dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 908dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 909dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp_q2 > tmp_q1) 910dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 911dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber boost_gain_q = Q28fmt(1.584893192f); 912dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 913dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 914dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 915dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 916dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber boost_gain_q = Q28fmt(1.584893192f); 917dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 918dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 919dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (band_nrg_tone_detector) 920dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 921dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (k = limSbc[limiterBand][c]; k < limSbc[limiterBand][c + 1]; k++) 922dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 923dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_gain_man[k] = fxp_mul32_Q28(nrg_gain_man[k], boost_gain_q); 924dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noise_level_man[k] = fxp_mul32_Q28(noise_level_man[k], boost_gain_q); 925dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_tone_man[k] = fxp_mul32_Q28(nrg_tone_man[k], boost_gain_q); 926dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 927dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 928dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 929dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 930dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 931dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (k = limSbc[limiterBand][c]; k < limSbc[limiterBand][c + 1]; k++) 932dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 933dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_gain_man[k] = fxp_mul32_Q28(nrg_gain_man[k], boost_gain_q); 934dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noise_level_man[k] = fxp_mul32_Q28(noise_level_man[k], boost_gain_q); 935dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 936dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 937dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 938dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 939dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 940dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* Limiter End for loop (c) */ 941dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 942dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 943dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (LC_flag == ON) 944dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 945dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 946dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 947dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Aliasing correction 948dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 949dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 950dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sbr_aliasing_reduction(degreeAlias, 951dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_gain_man, 952dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_gain_exp, 953dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_man, 954dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_exp, 955dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber dontUseTheseGainValues, 956dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noSubbands, 957dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber lowSubband, 958dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sqrt_cache, 959dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber scratch_mem[3]); 960dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 961dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (*sUp) /* Init only done once upon reset */ 962dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 963dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *sUp = 0; 964dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 965dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 966dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber envelope_application_LC((Int32 *)aBufR, 967dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_gain_man, 968dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_gain_exp, 969dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noise_level_man, 970dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noise_level_exp, 971dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_tone_man, 972dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_tone_exp, 973dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber band_nrg_tone_detector, 974dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber frame_info, 975dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber harm_index, 976dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber phase_index, 977dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber i, 978dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber lowSubband, 979dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noSubbands, 980dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noNoiseFlag); 981dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 982dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef HQ_SBR 983dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 984dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 985dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 986dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (*sUp) /* Init only done once upon reset */ 987dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 988dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (n = 0; n < maxSmoothLength; n++) 989dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 990dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memcpy(fBuf_man[n], nrg_gain_man, noSubbands*sizeof(*fBuf_man[n])); 991dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memcpy(fBufN_man[n], noise_level_man, noSubbands*sizeof(*fBufN_man[n])); 992dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memcpy(fBuf_exp[n], nrg_gain_exp, noSubbands*sizeof(*fBuf_exp[n])); 993dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memcpy(fBufN_exp[n], noise_level_exp, noSubbands*sizeof(*fBufN_exp[n])); 994dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 995dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *sUp = 0; 996dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 997dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 998dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 999dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber envelope_application((Int32 *)aBufR, 1000dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (Int32 *)aBufI, 1001dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_gain_man, 1002dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_gain_exp, 1003dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noise_level_man, 1004dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noise_level_exp, 1005dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_tone_man, 1006dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_tone_exp, 1007dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fBuf_man, 1008dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fBuf_exp, 1009dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fBufN_man, 1010dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fBufN_exp, 1011dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber frame_info, 1012dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber harm_index, 1013dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber phase_index, 1014dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber i, 1015dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber lowSubband, 1016dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noSubbands, 1017dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noNoiseFlag, 1018dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber band_nrg_tone_detector, 1019dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber maxSmoothLength, 1020dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber smooth_length); 1021dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1022dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1023dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 1024dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1025dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* ----- Envelope adjustment end for-loop (i) ---- */ 1026dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1027dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1028dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memcpy(&hFp[0] + lowSubband, 1029dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber hF, 1030dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber (64 - lowSubband)*sizeof(*hF)); 1031dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1032dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sEnv == nEnv) 1033dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1034dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber frameData->prevEnvIsShort = 0; 1035dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1036dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1037dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1038dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber frameData->prevEnvIsShort = -1; 1039dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1040dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1041dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1042dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} 1043dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1044dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1045dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1046dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 1047dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE 1048dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 1049dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1050dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid envelope_application_LC(Int32 *aBufR, 1051dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_gain_man, 1052dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_gain_exp, 1053dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *noise_level_man, 1054dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *noise_level_exp, 1055dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_tone_man, 1056dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_tone_exp, 1057dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 band_nrg_tone_detector, 1058dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int32 *frame_info, 1059dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *harm_index, 1060dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *phase_index, 1061dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 i, 1062dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 lowSubband, 1063dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 noSubbands, 1064dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 noNoiseFlag) 1065dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 1066dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1067dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *ptrReal; 1068dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 sb_gain_man; 1069dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 sb_noise_man; 1070dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 sb_noise_exp; 1071dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 l; 1072dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 k; 1073dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp_q1; 1074dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp_q2; 1075dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tone_count; 1076dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int16 tmp_16; 1077dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 indexMinus1; 1078dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 indexPlus1; 1079dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1080dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1081dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1082dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Application 1083dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1084dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1085dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (band_nrg_tone_detector) /* Add tone energy only if energy is detected */ 1086dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1087dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1088dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1089dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * pre-calculate tone application 1090dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1091dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (k = 0; k < noSubbands; k++) 1092dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1093dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = (-nrg_tone_exp[k]); 1094dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = nrg_tone_man[k]; 1095dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = tmp_q1 >> tmp_q2; 1096dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_by_16(tmp_q2, Q15fmt(0.0163f)); 1097dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_tone_man[k] = tmp_q2; 1098dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_tone_exp[k] = tmp_q1; 1099dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noise_level_exp[k] += 1; 1100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_gain_exp[k] += 28; 1101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (l = (frame_info[1+i] << 1); l < (frame_info[2+i] << 1); l++) 1104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrReal = (aBufR + l * SBR_NUM_BANDS); 1106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tone_count = 0; 1108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber indexPlus1 = (*harm_index + 1) & 3; 1110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (indexPlus1 & 1) /* if indexPlus1 is odd */ 1112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (k = 0; k < noSubbands; k++) 1114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_man = nrg_gain_man[k]; 1117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = *ptrReal; 1118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = nrg_gain_exp[k]; 1119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q28(tmp_q1, sb_gain_man); 1120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp_q2 < 0) 1122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp_q2 > -32) 1124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal = tmp_q1 >> (-tmp_q2); 1126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal = tmp_q1 << tmp_q2; 1131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *phase_index = (*phase_index + 1) & 511; 1134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (!nrg_tone_man[k] && !noNoiseFlag) 1136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_16 = rP_LCx[*phase_index]; 1139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_man = noise_level_man[k]; 1140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_exp = noise_level_exp[k]; 1141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_by_16(sb_noise_man, tmp_16); 1143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_noise_exp < 0) 1145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_noise_exp > -32) 1147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal += tmp_q1 >> (-sb_noise_exp); 1149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal += tmp_q1 << sb_noise_exp; 1154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = nrg_tone_man[k]; 1158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (*harm_index) 1160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal -= tmp_q1; 1162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal += tmp_q1; 1166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp_q1) 1169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tone_count++; 1171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrReal++; 1174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* for-loop (k) */ 1176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else /* if indexPlus1 is even */ 1179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber indexMinus1 = (*harm_index - 1) & 3; 1181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* --- k = 0 ----- */ 1183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_man = nrg_gain_man[0]; 1185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = *ptrReal; 1186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = nrg_gain_exp[0]; 1187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q28(tmp_q1, sb_gain_man); 1188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp_q2 < 0) 1190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp_q2 > -32) 1192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal = tmp_q1 >> (-tmp_q2); 1194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal = tmp_q1 << tmp_q2; 1199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *phase_index = (*phase_index + 1) & 511; 1202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = nrg_tone_exp[0]; 1204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = nrg_tone_exp[1]; 1205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((indexPlus1 != 0) ^((lowSubband & 1) != 0)) 1207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(ptrReal - 1) -= tmp_q1; 1209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(ptrReal) += tmp_q2; 1210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(ptrReal - 1) += tmp_q1; 1214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(ptrReal) -= tmp_q2; 1215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (!nrg_tone_man[0] && !noNoiseFlag) 1218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_16 = rP_LCx[*phase_index]; 1220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_man = noise_level_man[0]; 1221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_exp = noise_level_exp[0]; 1222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_by_16(sb_noise_man, tmp_16); 1224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_noise_exp < 0) 1226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_noise_exp > -32) 1228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal += tmp_q1 >> (-sb_noise_exp); 1230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal += tmp_q1 << sb_noise_exp; 1235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tone_count++; 1240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrReal++; 1243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* ---- */ 1245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (k = 1; k < noSubbands - 1; k++) 1247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_man = nrg_gain_man[k]; 1250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = *ptrReal; 1251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = nrg_gain_exp[k]; 1252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q28(tmp_q1, sb_gain_man); 1253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp_q2 < 0) 1255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp_q2 > -32) 1257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal = tmp_q1 >> (-tmp_q2); 1259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal = tmp_q1 << tmp_q2; 1264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *phase_index = (*phase_index + 1) & 511; 1267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tone_count < 16) 1270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = nrg_tone_exp[k - 1]; 1272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = nrg_tone_exp[k + 1]; 1273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 -= tmp_q2; 1275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((indexPlus1 != 0) ^(((k + lowSubband) & 1) != 0)) 1278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(ptrReal) -= tmp_q1; 1280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(ptrReal) += tmp_q1; 1284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (tone_count < 16) */ 1286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (!nrg_tone_man[k] && !noNoiseFlag) 1289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_16 = rP_LCx[*phase_index]; 1291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_man = noise_level_man[k]; 1292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_exp = noise_level_exp[k]; 1293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_by_16(sb_noise_man, tmp_16); 1295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_noise_exp < 0) 1297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_noise_exp > -32) 1299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal += tmp_q1 >> (-sb_noise_exp); 1301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal += tmp_q1 << sb_noise_exp; 1306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tone_count++; 1311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrReal++; 1314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* for-loop (k) */ 1316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_man = nrg_gain_man[k]; 1318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = *ptrReal; 1319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = nrg_gain_exp[k]; 1320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q28(tmp_q1, sb_gain_man); 1321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp_q2 < 0) 1323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp_q2 > -31) 1325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal = tmp_q1 >> (-tmp_q2); 1327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal = tmp_q1 << tmp_q2; 1332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *phase_index = (*phase_index + 1) & 511; 1335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((tone_count < 16) && !(indexMinus1 &1)) 1338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = nrg_tone_exp[k - 1]; 1340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = nrg_tone_exp[k ]; 1341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((indexMinus1 != 0) ^(((k + lowSubband) & 1) != 0)) 1343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(ptrReal) += tmp_q1; 1345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (k + lowSubband < 62) 1347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(ptrReal + 1) -= tmp_q2; 1349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(ptrReal) -= tmp_q1; 1354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (k + lowSubband < 62) 1356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(ptrReal + 1) += tmp_q2; 1358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if (tone_count < 16) */ 1361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (!nrg_tone_man[k] && !noNoiseFlag) 1364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_16 = rP_LCx[*phase_index]; 1366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_man = noise_level_man[k]; 1367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_exp = noise_level_exp[k]; 1368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_by_16(sb_noise_man, tmp_16); 1370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_noise_exp < 0) 1372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_noise_exp > -31) 1374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal += tmp_q1 >> (-sb_noise_exp); 1376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal += tmp_q1 << sb_noise_exp; 1381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if indexPlus1 is odd */ 1385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *harm_index = indexPlus1; 1387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* for-loop (l) */ 1390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else /* if ( band_nrg_tone_detector) */ 1393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (k = 0; k < noSubbands; k++) 1396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = noise_level_exp[k]; 1398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = nrg_gain_exp[k]; 1399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber noise_level_exp[k] = tmp_q1 + 1; 1400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_gain_exp[k] = tmp_q2 + 28; 1401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (l = (frame_info[1+i] << 1); l < (frame_info[2+i] << 1); l++) 1404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrReal = (aBufR + l * SBR_NUM_BANDS); 1406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (k = 0; k < noSubbands; k++) 1408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = *ptrReal; 1411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_man = nrg_gain_man[k]; 1412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = nrg_gain_exp[k]; 1414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q28(tmp_q1, sb_gain_man); 1416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp_q2 < 0) 1418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp_q2 > -31) 1420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal = tmp_q1 >> (-tmp_q2); 1422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal = tmp_q1 << tmp_q2; 1427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *phase_index = (*phase_index + 1) & 511; 1430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (! noNoiseFlag) 1432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_16 = rP_LCx[*phase_index]; 1434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_man = noise_level_man[k]; 1435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_exp = noise_level_exp[k]; 1436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_by_16(sb_noise_man, tmp_16); 1438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_noise_exp < 0) 1440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_noise_exp > -31) 1442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal += tmp_q1 >> (-sb_noise_exp); 1444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal += tmp_q1 << sb_noise_exp; 1449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrReal++; 1453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* for-loop (k) */ 1455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *harm_index = (*harm_index + 1) & 3; 1457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* for-loop (l) */ 1460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} 1464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 1468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE 1469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 1470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define Qfmt15(a) (Int32)(a*((Int32)1<<15) + (a>=0?0.5F:-0.5F)) 1473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberconst Int16 pow2[39] = { 0, 0, 1, 0, 2, 1476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, Qfmt15(2 / 6.0f), 0, 3, 0, Qfmt15(2 / 10.0f), 0, Qfmt15(2 / 12.0f), 0, Qfmt15(2 / 14.0f), 0, 4, 1477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, Qfmt15(2 / 18.0f), 0, Qfmt15(2 / 20.0f), 0, Qfmt15(2 / 22.0f), 0, Qfmt15(2 / 24.0f), 1478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, Qfmt15(2 / 26.0f), 0, Qfmt15(2 / 28.0f), 0, Qfmt15(2 / 30.0f), 0, 5, 0, Qfmt15(2 / 34.0f), 1479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 0, Qfmt15(2 / 36.0f), 0, Qfmt15(2 / 38.0f) 1480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber }; 1481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid energy_estimation_LC(Int32 *aBufR, 1483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_est_man, 1484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_est_exp, 1485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int32 *frame_info, 1486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 i, 1487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 k, 1488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 c, 1489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 ui2) 1490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 1491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 aux1; 1494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 aux2; 1495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 l; 1496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber int64_t nrg_h = 0; 1499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp1; 1500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber UInt32 tmp2; 1501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (l = ui2; l < (frame_info[2+i] << 1); l++) 1503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux1 = aBufR[l++*SBR_NUM_BANDS + k ]; 1506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux2 = aBufR[l *SBR_NUM_BANDS + k ]; 1507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_h = fxp_mac64_Q31(nrg_h, aux1, aux1); 1509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_h = fxp_mac64_Q31(nrg_h, aux2, aux2); 1510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Check for overflow and saturate if needed 1514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (nrg_h < 0) 1516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_h = 0x7fffffff; 1518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (nrg_h) 1522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp2 = (UInt32)(nrg_h >> 32); 1524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp2) 1525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux2 = pv_normalize(tmp2); 1527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux2 -= 1; /* ensure Q30 */ 1528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_h = (nrg_h << aux2) >> 33; 1529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp2 = (UInt32)(nrg_h); 1530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_exp[c] = 33 - aux2; 1531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp2 = (UInt32)(nrg_h >> 2); 1535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux2 = pv_normalize(tmp2); 1536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux2 -= 1; /* ensure Q30 */ 1537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp2 = (tmp2 << aux2); 1539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_exp[c] = -aux2 + 2; 1540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp1 = (l - ui2); 1543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux2 = pow2[tmp1]; 1545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp1 == (tmp1 & (-tmp1))) 1546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_man[c] = tmp2 >> aux2; 1548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_man[c] = fxp_mul32_by_16(tmp2, aux2); 1552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_man[c] = 0; 1558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_exp[c] = -100; 1559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} 1566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if HQ_SBR 1573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1574dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 1575dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE 1576dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 1577dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1578dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid envelope_application(Int32 *aBufR, 1579dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *aBufI, 1580dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_gain_man, 1581dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_gain_exp, 1582dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *noise_level_man, 1583dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *noise_level_exp, 1584dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_tone_man, 1585dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_tone_exp, 1586dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *fBuf_man[64], 1587dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *fBuf_exp[64], 1588dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *fBufN_man[64], 1589dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *fBufN_exp[64], 1590dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int32 *frame_info, 1591dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *harm_index, 1592dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *phase_index, 1593dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 i, 1594dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 lowSubband, 1595dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 noSubbands, 1596dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 noNoiseFlag, 1597dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 band_nrg_tone_detector, 1598dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 maxSmoothLength, 1599dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 smooth_length) 1600dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 1601dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1602dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *ptrReal; 1603dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *ptrImag; 1604dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 sb_gain_man; 1605dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 sb_gain_exp; 1606dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 sb_noise_man; 1607dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 sb_noise_exp; 1608dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 l; 1609dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 k; 1610dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 n; 1611dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp_q1; 1612dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp_q2; 1613dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 aux1; 1614dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 aux2; 1615dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 filter_history = 0; 1616dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1617dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1618dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (band_nrg_tone_detector) /* Add tone energy only if energy is detected */ 1619dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1620dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1621dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1622dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * pre-calculate tone application 1623dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1624dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1625dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrReal = nrg_tone_exp; 1626dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrImag = nrg_tone_man; 1627dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = - *(ptrReal++); 1628dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux1 = *(ptrImag); 1629dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (k = 0; k < noSubbands; k++) 1630dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1631dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *(ptrImag++) = aux1 >> tmp_q1; 1632dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = - *(ptrReal++); 1633dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux1 = *(ptrImag); 1634dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1635dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1636dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1637dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Application 1638dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1639dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1640dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (l = (frame_info[1+i] << 1); l < (frame_info[2+i] << 1); l++) 1641dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1642dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrReal = (aBufR + l * SBR_NUM_BANDS); 1643dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrImag = (aBufI + l * SBR_NUM_BANDS); 1644dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1645dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (filter_history <= maxSmoothLength) /* no more update is needed as buffer will have same info */ 1646dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1647dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memmove(fBuf_man[maxSmoothLength], nrg_gain_man, noSubbands*sizeof(*nrg_gain_man)); 1648dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memmove(fBuf_exp[maxSmoothLength], nrg_gain_exp, noSubbands*sizeof(*nrg_gain_exp)); 1649dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memmove(fBufN_man[maxSmoothLength], noise_level_man, noSubbands*sizeof(*noise_level_man)); 1650dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memmove(fBufN_exp[maxSmoothLength], noise_level_exp, noSubbands*sizeof(*noise_level_exp)); 1651dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1652dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1653dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1654dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * nrg_gain_max bounded to 1.584893192*1e5, which requires (32-bit) Q14 notation 1655dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1656dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (k = 0; k < noSubbands; k++) 1657dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1658dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (smooth_length == 0) /* no filter-smooth needed */ 1659dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1660dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_man = nrg_gain_man[k]; 1661dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_exp = nrg_gain_exp[k]; 1662dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1663dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_man = noise_level_man[k]; 1664dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_exp = noise_level_exp[k]; 1665dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1666dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1667dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1668dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* else smooth_length == 4 and fir_4 filter is being used */ 1669dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1670dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_exp = fBuf_exp[maxSmoothLength][k]; 1671dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1672dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_exp = fBufN_exp[maxSmoothLength][k]; 1673dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1674dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (n = maxSmoothLength - smooth_length; n < maxSmoothLength; n++) 1675dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1676dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_gain_exp < fBuf_exp[n][k]) 1677dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1678dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_exp = fBuf_exp[n][k]; 1679dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1680dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1681dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_noise_exp < fBufN_exp[n][k]) 1682dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1683dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_exp = fBufN_exp[n][k]; 1684dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1685dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1686dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1687dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_man = fxp_mul32_Q30(fBuf_man[maxSmoothLength][k], Q30fmt(0.33333333333333f)); 1688dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_man = sb_gain_man >> (sb_gain_exp - fBuf_exp[maxSmoothLength][k]); 1689dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1690dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_man = fxp_mul32_Q30(fBufN_man[maxSmoothLength][k], Q30fmt(0.33333333333333f)); 1691dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_man = sb_noise_man >> (sb_noise_exp - fBufN_exp[maxSmoothLength][k]); 1692dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1693dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber n = maxSmoothLength - smooth_length; 1694dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1695dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.03183050093751f)); 1696dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_man += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]); 1697dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1698dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.03183050093751f)); 1699dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n++][k]); 1700dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1701dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.11516383427084f)); 1702dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_man += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]); 1703dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1704dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.11516383427084f)); 1705dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n++][k]); 1706dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1707dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.21816949906249f)); 1708dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_man += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]); 1709dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1710dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.21816949906249f)); 1711dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n++][k]); 1712dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1713dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.30150283239582f)); 1714dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_man += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]); 1715dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1716dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.30150283239582f)); 1717dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n][k]); 1718dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1719dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1720dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1721dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1722dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1723dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1724dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * *ptrReal = *ptrReal * sb_gain ; 1725dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * *ptrImag = *ptrImag * sb_gain; 1726dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1727dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux1 = *ptrReal; 1728dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux2 = *ptrImag; 1729dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_exp += 32; 1730dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux1 = fxp_mul32_Q31(aux1, sb_gain_man); 1731dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux2 = fxp_mul32_Q31(aux2, sb_gain_man); 1732dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1733dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1734dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_gain_exp < 0) 1735dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1736dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_exp = -sb_gain_exp; 1737dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_gain_exp < 32) 1738dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1739dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal = (aux1 >> sb_gain_exp); 1740dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrImag = (aux2 >> sb_gain_exp); 1741dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1742dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1743dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1744dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1745dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal = (aux1 << sb_gain_exp); 1746dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrImag = (aux2 << sb_gain_exp); 1747dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1748dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1749dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1750dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1751dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1752dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * if ( sb_noise != 0) 1753dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * { 1754dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * *ptrReal += sb_noise * rP[*phase_index][0]; 1755dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * *ptrImag += sb_noise * rP[*phase_index][1]; 1756dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * } 1757dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1758dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *phase_index = (*phase_index + 1) & 511; 1759dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1760dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (nrg_tone_man[k] || noNoiseFlag) 1761dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1762dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_man = 0; 1763dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_exp = 0; 1764dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1765dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1766dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1767dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1768dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp = rPxx[*phase_index]; 1769dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_exp += 1; 1770dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_by_16t(sb_noise_man, tmp); 1771dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = fxp_mul32_by_16b(sb_noise_man, tmp); 1772dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1773dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1774dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_noise_exp < 0) 1775dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1776dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_noise_exp > -32) 1777dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1778dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal += tmp_q1 >> (-sb_noise_exp); 1779dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrImag += tmp_q2 >> (-sb_noise_exp); 1780dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1781dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1782dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1783dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1784dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal += tmp_q1 << sb_noise_exp; 1785dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrImag += tmp_q2 << sb_noise_exp; 1786dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1787dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1788dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1789dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1790dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * tmp_q1 = nrg_tone[k] 1791dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1792dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1793dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = nrg_tone_man[k]; 1794dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1795dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (*harm_index & 1) 1796dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1797dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if ((((k + lowSubband) & 1) != 0) ^(*harm_index != 1)) 1798dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1799dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrImag -= tmp_q1; 1800dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1801dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1802dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1803dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrImag += tmp_q1; 1804dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1805dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1806dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1807dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1808dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal += (*harm_index) ? -tmp_q1 : tmp_q1; 1809dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1810dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1811dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal++ <<= 10; 1812dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrImag++ <<= 10; 1813dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1814dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1815dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* for-loop (k) */ 1816dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1817dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1818dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *harm_index = (*harm_index + 1) & 3; 1819dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1820dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1821dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Update smoothing filter history 1822dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1823dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1824dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (filter_history++ < maxSmoothLength) /* no more update is needed as buffer will have same info */ 1825dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1826dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1827dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * mantissas 1828dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1829dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1830dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrReal = (Int32 *)fBuf_man[0]; 1831dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrImag = (Int32 *)fBufN_man[0]; 1832dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1833dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (n = 0; n < maxSmoothLength; n++) 1834dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1835dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fBuf_man[n] = fBuf_man[n+1]; 1836dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fBufN_man[n] = fBufN_man[n+1]; 1837dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1838dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1839dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fBuf_man[maxSmoothLength] = ptrReal; 1840dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fBufN_man[maxSmoothLength] = ptrImag; 1841dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1842dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1843dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * exponents 1844dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1845dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrReal = (Int32 *)fBuf_exp[0]; 1846dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrImag = (Int32 *)fBufN_exp[0]; 1847dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1848dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (n = 0; n < maxSmoothLength; n++) 1849dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1850dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fBuf_exp[n] = fBuf_exp[n+1]; 1851dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fBufN_exp[n] = fBufN_exp[n+1]; 1852dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1853dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1854dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fBuf_exp[maxSmoothLength] = ptrReal; 1855dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fBufN_exp[maxSmoothLength] = ptrImag; 1856dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1857dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1858dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* for-loop (l) */ 1859dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1860dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1861dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1862dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else /* ---- if ( band_nrg_tone_detector) ---- */ 1863dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1864dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1865dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1866dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Application 1867dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1868dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1869dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (l = (frame_info[1+i] << 1); l < (frame_info[2+i] << 1); l++) 1870dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1871dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrReal = (aBufR + l * SBR_NUM_BANDS); 1872dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrImag = (aBufI + l * SBR_NUM_BANDS); 1873dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1874dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (filter_history <= maxSmoothLength) /* no more update is needed as buffer will have same info */ 1875dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1876dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memmove(fBuf_man[maxSmoothLength], nrg_gain_man, noSubbands*sizeof(*nrg_gain_man)); 1877dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memmove(fBuf_exp[maxSmoothLength], nrg_gain_exp, noSubbands*sizeof(*nrg_gain_exp)); 1878dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memmove(fBufN_man[maxSmoothLength], noise_level_man, noSubbands*sizeof(*noise_level_man)); 1879dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber pv_memmove(fBufN_exp[maxSmoothLength], noise_level_exp, noSubbands*sizeof(*noise_level_exp)); 1880dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1881dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1882dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1883dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * nrg_gain_max bounded to 1.584893192*1e5, which requires (32-bit) Q14 notation 1884dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1885dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (k = 0; k < noSubbands; k++) 1886dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1887dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (smooth_length == 0) /* no filter-smooth needed */ 1888dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1889dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_man = nrg_gain_man[k]; 1890dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_exp = nrg_gain_exp[k]; 1891dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1892dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_man = noise_level_man[k]; 1893dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_exp = noise_level_exp[k]; 1894dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1895dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1896dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1897dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { /* else smooth_length == 4 and fir_4 filter is being used */ 1898dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1899dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_exp = fBuf_exp[maxSmoothLength][k]; 1900dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1901dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_exp = fBufN_exp[maxSmoothLength][k]; 1902dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1903dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (n = maxSmoothLength - smooth_length; n < maxSmoothLength; n++) 1904dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1905dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_gain_exp < fBuf_exp[n][k]) 1906dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1907dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_exp = fBuf_exp[n][k]; 1908dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1909dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1910dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_noise_exp < fBufN_exp[n][k]) 1911dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1912dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_exp = fBufN_exp[n][k]; 1913dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1914dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1915dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1916dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_man = fxp_mul32_Q30(fBuf_man[maxSmoothLength][k], Q30fmt(0.33333333333333f)); 1917dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_man = sb_gain_man >> (sb_gain_exp - fBuf_exp[maxSmoothLength][k]); 1918dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1919dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_man = fxp_mul32_Q30(fBufN_man[maxSmoothLength][k], Q30fmt(0.33333333333333f)); 1920dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_man = sb_noise_man >> (sb_noise_exp - fBufN_exp[maxSmoothLength][k]); 1921dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1922dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber n = maxSmoothLength - smooth_length; 1923dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1924dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.03183050093751f)); 1925dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_man += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]); 1926dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1927dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.03183050093751f)); 1928dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n++][k]); 1929dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1930dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.11516383427084f)); 1931dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_man += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]); 1932dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1933dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.11516383427084f)); 1934dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n++][k]); 1935dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1936dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.21816949906249f)); 1937dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_man += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]); 1938dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1939dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.21816949906249f)); 1940dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n++][k]); 1941dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1942dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q30(fBuf_man[n][k], Q30fmt(0.30150283239582f)); 1943dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_man += tmp_q1 >> (sb_gain_exp - fBuf_exp[n][k]); 1944dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1945dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_Q30(fBufN_man[n][k], Q30fmt(0.30150283239582f)); 1946dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_man += tmp_q1 >> (sb_noise_exp - fBufN_exp[n][k]); 1947dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1948dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1949dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1950dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1951dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1952dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1953dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * *ptrReal = *ptrReal * sb_gain ; 1954dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * *ptrImag = *ptrImag * sb_gain; 1955dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1956dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux1 = *ptrReal; 1957dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux2 = *ptrImag; 1958dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_gain_exp += 32; 1959dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux1 = fxp_mul32_Q31(aux1, sb_gain_man); 1960dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux2 = fxp_mul32_Q31(aux2, sb_gain_man); 1961dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1962dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1963dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1964dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1965dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * if ( sb_noise != 0) 1966dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * { 1967dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * *ptrReal += sb_noise * rP[*phase_index][0]; 1968dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * *ptrImag += sb_noise * rP[*phase_index][1]; 1969dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * } 1970dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 1971dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1972dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1973dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_gain_exp < 0) 1974dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1975dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_gain_exp > -32) 1976dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1977dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_gain_exp > -10) 1978dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1979dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal = aux1 << (10 + sb_gain_exp); 1980dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrImag = aux2 << (10 + sb_gain_exp); 1981dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1982dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1983dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1984dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal = aux1 >> (-sb_gain_exp - 10); 1985dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrImag = aux2 >> (-sb_gain_exp - 10); 1986dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1987dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1988dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1989dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 1990dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 1991dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal = aux1 << (sb_gain_exp + 10); 1992dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrImag = aux2 << (sb_gain_exp + 10); 1993dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 1994dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1995dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1996dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1997dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 1998dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 1999dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * if ( sb_noise != 0) 2000dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * { 2001dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * *ptrReal += sb_noise * rP[*phase_index][0]; 2002dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * *ptrImag += sb_noise * rP[*phase_index][1]; 2003dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * } 2004dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2005dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *phase_index = (*phase_index + 1) & 511; 2006dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2007dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (!noNoiseFlag) 2008dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2009dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2010dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp = rPxx[*phase_index]; 2011dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber sb_noise_exp += 1; 2012dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q1 = fxp_mul32_by_16t(sb_noise_man, tmp); 2013dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp_q2 = fxp_mul32_by_16b(sb_noise_man, tmp); 2014dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2015dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_noise_exp < 0) 2016dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2017dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_noise_exp > -32) 2018dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2019dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (sb_noise_exp > -10) 2020dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2021dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal += tmp_q1 << (10 + sb_noise_exp); 2022dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrImag += tmp_q2 << (10 + sb_noise_exp); 2023dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2024dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 2025dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2026dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal += tmp_q1 >> (-sb_noise_exp - 10); 2027dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrImag += tmp_q2 >> (-sb_noise_exp - 10); 2028dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2029dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2030dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2031dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 2032dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2033dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrReal += tmp_q1 << (sb_noise_exp + 10); 2034dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *ptrImag += tmp_q2 << (sb_noise_exp + 10); 2035dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2036dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2037dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2038dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrReal++; 2039dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrImag++; 2040dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2041dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2042dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* for-loop (k) */ 2043dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2044dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2045dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *harm_index = (*harm_index + 1) & 3; 2046dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2047dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 2048dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Update smoothing filter history 2049dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2050dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2051dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (filter_history++ < maxSmoothLength) /* no more update is needed as buffer will have same info */ 2052dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2053dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 2054dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * mantissas 2055dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2056dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2057dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrReal = (Int32 *)fBuf_man[0]; 2058dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrImag = (Int32 *)fBufN_man[0]; 2059dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2060dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (n = 0; n < maxSmoothLength; n++) 2061dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2062dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fBuf_man[n] = fBuf_man[n+1]; 2063dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fBufN_man[n] = fBufN_man[n+1]; 2064dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2065dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2066dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fBuf_man[maxSmoothLength] = ptrReal; 2067dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fBufN_man[maxSmoothLength] = ptrImag; 2068dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2069dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 2070dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * exponents 2071dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2072dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrReal = (Int32 *)fBuf_exp[0]; 2073dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber ptrImag = (Int32 *)fBufN_exp[0]; 2074dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2075dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (n = 0; n < maxSmoothLength; n++) 2076dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2077dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fBuf_exp[n] = fBuf_exp[n+1]; 2078dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fBufN_exp[n] = fBufN_exp[n+1]; 2079dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2080dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2081dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fBuf_exp[maxSmoothLength] = ptrReal; 2082dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber fBufN_exp[maxSmoothLength] = ptrImag; 2083dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2084dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2085dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* for-loop (l) */ 2086dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2087dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } /* if ( band_nrg_tone_detector) */ 2088dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2089dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} 2090dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2091dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2092dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*---------------------------------------------------------------------------- 2093dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE 2094dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/ 2095dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2096dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid energy_estimation(Int32 *aBufR, 2097dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *aBufI, 2098dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_est_man, 2099dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 *nrg_est_exp, 2100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber const Int32 *frame_info, 2101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 i, 2102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 k, 2103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 c, 2104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 ui2) 2105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{ 2106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 aux1; 2108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 aux2; 2109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 l; 2110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber int64_t nrg_h = 0; 2114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp1; 2115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Int32 tmp2; 2116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux1 = aBufR[ui2*SBR_NUM_BANDS + k]; 2118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux2 = aBufI[ui2*SBR_NUM_BANDS + k]; 2119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber for (l = ui2 + 1; l < (frame_info[2+i] << 1); l++) 2120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_h = fxp_mac64_Q31(nrg_h, aux1, aux1); 2122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_h = fxp_mac64_Q31(nrg_h, aux2, aux2); 2123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux1 = aBufR[l*SBR_NUM_BANDS + k]; 2124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux2 = aBufI[l*SBR_NUM_BANDS + k]; 2125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_h = fxp_mac64_Q31(nrg_h, aux1, aux1); 2127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_h = fxp_mac64_Q31(nrg_h, aux2, aux2); 2128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber /* 2131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Check for overflow and saturate if needed 2132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */ 2133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (nrg_h < 0) 2134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_h = 0x7fffffff; 2136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (nrg_h) 2139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux1 = (UInt32)(nrg_h >> 32); 2142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (aux1) 2143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux2 = pv_normalize(aux1); 2145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (aux2) 2146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux2 -= 1; /* ensure Q30 */ 2148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_h = (nrg_h << aux2) >> 33; 2149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp2 = (UInt32)(nrg_h); 2150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_exp[c] = 33 - aux2; 2151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 2153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp2 = (UInt32)(aux1 >> 1); 2155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_exp[c] = 33 ; 2156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 2161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux1 = (UInt32)(nrg_h >> 1); 2163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux2 = pv_normalize(aux1); 2164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp2 = (aux1 << aux2); 2166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_exp[c] = -aux2 + 1; 2167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber tmp1 = (l - ui2); 2174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber aux2 = pow2[tmp1]; 2175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber if (tmp1 == (tmp1 & (-tmp1))) 2176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_man[c] = tmp2 >> aux2; 2178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 2180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_man[c] = fxp_mul32_by_16(tmp2, aux2); 2182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber else 2185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber { 2186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_man[c] = 0; 2187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber nrg_est_exp[c] = -100; 2188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber } 2189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber} 2192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 2198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif 2201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber 2204