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
20dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber  Filename: calc_sbr_synfilterbank.c
21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY
25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who:                                   Date: MM/DD/YYYY
28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS
32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION
37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS
41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES
45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
46dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberSC 29 Software Copyright Licencing Disclaimer:
47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
48dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThis software module was originally developed by
49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber  Coding Technologies
50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberand edited by
52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber  -
53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberin the course of development of the ISO/IEC 13818-7 and ISO/IEC 14496-3
55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberstandards for reference purposes and its performance may not have been
56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberoptimized. This software module is an implementation of one or more tools as
57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberspecified by the ISO/IEC 13818-7 and ISO/IEC 14496-3 standards.
58dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberISO/IEC gives users free license to this software module or modifications
59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberthereof for use in products claiming conformance to audiovisual and
60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberimage-coding related ITU Recommendations and/or ISO/IEC International
61dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberStandards. ISO/IEC gives users the same free license to this software module or
62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubermodifications thereof for research purposes and further ISO/IEC standardisation.
63dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThose intending to use this software module in products are advised that its
64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberuse may infringe existing patents. ISO/IEC have no liability for use of this
65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubersoftware module or modifications thereof. Copyright is not released for
66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberproducts that do not conform to audiovisual and image-coding related ITU
67dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberRecommendations and/or ISO/IEC International Standards.
68dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThe original developer retains full right to modify and use the code for its
69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberown purpose, assign or donate the code to a third party and to inhibit third
70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberparties from using the code for products that do not conform to audiovisual and
71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberimage-coding related ITU Recommendations and/or ISO/IEC International Standards.
72dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberThis copyright notice must be included in all copies or derivative works.
73dacaa73ae5010b66f4224d70a520945e5b653544Andreas HuberCopyright (c) ISO/IEC 2002.
74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE
77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/
80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef AAC_PLUS
82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES
85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "calc_sbr_synfilterbank.h"
87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "qmf_filterbank_coeff.h"
88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "synthesis_sub_band.h"
89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "fxp_mul32.h"
90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include    "aac_mem_funcs.h"
91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS
94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here
95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES
100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional
101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also.
102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#if defined (PV_ARM_V5)
106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber__inline Int16 sat(Int32 y)
109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 x;
111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    __asm
112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        qdadd y, y, y
114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        mov y, y, asr #16
115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return((Int16)y);
118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define saturate2( a, b, c, d)      *c = sat( a);   \
121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *d = sat( b);   \
122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    c += 2;         \
123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    d -= 2;
124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#elif defined (PV_ARM_V4)
127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber__inline Int16 sat(Int32 y)
130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 x;
132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 z = 31; /* rvct compiler problem */
133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    __asm
134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        sub y, y, y, asr 2
136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        mov y, y, asr N
137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        mov x, y, asr #15
138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        teq x, y, asr z
139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        eorne  y, INT16_MAX, y, asr #31
140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return((Int16)y);
143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define saturate2( a, b, c, d)      *c = sat( a);   \
146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *d = sat( b);   \
147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    c += 2;         \
148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    d -= 2;
149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#elif defined(PV_ARM_GCC_V5)
151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber__inline Int16 sat(Int32 y)
153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    register Int32 x;
155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    register Int32 ra = y;
156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    asm volatile(
159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        "qdadd %0, %1, %1\n\t"
160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        "mov %0, %0, asr #16"
161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    : "=&r*i"(x)
162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                : "r"(ra));
163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    return ((Int16)x);
165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define saturate2( a, b, c, d)      *c = sat( a);   \
169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *d = sat( b);   \
170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    c += 2;         \
171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    d -= 2;
172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#elif defined(PV_ARM_MSC_EVC_V5)
175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "armintr.h"
177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define saturate2( a, b, c, d)      *c = _DAddSatInt( a, a)>>16;   \
179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *d = _DAddSatInt( b, b)>>16;   \
180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    c += 2;         \
181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    d -= 2;
182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#else
184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define   saturate2( a, b, c, d)    a -= (a>>2);                             \
187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    a  = (a>>N);                     \
188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    if((a>>15) != (a>>31))                   \
189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    {                                        \
190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                        a = ((a >> 31) ^ INT16_MAX); \
191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    }                                        \
192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *c = (Int16)a;                           \
193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    c += 2;                                  \
194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    b -= (b>>2);                             \
195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    b =  (b>>N);                      \
196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    if((b>>15) != (b>>31))                   \
197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    {                                        \
198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                        b = ((b >> 31) ^ INT16_MAX); \
199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    }                                        \
200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    *d = (Int16)b;                           \
201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                                    d -= 2;
202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS
208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration
209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module
215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
219dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
220dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
221dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES
222dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module
223dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
224dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
225dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
226dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
227dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere
228dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
229dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
230dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
231dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE
232dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
233dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
234dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid calc_sbr_synfilterbank_LC(Int32 * Sr,
235dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                               Int16 * timeSig,
236dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                               Int16   V[1280],
237dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                               bool bDownSampleSBR)
238dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
239dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 i;
240dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
241dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32   realAccu1;
242dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32   realAccu2;
243dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int32 *pt_C2;
244dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
245dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16 *pt_V1;
246dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16 *pt_V2;
247dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
248dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
249dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16 *pt_timeSig;
250dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
251dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16 *pt_timeSig_2;
252dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32  test1;
253dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16  tmp1;
254dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16  tmp2;
255dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
256dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    /* shift filterstates */
257dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
258dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 * pt_Sr = Sr;
259dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
260dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
261dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (bDownSampleSBR == false)
262dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
263dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
264dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        synthesis_sub_band_LC(pt_Sr, V);
265dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
266dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* content of V[] is at most 16 bits */
267dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
268dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_timeSig   = &timeSig[0];
269dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_timeSig_2 = &timeSig[64];
270dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
271dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
272dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = V[ 704];
273dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 = V[ 768];
274dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(0.853738560F), ROUND_SYNFIL);
275dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.361158990F), realAccu1);
276dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = -V[ 512];
277dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 =  V[ 960];
278dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.361158990F), realAccu1);
279dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(0.070353307F), realAccu1);
280dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 =  V[ 448];
281dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 =  V[1024];
282dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(0.070353307F), realAccu1);
283dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.013271822F), realAccu1);
284dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 =  -V[ 256];
285dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 =   V[ 192];
286dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.013271822F), realAccu1);
287dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(0.002620176F), realAccu1);
288dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu1 =  fxp_mac_16_by_16(V[1216], Qfmt(0.002620176F), realAccu1);
289dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
290dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = V[  32];
291dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 = V[1248];
292dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.000665042F), ROUND_SYNFIL);
293dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.000665042F), realAccu2);
294dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = V[ 224];
295dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 = V[1056];
296dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(0.005271576F), realAccu2);
297dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(0.005271576F), realAccu2);
298dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = V[ 992];
299dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 = V[ 288];
300dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(0.058591568F), realAccu2);
301dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(0.058591568F), realAccu2);
302dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = V[ 480];
303dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 = V[ 800];
304dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.058370533F), realAccu2);
305dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.058370533F), realAccu2);
306dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = V[ 736];
307dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 = V[ 544];
308dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(0.702238872F), realAccu2);
309dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(0.702238872F), realAccu2);
310dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
311dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
312dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
313dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        saturate2(realAccu1, realAccu2, pt_timeSig, pt_timeSig_2);
314dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
315dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_timeSig_2 = &timeSig[126];
316dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
317dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_V1 = &V[1];
318dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_V2 = &V[1279];
319dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
320dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_C2 = &sbrDecoderFilterbankCoefficients[0];
321dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
322dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (i = 31; i != 0; i--)
323dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
324dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            test1 = *(pt_C2++);
325dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp1 = *(pt_V1++);
326dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = *(pt_V2--);
327dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, ROUND_SYNFIL);
328dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, ROUND_SYNFIL);
329dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp1 = pt_V1[  191];
330dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = pt_V2[ -191];
331dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
332dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
333dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
334dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            test1 = *(pt_C2++);
335dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp1 = pt_V1[  255];
336dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = pt_V2[ -255];
337dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
338dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
339dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp1 = pt_V1[  447];
340dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = pt_V2[ -447];
341dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
342dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
343dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
344dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            test1 = *(pt_C2++);
345dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp1 = pt_V1[  511];
346dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = pt_V2[ -511];
347dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
348dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
349dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp1 = pt_V1[  703];
350dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = pt_V2[ -703];
351dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
352dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
353dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
354dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            test1 = *(pt_C2++);
355dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp1 = pt_V1[  767];
356dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = pt_V2[ -767];
357dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
358dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
359dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp1 = pt_V1[  959];
360dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = pt_V2[ -959];
361dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
362dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
363dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
364dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            test1 = *(pt_C2++);
365dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp1 = pt_V1[  1023];
366dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = pt_V2[ -1023];
367dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
368dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
369dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp1 = pt_V1[  1215];
370dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = pt_V2[ -1215];
371dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
372dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
373dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
374dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            saturate2(realAccu1, realAccu2, pt_timeSig, pt_timeSig_2);
375dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
376dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
377dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
378dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    else
379dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
380dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
381dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        synthesis_sub_band_LC_down_sampled(Sr, V);
382dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
383dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
384dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *    window signal
385dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *    calculate output samples
386dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
387dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
388dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
389dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_V1 = &V[0];
390dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_V2 = &V[96];
391dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
392dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
393dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 * pt_out = Sr;
394dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
395dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (i = 0; i < 8; i++)
396dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
397dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *(pt_out++) = 0;
398dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *(pt_out++) = 0;
399dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *(pt_out++) = 0;
400dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *(pt_out++) = 0;
401dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
402dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
403dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        const Int32* pt_C1 = &sbrDecoderFilterbankCoefficients_down_smpl[0];
404dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_C2 = &sbrDecoderFilterbankCoefficients_down_smpl[16];
405dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
406dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (int k = 0; k < 5; k++)
407dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
408dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pt_out -= 32;
409dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            for (i = 0; i < 16; i++)
410dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
411dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                realAccu1   = fxp_mul_16_by_16bt(*(pt_V1++), *(pt_C1));
412dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                realAccu2   = fxp_mul_16_by_16bb(*(pt_V1++), *(pt_C1++));
413dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                realAccu1   = fxp_mac_16_by_16_bt(*(pt_V2++), *(pt_C2), realAccu1);
414dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                realAccu2   = fxp_mac_16_by_16_bb(*(pt_V2++), *(pt_C2++), realAccu2);
415dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                *(pt_out++) += realAccu1 >> 5;
416dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                *(pt_out++) += realAccu2 >> 5;
417dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
418dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
419dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pt_V1 += 96;
420dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pt_V2 += 96;
421dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pt_C1 += 16;
422dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pt_C2 += 16;
423dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
424dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_out -= 32;
425dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
426dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (i = 0; i < 32; i++)
427dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
428dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            timeSig[2*i] = (Int16)((*(pt_out++) + 512) >> 10);
429dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
430dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
431dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
432dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
433dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
434dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
435dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
436dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
437dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef HQ_SBR
438dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
439dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid calc_sbr_synfilterbank(Int32 * Sr,
440dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            Int32 * Si,
441dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            Int16 * timeSig,
442dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            Int16   V[1280],
443dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                            bool bDownSampleSBR)
444dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
445dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 i;
446dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
447dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int32 *pt_C2;
448dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
449dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32   realAccu1;
450dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32   realAccu2;
451dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
452dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16 *pt_V1;
453dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16 *pt_V2;
454dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
455dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16 *pt_timeSig;
456dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
457dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16 *pt_timeSig_2;
458dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32  test1;
459dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16  tmp1;
460dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int16  tmp2;
461dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
462dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
463dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (bDownSampleSBR == false)
464dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
465dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        synthesis_sub_band(Sr, Si, V);
466dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
467dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /* content of V[] is at most 16 bits */
468dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_timeSig   = &timeSig[0];
469dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_timeSig_2 = &timeSig[64];
470dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
471dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = V[ 704];
472dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 = V[ 768];
473dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(0.853738560F), ROUND_SYNFIL);
474dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.361158990F), realAccu1);
475dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = -V[ 512];
476dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 =  V[ 960];
477dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.361158990F), realAccu1);
478dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(0.070353307F), realAccu1);
479dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 =  V[ 448];
480dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 =  V[1024];
481dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(0.070353307F), realAccu1);
482dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.013271822F), realAccu1);
483dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 =  -V[ 256];
484dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 =   V[ 192];
485dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu1 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.013271822F), realAccu1);
486dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu1 =  fxp_mac_16_by_16(tmp2, Qfmt(0.002620176F), realAccu1);
487dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu1 =  fxp_mac_16_by_16(V[1216], Qfmt(0.002620176F), realAccu1);
488dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
489dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = V[  32];
490dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 = V[1248];
491dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.000665042F), ROUND_SYNFIL);
492dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.000665042F), realAccu2);
493dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = V[ 224];
494dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 = V[1056];
495dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(0.005271576F), realAccu2);
496dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(0.005271576F), realAccu2);
497dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = V[ 992];
498dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 = V[ 288];
499dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(0.058591568F), realAccu2);
500dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(0.058591568F), realAccu2);
501dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = V[ 480];
502dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 = V[ 800];
503dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(-0.058370533F), realAccu2);
504dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(-0.058370533F), realAccu2);
505dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp1 = V[ 736];
506dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        tmp2 = V[ 544];
507dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu2 =  fxp_mac_16_by_16(tmp1, Qfmt(0.702238872F), realAccu2);
508dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        realAccu2 =  fxp_mac_16_by_16(tmp2, Qfmt(0.702238872F), realAccu2);
509dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
510dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
511dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        saturate2(realAccu1, realAccu2, pt_timeSig, pt_timeSig_2);
512dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
513dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_timeSig_2 = &timeSig[126];
514dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
515dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_V1 = &V[1];
516dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_V2 = &V[1279];
517dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
518dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_C2 = &sbrDecoderFilterbankCoefficients[0];
519dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
520dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (i = 31; i != 0; i--)
521dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
522dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            test1 = *(pt_C2++);
523dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp1 = *(pt_V1++);
524dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = *(pt_V2--);
525dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, ROUND_SYNFIL);
526dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, ROUND_SYNFIL);
527dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp1 = pt_V1[  191];
528dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = pt_V2[ -191];
529dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
530dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
531dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
532dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            test1 = *(pt_C2++);
533dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp1 = pt_V1[  255];
534dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = pt_V2[ -255];
535dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
536dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
537dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp1 = pt_V1[  447];
538dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = pt_V2[ -447];
539dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
540dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
541dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
542dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            test1 = *(pt_C2++);
543dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp1 = pt_V1[  511];
544dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = pt_V2[ -511];
545dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
546dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
547dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp1 = pt_V1[  703];
548dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = pt_V2[ -703];
549dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
550dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
551dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
552dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            test1 = *(pt_C2++);
553dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp1 = pt_V1[  767];
554dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = pt_V2[ -767];
555dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
556dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
557dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp1 = pt_V1[  959];
558dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = pt_V2[ -959];
559dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
560dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
561dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
562dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            test1 = *(pt_C2++);
563dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp1 = pt_V1[  1023];
564dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = pt_V2[ -1023];
565dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu1 =  fxp_mac_16_by_16_bt(tmp1 , test1, realAccu1);
566dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu2 =  fxp_mac_16_by_16_bt(tmp2 , test1, realAccu2);
567dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp1 = pt_V1[  1215];
568dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            tmp2 = pt_V2[ -1215];
569dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu1 =  fxp_mac_16_by_16_bb(tmp1, test1, realAccu1);
570dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            realAccu2 =  fxp_mac_16_by_16_bb(tmp2, test1, realAccu2);
571dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
572dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            saturate2(realAccu1, realAccu2, pt_timeSig, pt_timeSig_2);
573dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
574dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
575dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
576dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    else
577dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
578dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
579dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        synthesis_sub_band_down_sampled(Sr,  Si,  V);
580dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
581dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
582dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        Int32 * pt_out = Sr;
583dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
584dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (i = 0; i < 8; i++)
585dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
586dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *(pt_out++) = 0;
587dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *(pt_out++) = 0;
588dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *(pt_out++) = 0;
589dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            *(pt_out++) = 0;
590dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
591dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
592dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
593dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        /*
594dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *    window signal
595dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         *    calculate output samples
596dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber         */
597dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
598dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_V1 = &V[0];
599dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_V2 = &V[96];
600dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
601dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
602dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        const Int32* pt_C1 = &sbrDecoderFilterbankCoefficients_down_smpl[0];
603dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_C2 = &sbrDecoderFilterbankCoefficients_down_smpl[16];
604dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
605dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (Int k = 0; k < 5; k++)
606dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
607dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pt_out -= 32;
608dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            for (i = 0; i < 16; i++)
609dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
610dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                realAccu1   = fxp_mul_16_by_16bt(*(pt_V1++), *(pt_C1));
611dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                realAccu2   = fxp_mul_16_by_16bb(*(pt_V1++), *(pt_C1++));
612dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                realAccu1   = fxp_mac_16_by_16_bt(*(pt_V2++), *(pt_C2), realAccu1);
613dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                realAccu2   = fxp_mac_16_by_16_bb(*(pt_V2++), *(pt_C2++), realAccu2);
614dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                *(pt_out++) += realAccu1 >> 5;
615dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                *(pt_out++) += realAccu2 >> 5;
616dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
617dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pt_V1 += 96;
618dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pt_V2 += 96;
619dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pt_C1 += 16;
620dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            pt_C2 += 16;
621dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
622dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        pt_out -= 32;
623dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
624dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        for (i = 0; i < 32; i++)
625dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
626dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            timeSig[2*i] = (Int16)((*(pt_out++) + 512) >> 10);
627dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
628dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
629dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
630dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
631dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
632dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
633dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif      /* --- HQ_SBR --- */
634dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
635dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
636dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif      /* --- AAC_PLUS --- */
637dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
638dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
639dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
640