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), &quotient);
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, &quotient);
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, &quotient);
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), &quotient);
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, &quotient);
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, &quotient);
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, &quotient);
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, &quotient);
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, &quotient);
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], &quotient);
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, &quotient);
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