1*e5436536SAndroid Build Coastguard Worker /* -----------------------------------------------------------------------------
2*e5436536SAndroid Build Coastguard Worker Software License for The Fraunhofer FDK AAC Codec Library for Android
3*e5436536SAndroid Build Coastguard Worker
4*e5436536SAndroid Build Coastguard Worker © Copyright 1995 - 2021 Fraunhofer-Gesellschaft zur Förderung der angewandten
5*e5436536SAndroid Build Coastguard Worker Forschung e.V. All rights reserved.
6*e5436536SAndroid Build Coastguard Worker
7*e5436536SAndroid Build Coastguard Worker 1. INTRODUCTION
8*e5436536SAndroid Build Coastguard Worker The Fraunhofer FDK AAC Codec Library for Android ("FDK AAC Codec") is software
9*e5436536SAndroid Build Coastguard Worker that implements the MPEG Advanced Audio Coding ("AAC") encoding and decoding
10*e5436536SAndroid Build Coastguard Worker scheme for digital audio. This FDK AAC Codec software is intended to be used on
11*e5436536SAndroid Build Coastguard Worker a wide variety of Android devices.
12*e5436536SAndroid Build Coastguard Worker
13*e5436536SAndroid Build Coastguard Worker AAC's HE-AAC and HE-AAC v2 versions are regarded as today's most efficient
14*e5436536SAndroid Build Coastguard Worker general perceptual audio codecs. AAC-ELD is considered the best-performing
15*e5436536SAndroid Build Coastguard Worker full-bandwidth communications codec by independent studies and is widely
16*e5436536SAndroid Build Coastguard Worker deployed. AAC has been standardized by ISO and IEC as part of the MPEG
17*e5436536SAndroid Build Coastguard Worker specifications.
18*e5436536SAndroid Build Coastguard Worker
19*e5436536SAndroid Build Coastguard Worker Patent licenses for necessary patent claims for the FDK AAC Codec (including
20*e5436536SAndroid Build Coastguard Worker those of Fraunhofer) may be obtained through Via Licensing
21*e5436536SAndroid Build Coastguard Worker (www.vialicensing.com) or through the respective patent owners individually for
22*e5436536SAndroid Build Coastguard Worker the purpose of encoding or decoding bit streams in products that are compliant
23*e5436536SAndroid Build Coastguard Worker with the ISO/IEC MPEG audio standards. Please note that most manufacturers of
24*e5436536SAndroid Build Coastguard Worker Android devices already license these patent claims through Via Licensing or
25*e5436536SAndroid Build Coastguard Worker directly from the patent owners, and therefore FDK AAC Codec software may
26*e5436536SAndroid Build Coastguard Worker already be covered under those patent licenses when it is used for those
27*e5436536SAndroid Build Coastguard Worker licensed purposes only.
28*e5436536SAndroid Build Coastguard Worker
29*e5436536SAndroid Build Coastguard Worker Commercially-licensed AAC software libraries, including floating-point versions
30*e5436536SAndroid Build Coastguard Worker with enhanced sound quality, are also available from Fraunhofer. Users are
31*e5436536SAndroid Build Coastguard Worker encouraged to check the Fraunhofer website for additional applications
32*e5436536SAndroid Build Coastguard Worker information and documentation.
33*e5436536SAndroid Build Coastguard Worker
34*e5436536SAndroid Build Coastguard Worker 2. COPYRIGHT LICENSE
35*e5436536SAndroid Build Coastguard Worker
36*e5436536SAndroid Build Coastguard Worker Redistribution and use in source and binary forms, with or without modification,
37*e5436536SAndroid Build Coastguard Worker are permitted without payment of copyright license fees provided that you
38*e5436536SAndroid Build Coastguard Worker satisfy the following conditions:
39*e5436536SAndroid Build Coastguard Worker
40*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in redistributions of
41*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec or your modifications thereto in source code form.
42*e5436536SAndroid Build Coastguard Worker
43*e5436536SAndroid Build Coastguard Worker You must retain the complete text of this software license in the documentation
44*e5436536SAndroid Build Coastguard Worker and/or other materials provided with redistributions of the FDK AAC Codec or
45*e5436536SAndroid Build Coastguard Worker your modifications thereto in binary form. You must make available free of
46*e5436536SAndroid Build Coastguard Worker charge copies of the complete source code of the FDK AAC Codec and your
47*e5436536SAndroid Build Coastguard Worker modifications thereto to recipients of copies in binary form.
48*e5436536SAndroid Build Coastguard Worker
49*e5436536SAndroid Build Coastguard Worker The name of Fraunhofer may not be used to endorse or promote products derived
50*e5436536SAndroid Build Coastguard Worker from this library without prior written permission.
51*e5436536SAndroid Build Coastguard Worker
52*e5436536SAndroid Build Coastguard Worker You may not charge copyright license fees for anyone to use, copy or distribute
53*e5436536SAndroid Build Coastguard Worker the FDK AAC Codec software or your modifications thereto.
54*e5436536SAndroid Build Coastguard Worker
55*e5436536SAndroid Build Coastguard Worker Your modified versions of the FDK AAC Codec must carry prominent notices stating
56*e5436536SAndroid Build Coastguard Worker that you changed the software and the date of any change. For modified versions
57*e5436536SAndroid Build Coastguard Worker of the FDK AAC Codec, the term "Fraunhofer FDK AAC Codec Library for Android"
58*e5436536SAndroid Build Coastguard Worker must be replaced by the term "Third-Party Modified Version of the Fraunhofer FDK
59*e5436536SAndroid Build Coastguard Worker AAC Codec Library for Android."
60*e5436536SAndroid Build Coastguard Worker
61*e5436536SAndroid Build Coastguard Worker 3. NO PATENT LICENSE
62*e5436536SAndroid Build Coastguard Worker
63*e5436536SAndroid Build Coastguard Worker NO EXPRESS OR IMPLIED LICENSES TO ANY PATENT CLAIMS, including without
64*e5436536SAndroid Build Coastguard Worker limitation the patents of Fraunhofer, ARE GRANTED BY THIS SOFTWARE LICENSE.
65*e5436536SAndroid Build Coastguard Worker Fraunhofer provides no warranty of patent non-infringement with respect to this
66*e5436536SAndroid Build Coastguard Worker software.
67*e5436536SAndroid Build Coastguard Worker
68*e5436536SAndroid Build Coastguard Worker You may use this FDK AAC Codec software or modifications thereto only for
69*e5436536SAndroid Build Coastguard Worker purposes that are authorized by appropriate patent licenses.
70*e5436536SAndroid Build Coastguard Worker
71*e5436536SAndroid Build Coastguard Worker 4. DISCLAIMER
72*e5436536SAndroid Build Coastguard Worker
73*e5436536SAndroid Build Coastguard Worker This FDK AAC Codec software is provided by Fraunhofer on behalf of the copyright
74*e5436536SAndroid Build Coastguard Worker holders and contributors "AS IS" and WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES,
75*e5436536SAndroid Build Coastguard Worker including but not limited to the implied warranties of merchantability and
76*e5436536SAndroid Build Coastguard Worker fitness for a particular purpose. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
77*e5436536SAndroid Build Coastguard Worker CONTRIBUTORS BE LIABLE for any direct, indirect, incidental, special, exemplary,
78*e5436536SAndroid Build Coastguard Worker or consequential damages, including but not limited to procurement of substitute
79*e5436536SAndroid Build Coastguard Worker goods or services; loss of use, data, or profits, or business interruption,
80*e5436536SAndroid Build Coastguard Worker however caused and on any theory of liability, whether in contract, strict
81*e5436536SAndroid Build Coastguard Worker liability, or tort (including negligence), arising in any way out of the use of
82*e5436536SAndroid Build Coastguard Worker this software, even if advised of the possibility of such damage.
83*e5436536SAndroid Build Coastguard Worker
84*e5436536SAndroid Build Coastguard Worker 5. CONTACT INFORMATION
85*e5436536SAndroid Build Coastguard Worker
86*e5436536SAndroid Build Coastguard Worker Fraunhofer Institute for Integrated Circuits IIS
87*e5436536SAndroid Build Coastguard Worker Attention: Audio and Multimedia Departments - FDK AAC LL
88*e5436536SAndroid Build Coastguard Worker Am Wolfsmantel 33
89*e5436536SAndroid Build Coastguard Worker 91058 Erlangen, Germany
90*e5436536SAndroid Build Coastguard Worker
91*e5436536SAndroid Build Coastguard Worker www.iis.fraunhofer.de/amm
92*e5436536SAndroid Build Coastguard Worker [email protected]
93*e5436536SAndroid Build Coastguard Worker ----------------------------------------------------------------------------- */
94*e5436536SAndroid Build Coastguard Worker
95*e5436536SAndroid Build Coastguard Worker /**************************** SBR decoder library ******************************
96*e5436536SAndroid Build Coastguard Worker
97*e5436536SAndroid Build Coastguard Worker Author(s):
98*e5436536SAndroid Build Coastguard Worker
99*e5436536SAndroid Build Coastguard Worker Description:
100*e5436536SAndroid Build Coastguard Worker
101*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
102*e5436536SAndroid Build Coastguard Worker
103*e5436536SAndroid Build Coastguard Worker /*!
104*e5436536SAndroid Build Coastguard Worker \file
105*e5436536SAndroid Build Coastguard Worker \brief Fast FFT routines prototypes
106*e5436536SAndroid Build Coastguard Worker \author Fabian Haussel
107*e5436536SAndroid Build Coastguard Worker */
108*e5436536SAndroid Build Coastguard Worker
109*e5436536SAndroid Build Coastguard Worker #include "hbe.h"
110*e5436536SAndroid Build Coastguard Worker #include "qmf.h"
111*e5436536SAndroid Build Coastguard Worker #include "env_extr.h"
112*e5436536SAndroid Build Coastguard Worker
113*e5436536SAndroid Build Coastguard Worker #define HBE_MAX_QMF_BANDS (40)
114*e5436536SAndroid Build Coastguard Worker
115*e5436536SAndroid Build Coastguard Worker #define HBE_MAX_OUT_SLOTS (11)
116*e5436536SAndroid Build Coastguard Worker
117*e5436536SAndroid Build Coastguard Worker #define QMF_WIN_LEN \
118*e5436536SAndroid Build Coastguard Worker (12 + 6 - 4 - 1) /* 6 subband slots extra delay to align with HQ - 4 slots \
119*e5436536SAndroid Build Coastguard Worker to compensate for critical sampling delay - 1 slot to \
120*e5436536SAndroid Build Coastguard Worker align critical sampling exactly (w additional time \
121*e5436536SAndroid Build Coastguard Worker domain delay)*/
122*e5436536SAndroid Build Coastguard Worker
123*e5436536SAndroid Build Coastguard Worker #ifndef PI
124*e5436536SAndroid Build Coastguard Worker #define PI 3.14159265358979323846
125*e5436536SAndroid Build Coastguard Worker #endif
126*e5436536SAndroid Build Coastguard Worker
127*e5436536SAndroid Build Coastguard Worker static const int xProducts[MAX_STRETCH_HBE - 1] = {
128*e5436536SAndroid Build Coastguard Worker 1, 1, 1}; /* Cross products on(1)/off(0) for T=2,3,4. */
129*e5436536SAndroid Build Coastguard Worker static const int startSubband2kL[33] = {
130*e5436536SAndroid Build Coastguard Worker 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6,
131*e5436536SAndroid Build Coastguard Worker 6, 8, 8, 8, 8, 8, 10, 10, 10, 12, 12, 12, 12, 12, 12, 12};
132*e5436536SAndroid Build Coastguard Worker
133*e5436536SAndroid Build Coastguard Worker static const int pmin = 12;
134*e5436536SAndroid Build Coastguard Worker
135*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL hintReal_F[4][3] = {
136*e5436536SAndroid Build Coastguard Worker {FL2FXCONST_DBL(0.39840335f), FL2FXCONST_DBL(0.39840335f),
137*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(-0.39840335f)},
138*e5436536SAndroid Build Coastguard Worker {FL2FXCONST_DBL(0.39840335f), FL2FXCONST_DBL(-0.39840335f),
139*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(-0.39840335f)},
140*e5436536SAndroid Build Coastguard Worker {FL2FXCONST_DBL(-0.39840335f), FL2FXCONST_DBL(-0.39840335f),
141*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(0.39840335f)},
142*e5436536SAndroid Build Coastguard Worker {FL2FXCONST_DBL(-0.39840335f), FL2FXCONST_DBL(0.39840335f),
143*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(0.39840335f)}};
144*e5436536SAndroid Build Coastguard Worker
145*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL factors[4] = {
146*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(0.39840335f), FL2FXCONST_DBL(-0.39840335f),
147*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(-0.39840335f), FL2FXCONST_DBL(0.39840335f)};
148*e5436536SAndroid Build Coastguard Worker
149*e5436536SAndroid Build Coastguard Worker #define PSCALE 32
150*e5436536SAndroid Build Coastguard Worker
151*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL p_F[128] = {FL2FXCONST_DBL(0.f / (PSCALE * 12.f)),
152*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(1.f / (PSCALE * 12.f)),
153*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(2.f / (PSCALE * 12.f)),
154*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(3.f / (PSCALE * 12.f)),
155*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(4.f / (PSCALE * 12.f)),
156*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(5.f / (PSCALE * 12.f)),
157*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(6.f / (PSCALE * 12.f)),
158*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(7.f / (PSCALE * 12.f)),
159*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(8.f / (PSCALE * 12.f)),
160*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(9.f / (PSCALE * 12.f)),
161*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(10.f / (PSCALE * 12.f)),
162*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(11.f / (PSCALE * 12.f)),
163*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(12.f / (PSCALE * 12.f)),
164*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(13.f / (PSCALE * 12.f)),
165*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(14.f / (PSCALE * 12.f)),
166*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(15.f / (PSCALE * 12.f)),
167*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(16.f / (PSCALE * 12.f)),
168*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(17.f / (PSCALE * 12.f)),
169*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(18.f / (PSCALE * 12.f)),
170*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(19.f / (PSCALE * 12.f)),
171*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(20.f / (PSCALE * 12.f)),
172*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(21.f / (PSCALE * 12.f)),
173*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(22.f / (PSCALE * 12.f)),
174*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(23.f / (PSCALE * 12.f)),
175*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(24.f / (PSCALE * 12.f)),
176*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(25.f / (PSCALE * 12.f)),
177*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(26.f / (PSCALE * 12.f)),
178*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(27.f / (PSCALE * 12.f)),
179*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(28.f / (PSCALE * 12.f)),
180*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(29.f / (PSCALE * 12.f)),
181*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(30.f / (PSCALE * 12.f)),
182*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(31.f / (PSCALE * 12.f)),
183*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(32.f / (PSCALE * 12.f)),
184*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(33.f / (PSCALE * 12.f)),
185*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(34.f / (PSCALE * 12.f)),
186*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(35.f / (PSCALE * 12.f)),
187*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(36.f / (PSCALE * 12.f)),
188*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(37.f / (PSCALE * 12.f)),
189*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(38.f / (PSCALE * 12.f)),
190*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(39.f / (PSCALE * 12.f)),
191*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(40.f / (PSCALE * 12.f)),
192*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(41.f / (PSCALE * 12.f)),
193*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(42.f / (PSCALE * 12.f)),
194*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(43.f / (PSCALE * 12.f)),
195*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(44.f / (PSCALE * 12.f)),
196*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(45.f / (PSCALE * 12.f)),
197*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(46.f / (PSCALE * 12.f)),
198*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(47.f / (PSCALE * 12.f)),
199*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(48.f / (PSCALE * 12.f)),
200*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(49.f / (PSCALE * 12.f)),
201*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(50.f / (PSCALE * 12.f)),
202*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(51.f / (PSCALE * 12.f)),
203*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(52.f / (PSCALE * 12.f)),
204*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(53.f / (PSCALE * 12.f)),
205*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(54.f / (PSCALE * 12.f)),
206*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(55.f / (PSCALE * 12.f)),
207*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(56.f / (PSCALE * 12.f)),
208*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(57.f / (PSCALE * 12.f)),
209*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(58.f / (PSCALE * 12.f)),
210*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(59.f / (PSCALE * 12.f)),
211*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(60.f / (PSCALE * 12.f)),
212*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(61.f / (PSCALE * 12.f)),
213*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(62.f / (PSCALE * 12.f)),
214*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(63.f / (PSCALE * 12.f)),
215*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(64.f / (PSCALE * 12.f)),
216*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(65.f / (PSCALE * 12.f)),
217*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(66.f / (PSCALE * 12.f)),
218*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(67.f / (PSCALE * 12.f)),
219*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(68.f / (PSCALE * 12.f)),
220*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(69.f / (PSCALE * 12.f)),
221*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(70.f / (PSCALE * 12.f)),
222*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(71.f / (PSCALE * 12.f)),
223*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(72.f / (PSCALE * 12.f)),
224*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(73.f / (PSCALE * 12.f)),
225*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(74.f / (PSCALE * 12.f)),
226*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(75.f / (PSCALE * 12.f)),
227*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(76.f / (PSCALE * 12.f)),
228*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(77.f / (PSCALE * 12.f)),
229*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(78.f / (PSCALE * 12.f)),
230*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(79.f / (PSCALE * 12.f)),
231*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(80.f / (PSCALE * 12.f)),
232*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(81.f / (PSCALE * 12.f)),
233*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(82.f / (PSCALE * 12.f)),
234*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(83.f / (PSCALE * 12.f)),
235*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(84.f / (PSCALE * 12.f)),
236*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(85.f / (PSCALE * 12.f)),
237*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(86.f / (PSCALE * 12.f)),
238*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(87.f / (PSCALE * 12.f)),
239*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(88.f / (PSCALE * 12.f)),
240*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(89.f / (PSCALE * 12.f)),
241*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(90.f / (PSCALE * 12.f)),
242*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(91.f / (PSCALE * 12.f)),
243*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(92.f / (PSCALE * 12.f)),
244*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(93.f / (PSCALE * 12.f)),
245*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(94.f / (PSCALE * 12.f)),
246*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(95.f / (PSCALE * 12.f)),
247*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(96.f / (PSCALE * 12.f)),
248*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(97.f / (PSCALE * 12.f)),
249*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(98.f / (PSCALE * 12.f)),
250*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(99.f / (PSCALE * 12.f)),
251*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(100.f / (PSCALE * 12.f)),
252*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(101.f / (PSCALE * 12.f)),
253*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(102.f / (PSCALE * 12.f)),
254*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(103.f / (PSCALE * 12.f)),
255*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(104.f / (PSCALE * 12.f)),
256*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(105.f / (PSCALE * 12.f)),
257*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(106.f / (PSCALE * 12.f)),
258*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(107.f / (PSCALE * 12.f)),
259*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(108.f / (PSCALE * 12.f)),
260*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(109.f / (PSCALE * 12.f)),
261*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(110.f / (PSCALE * 12.f)),
262*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(111.f / (PSCALE * 12.f)),
263*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(112.f / (PSCALE * 12.f)),
264*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(113.f / (PSCALE * 12.f)),
265*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(114.f / (PSCALE * 12.f)),
266*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(115.f / (PSCALE * 12.f)),
267*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(116.f / (PSCALE * 12.f)),
268*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(117.f / (PSCALE * 12.f)),
269*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(118.f / (PSCALE * 12.f)),
270*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(119.f / (PSCALE * 12.f)),
271*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(120.f / (PSCALE * 12.f)),
272*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(121.f / (PSCALE * 12.f)),
273*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(122.f / (PSCALE * 12.f)),
274*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(123.f / (PSCALE * 12.f)),
275*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(124.f / (PSCALE * 12.f)),
276*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(125.f / (PSCALE * 12.f)),
277*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(126.f / (PSCALE * 12.f)),
278*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(127.f / (PSCALE * 12.f))};
279*e5436536SAndroid Build Coastguard Worker
280*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL band_F[64] = {
281*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((0.f * 2.f + 1) / (PSCALE << 2)),
282*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((1.f * 2.f + 1) / (PSCALE << 2)),
283*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((2.f * 2.f + 1) / (PSCALE << 2)),
284*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((3.f * 2.f + 1) / (PSCALE << 2)),
285*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((4.f * 2.f + 1) / (PSCALE << 2)),
286*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((5.f * 2.f + 1) / (PSCALE << 2)),
287*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((6.f * 2.f + 1) / (PSCALE << 2)),
288*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((7.f * 2.f + 1) / (PSCALE << 2)),
289*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((8.f * 2.f + 1) / (PSCALE << 2)),
290*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((9.f * 2.f + 1) / (PSCALE << 2)),
291*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((10.f * 2.f + 1) / (PSCALE << 2)),
292*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((11.f * 2.f + 1) / (PSCALE << 2)),
293*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((12.f * 2.f + 1) / (PSCALE << 2)),
294*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((13.f * 2.f + 1) / (PSCALE << 2)),
295*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((14.f * 2.f + 1) / (PSCALE << 2)),
296*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((15.f * 2.f + 1) / (PSCALE << 2)),
297*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((16.f * 2.f + 1) / (PSCALE << 2)),
298*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((17.f * 2.f + 1) / (PSCALE << 2)),
299*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((18.f * 2.f + 1) / (PSCALE << 2)),
300*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((19.f * 2.f + 1) / (PSCALE << 2)),
301*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((20.f * 2.f + 1) / (PSCALE << 2)),
302*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((21.f * 2.f + 1) / (PSCALE << 2)),
303*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((22.f * 2.f + 1) / (PSCALE << 2)),
304*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((23.f * 2.f + 1) / (PSCALE << 2)),
305*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((24.f * 2.f + 1) / (PSCALE << 2)),
306*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((25.f * 2.f + 1) / (PSCALE << 2)),
307*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((26.f * 2.f + 1) / (PSCALE << 2)),
308*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((27.f * 2.f + 1) / (PSCALE << 2)),
309*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((28.f * 2.f + 1) / (PSCALE << 2)),
310*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((29.f * 2.f + 1) / (PSCALE << 2)),
311*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((30.f * 2.f + 1) / (PSCALE << 2)),
312*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((31.f * 2.f + 1) / (PSCALE << 2)),
313*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((32.f * 2.f + 1) / (PSCALE << 2)),
314*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((33.f * 2.f + 1) / (PSCALE << 2)),
315*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((34.f * 2.f + 1) / (PSCALE << 2)),
316*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((35.f * 2.f + 1) / (PSCALE << 2)),
317*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((36.f * 2.f + 1) / (PSCALE << 2)),
318*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((37.f * 2.f + 1) / (PSCALE << 2)),
319*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((38.f * 2.f + 1) / (PSCALE << 2)),
320*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((39.f * 2.f + 1) / (PSCALE << 2)),
321*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((40.f * 2.f + 1) / (PSCALE << 2)),
322*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((41.f * 2.f + 1) / (PSCALE << 2)),
323*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((42.f * 2.f + 1) / (PSCALE << 2)),
324*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((43.f * 2.f + 1) / (PSCALE << 2)),
325*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((44.f * 2.f + 1) / (PSCALE << 2)),
326*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((45.f * 2.f + 1) / (PSCALE << 2)),
327*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((46.f * 2.f + 1) / (PSCALE << 2)),
328*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((47.f * 2.f + 1) / (PSCALE << 2)),
329*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((48.f * 2.f + 1) / (PSCALE << 2)),
330*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((49.f * 2.f + 1) / (PSCALE << 2)),
331*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((50.f * 2.f + 1) / (PSCALE << 2)),
332*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((51.f * 2.f + 1) / (PSCALE << 2)),
333*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((52.f * 2.f + 1) / (PSCALE << 2)),
334*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((53.f * 2.f + 1) / (PSCALE << 2)),
335*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((54.f * 2.f + 1) / (PSCALE << 2)),
336*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((55.f * 2.f + 1) / (PSCALE << 2)),
337*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((56.f * 2.f + 1) / (PSCALE << 2)),
338*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((57.f * 2.f + 1) / (PSCALE << 2)),
339*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((58.f * 2.f + 1) / (PSCALE << 2)),
340*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((59.f * 2.f + 1) / (PSCALE << 2)),
341*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((60.f * 2.f + 1) / (PSCALE << 2)),
342*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((61.f * 2.f + 1) / (PSCALE << 2)),
343*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((62.f * 2.f + 1) / (PSCALE << 2)),
344*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL((63.f * 2.f + 1) / (PSCALE << 2))};
345*e5436536SAndroid Build Coastguard Worker
346*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL tr_str[3] = {FL2FXCONST_DBL(1.f / 4.f),
347*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(2.f / 4.f),
348*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(3.f / 4.f)};
349*e5436536SAndroid Build Coastguard Worker
350*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL stretchfac[3] = {FL2FXCONST_DBL(1.f / 2.f),
351*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(1.f / 3.f),
352*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(1.f / 4.f)};
353*e5436536SAndroid Build Coastguard Worker
354*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL cos_F[64] = {
355*e5436536SAndroid Build Coastguard Worker 26353028, -79043208, 131685776, -184244944, 236697216, -289006912,
356*e5436536SAndroid Build Coastguard Worker 341142496, -393072608, 444773984, -496191392, 547325824, -598114752,
357*e5436536SAndroid Build Coastguard Worker 648559104, -698597248, 748230016, -797411904, 846083200, -894275136,
358*e5436536SAndroid Build Coastguard Worker 941928192, -989013760, 1035474624, -1081340672, 1126555136, -1171063296,
359*e5436536SAndroid Build Coastguard Worker 1214893696, -1257992192, 1300332544, -1341889408, 1382612736, -1422503808,
360*e5436536SAndroid Build Coastguard Worker 1461586944, -1499741440, 1537039104, -1573364864, 1608743808, -1643196672,
361*e5436536SAndroid Build Coastguard Worker 1676617344, -1709028992, 1740450560, -1770784896, 1800089472, -1828273536,
362*e5436536SAndroid Build Coastguard Worker 1855357440, -1881356288, 1906190080, -1929876608, 1952428928, -1973777664,
363*e5436536SAndroid Build Coastguard Worker 1993962880, -2012922240, 2030670208, -2047216000, 2062508288, -2076559488,
364*e5436536SAndroid Build Coastguard Worker 2089376128, -2100932224, 2111196800, -2120214784, 2127953792, -2134394368,
365*e5436536SAndroid Build Coastguard Worker 2139565056, -2143444864, 2146026624, -2147321856};
366*e5436536SAndroid Build Coastguard Worker
367*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL twiddle[121] = {1073741824,
368*e5436536SAndroid Build Coastguard Worker 1071442860,
369*e5436536SAndroid Build Coastguard Worker 1064555814,
370*e5436536SAndroid Build Coastguard Worker 1053110176,
371*e5436536SAndroid Build Coastguard Worker 1037154959,
372*e5436536SAndroid Build Coastguard Worker 1016758484,
373*e5436536SAndroid Build Coastguard Worker 992008094,
374*e5436536SAndroid Build Coastguard Worker 963009773,
375*e5436536SAndroid Build Coastguard Worker 929887697,
376*e5436536SAndroid Build Coastguard Worker 892783698,
377*e5436536SAndroid Build Coastguard Worker 851856663,
378*e5436536SAndroid Build Coastguard Worker 807281846,
379*e5436536SAndroid Build Coastguard Worker 759250125,
380*e5436536SAndroid Build Coastguard Worker 707967178,
381*e5436536SAndroid Build Coastguard Worker 653652607,
382*e5436536SAndroid Build Coastguard Worker 596538995,
383*e5436536SAndroid Build Coastguard Worker 536870912,
384*e5436536SAndroid Build Coastguard Worker 474903865,
385*e5436536SAndroid Build Coastguard Worker 410903207,
386*e5436536SAndroid Build Coastguard Worker 345142998,
387*e5436536SAndroid Build Coastguard Worker 277904834,
388*e5436536SAndroid Build Coastguard Worker 209476638,
389*e5436536SAndroid Build Coastguard Worker 140151432,
390*e5436536SAndroid Build Coastguard Worker 70226075,
391*e5436536SAndroid Build Coastguard Worker 0,
392*e5436536SAndroid Build Coastguard Worker -70226075,
393*e5436536SAndroid Build Coastguard Worker -140151432,
394*e5436536SAndroid Build Coastguard Worker -209476638,
395*e5436536SAndroid Build Coastguard Worker -277904834,
396*e5436536SAndroid Build Coastguard Worker -345142998,
397*e5436536SAndroid Build Coastguard Worker -410903207,
398*e5436536SAndroid Build Coastguard Worker -474903865,
399*e5436536SAndroid Build Coastguard Worker -536870912,
400*e5436536SAndroid Build Coastguard Worker -596538995,
401*e5436536SAndroid Build Coastguard Worker -653652607,
402*e5436536SAndroid Build Coastguard Worker -707967178,
403*e5436536SAndroid Build Coastguard Worker -759250125,
404*e5436536SAndroid Build Coastguard Worker -807281846,
405*e5436536SAndroid Build Coastguard Worker -851856663,
406*e5436536SAndroid Build Coastguard Worker -892783698,
407*e5436536SAndroid Build Coastguard Worker -929887697,
408*e5436536SAndroid Build Coastguard Worker -963009773,
409*e5436536SAndroid Build Coastguard Worker -992008094,
410*e5436536SAndroid Build Coastguard Worker -1016758484,
411*e5436536SAndroid Build Coastguard Worker -1037154959,
412*e5436536SAndroid Build Coastguard Worker -1053110176,
413*e5436536SAndroid Build Coastguard Worker -1064555814,
414*e5436536SAndroid Build Coastguard Worker -1071442860,
415*e5436536SAndroid Build Coastguard Worker -1073741824,
416*e5436536SAndroid Build Coastguard Worker -1071442860,
417*e5436536SAndroid Build Coastguard Worker -1064555814,
418*e5436536SAndroid Build Coastguard Worker -1053110176,
419*e5436536SAndroid Build Coastguard Worker -1037154959,
420*e5436536SAndroid Build Coastguard Worker -1016758484,
421*e5436536SAndroid Build Coastguard Worker -992008094,
422*e5436536SAndroid Build Coastguard Worker -963009773,
423*e5436536SAndroid Build Coastguard Worker -929887697,
424*e5436536SAndroid Build Coastguard Worker -892783698,
425*e5436536SAndroid Build Coastguard Worker -851856663,
426*e5436536SAndroid Build Coastguard Worker -807281846,
427*e5436536SAndroid Build Coastguard Worker -759250125,
428*e5436536SAndroid Build Coastguard Worker -707967178,
429*e5436536SAndroid Build Coastguard Worker -653652607,
430*e5436536SAndroid Build Coastguard Worker -596538995,
431*e5436536SAndroid Build Coastguard Worker -536870912,
432*e5436536SAndroid Build Coastguard Worker -474903865,
433*e5436536SAndroid Build Coastguard Worker -410903207,
434*e5436536SAndroid Build Coastguard Worker -345142998,
435*e5436536SAndroid Build Coastguard Worker -277904834,
436*e5436536SAndroid Build Coastguard Worker -209476638,
437*e5436536SAndroid Build Coastguard Worker -140151432,
438*e5436536SAndroid Build Coastguard Worker -70226075,
439*e5436536SAndroid Build Coastguard Worker 0,
440*e5436536SAndroid Build Coastguard Worker 70226075,
441*e5436536SAndroid Build Coastguard Worker 140151432,
442*e5436536SAndroid Build Coastguard Worker 209476638,
443*e5436536SAndroid Build Coastguard Worker 277904834,
444*e5436536SAndroid Build Coastguard Worker 345142998,
445*e5436536SAndroid Build Coastguard Worker 410903207,
446*e5436536SAndroid Build Coastguard Worker 474903865,
447*e5436536SAndroid Build Coastguard Worker 536870912,
448*e5436536SAndroid Build Coastguard Worker 596538995,
449*e5436536SAndroid Build Coastguard Worker 653652607,
450*e5436536SAndroid Build Coastguard Worker 707967178,
451*e5436536SAndroid Build Coastguard Worker 759250125,
452*e5436536SAndroid Build Coastguard Worker 807281846,
453*e5436536SAndroid Build Coastguard Worker 851856663,
454*e5436536SAndroid Build Coastguard Worker 892783698,
455*e5436536SAndroid Build Coastguard Worker 929887697,
456*e5436536SAndroid Build Coastguard Worker 963009773,
457*e5436536SAndroid Build Coastguard Worker 992008094,
458*e5436536SAndroid Build Coastguard Worker 1016758484,
459*e5436536SAndroid Build Coastguard Worker 1037154959,
460*e5436536SAndroid Build Coastguard Worker 1053110176,
461*e5436536SAndroid Build Coastguard Worker 1064555814,
462*e5436536SAndroid Build Coastguard Worker 1071442860,
463*e5436536SAndroid Build Coastguard Worker 1073741824,
464*e5436536SAndroid Build Coastguard Worker 1071442860,
465*e5436536SAndroid Build Coastguard Worker 1064555814,
466*e5436536SAndroid Build Coastguard Worker 1053110176,
467*e5436536SAndroid Build Coastguard Worker 1037154959,
468*e5436536SAndroid Build Coastguard Worker 1016758484,
469*e5436536SAndroid Build Coastguard Worker 992008094,
470*e5436536SAndroid Build Coastguard Worker 963009773,
471*e5436536SAndroid Build Coastguard Worker 929887697,
472*e5436536SAndroid Build Coastguard Worker 892783698,
473*e5436536SAndroid Build Coastguard Worker 851856663,
474*e5436536SAndroid Build Coastguard Worker 807281846,
475*e5436536SAndroid Build Coastguard Worker 759250125,
476*e5436536SAndroid Build Coastguard Worker 707967178,
477*e5436536SAndroid Build Coastguard Worker 653652607,
478*e5436536SAndroid Build Coastguard Worker 596538995,
479*e5436536SAndroid Build Coastguard Worker 536870912,
480*e5436536SAndroid Build Coastguard Worker 474903865,
481*e5436536SAndroid Build Coastguard Worker 410903207,
482*e5436536SAndroid Build Coastguard Worker 345142998,
483*e5436536SAndroid Build Coastguard Worker 277904834,
484*e5436536SAndroid Build Coastguard Worker 209476638,
485*e5436536SAndroid Build Coastguard Worker 140151432,
486*e5436536SAndroid Build Coastguard Worker 70226075,
487*e5436536SAndroid Build Coastguard Worker 0};
488*e5436536SAndroid Build Coastguard Worker
489*e5436536SAndroid Build Coastguard Worker #if FIXP_QTW == FIXP_SGL
490*e5436536SAndroid Build Coastguard Worker #define HTW(x) (x)
491*e5436536SAndroid Build Coastguard Worker #else
492*e5436536SAndroid Build Coastguard Worker #define HTW(x) FX_DBL2FX_QTW(FX_SGL2FX_DBL((const FIXP_SGL)x))
493*e5436536SAndroid Build Coastguard Worker #endif
494*e5436536SAndroid Build Coastguard Worker
495*e5436536SAndroid Build Coastguard Worker static const FIXP_QTW post_twiddle_cos_8[8] = {
496*e5436536SAndroid Build Coastguard Worker HTW(-1606), HTW(4756), HTW(-7723), HTW(10394),
497*e5436536SAndroid Build Coastguard Worker HTW(-12665), HTW(14449), HTW(-15679), HTW(16305)};
498*e5436536SAndroid Build Coastguard Worker
499*e5436536SAndroid Build Coastguard Worker static const FIXP_QTW post_twiddle_cos_16[16] = {
500*e5436536SAndroid Build Coastguard Worker HTW(-804), HTW(2404), HTW(-3981), HTW(5520), HTW(-7005), HTW(8423),
501*e5436536SAndroid Build Coastguard Worker HTW(-9760), HTW(11003), HTW(-12140), HTW(13160), HTW(-14053), HTW(14811),
502*e5436536SAndroid Build Coastguard Worker HTW(-15426), HTW(15893), HTW(-16207), HTW(16364)};
503*e5436536SAndroid Build Coastguard Worker
504*e5436536SAndroid Build Coastguard Worker static const FIXP_QTW post_twiddle_cos_24[24] = {
505*e5436536SAndroid Build Coastguard Worker HTW(-536), HTW(1606), HTW(-2669), HTW(3720), HTW(-4756), HTW(5771),
506*e5436536SAndroid Build Coastguard Worker HTW(-6762), HTW(7723), HTW(-8652), HTW(9543), HTW(-10394), HTW(11200),
507*e5436536SAndroid Build Coastguard Worker HTW(-11958), HTW(12665), HTW(-13318), HTW(13913), HTW(-14449), HTW(14924),
508*e5436536SAndroid Build Coastguard Worker HTW(-15334), HTW(15679), HTW(-15956), HTW(16165), HTW(-16305), HTW(16375)};
509*e5436536SAndroid Build Coastguard Worker
510*e5436536SAndroid Build Coastguard Worker static const FIXP_QTW post_twiddle_cos_32[32] = {
511*e5436536SAndroid Build Coastguard Worker HTW(-402), HTW(1205), HTW(-2006), HTW(2801), HTW(-3590), HTW(4370),
512*e5436536SAndroid Build Coastguard Worker HTW(-5139), HTW(5897), HTW(-6639), HTW(7366), HTW(-8076), HTW(8765),
513*e5436536SAndroid Build Coastguard Worker HTW(-9434), HTW(10080), HTW(-10702), HTW(11297), HTW(-11866), HTW(12406),
514*e5436536SAndroid Build Coastguard Worker HTW(-12916), HTW(13395), HTW(-13842), HTW(14256), HTW(-14635), HTW(14978),
515*e5436536SAndroid Build Coastguard Worker HTW(-15286), HTW(15557), HTW(-15791), HTW(15986), HTW(-16143), HTW(16261),
516*e5436536SAndroid Build Coastguard Worker HTW(-16340), HTW(16379)};
517*e5436536SAndroid Build Coastguard Worker
518*e5436536SAndroid Build Coastguard Worker static const FIXP_QTW post_twiddle_cos_40[40] = {
519*e5436536SAndroid Build Coastguard Worker HTW(-322), HTW(965), HTW(-1606), HTW(2245), HTW(-2880), HTW(3511),
520*e5436536SAndroid Build Coastguard Worker HTW(-4137), HTW(4756), HTW(-5368), HTW(5971), HTW(-6566), HTW(7150),
521*e5436536SAndroid Build Coastguard Worker HTW(-7723), HTW(8285), HTW(-8833), HTW(9368), HTW(-9889), HTW(10394),
522*e5436536SAndroid Build Coastguard Worker HTW(-10883), HTW(11356), HTW(-11810), HTW(12247), HTW(-12665), HTW(13063),
523*e5436536SAndroid Build Coastguard Worker HTW(-13441), HTW(13799), HTW(-14135), HTW(14449), HTW(-14741), HTW(15011),
524*e5436536SAndroid Build Coastguard Worker HTW(-15257), HTW(15480), HTW(-15679), HTW(15853), HTW(-16003), HTW(16129),
525*e5436536SAndroid Build Coastguard Worker HTW(-16229), HTW(16305), HTW(-16356), HTW(16381)};
526*e5436536SAndroid Build Coastguard Worker
527*e5436536SAndroid Build Coastguard Worker static const FIXP_QTW post_twiddle_sin_8[8] = {
528*e5436536SAndroid Build Coastguard Worker HTW(16305), HTW(-15679), HTW(14449), HTW(-12665),
529*e5436536SAndroid Build Coastguard Worker HTW(10394), HTW(-7723), HTW(4756), HTW(-1606)};
530*e5436536SAndroid Build Coastguard Worker
531*e5436536SAndroid Build Coastguard Worker static const FIXP_QTW post_twiddle_sin_16[16] = {
532*e5436536SAndroid Build Coastguard Worker HTW(16364), HTW(-16207), HTW(15893), HTW(-15426), HTW(14811), HTW(-14053),
533*e5436536SAndroid Build Coastguard Worker HTW(13160), HTW(-12140), HTW(11003), HTW(-9760), HTW(8423), HTW(-7005),
534*e5436536SAndroid Build Coastguard Worker HTW(5520), HTW(-3981), HTW(2404), HTW(-804)};
535*e5436536SAndroid Build Coastguard Worker
536*e5436536SAndroid Build Coastguard Worker static const FIXP_QTW post_twiddle_sin_24[24] = {
537*e5436536SAndroid Build Coastguard Worker HTW(16375), HTW(-16305), HTW(16165), HTW(-15956), HTW(15679), HTW(-15334),
538*e5436536SAndroid Build Coastguard Worker HTW(14924), HTW(-14449), HTW(13913), HTW(-13318), HTW(12665), HTW(-11958),
539*e5436536SAndroid Build Coastguard Worker HTW(11200), HTW(-10394), HTW(9543), HTW(-8652), HTW(7723), HTW(-6762),
540*e5436536SAndroid Build Coastguard Worker HTW(5771), HTW(-4756), HTW(3720), HTW(-2669), HTW(1606), HTW(-536)};
541*e5436536SAndroid Build Coastguard Worker
542*e5436536SAndroid Build Coastguard Worker static const FIXP_QTW post_twiddle_sin_32[32] = {
543*e5436536SAndroid Build Coastguard Worker HTW(16379), HTW(-16340), HTW(16261), HTW(-16143), HTW(15986), HTW(-15791),
544*e5436536SAndroid Build Coastguard Worker HTW(15557), HTW(-15286), HTW(14978), HTW(-14635), HTW(14256), HTW(-13842),
545*e5436536SAndroid Build Coastguard Worker HTW(13395), HTW(-12916), HTW(12406), HTW(-11866), HTW(11297), HTW(-10702),
546*e5436536SAndroid Build Coastguard Worker HTW(10080), HTW(-9434), HTW(8765), HTW(-8076), HTW(7366), HTW(-6639),
547*e5436536SAndroid Build Coastguard Worker HTW(5897), HTW(-5139), HTW(4370), HTW(-3590), HTW(2801), HTW(-2006),
548*e5436536SAndroid Build Coastguard Worker HTW(1205), HTW(-402)};
549*e5436536SAndroid Build Coastguard Worker
550*e5436536SAndroid Build Coastguard Worker static const FIXP_QTW post_twiddle_sin_40[40] = {
551*e5436536SAndroid Build Coastguard Worker HTW(16381), HTW(-16356), HTW(16305), HTW(-16229), HTW(16129), HTW(-16003),
552*e5436536SAndroid Build Coastguard Worker HTW(15853), HTW(-15679), HTW(15480), HTW(-15257), HTW(15011), HTW(-14741),
553*e5436536SAndroid Build Coastguard Worker HTW(14449), HTW(-14135), HTW(13799), HTW(-13441), HTW(13063), HTW(-12665),
554*e5436536SAndroid Build Coastguard Worker HTW(12247), HTW(-11810), HTW(11356), HTW(-10883), HTW(10394), HTW(-9889),
555*e5436536SAndroid Build Coastguard Worker HTW(9368), HTW(-8833), HTW(8285), HTW(-7723), HTW(7150), HTW(-6566),
556*e5436536SAndroid Build Coastguard Worker HTW(5971), HTW(-5368), HTW(4756), HTW(-4137), HTW(3511), HTW(-2880),
557*e5436536SAndroid Build Coastguard Worker HTW(2245), HTW(-1606), HTW(965), HTW(-322)};
558*e5436536SAndroid Build Coastguard Worker
559*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL preModCos[32] = {
560*e5436536SAndroid Build Coastguard Worker -749875776, 786681536, 711263552, -821592064, -670937792, 854523392,
561*e5436536SAndroid Build Coastguard Worker 628995648, -885396032, -585538240, 914135680, 540670208, -940673088,
562*e5436536SAndroid Build Coastguard Worker -494499680, 964944384, 447137824, -986891008, -398698816, 1006460096,
563*e5436536SAndroid Build Coastguard Worker 349299264, -1023604544, -299058240, 1038283072, 248096752, -1050460288,
564*e5436536SAndroid Build Coastguard Worker -196537584, 1060106816, 144504928, -1067199488, -92124160, 1071721152,
565*e5436536SAndroid Build Coastguard Worker 39521456, -1073660992};
566*e5436536SAndroid Build Coastguard Worker
567*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL preModSin[32] = {
568*e5436536SAndroid Build Coastguard Worker 768510144, 730789760, -804379072, -691308864, 838310208, 650162560,
569*e5436536SAndroid Build Coastguard Worker -870221760, -607449920, 900036928, 563273856, -927683776, -517740896,
570*e5436536SAndroid Build Coastguard Worker 953095808, 470960608, -976211712, -423045728, 996975808, 374111712,
571*e5436536SAndroid Build Coastguard Worker -1015338112, -324276416, 1031254400, 273659904, -1044686336, -222384144,
572*e5436536SAndroid Build Coastguard Worker 1055601472, 170572640, -1063973632, -118350192, 1069782528, 65842640,
573*e5436536SAndroid Build Coastguard Worker -1073014208, -13176464};
574*e5436536SAndroid Build Coastguard Worker
575*e5436536SAndroid Build Coastguard Worker /* The cube root function */
576*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
577*e5436536SAndroid Build Coastguard Worker
578*e5436536SAndroid Build Coastguard Worker functionname: invCubeRootNorm2
579*e5436536SAndroid Build Coastguard Worker description: delivers 1/cuberoot(op) in Q1.31 format and modified exponent
580*e5436536SAndroid Build Coastguard Worker
581*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
582*e5436536SAndroid Build Coastguard Worker #define CUBE_ROOT_BITS 7
583*e5436536SAndroid Build Coastguard Worker #define CUBE_ROOT_VALUES (128 + 2)
584*e5436536SAndroid Build Coastguard Worker #define CUBE_ROOT_BITS_MASK 0x7f
585*e5436536SAndroid Build Coastguard Worker #define CUBE_ROOT_FRACT_BITS_MASK 0x007FFFFF
586*e5436536SAndroid Build Coastguard Worker /* Inverse cube root table for operands running from 0.5 to 1.0 */
587*e5436536SAndroid Build Coastguard Worker /* (INT) (1.0/cuberoot((op))); */
588*e5436536SAndroid Build Coastguard Worker /* Implicit exponent is 1. */
589*e5436536SAndroid Build Coastguard Worker
590*e5436536SAndroid Build Coastguard Worker LNK_SECTION_CONSTDATA
591*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL invCubeRootTab[CUBE_ROOT_VALUES] = {
592*e5436536SAndroid Build Coastguard Worker (0x50a28be6), (0x506d1172), (0x503823c4), (0x5003c05a), (0x4fcfe4c0),
593*e5436536SAndroid Build Coastguard Worker (0x4f9c8e92), (0x4f69bb7d), (0x4f37693b), (0x4f059594), (0x4ed43e5f),
594*e5436536SAndroid Build Coastguard Worker (0x4ea36181), (0x4e72fcea), (0x4e430e98), (0x4e139495), (0x4de48cf5),
595*e5436536SAndroid Build Coastguard Worker (0x4db5f5db), (0x4d87cd73), (0x4d5a11f2), (0x4d2cc19c), (0x4cffdabb),
596*e5436536SAndroid Build Coastguard Worker (0x4cd35ba4), (0x4ca742b7), (0x4c7b8e5c), (0x4c503d05), (0x4c254d2a),
597*e5436536SAndroid Build Coastguard Worker (0x4bfabd50), (0x4bd08c00), (0x4ba6b7cd), (0x4b7d3f53), (0x4b542134),
598*e5436536SAndroid Build Coastguard Worker (0x4b2b5c18), (0x4b02eeb1), (0x4adad7b8), (0x4ab315ea), (0x4a8ba80d),
599*e5436536SAndroid Build Coastguard Worker (0x4a648cec), (0x4a3dc35b), (0x4a174a30), (0x49f1204a), (0x49cb448d),
600*e5436536SAndroid Build Coastguard Worker (0x49a5b5e2), (0x49807339), (0x495b7b86), (0x4936cdc2), (0x491268ec),
601*e5436536SAndroid Build Coastguard Worker (0x48ee4c08), (0x48ca761f), (0x48a6e63e), (0x48839b76), (0x486094de),
602*e5436536SAndroid Build Coastguard Worker (0x483dd190), (0x481b50ad), (0x47f91156), (0x47d712b3), (0x47b553f0),
603*e5436536SAndroid Build Coastguard Worker (0x4793d43c), (0x477292c9), (0x47518ece), (0x4730c785), (0x47103c2d),
604*e5436536SAndroid Build Coastguard Worker (0x46efec06), (0x46cfd655), (0x46affa61), (0x46905777), (0x4670ece4),
605*e5436536SAndroid Build Coastguard Worker (0x4651b9f9), (0x4632be0b), (0x4613f871), (0x45f56885), (0x45d70da5),
606*e5436536SAndroid Build Coastguard Worker (0x45b8e72f), (0x459af487), (0x457d3511), (0x455fa835), (0x45424d5d),
607*e5436536SAndroid Build Coastguard Worker (0x452523f6), (0x45082b6e), (0x44eb6337), (0x44cecac5), (0x44b2618d),
608*e5436536SAndroid Build Coastguard Worker (0x44962708), (0x447a1ab1), (0x445e3c02), (0x44428a7c), (0x4427059e),
609*e5436536SAndroid Build Coastguard Worker (0x440bacec), (0x43f07fe9), (0x43d57e1c), (0x43baa70e), (0x439ffa48),
610*e5436536SAndroid Build Coastguard Worker (0x43857757), (0x436b1dc8), (0x4350ed2b), (0x4336e511), (0x431d050c),
611*e5436536SAndroid Build Coastguard Worker (0x43034cb2), (0x42e9bb98), (0x42d05156), (0x42b70d85), (0x429defc0),
612*e5436536SAndroid Build Coastguard Worker (0x4284f7a2), (0x426c24cb), (0x425376d8), (0x423aed6a), (0x42228823),
613*e5436536SAndroid Build Coastguard Worker (0x420a46a6), (0x41f22898), (0x41da2d9f), (0x41c25561), (0x41aa9f86),
614*e5436536SAndroid Build Coastguard Worker (0x41930bba), (0x417b99a5), (0x416448f5), (0x414d1956), (0x41360a76),
615*e5436536SAndroid Build Coastguard Worker (0x411f1c06), (0x41084db5), (0x40f19f35), (0x40db1039), (0x40c4a074),
616*e5436536SAndroid Build Coastguard Worker (0x40ae4f9b), (0x40981d64), (0x40820985), (0x406c13b6), (0x40563bb1),
617*e5436536SAndroid Build Coastguard Worker (0x4040812e), (0x402ae3e7), (0x40156399), (0x40000000), (0x3FEAB8D9)};
618*e5436536SAndroid Build Coastguard Worker /* n.a. */
619*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL invCubeRootCorrection[3] = {0x40000000, 0x50A28BE6,
620*e5436536SAndroid Build Coastguard Worker 0x6597FA95};
621*e5436536SAndroid Build Coastguard Worker
622*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
623*e5436536SAndroid Build Coastguard Worker * \brief calculate 1.0/cube_root(op), op contains mantissa and exponent
624*e5436536SAndroid Build Coastguard Worker * \param op_m: (i) mantissa of operand, must not be zero (0x0000.0000) or
625*e5436536SAndroid Build Coastguard Worker * negative
626*e5436536SAndroid Build Coastguard Worker * \param op_e: (i) pointer to the exponent of the operand (must be initialized)
627*e5436536SAndroid Build Coastguard Worker * and .. (o) pointer to the exponent of the result
628*e5436536SAndroid Build Coastguard Worker * \return: (o) mantissa of the result
629*e5436536SAndroid Build Coastguard Worker * \description:
630*e5436536SAndroid Build Coastguard Worker * This routine calculates the cube root of the input operand, that is
631*e5436536SAndroid Build Coastguard Worker * given with its mantissa in Q31 format (FIXP_DBL) and its exponent (INT).
632*e5436536SAndroid Build Coastguard Worker * The resulting mantissa is returned in format Q31. The exponent (*op_e)
633*e5436536SAndroid Build Coastguard Worker * is modified accordingly. It is not assured, that the result is fully
634*e5436536SAndroid Build Coastguard Worker * left-aligned but assumed to have not more than 2 bits headroom. There is one
635*e5436536SAndroid Build Coastguard Worker * macro to activate the use of this algorithm: FUNCTION_invCubeRootNorm2 By
636*e5436536SAndroid Build Coastguard Worker * means of activating the macro INVCUBEROOTNORM2_LINEAR_INTERPOLATE_HQ, a
637*e5436536SAndroid Build Coastguard Worker * slightly higher precision is reachable (by default, not active). For DEBUG
638*e5436536SAndroid Build Coastguard Worker * purpose only: a FDK_ASSERT macro validates, if the input mantissa is greater
639*e5436536SAndroid Build Coastguard Worker * zero.
640*e5436536SAndroid Build Coastguard Worker *
641*e5436536SAndroid Build Coastguard Worker */
642*e5436536SAndroid Build Coastguard Worker static
643*e5436536SAndroid Build Coastguard Worker #ifdef __arm__
644*e5436536SAndroid Build Coastguard Worker FIXP_DBL __attribute__((always_inline))
invCubeRootNorm2(FIXP_DBL op_m,INT * op_e)645*e5436536SAndroid Build Coastguard Worker invCubeRootNorm2(FIXP_DBL op_m, INT* op_e)
646*e5436536SAndroid Build Coastguard Worker #else
647*e5436536SAndroid Build Coastguard Worker FIXP_DBL
648*e5436536SAndroid Build Coastguard Worker invCubeRootNorm2(FIXP_DBL op_m, INT* op_e)
649*e5436536SAndroid Build Coastguard Worker #endif
650*e5436536SAndroid Build Coastguard Worker {
651*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(op_m > FIXP_DBL(0));
652*e5436536SAndroid Build Coastguard Worker
653*e5436536SAndroid Build Coastguard Worker /* normalize input, calculate shift value */
654*e5436536SAndroid Build Coastguard Worker INT exponent = (INT)fNormz(op_m) - 1;
655*e5436536SAndroid Build Coastguard Worker op_m <<= exponent;
656*e5436536SAndroid Build Coastguard Worker
657*e5436536SAndroid Build Coastguard Worker INT index = (INT)(op_m >> (DFRACT_BITS - 1 - (CUBE_ROOT_BITS + 1))) &
658*e5436536SAndroid Build Coastguard Worker CUBE_ROOT_BITS_MASK;
659*e5436536SAndroid Build Coastguard Worker FIXP_DBL fract = (FIXP_DBL)(((INT)op_m & CUBE_ROOT_FRACT_BITS_MASK)
660*e5436536SAndroid Build Coastguard Worker << (CUBE_ROOT_BITS + 1));
661*e5436536SAndroid Build Coastguard Worker FIXP_DBL diff = invCubeRootTab[index + 1] - invCubeRootTab[index];
662*e5436536SAndroid Build Coastguard Worker op_m = fMultAddDiv2(invCubeRootTab[index], diff << 1, fract);
663*e5436536SAndroid Build Coastguard Worker #if defined(INVCUBEROOTNORM2_LINEAR_INTERPOLATE_HQ)
664*e5436536SAndroid Build Coastguard Worker /* reg1 = t[i] + (t[i+1]-t[i])*fract ... already computed ... +
665*e5436536SAndroid Build Coastguard Worker * (1-fract)fract*(t[i+2]-t[i+1])/2 */
666*e5436536SAndroid Build Coastguard Worker if (fract != (FIXP_DBL)0) {
667*e5436536SAndroid Build Coastguard Worker /* fract = fract * (1 - fract) */
668*e5436536SAndroid Build Coastguard Worker fract = fMultDiv2(fract, (FIXP_DBL)((LONG)0x80000000 - (LONG)fract)) << 1;
669*e5436536SAndroid Build Coastguard Worker diff = diff - (invCubeRootTab[index + 2] - invCubeRootTab[index + 1]);
670*e5436536SAndroid Build Coastguard Worker op_m = fMultAddDiv2(op_m, fract, diff);
671*e5436536SAndroid Build Coastguard Worker }
672*e5436536SAndroid Build Coastguard Worker #endif /* INVCUBEROOTNORM2_LINEAR_INTERPOLATE_HQ */
673*e5436536SAndroid Build Coastguard Worker
674*e5436536SAndroid Build Coastguard Worker /* calculate the output exponent = input * exp/3 = cubicroot(m)*2^(exp/3)
675*e5436536SAndroid Build Coastguard Worker * where 2^(exp/3) = 2^k'*2 or 2^k'*2^(1/3) or 2^k'*2^(2/3) */
676*e5436536SAndroid Build Coastguard Worker exponent = exponent - *op_e + 3;
677*e5436536SAndroid Build Coastguard Worker INT shift_tmp =
678*e5436536SAndroid Build Coastguard Worker ((INT)fMultDiv2((FIXP_SGL)fAbs(exponent), (FIXP_SGL)0x5556)) >> 16;
679*e5436536SAndroid Build Coastguard Worker if (exponent < 0) {
680*e5436536SAndroid Build Coastguard Worker shift_tmp = -shift_tmp;
681*e5436536SAndroid Build Coastguard Worker }
682*e5436536SAndroid Build Coastguard Worker INT rem = exponent - 3 * shift_tmp;
683*e5436536SAndroid Build Coastguard Worker if (rem < 0) {
684*e5436536SAndroid Build Coastguard Worker rem += 3;
685*e5436536SAndroid Build Coastguard Worker shift_tmp--;
686*e5436536SAndroid Build Coastguard Worker }
687*e5436536SAndroid Build Coastguard Worker
688*e5436536SAndroid Build Coastguard Worker *op_e = shift_tmp;
689*e5436536SAndroid Build Coastguard Worker op_m = fMultDiv2(op_m, invCubeRootCorrection[rem]) << 2;
690*e5436536SAndroid Build Coastguard Worker
691*e5436536SAndroid Build Coastguard Worker return (op_m);
692*e5436536SAndroid Build Coastguard Worker }
693*e5436536SAndroid Build Coastguard Worker
694*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
695*e5436536SAndroid Build Coastguard Worker
696*e5436536SAndroid Build Coastguard Worker functionname: invFourthRootNorm2
697*e5436536SAndroid Build Coastguard Worker description: delivers 1/FourthRoot(op) in Q1.31 format and modified
698*e5436536SAndroid Build Coastguard Worker exponent
699*e5436536SAndroid Build Coastguard Worker
700*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
701*e5436536SAndroid Build Coastguard Worker
702*e5436536SAndroid Build Coastguard Worker #define FOURTHROOT_BITS 7
703*e5436536SAndroid Build Coastguard Worker #define FOURTHROOT_VALUES (128 + 2)
704*e5436536SAndroid Build Coastguard Worker #define FOURTHROOT_BITS_MASK 0x7f
705*e5436536SAndroid Build Coastguard Worker #define FOURTHROOT_FRACT_BITS_MASK 0x007FFFFF
706*e5436536SAndroid Build Coastguard Worker
707*e5436536SAndroid Build Coastguard Worker LNK_SECTION_CONSTDATA
708*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL invFourthRootTab[FOURTHROOT_VALUES] = {
709*e5436536SAndroid Build Coastguard Worker (0x4c1bf829), (0x4bf61977), (0x4bd09843), (0x4bab72ef), (0x4b86a7eb),
710*e5436536SAndroid Build Coastguard Worker (0x4b6235ac), (0x4b3e1ab6), (0x4b1a5592), (0x4af6e4d4), (0x4ad3c718),
711*e5436536SAndroid Build Coastguard Worker (0x4ab0fb03), (0x4a8e7f42), (0x4a6c5288), (0x4a4a7393), (0x4a28e126),
712*e5436536SAndroid Build Coastguard Worker (0x4a079a0c), (0x49e69d16), (0x49c5e91f), (0x49a57d04), (0x498557ac),
713*e5436536SAndroid Build Coastguard Worker (0x49657802), (0x4945dcf9), (0x49268588), (0x490770ac), (0x48e89d6a),
714*e5436536SAndroid Build Coastguard Worker (0x48ca0ac9), (0x48abb7d6), (0x488da3a6), (0x486fcd4f), (0x485233ed),
715*e5436536SAndroid Build Coastguard Worker (0x4834d6a3), (0x4817b496), (0x47faccf0), (0x47de1ee0), (0x47c1a999),
716*e5436536SAndroid Build Coastguard Worker (0x47a56c51), (0x47896643), (0x476d96af), (0x4751fcd6), (0x473697ff),
717*e5436536SAndroid Build Coastguard Worker (0x471b6773), (0x47006a81), (0x46e5a079), (0x46cb08ae), (0x46b0a279),
718*e5436536SAndroid Build Coastguard Worker (0x46966d34), (0x467c683d), (0x466292f4), (0x4648ecbc), (0x462f74fe),
719*e5436536SAndroid Build Coastguard Worker (0x46162b20), (0x45fd0e91), (0x45e41ebe), (0x45cb5b19), (0x45b2c315),
720*e5436536SAndroid Build Coastguard Worker (0x459a562a), (0x458213cf), (0x4569fb81), (0x45520cbc), (0x453a4701),
721*e5436536SAndroid Build Coastguard Worker (0x4522a9d1), (0x450b34b0), (0x44f3e726), (0x44dcc0ba), (0x44c5c0f7),
722*e5436536SAndroid Build Coastguard Worker (0x44aee768), (0x4498339e), (0x4481a527), (0x446b3b96), (0x4454f67e),
723*e5436536SAndroid Build Coastguard Worker (0x443ed576), (0x4428d815), (0x4412fdf3), (0x43fd46ad), (0x43e7b1de),
724*e5436536SAndroid Build Coastguard Worker (0x43d23f23), (0x43bcee1e), (0x43a7be6f), (0x4392afb8), (0x437dc19d),
725*e5436536SAndroid Build Coastguard Worker (0x4368f3c5), (0x435445d6), (0x433fb779), (0x432b4856), (0x4316f81a),
726*e5436536SAndroid Build Coastguard Worker (0x4302c66f), (0x42eeb305), (0x42dabd8a), (0x42c6e5ad), (0x42b32b21),
727*e5436536SAndroid Build Coastguard Worker (0x429f8d96), (0x428c0cc2), (0x4278a859), (0x42656010), (0x4252339e),
728*e5436536SAndroid Build Coastguard Worker (0x423f22bc), (0x422c2d23), (0x4219528b), (0x420692b2), (0x41f3ed51),
729*e5436536SAndroid Build Coastguard Worker (0x41e16228), (0x41cef0f2), (0x41bc9971), (0x41aa5b62), (0x41983687),
730*e5436536SAndroid Build Coastguard Worker (0x41862aa2), (0x41743775), (0x41625cc3), (0x41509a50), (0x413eefe2),
731*e5436536SAndroid Build Coastguard Worker (0x412d5d3e), (0x411be22b), (0x410a7e70), (0x40f931d5), (0x40e7fc23),
732*e5436536SAndroid Build Coastguard Worker (0x40d6dd24), (0x40c5d4a2), (0x40b4e268), (0x40a40642), (0x40933ffc),
733*e5436536SAndroid Build Coastguard Worker (0x40828f64), (0x4071f447), (0x40616e73), (0x4050fdb9), (0x4040a1e6),
734*e5436536SAndroid Build Coastguard Worker (0x40305acc), (0x4020283c), (0x40100a08), (0x40000000), (0x3ff009f9),
735*e5436536SAndroid Build Coastguard Worker };
736*e5436536SAndroid Build Coastguard Worker
737*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL invFourthRootCorrection[4] = {0x40000000, 0x4C1BF829,
738*e5436536SAndroid Build Coastguard Worker 0x5A82799A, 0x6BA27E65};
739*e5436536SAndroid Build Coastguard Worker
740*e5436536SAndroid Build Coastguard Worker /* The fourth root function */
741*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
742*e5436536SAndroid Build Coastguard Worker * \brief calculate 1.0/fourth_root(op), op contains mantissa and exponent
743*e5436536SAndroid Build Coastguard Worker * \param op_m: (i) mantissa of operand, must not be zero (0x0000.0000) or
744*e5436536SAndroid Build Coastguard Worker * negative
745*e5436536SAndroid Build Coastguard Worker * \param op_e: (i) pointer to the exponent of the operand (must be initialized)
746*e5436536SAndroid Build Coastguard Worker * and .. (o) pointer to the exponent of the result
747*e5436536SAndroid Build Coastguard Worker * \return: (o) mantissa of the result
748*e5436536SAndroid Build Coastguard Worker * \description:
749*e5436536SAndroid Build Coastguard Worker * This routine calculates the cube root of the input operand, that is
750*e5436536SAndroid Build Coastguard Worker * given with its mantissa in Q31 format (FIXP_DBL) and its exponent (INT).
751*e5436536SAndroid Build Coastguard Worker * The resulting mantissa is returned in format Q31. The exponent (*op_e)
752*e5436536SAndroid Build Coastguard Worker * is modified accordingly. It is not assured, that the result is fully
753*e5436536SAndroid Build Coastguard Worker * left-aligned but assumed to have not more than 2 bits headroom. There is one
754*e5436536SAndroid Build Coastguard Worker * macro to activate the use of this algorithm: FUNCTION_invFourthRootNorm2 By
755*e5436536SAndroid Build Coastguard Worker * means of activating the macro INVFOURTHROOTNORM2_LINEAR_INTERPOLATE_HQ, a
756*e5436536SAndroid Build Coastguard Worker * slightly higher precision is reachable (by default, not active). For DEBUG
757*e5436536SAndroid Build Coastguard Worker * purpose only: a FDK_ASSERT macro validates, if the input mantissa is greater
758*e5436536SAndroid Build Coastguard Worker * zero.
759*e5436536SAndroid Build Coastguard Worker *
760*e5436536SAndroid Build Coastguard Worker */
761*e5436536SAndroid Build Coastguard Worker
762*e5436536SAndroid Build Coastguard Worker /* #define INVFOURTHROOTNORM2_LINEAR_INTERPOLATE_HQ */
763*e5436536SAndroid Build Coastguard Worker
764*e5436536SAndroid Build Coastguard Worker static
765*e5436536SAndroid Build Coastguard Worker #ifdef __arm__
766*e5436536SAndroid Build Coastguard Worker FIXP_DBL __attribute__((always_inline))
invFourthRootNorm2(FIXP_DBL op_m,INT * op_e)767*e5436536SAndroid Build Coastguard Worker invFourthRootNorm2(FIXP_DBL op_m, INT* op_e)
768*e5436536SAndroid Build Coastguard Worker #else
769*e5436536SAndroid Build Coastguard Worker FIXP_DBL
770*e5436536SAndroid Build Coastguard Worker invFourthRootNorm2(FIXP_DBL op_m, INT* op_e)
771*e5436536SAndroid Build Coastguard Worker #endif
772*e5436536SAndroid Build Coastguard Worker {
773*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(op_m > FL2FXCONST_DBL(0.0));
774*e5436536SAndroid Build Coastguard Worker
775*e5436536SAndroid Build Coastguard Worker /* normalize input, calculate shift value */
776*e5436536SAndroid Build Coastguard Worker INT exponent = (INT)fNormz(op_m) - 1;
777*e5436536SAndroid Build Coastguard Worker op_m <<= exponent;
778*e5436536SAndroid Build Coastguard Worker
779*e5436536SAndroid Build Coastguard Worker INT index = (INT)(op_m >> (DFRACT_BITS - 1 - (FOURTHROOT_BITS + 1))) &
780*e5436536SAndroid Build Coastguard Worker FOURTHROOT_BITS_MASK;
781*e5436536SAndroid Build Coastguard Worker FIXP_DBL fract = (FIXP_DBL)(((INT)op_m & FOURTHROOT_FRACT_BITS_MASK)
782*e5436536SAndroid Build Coastguard Worker << (FOURTHROOT_BITS + 1));
783*e5436536SAndroid Build Coastguard Worker FIXP_DBL diff = invFourthRootTab[index + 1] - invFourthRootTab[index];
784*e5436536SAndroid Build Coastguard Worker op_m = invFourthRootTab[index] + (fMultDiv2(diff, fract) << 1);
785*e5436536SAndroid Build Coastguard Worker
786*e5436536SAndroid Build Coastguard Worker #if defined(INVFOURTHROOTNORM2_LINEAR_INTERPOLATE_HQ)
787*e5436536SAndroid Build Coastguard Worker /* reg1 = t[i] + (t[i+1]-t[i])*fract ... already computed ... +
788*e5436536SAndroid Build Coastguard Worker * (1-fract)fract*(t[i+2]-t[i+1])/2 */
789*e5436536SAndroid Build Coastguard Worker if (fract != (FIXP_DBL)0) {
790*e5436536SAndroid Build Coastguard Worker /* fract = fract * (1 - fract) */
791*e5436536SAndroid Build Coastguard Worker fract = fMultDiv2(fract, (FIXP_DBL)((LONG)0x80000000 - (LONG)fract)) << 1;
792*e5436536SAndroid Build Coastguard Worker diff = diff - (invFourthRootTab[index + 2] - invFourthRootTab[index + 1]);
793*e5436536SAndroid Build Coastguard Worker op_m = fMultAddDiv2(op_m, fract, diff);
794*e5436536SAndroid Build Coastguard Worker }
795*e5436536SAndroid Build Coastguard Worker #endif /* INVFOURTHROOTNORM2_LINEAR_INTERPOLATE_HQ */
796*e5436536SAndroid Build Coastguard Worker
797*e5436536SAndroid Build Coastguard Worker exponent = exponent - *op_e + 4;
798*e5436536SAndroid Build Coastguard Worker INT rem = exponent & 0x00000003;
799*e5436536SAndroid Build Coastguard Worker INT shift_tmp = (exponent >> 2);
800*e5436536SAndroid Build Coastguard Worker
801*e5436536SAndroid Build Coastguard Worker *op_e = shift_tmp;
802*e5436536SAndroid Build Coastguard Worker op_m = fMultDiv2(op_m, invFourthRootCorrection[rem]) << 2;
803*e5436536SAndroid Build Coastguard Worker
804*e5436536SAndroid Build Coastguard Worker return (op_m);
805*e5436536SAndroid Build Coastguard Worker }
806*e5436536SAndroid Build Coastguard Worker
807*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
808*e5436536SAndroid Build Coastguard Worker
809*e5436536SAndroid Build Coastguard Worker functionname: inv3EigthRootNorm2
810*e5436536SAndroid Build Coastguard Worker description: delivers 1/cubert(op) normalized to .5...1 and the shift value
811*e5436536SAndroid Build Coastguard Worker of the OUTPUT
812*e5436536SAndroid Build Coastguard Worker
813*e5436536SAndroid Build Coastguard Worker *****************************************************************************/
814*e5436536SAndroid Build Coastguard Worker #define THREEIGTHROOT_BITS 7
815*e5436536SAndroid Build Coastguard Worker #define THREEIGTHROOT_VALUES (128 + 2)
816*e5436536SAndroid Build Coastguard Worker #define THREEIGTHROOT_BITS_MASK 0x7f
817*e5436536SAndroid Build Coastguard Worker #define THREEIGTHROOT_FRACT_BITS_MASK 0x007FFFFF
818*e5436536SAndroid Build Coastguard Worker
819*e5436536SAndroid Build Coastguard Worker LNK_SECTION_CONSTDATA
820*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL inv3EigthRootTab[THREEIGTHROOT_VALUES] = {
821*e5436536SAndroid Build Coastguard Worker (0x45cae0f2), (0x45b981bf), (0x45a8492a), (0x45973691), (0x45864959),
822*e5436536SAndroid Build Coastguard Worker (0x457580e6), (0x4564dca4), (0x45545c00), (0x4543fe6b), (0x4533c35a),
823*e5436536SAndroid Build Coastguard Worker (0x4523aa44), (0x4513b2a4), (0x4503dbf7), (0x44f425be), (0x44e48f7b),
824*e5436536SAndroid Build Coastguard Worker (0x44d518b6), (0x44c5c0f7), (0x44b687c8), (0x44a76cb8), (0x44986f58),
825*e5436536SAndroid Build Coastguard Worker (0x44898f38), (0x447acbef), (0x446c2514), (0x445d9a3f), (0x444f2b0d),
826*e5436536SAndroid Build Coastguard Worker (0x4440d71a), (0x44329e07), (0x44247f73), (0x44167b04), (0x4408905e),
827*e5436536SAndroid Build Coastguard Worker (0x43fabf28), (0x43ed070b), (0x43df67b0), (0x43d1e0c5), (0x43c471f7),
828*e5436536SAndroid Build Coastguard Worker (0x43b71af6), (0x43a9db71), (0x439cb31c), (0x438fa1ab), (0x4382a6d2),
829*e5436536SAndroid Build Coastguard Worker (0x4375c248), (0x4368f3c5), (0x435c3b03), (0x434f97bc), (0x434309ac),
830*e5436536SAndroid Build Coastguard Worker (0x43369091), (0x432a2c28), (0x431ddc30), (0x4311a06c), (0x4305789c),
831*e5436536SAndroid Build Coastguard Worker (0x42f96483), (0x42ed63e5), (0x42e17688), (0x42d59c30), (0x42c9d4a6),
832*e5436536SAndroid Build Coastguard Worker (0x42be1fb1), (0x42b27d1a), (0x42a6ecac), (0x429b6e2f), (0x42900172),
833*e5436536SAndroid Build Coastguard Worker (0x4284a63f), (0x42795c64), (0x426e23b0), (0x4262fbf2), (0x4257e4f9),
834*e5436536SAndroid Build Coastguard Worker (0x424cde96), (0x4241e89a), (0x423702d8), (0x422c2d23), (0x4221674d),
835*e5436536SAndroid Build Coastguard Worker (0x4216b12c), (0x420c0a94), (0x4201735b), (0x41f6eb57), (0x41ec725f),
836*e5436536SAndroid Build Coastguard Worker (0x41e2084b), (0x41d7acf3), (0x41cd6030), (0x41c321db), (0x41b8f1ce),
837*e5436536SAndroid Build Coastguard Worker (0x41aecfe5), (0x41a4bbf8), (0x419ab5e6), (0x4190bd89), (0x4186d2bf),
838*e5436536SAndroid Build Coastguard Worker (0x417cf565), (0x41732558), (0x41696277), (0x415faca1), (0x415603b4),
839*e5436536SAndroid Build Coastguard Worker (0x414c6792), (0x4142d818), (0x4139552a), (0x412fdea6), (0x41267470),
840*e5436536SAndroid Build Coastguard Worker (0x411d1668), (0x4113c472), (0x410a7e70), (0x41014445), (0x40f815d4),
841*e5436536SAndroid Build Coastguard Worker (0x40eef302), (0x40e5dbb4), (0x40dccfcd), (0x40d3cf33), (0x40cad9cb),
842*e5436536SAndroid Build Coastguard Worker (0x40c1ef7b), (0x40b9102a), (0x40b03bbd), (0x40a7721c), (0x409eb32e),
843*e5436536SAndroid Build Coastguard Worker (0x4095feda), (0x408d5508), (0x4084b5a0), (0x407c208b), (0x407395b2),
844*e5436536SAndroid Build Coastguard Worker (0x406b14fd), (0x40629e56), (0x405a31a6), (0x4051ced8), (0x404975d5),
845*e5436536SAndroid Build Coastguard Worker (0x40412689), (0x4038e0dd), (0x4030a4bd), (0x40287215), (0x402048cf),
846*e5436536SAndroid Build Coastguard Worker (0x401828d7), (0x4010121a), (0x40080483), (0x40000000), (0x3ff8047d),
847*e5436536SAndroid Build Coastguard Worker };
848*e5436536SAndroid Build Coastguard Worker
849*e5436536SAndroid Build Coastguard Worker /* The last value is rounded in order to avoid any overflow due to the values
850*e5436536SAndroid Build Coastguard Worker * range of the root table */
851*e5436536SAndroid Build Coastguard Worker static const FIXP_DBL inv3EigthRootCorrection[8] = {
852*e5436536SAndroid Build Coastguard Worker 0x40000000, 0x45CAE0F2, 0x4C1BF829, 0x52FF6B55,
853*e5436536SAndroid Build Coastguard Worker 0x5A82799A, 0x62B39509, 0x6BA27E65, 0x75606373};
854*e5436536SAndroid Build Coastguard Worker
855*e5436536SAndroid Build Coastguard Worker /* The 3/8 root function */
856*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
857*e5436536SAndroid Build Coastguard Worker * \brief calculate 1.0/3Eigth_root(op) = 1.0/(x)^(3/8), op contains mantissa
858*e5436536SAndroid Build Coastguard Worker * and exponent
859*e5436536SAndroid Build Coastguard Worker * \param op_m: (i) mantissa of operand, must not be zero (0x0000.0000) or
860*e5436536SAndroid Build Coastguard Worker * negative
861*e5436536SAndroid Build Coastguard Worker * \param op_e: (i) pointer to the exponent of the operand (must be initialized)
862*e5436536SAndroid Build Coastguard Worker * and .. (o) pointer to the exponent of the result
863*e5436536SAndroid Build Coastguard Worker * \return: (o) mantissa of the result
864*e5436536SAndroid Build Coastguard Worker * \description:
865*e5436536SAndroid Build Coastguard Worker * This routine calculates the cube root of the input operand, that is
866*e5436536SAndroid Build Coastguard Worker * given with its mantissa in Q31 format (FIXP_DBL) and its exponent (INT).
867*e5436536SAndroid Build Coastguard Worker * The resulting mantissa is returned in format Q31. The exponent (*op_e)
868*e5436536SAndroid Build Coastguard Worker * is modified accordingly. It is not assured, that the result is fully
869*e5436536SAndroid Build Coastguard Worker * left-aligned but assumed to have not more than 2 bits headroom. There is one
870*e5436536SAndroid Build Coastguard Worker * macro to activate the use of this algorithm: FUNCTION_inv3EigthRootNorm2 By
871*e5436536SAndroid Build Coastguard Worker * means of activating the macro INVTHREEIGTHROOTNORM2_LINEAR_INTERPOLATE_HQ, a
872*e5436536SAndroid Build Coastguard Worker * slightly higher precision is reachable (by default, not active). For DEBUG
873*e5436536SAndroid Build Coastguard Worker * purpose only: a FDK_ASSERT macro validates, if the input mantissa is greater
874*e5436536SAndroid Build Coastguard Worker * zero.
875*e5436536SAndroid Build Coastguard Worker *
876*e5436536SAndroid Build Coastguard Worker */
877*e5436536SAndroid Build Coastguard Worker
878*e5436536SAndroid Build Coastguard Worker /* #define INVTHREEIGTHROOTNORM2_LINEAR_INTERPOLATE_HQ */
879*e5436536SAndroid Build Coastguard Worker
880*e5436536SAndroid Build Coastguard Worker static
881*e5436536SAndroid Build Coastguard Worker #ifdef __arm__
882*e5436536SAndroid Build Coastguard Worker FIXP_DBL __attribute__((always_inline))
inv3EigthRootNorm2(FIXP_DBL op_m,INT * op_e)883*e5436536SAndroid Build Coastguard Worker inv3EigthRootNorm2(FIXP_DBL op_m, INT* op_e)
884*e5436536SAndroid Build Coastguard Worker #else
885*e5436536SAndroid Build Coastguard Worker FIXP_DBL
886*e5436536SAndroid Build Coastguard Worker inv3EigthRootNorm2(FIXP_DBL op_m, INT* op_e)
887*e5436536SAndroid Build Coastguard Worker #endif
888*e5436536SAndroid Build Coastguard Worker {
889*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(op_m > FL2FXCONST_DBL(0.0));
890*e5436536SAndroid Build Coastguard Worker
891*e5436536SAndroid Build Coastguard Worker /* normalize input, calculate shift op_mue */
892*e5436536SAndroid Build Coastguard Worker INT exponent = (INT)fNormz(op_m) - 1;
893*e5436536SAndroid Build Coastguard Worker op_m <<= exponent;
894*e5436536SAndroid Build Coastguard Worker
895*e5436536SAndroid Build Coastguard Worker INT index = (INT)(op_m >> (DFRACT_BITS - 1 - (THREEIGTHROOT_BITS + 1))) &
896*e5436536SAndroid Build Coastguard Worker THREEIGTHROOT_BITS_MASK;
897*e5436536SAndroid Build Coastguard Worker FIXP_DBL fract = (FIXP_DBL)(((INT)op_m & THREEIGTHROOT_FRACT_BITS_MASK)
898*e5436536SAndroid Build Coastguard Worker << (THREEIGTHROOT_BITS + 1));
899*e5436536SAndroid Build Coastguard Worker FIXP_DBL diff = inv3EigthRootTab[index + 1] - inv3EigthRootTab[index];
900*e5436536SAndroid Build Coastguard Worker op_m = inv3EigthRootTab[index] + (fMultDiv2(diff, fract) << 1);
901*e5436536SAndroid Build Coastguard Worker
902*e5436536SAndroid Build Coastguard Worker #if defined(INVTHREEIGTHROOTNORM2_LINEAR_INTERPOLATE_HQ)
903*e5436536SAndroid Build Coastguard Worker /* op_m = t[i] + (t[i+1]-t[i])*fract ... already computed ... +
904*e5436536SAndroid Build Coastguard Worker * (1-fract)fract*(t[i+2]-t[i+1])/2 */
905*e5436536SAndroid Build Coastguard Worker if (fract != (FIXP_DBL)0) {
906*e5436536SAndroid Build Coastguard Worker /* fract = fract * (1 - fract) */
907*e5436536SAndroid Build Coastguard Worker fract = fMultDiv2(fract, (FIXP_DBL)((LONG)0x80000000 - (LONG)fract)) << 1;
908*e5436536SAndroid Build Coastguard Worker diff = diff - (inv3EigthRootTab[index + 2] - inv3EigthRootTab[index + 1]);
909*e5436536SAndroid Build Coastguard Worker op_m = fMultAddDiv2(op_m, fract, diff);
910*e5436536SAndroid Build Coastguard Worker }
911*e5436536SAndroid Build Coastguard Worker #endif /* INVTHREEIGTHROOTNORM2_LINEAR_INTERPOLATE_HQ */
912*e5436536SAndroid Build Coastguard Worker
913*e5436536SAndroid Build Coastguard Worker exponent = exponent - *op_e + 8;
914*e5436536SAndroid Build Coastguard Worker INT rem = exponent & 0x00000007;
915*e5436536SAndroid Build Coastguard Worker INT shift_tmp = (exponent >> 3);
916*e5436536SAndroid Build Coastguard Worker
917*e5436536SAndroid Build Coastguard Worker *op_e = shift_tmp * 3;
918*e5436536SAndroid Build Coastguard Worker op_m = fMultDiv2(op_m, inv3EigthRootCorrection[rem]) << 2;
919*e5436536SAndroid Build Coastguard Worker
920*e5436536SAndroid Build Coastguard Worker return (fMult(op_m, fMult(op_m, op_m)));
921*e5436536SAndroid Build Coastguard Worker }
922*e5436536SAndroid Build Coastguard Worker
923*e5436536SAndroid Build Coastguard Worker SBR_ERROR
QmfTransposerCreate(HANDLE_HBE_TRANSPOSER * hQmfTransposer,const int frameSize,int bDisableCrossProducts,int bSbr41)924*e5436536SAndroid Build Coastguard Worker QmfTransposerCreate(HANDLE_HBE_TRANSPOSER* hQmfTransposer, const int frameSize,
925*e5436536SAndroid Build Coastguard Worker int bDisableCrossProducts, int bSbr41) {
926*e5436536SAndroid Build Coastguard Worker HANDLE_HBE_TRANSPOSER hQmfTran = NULL;
927*e5436536SAndroid Build Coastguard Worker
928*e5436536SAndroid Build Coastguard Worker int i;
929*e5436536SAndroid Build Coastguard Worker
930*e5436536SAndroid Build Coastguard Worker if (hQmfTransposer != NULL) {
931*e5436536SAndroid Build Coastguard Worker /* Memory allocation */
932*e5436536SAndroid Build Coastguard Worker /*--------------------------------------------------------------------------------------------*/
933*e5436536SAndroid Build Coastguard Worker hQmfTran =
934*e5436536SAndroid Build Coastguard Worker (HANDLE_HBE_TRANSPOSER)FDKcalloc(1, sizeof(struct hbeTransposer));
935*e5436536SAndroid Build Coastguard Worker if (hQmfTran == NULL) {
936*e5436536SAndroid Build Coastguard Worker return SBRDEC_MEM_ALLOC_FAILED;
937*e5436536SAndroid Build Coastguard Worker }
938*e5436536SAndroid Build Coastguard Worker
939*e5436536SAndroid Build Coastguard Worker for (i = 0; i < MAX_STRETCH_HBE - 1; i++) {
940*e5436536SAndroid Build Coastguard Worker hQmfTran->bXProducts[i] = (bDisableCrossProducts ? 0 : xProducts[i]);
941*e5436536SAndroid Build Coastguard Worker }
942*e5436536SAndroid Build Coastguard Worker
943*e5436536SAndroid Build Coastguard Worker hQmfTran->timeDomainWinLen = frameSize;
944*e5436536SAndroid Build Coastguard Worker if (frameSize == 768) {
945*e5436536SAndroid Build Coastguard Worker hQmfTran->noCols =
946*e5436536SAndroid Build Coastguard Worker (8 * frameSize / 3) / QMF_SYNTH_CHANNELS; /* 32 for 24:64 */
947*e5436536SAndroid Build Coastguard Worker } else {
948*e5436536SAndroid Build Coastguard Worker hQmfTran->noCols =
949*e5436536SAndroid Build Coastguard Worker (bSbr41 + 1) * 2 * frameSize /
950*e5436536SAndroid Build Coastguard Worker QMF_SYNTH_CHANNELS; /* 32 for 32:64 and 64 for 16:64 -> identical to
951*e5436536SAndroid Build Coastguard Worker sbrdec->no_cols */
952*e5436536SAndroid Build Coastguard Worker }
953*e5436536SAndroid Build Coastguard Worker
954*e5436536SAndroid Build Coastguard Worker hQmfTran->noChannels = frameSize / hQmfTran->noCols;
955*e5436536SAndroid Build Coastguard Worker
956*e5436536SAndroid Build Coastguard Worker hQmfTran->qmfInBufSize = QMF_WIN_LEN;
957*e5436536SAndroid Build Coastguard Worker hQmfTran->qmfOutBufSize = 2 * (hQmfTran->noCols / 2 + QMF_WIN_LEN - 1);
958*e5436536SAndroid Build Coastguard Worker
959*e5436536SAndroid Build Coastguard Worker hQmfTran->inBuf_F =
960*e5436536SAndroid Build Coastguard Worker (LONG*)FDKcalloc(QMF_SYNTH_CHANNELS + 20 + 1, sizeof(LONG));
961*e5436536SAndroid Build Coastguard Worker /* buffered time signal needs to be delayed by synthesis_size; max
962*e5436536SAndroid Build Coastguard Worker * synthesis_size = 20; */
963*e5436536SAndroid Build Coastguard Worker if (hQmfTran->inBuf_F == NULL) {
964*e5436536SAndroid Build Coastguard Worker QmfTransposerClose(hQmfTran);
965*e5436536SAndroid Build Coastguard Worker return SBRDEC_MEM_ALLOC_FAILED;
966*e5436536SAndroid Build Coastguard Worker }
967*e5436536SAndroid Build Coastguard Worker
968*e5436536SAndroid Build Coastguard Worker hQmfTran->qmfInBufReal_F =
969*e5436536SAndroid Build Coastguard Worker (FIXP_DBL**)FDKcalloc(hQmfTran->qmfInBufSize, sizeof(FIXP_DBL*));
970*e5436536SAndroid Build Coastguard Worker hQmfTran->qmfInBufImag_F =
971*e5436536SAndroid Build Coastguard Worker (FIXP_DBL**)FDKcalloc(hQmfTran->qmfInBufSize, sizeof(FIXP_DBL*));
972*e5436536SAndroid Build Coastguard Worker
973*e5436536SAndroid Build Coastguard Worker if (hQmfTran->qmfInBufReal_F == NULL) {
974*e5436536SAndroid Build Coastguard Worker QmfTransposerClose(hQmfTran);
975*e5436536SAndroid Build Coastguard Worker return SBRDEC_MEM_ALLOC_FAILED;
976*e5436536SAndroid Build Coastguard Worker }
977*e5436536SAndroid Build Coastguard Worker if (hQmfTran->qmfInBufImag_F == NULL) {
978*e5436536SAndroid Build Coastguard Worker QmfTransposerClose(hQmfTran);
979*e5436536SAndroid Build Coastguard Worker return SBRDEC_MEM_ALLOC_FAILED;
980*e5436536SAndroid Build Coastguard Worker }
981*e5436536SAndroid Build Coastguard Worker
982*e5436536SAndroid Build Coastguard Worker for (i = 0; i < hQmfTran->qmfInBufSize; i++) {
983*e5436536SAndroid Build Coastguard Worker hQmfTran->qmfInBufReal_F[i] = (FIXP_DBL*)FDKaalloc(
984*e5436536SAndroid Build Coastguard Worker QMF_SYNTH_CHANNELS * sizeof(FIXP_DBL), ALIGNMENT_DEFAULT);
985*e5436536SAndroid Build Coastguard Worker hQmfTran->qmfInBufImag_F[i] = (FIXP_DBL*)FDKaalloc(
986*e5436536SAndroid Build Coastguard Worker QMF_SYNTH_CHANNELS * sizeof(FIXP_DBL), ALIGNMENT_DEFAULT);
987*e5436536SAndroid Build Coastguard Worker if (hQmfTran->qmfInBufReal_F[i] == NULL) {
988*e5436536SAndroid Build Coastguard Worker QmfTransposerClose(hQmfTran);
989*e5436536SAndroid Build Coastguard Worker return SBRDEC_MEM_ALLOC_FAILED;
990*e5436536SAndroid Build Coastguard Worker }
991*e5436536SAndroid Build Coastguard Worker if (hQmfTran->qmfInBufImag_F[i] == NULL) {
992*e5436536SAndroid Build Coastguard Worker QmfTransposerClose(hQmfTran);
993*e5436536SAndroid Build Coastguard Worker return SBRDEC_MEM_ALLOC_FAILED;
994*e5436536SAndroid Build Coastguard Worker }
995*e5436536SAndroid Build Coastguard Worker }
996*e5436536SAndroid Build Coastguard Worker
997*e5436536SAndroid Build Coastguard Worker hQmfTran->qmfHBEBufReal_F =
998*e5436536SAndroid Build Coastguard Worker (FIXP_DBL**)FDKcalloc(HBE_MAX_OUT_SLOTS, sizeof(FIXP_DBL*));
999*e5436536SAndroid Build Coastguard Worker hQmfTran->qmfHBEBufImag_F =
1000*e5436536SAndroid Build Coastguard Worker (FIXP_DBL**)FDKcalloc(HBE_MAX_OUT_SLOTS, sizeof(FIXP_DBL*));
1001*e5436536SAndroid Build Coastguard Worker
1002*e5436536SAndroid Build Coastguard Worker if (hQmfTran->qmfHBEBufReal_F == NULL) {
1003*e5436536SAndroid Build Coastguard Worker QmfTransposerClose(hQmfTran);
1004*e5436536SAndroid Build Coastguard Worker return SBRDEC_MEM_ALLOC_FAILED;
1005*e5436536SAndroid Build Coastguard Worker }
1006*e5436536SAndroid Build Coastguard Worker if (hQmfTran->qmfHBEBufImag_F == NULL) {
1007*e5436536SAndroid Build Coastguard Worker QmfTransposerClose(hQmfTran);
1008*e5436536SAndroid Build Coastguard Worker return SBRDEC_MEM_ALLOC_FAILED;
1009*e5436536SAndroid Build Coastguard Worker }
1010*e5436536SAndroid Build Coastguard Worker
1011*e5436536SAndroid Build Coastguard Worker for (i = 0; i < HBE_MAX_OUT_SLOTS; i++) {
1012*e5436536SAndroid Build Coastguard Worker hQmfTran->qmfHBEBufReal_F[i] =
1013*e5436536SAndroid Build Coastguard Worker (FIXP_DBL*)FDKcalloc(QMF_SYNTH_CHANNELS, sizeof(FIXP_DBL));
1014*e5436536SAndroid Build Coastguard Worker hQmfTran->qmfHBEBufImag_F[i] =
1015*e5436536SAndroid Build Coastguard Worker (FIXP_DBL*)FDKcalloc(QMF_SYNTH_CHANNELS, sizeof(FIXP_DBL));
1016*e5436536SAndroid Build Coastguard Worker if (hQmfTran->qmfHBEBufReal_F[i] == NULL) {
1017*e5436536SAndroid Build Coastguard Worker QmfTransposerClose(hQmfTran);
1018*e5436536SAndroid Build Coastguard Worker return SBRDEC_MEM_ALLOC_FAILED;
1019*e5436536SAndroid Build Coastguard Worker }
1020*e5436536SAndroid Build Coastguard Worker if (hQmfTran->qmfHBEBufImag_F[i] == NULL) {
1021*e5436536SAndroid Build Coastguard Worker QmfTransposerClose(hQmfTran);
1022*e5436536SAndroid Build Coastguard Worker return SBRDEC_MEM_ALLOC_FAILED;
1023*e5436536SAndroid Build Coastguard Worker }
1024*e5436536SAndroid Build Coastguard Worker }
1025*e5436536SAndroid Build Coastguard Worker
1026*e5436536SAndroid Build Coastguard Worker hQmfTran->qmfBufferCodecTempSlot_F =
1027*e5436536SAndroid Build Coastguard Worker (FIXP_DBL*)FDKcalloc(QMF_SYNTH_CHANNELS / 2, sizeof(FIXP_DBL));
1028*e5436536SAndroid Build Coastguard Worker if (hQmfTran->qmfBufferCodecTempSlot_F == NULL) {
1029*e5436536SAndroid Build Coastguard Worker QmfTransposerClose(hQmfTran);
1030*e5436536SAndroid Build Coastguard Worker return SBRDEC_MEM_ALLOC_FAILED;
1031*e5436536SAndroid Build Coastguard Worker }
1032*e5436536SAndroid Build Coastguard Worker
1033*e5436536SAndroid Build Coastguard Worker hQmfTran->bSbr41 = bSbr41;
1034*e5436536SAndroid Build Coastguard Worker
1035*e5436536SAndroid Build Coastguard Worker hQmfTran->highband_exp[0] = 0;
1036*e5436536SAndroid Build Coastguard Worker hQmfTran->highband_exp[1] = 0;
1037*e5436536SAndroid Build Coastguard Worker hQmfTran->target_exp[0] = 0;
1038*e5436536SAndroid Build Coastguard Worker hQmfTran->target_exp[1] = 0;
1039*e5436536SAndroid Build Coastguard Worker
1040*e5436536SAndroid Build Coastguard Worker *hQmfTransposer = hQmfTran;
1041*e5436536SAndroid Build Coastguard Worker }
1042*e5436536SAndroid Build Coastguard Worker
1043*e5436536SAndroid Build Coastguard Worker return SBRDEC_OK;
1044*e5436536SAndroid Build Coastguard Worker }
1045*e5436536SAndroid Build Coastguard Worker
QmfTransposerReInit(HANDLE_HBE_TRANSPOSER hQmfTransposer,UCHAR * FreqBandTable[2],UCHAR NSfb[2])1046*e5436536SAndroid Build Coastguard Worker SBR_ERROR QmfTransposerReInit(HANDLE_HBE_TRANSPOSER hQmfTransposer,
1047*e5436536SAndroid Build Coastguard Worker UCHAR* FreqBandTable[2], UCHAR NSfb[2])
1048*e5436536SAndroid Build Coastguard Worker /* removed bSbr41 from parameterlist:
1049*e5436536SAndroid Build Coastguard Worker don't know where to get this value from
1050*e5436536SAndroid Build Coastguard Worker at call-side */
1051*e5436536SAndroid Build Coastguard Worker {
1052*e5436536SAndroid Build Coastguard Worker int L, sfb, patch, stopPatch, qmfErr;
1053*e5436536SAndroid Build Coastguard Worker
1054*e5436536SAndroid Build Coastguard Worker if (hQmfTransposer != NULL) {
1055*e5436536SAndroid Build Coastguard Worker const FIXP_QTW* tmp_t_cos;
1056*e5436536SAndroid Build Coastguard Worker const FIXP_QTW* tmp_t_sin;
1057*e5436536SAndroid Build Coastguard Worker
1058*e5436536SAndroid Build Coastguard Worker hQmfTransposer->startBand = FreqBandTable[0][0];
1059*e5436536SAndroid Build Coastguard Worker FDK_ASSERT((!hQmfTransposer->bSbr41 && hQmfTransposer->startBand <= 32) ||
1060*e5436536SAndroid Build Coastguard Worker (hQmfTransposer->bSbr41 &&
1061*e5436536SAndroid Build Coastguard Worker hQmfTransposer->startBand <=
1062*e5436536SAndroid Build Coastguard Worker 16)); /* is checked by resetFreqBandTables() */
1063*e5436536SAndroid Build Coastguard Worker hQmfTransposer->stopBand = FreqBandTable[0][NSfb[0]];
1064*e5436536SAndroid Build Coastguard Worker
1065*e5436536SAndroid Build Coastguard Worker hQmfTransposer->synthSize =
1066*e5436536SAndroid Build Coastguard Worker 4 * ((hQmfTransposer->startBand + 4) / 8 + 1); /* 8, 12, 16, 20 */
1067*e5436536SAndroid Build Coastguard Worker hQmfTransposer->kstart = startSubband2kL[hQmfTransposer->startBand];
1068*e5436536SAndroid Build Coastguard Worker
1069*e5436536SAndroid Build Coastguard Worker /* don't know where to take this information from */
1070*e5436536SAndroid Build Coastguard Worker /* hQmfTransposer->bSbr41 = bSbr41; */
1071*e5436536SAndroid Build Coastguard Worker
1072*e5436536SAndroid Build Coastguard Worker if (hQmfTransposer->bSbr41) {
1073*e5436536SAndroid Build Coastguard Worker if (hQmfTransposer->kstart + hQmfTransposer->synthSize > 16)
1074*e5436536SAndroid Build Coastguard Worker hQmfTransposer->kstart = 16 - hQmfTransposer->synthSize;
1075*e5436536SAndroid Build Coastguard Worker } else if (hQmfTransposer->timeDomainWinLen == 768) {
1076*e5436536SAndroid Build Coastguard Worker if (hQmfTransposer->kstart + hQmfTransposer->synthSize > 24)
1077*e5436536SAndroid Build Coastguard Worker hQmfTransposer->kstart = 24 - hQmfTransposer->synthSize;
1078*e5436536SAndroid Build Coastguard Worker }
1079*e5436536SAndroid Build Coastguard Worker
1080*e5436536SAndroid Build Coastguard Worker hQmfTransposer->synthesisQmfPreModCos_F =
1081*e5436536SAndroid Build Coastguard Worker &preModCos[hQmfTransposer->kstart];
1082*e5436536SAndroid Build Coastguard Worker hQmfTransposer->synthesisQmfPreModSin_F =
1083*e5436536SAndroid Build Coastguard Worker &preModSin[hQmfTransposer->kstart];
1084*e5436536SAndroid Build Coastguard Worker
1085*e5436536SAndroid Build Coastguard Worker L = 2 * hQmfTransposer->synthSize; /* 8, 16, 24, 32, 40 */
1086*e5436536SAndroid Build Coastguard Worker /* Change analysis post twiddles */
1087*e5436536SAndroid Build Coastguard Worker
1088*e5436536SAndroid Build Coastguard Worker switch (L) {
1089*e5436536SAndroid Build Coastguard Worker case 8:
1090*e5436536SAndroid Build Coastguard Worker tmp_t_cos = post_twiddle_cos_8;
1091*e5436536SAndroid Build Coastguard Worker tmp_t_sin = post_twiddle_sin_8;
1092*e5436536SAndroid Build Coastguard Worker break;
1093*e5436536SAndroid Build Coastguard Worker case 16:
1094*e5436536SAndroid Build Coastguard Worker tmp_t_cos = post_twiddle_cos_16;
1095*e5436536SAndroid Build Coastguard Worker tmp_t_sin = post_twiddle_sin_16;
1096*e5436536SAndroid Build Coastguard Worker break;
1097*e5436536SAndroid Build Coastguard Worker case 24:
1098*e5436536SAndroid Build Coastguard Worker tmp_t_cos = post_twiddle_cos_24;
1099*e5436536SAndroid Build Coastguard Worker tmp_t_sin = post_twiddle_sin_24;
1100*e5436536SAndroid Build Coastguard Worker break;
1101*e5436536SAndroid Build Coastguard Worker case 32:
1102*e5436536SAndroid Build Coastguard Worker tmp_t_cos = post_twiddle_cos_32;
1103*e5436536SAndroid Build Coastguard Worker tmp_t_sin = post_twiddle_sin_32;
1104*e5436536SAndroid Build Coastguard Worker break;
1105*e5436536SAndroid Build Coastguard Worker case 40:
1106*e5436536SAndroid Build Coastguard Worker tmp_t_cos = post_twiddle_cos_40;
1107*e5436536SAndroid Build Coastguard Worker tmp_t_sin = post_twiddle_sin_40;
1108*e5436536SAndroid Build Coastguard Worker break;
1109*e5436536SAndroid Build Coastguard Worker default:
1110*e5436536SAndroid Build Coastguard Worker return SBRDEC_UNSUPPORTED_CONFIG;
1111*e5436536SAndroid Build Coastguard Worker }
1112*e5436536SAndroid Build Coastguard Worker
1113*e5436536SAndroid Build Coastguard Worker qmfErr = qmfInitSynthesisFilterBank(
1114*e5436536SAndroid Build Coastguard Worker &hQmfTransposer->HBESynthesisQMF, hQmfTransposer->synQmfStates,
1115*e5436536SAndroid Build Coastguard Worker hQmfTransposer->noCols, 0, hQmfTransposer->synthSize,
1116*e5436536SAndroid Build Coastguard Worker hQmfTransposer->synthSize, 1);
1117*e5436536SAndroid Build Coastguard Worker if (qmfErr != 0) {
1118*e5436536SAndroid Build Coastguard Worker return SBRDEC_UNSUPPORTED_CONFIG;
1119*e5436536SAndroid Build Coastguard Worker }
1120*e5436536SAndroid Build Coastguard Worker
1121*e5436536SAndroid Build Coastguard Worker qmfErr = qmfInitAnalysisFilterBank(
1122*e5436536SAndroid Build Coastguard Worker &hQmfTransposer->HBEAnalysiscQMF, hQmfTransposer->anaQmfStates,
1123*e5436536SAndroid Build Coastguard Worker hQmfTransposer->noCols / 2, 0, 2 * hQmfTransposer->synthSize,
1124*e5436536SAndroid Build Coastguard Worker 2 * hQmfTransposer->synthSize, 0);
1125*e5436536SAndroid Build Coastguard Worker
1126*e5436536SAndroid Build Coastguard Worker if (qmfErr != 0) {
1127*e5436536SAndroid Build Coastguard Worker return SBRDEC_UNSUPPORTED_CONFIG;
1128*e5436536SAndroid Build Coastguard Worker }
1129*e5436536SAndroid Build Coastguard Worker
1130*e5436536SAndroid Build Coastguard Worker hQmfTransposer->HBEAnalysiscQMF.t_cos = tmp_t_cos;
1131*e5436536SAndroid Build Coastguard Worker hQmfTransposer->HBEAnalysiscQMF.t_sin = tmp_t_sin;
1132*e5436536SAndroid Build Coastguard Worker
1133*e5436536SAndroid Build Coastguard Worker FDKmemset(hQmfTransposer->xOverQmf, 0,
1134*e5436536SAndroid Build Coastguard Worker MAX_NUM_PATCHES * sizeof(int)); /* global */
1135*e5436536SAndroid Build Coastguard Worker sfb = 0;
1136*e5436536SAndroid Build Coastguard Worker if (hQmfTransposer->bSbr41) {
1137*e5436536SAndroid Build Coastguard Worker stopPatch = MAX_NUM_PATCHES;
1138*e5436536SAndroid Build Coastguard Worker hQmfTransposer->maxStretch = MAX_STRETCH_HBE;
1139*e5436536SAndroid Build Coastguard Worker } else {
1140*e5436536SAndroid Build Coastguard Worker stopPatch = MAX_STRETCH_HBE;
1141*e5436536SAndroid Build Coastguard Worker }
1142*e5436536SAndroid Build Coastguard Worker
1143*e5436536SAndroid Build Coastguard Worker for (patch = 1; patch <= stopPatch; patch++) {
1144*e5436536SAndroid Build Coastguard Worker while (sfb <= NSfb[0] &&
1145*e5436536SAndroid Build Coastguard Worker FreqBandTable[0][sfb] <= patch * hQmfTransposer->startBand)
1146*e5436536SAndroid Build Coastguard Worker sfb++;
1147*e5436536SAndroid Build Coastguard Worker if (sfb <= NSfb[0]) {
1148*e5436536SAndroid Build Coastguard Worker /* If the distance is larger than three QMF bands - try aligning to high
1149*e5436536SAndroid Build Coastguard Worker * resolution frequency bands instead. */
1150*e5436536SAndroid Build Coastguard Worker if ((patch * hQmfTransposer->startBand - FreqBandTable[0][sfb - 1]) <=
1151*e5436536SAndroid Build Coastguard Worker 3) {
1152*e5436536SAndroid Build Coastguard Worker hQmfTransposer->xOverQmf[patch - 1] = FreqBandTable[0][sfb - 1];
1153*e5436536SAndroid Build Coastguard Worker } else {
1154*e5436536SAndroid Build Coastguard Worker int sfb_tmp = 0;
1155*e5436536SAndroid Build Coastguard Worker while (sfb_tmp <= NSfb[1] &&
1156*e5436536SAndroid Build Coastguard Worker FreqBandTable[1][sfb_tmp] <= patch * hQmfTransposer->startBand)
1157*e5436536SAndroid Build Coastguard Worker sfb_tmp++;
1158*e5436536SAndroid Build Coastguard Worker hQmfTransposer->xOverQmf[patch - 1] = FreqBandTable[1][sfb_tmp - 1];
1159*e5436536SAndroid Build Coastguard Worker }
1160*e5436536SAndroid Build Coastguard Worker } else {
1161*e5436536SAndroid Build Coastguard Worker hQmfTransposer->xOverQmf[patch - 1] = hQmfTransposer->stopBand;
1162*e5436536SAndroid Build Coastguard Worker hQmfTransposer->maxStretch = fMin(patch, MAX_STRETCH_HBE);
1163*e5436536SAndroid Build Coastguard Worker break;
1164*e5436536SAndroid Build Coastguard Worker }
1165*e5436536SAndroid Build Coastguard Worker }
1166*e5436536SAndroid Build Coastguard Worker
1167*e5436536SAndroid Build Coastguard Worker hQmfTransposer->highband_exp[0] = 0;
1168*e5436536SAndroid Build Coastguard Worker hQmfTransposer->highband_exp[1] = 0;
1169*e5436536SAndroid Build Coastguard Worker hQmfTransposer->target_exp[0] = 0;
1170*e5436536SAndroid Build Coastguard Worker hQmfTransposer->target_exp[1] = 0;
1171*e5436536SAndroid Build Coastguard Worker }
1172*e5436536SAndroid Build Coastguard Worker
1173*e5436536SAndroid Build Coastguard Worker return SBRDEC_OK;
1174*e5436536SAndroid Build Coastguard Worker }
1175*e5436536SAndroid Build Coastguard Worker
QmfTransposerClose(HANDLE_HBE_TRANSPOSER hQmfTransposer)1176*e5436536SAndroid Build Coastguard Worker void QmfTransposerClose(HANDLE_HBE_TRANSPOSER hQmfTransposer) {
1177*e5436536SAndroid Build Coastguard Worker int i;
1178*e5436536SAndroid Build Coastguard Worker
1179*e5436536SAndroid Build Coastguard Worker if (hQmfTransposer != NULL) {
1180*e5436536SAndroid Build Coastguard Worker if (hQmfTransposer->inBuf_F) FDKfree(hQmfTransposer->inBuf_F);
1181*e5436536SAndroid Build Coastguard Worker
1182*e5436536SAndroid Build Coastguard Worker if (hQmfTransposer->qmfInBufReal_F) {
1183*e5436536SAndroid Build Coastguard Worker for (i = 0; i < hQmfTransposer->qmfInBufSize; i++) {
1184*e5436536SAndroid Build Coastguard Worker FDKafree(hQmfTransposer->qmfInBufReal_F[i]);
1185*e5436536SAndroid Build Coastguard Worker }
1186*e5436536SAndroid Build Coastguard Worker FDKfree(hQmfTransposer->qmfInBufReal_F);
1187*e5436536SAndroid Build Coastguard Worker }
1188*e5436536SAndroid Build Coastguard Worker
1189*e5436536SAndroid Build Coastguard Worker if (hQmfTransposer->qmfInBufImag_F) {
1190*e5436536SAndroid Build Coastguard Worker for (i = 0; i < hQmfTransposer->qmfInBufSize; i++) {
1191*e5436536SAndroid Build Coastguard Worker FDKafree(hQmfTransposer->qmfInBufImag_F[i]);
1192*e5436536SAndroid Build Coastguard Worker }
1193*e5436536SAndroid Build Coastguard Worker FDKfree(hQmfTransposer->qmfInBufImag_F);
1194*e5436536SAndroid Build Coastguard Worker }
1195*e5436536SAndroid Build Coastguard Worker
1196*e5436536SAndroid Build Coastguard Worker if (hQmfTransposer->qmfHBEBufReal_F) {
1197*e5436536SAndroid Build Coastguard Worker for (i = 0; i < HBE_MAX_OUT_SLOTS; i++) {
1198*e5436536SAndroid Build Coastguard Worker FDKfree(hQmfTransposer->qmfHBEBufReal_F[i]);
1199*e5436536SAndroid Build Coastguard Worker }
1200*e5436536SAndroid Build Coastguard Worker FDKfree(hQmfTransposer->qmfHBEBufReal_F);
1201*e5436536SAndroid Build Coastguard Worker }
1202*e5436536SAndroid Build Coastguard Worker
1203*e5436536SAndroid Build Coastguard Worker if (hQmfTransposer->qmfHBEBufImag_F) {
1204*e5436536SAndroid Build Coastguard Worker for (i = 0; i < HBE_MAX_OUT_SLOTS; i++) {
1205*e5436536SAndroid Build Coastguard Worker FDKfree(hQmfTransposer->qmfHBEBufImag_F[i]);
1206*e5436536SAndroid Build Coastguard Worker }
1207*e5436536SAndroid Build Coastguard Worker FDKfree(hQmfTransposer->qmfHBEBufImag_F);
1208*e5436536SAndroid Build Coastguard Worker }
1209*e5436536SAndroid Build Coastguard Worker
1210*e5436536SAndroid Build Coastguard Worker FDKfree(hQmfTransposer->qmfBufferCodecTempSlot_F);
1211*e5436536SAndroid Build Coastguard Worker
1212*e5436536SAndroid Build Coastguard Worker FDKfree(hQmfTransposer);
1213*e5436536SAndroid Build Coastguard Worker }
1214*e5436536SAndroid Build Coastguard Worker }
1215*e5436536SAndroid Build Coastguard Worker
scaleUp(FIXP_DBL * real_m,FIXP_DBL * imag_m,INT * _e)1216*e5436536SAndroid Build Coastguard Worker inline void scaleUp(FIXP_DBL* real_m, FIXP_DBL* imag_m, INT* _e) {
1217*e5436536SAndroid Build Coastguard Worker INT reserve;
1218*e5436536SAndroid Build Coastguard Worker /* shift gc_r and gc_i up if possible */
1219*e5436536SAndroid Build Coastguard Worker reserve = CntLeadingZeros((INT(*real_m) ^ INT((*real_m >> 31))) |
1220*e5436536SAndroid Build Coastguard Worker (INT(*imag_m) ^ INT((*imag_m >> 31)))) -
1221*e5436536SAndroid Build Coastguard Worker 1;
1222*e5436536SAndroid Build Coastguard Worker reserve = fMax(reserve - 1,
1223*e5436536SAndroid Build Coastguard Worker 0); /* Leave one bit headroom such that (real_m^2 + imag_m^2)
1224*e5436536SAndroid Build Coastguard Worker does not overflow later if both are 0x80000000. */
1225*e5436536SAndroid Build Coastguard Worker reserve = fMin(reserve, *_e);
1226*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(reserve >= 0);
1227*e5436536SAndroid Build Coastguard Worker *real_m <<= reserve;
1228*e5436536SAndroid Build Coastguard Worker *imag_m <<= reserve;
1229*e5436536SAndroid Build Coastguard Worker *_e -= reserve;
1230*e5436536SAndroid Build Coastguard Worker }
1231*e5436536SAndroid Build Coastguard Worker
calculateCenterFIXP(FIXP_DBL gammaVecReal,FIXP_DBL gammaVecImag,FIXP_DBL * centerReal,FIXP_DBL * centerImag,INT * exponent,int stretch,int mult)1232*e5436536SAndroid Build Coastguard Worker static void calculateCenterFIXP(FIXP_DBL gammaVecReal, FIXP_DBL gammaVecImag,
1233*e5436536SAndroid Build Coastguard Worker FIXP_DBL* centerReal, FIXP_DBL* centerImag,
1234*e5436536SAndroid Build Coastguard Worker INT* exponent, int stretch, int mult) {
1235*e5436536SAndroid Build Coastguard Worker scaleUp(&gammaVecReal, &gammaVecImag, exponent);
1236*e5436536SAndroid Build Coastguard Worker FIXP_DBL energy = fPow2Div2(gammaVecReal) + fPow2Div2(gammaVecImag);
1237*e5436536SAndroid Build Coastguard Worker
1238*e5436536SAndroid Build Coastguard Worker if (energy != FL2FXCONST_DBL(0.f)) {
1239*e5436536SAndroid Build Coastguard Worker FIXP_DBL gc_r_m, gc_i_m, factor_m = (FIXP_DBL)0;
1240*e5436536SAndroid Build Coastguard Worker INT factor_e, gc_e;
1241*e5436536SAndroid Build Coastguard Worker factor_e = 2 * (*exponent) + 1;
1242*e5436536SAndroid Build Coastguard Worker
1243*e5436536SAndroid Build Coastguard Worker switch (stretch) {
1244*e5436536SAndroid Build Coastguard Worker case 2:
1245*e5436536SAndroid Build Coastguard Worker factor_m = invFourthRootNorm2(energy, &factor_e);
1246*e5436536SAndroid Build Coastguard Worker break;
1247*e5436536SAndroid Build Coastguard Worker case 3:
1248*e5436536SAndroid Build Coastguard Worker factor_m = invCubeRootNorm2(energy, &factor_e);
1249*e5436536SAndroid Build Coastguard Worker break;
1250*e5436536SAndroid Build Coastguard Worker case 4:
1251*e5436536SAndroid Build Coastguard Worker factor_m = inv3EigthRootNorm2(energy, &factor_e);
1252*e5436536SAndroid Build Coastguard Worker break;
1253*e5436536SAndroid Build Coastguard Worker }
1254*e5436536SAndroid Build Coastguard Worker
1255*e5436536SAndroid Build Coastguard Worker gc_r_m = fMultDiv2(gammaVecReal,
1256*e5436536SAndroid Build Coastguard Worker factor_m); /* exponent = HBE_SCALE + factor_e + 1 */
1257*e5436536SAndroid Build Coastguard Worker gc_i_m = fMultDiv2(gammaVecImag,
1258*e5436536SAndroid Build Coastguard Worker factor_m); /* exponent = HBE_SCALE + factor_e + 1*/
1259*e5436536SAndroid Build Coastguard Worker gc_e = *exponent + factor_e + 1;
1260*e5436536SAndroid Build Coastguard Worker
1261*e5436536SAndroid Build Coastguard Worker scaleUp(&gc_r_m, &gc_i_m, &gc_e);
1262*e5436536SAndroid Build Coastguard Worker
1263*e5436536SAndroid Build Coastguard Worker switch (mult) {
1264*e5436536SAndroid Build Coastguard Worker case 0:
1265*e5436536SAndroid Build Coastguard Worker *centerReal = gc_r_m;
1266*e5436536SAndroid Build Coastguard Worker *centerImag = gc_i_m;
1267*e5436536SAndroid Build Coastguard Worker break;
1268*e5436536SAndroid Build Coastguard Worker case 1:
1269*e5436536SAndroid Build Coastguard Worker *centerReal = fPow2Div2(gc_r_m) - fPow2Div2(gc_i_m);
1270*e5436536SAndroid Build Coastguard Worker *centerImag = fMult(gc_r_m, gc_i_m);
1271*e5436536SAndroid Build Coastguard Worker gc_e = 2 * gc_e + 1;
1272*e5436536SAndroid Build Coastguard Worker break;
1273*e5436536SAndroid Build Coastguard Worker case 2:
1274*e5436536SAndroid Build Coastguard Worker FIXP_DBL tmp_r = gc_r_m;
1275*e5436536SAndroid Build Coastguard Worker FIXP_DBL tmp_i = gc_i_m;
1276*e5436536SAndroid Build Coastguard Worker gc_r_m = fPow2Div2(gc_r_m) - fPow2Div2(gc_i_m);
1277*e5436536SAndroid Build Coastguard Worker gc_i_m = fMult(tmp_r, gc_i_m);
1278*e5436536SAndroid Build Coastguard Worker gc_e = 3 * gc_e + 1 + 1;
1279*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(¢erReal[0], ¢erImag[0], gc_r_m, gc_i_m, tmp_r,
1280*e5436536SAndroid Build Coastguard Worker tmp_i);
1281*e5436536SAndroid Build Coastguard Worker break;
1282*e5436536SAndroid Build Coastguard Worker }
1283*e5436536SAndroid Build Coastguard Worker
1284*e5436536SAndroid Build Coastguard Worker scaleUp(centerReal, centerImag, &gc_e);
1285*e5436536SAndroid Build Coastguard Worker
1286*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(gc_e >= 0);
1287*e5436536SAndroid Build Coastguard Worker *exponent = gc_e;
1288*e5436536SAndroid Build Coastguard Worker } else {
1289*e5436536SAndroid Build Coastguard Worker *centerReal = energy; /* energy = 0 */
1290*e5436536SAndroid Build Coastguard Worker *centerImag = energy; /* energy = 0 */
1291*e5436536SAndroid Build Coastguard Worker *exponent = (INT)energy;
1292*e5436536SAndroid Build Coastguard Worker }
1293*e5436536SAndroid Build Coastguard Worker }
1294*e5436536SAndroid Build Coastguard Worker
getHBEScaleFactorFrame(const int bSbr41,const int maxStretch,const int pitchInBins)1295*e5436536SAndroid Build Coastguard Worker static int getHBEScaleFactorFrame(const int bSbr41, const int maxStretch,
1296*e5436536SAndroid Build Coastguard Worker const int pitchInBins) {
1297*e5436536SAndroid Build Coastguard Worker if (pitchInBins >= pmin * (1 + bSbr41)) {
1298*e5436536SAndroid Build Coastguard Worker /* crossproducts enabled */
1299*e5436536SAndroid Build Coastguard Worker return 26;
1300*e5436536SAndroid Build Coastguard Worker } else {
1301*e5436536SAndroid Build Coastguard Worker return (maxStretch == 2) ? 24 : 25;
1302*e5436536SAndroid Build Coastguard Worker }
1303*e5436536SAndroid Build Coastguard Worker }
1304*e5436536SAndroid Build Coastguard Worker
addHighBandPart(FIXP_DBL g_r_m,FIXP_DBL g_i_m,INT g_e,FIXP_DBL mult,FIXP_DBL gammaCenterReal_m,FIXP_DBL gammaCenterImag_m,INT gammaCenter_e,INT stretch,INT scale_factor_hbe,FIXP_DBL * qmfHBEBufReal_F,FIXP_DBL * qmfHBEBufImag_F)1305*e5436536SAndroid Build Coastguard Worker static void addHighBandPart(FIXP_DBL g_r_m, FIXP_DBL g_i_m, INT g_e,
1306*e5436536SAndroid Build Coastguard Worker FIXP_DBL mult, FIXP_DBL gammaCenterReal_m,
1307*e5436536SAndroid Build Coastguard Worker FIXP_DBL gammaCenterImag_m, INT gammaCenter_e,
1308*e5436536SAndroid Build Coastguard Worker INT stretch, INT scale_factor_hbe,
1309*e5436536SAndroid Build Coastguard Worker FIXP_DBL* qmfHBEBufReal_F,
1310*e5436536SAndroid Build Coastguard Worker FIXP_DBL* qmfHBEBufImag_F) {
1311*e5436536SAndroid Build Coastguard Worker if ((g_r_m | g_i_m) != FL2FXCONST_DBL(0.f)) {
1312*e5436536SAndroid Build Coastguard Worker FIXP_DBL factor_m = (FIXP_DBL)0;
1313*e5436536SAndroid Build Coastguard Worker INT factor_e;
1314*e5436536SAndroid Build Coastguard Worker INT add = (stretch == 4) ? 1 : 0;
1315*e5436536SAndroid Build Coastguard Worker INT shift = (stretch == 4) ? 1 : 2;
1316*e5436536SAndroid Build Coastguard Worker
1317*e5436536SAndroid Build Coastguard Worker scaleUp(&g_r_m, &g_i_m, &g_e);
1318*e5436536SAndroid Build Coastguard Worker FIXP_DBL energy = fPow2AddDiv2(fPow2Div2(g_r_m), g_i_m);
1319*e5436536SAndroid Build Coastguard Worker factor_e = 2 * g_e + 1;
1320*e5436536SAndroid Build Coastguard Worker
1321*e5436536SAndroid Build Coastguard Worker switch (stretch) {
1322*e5436536SAndroid Build Coastguard Worker case 2:
1323*e5436536SAndroid Build Coastguard Worker factor_m = invFourthRootNorm2(energy, &factor_e);
1324*e5436536SAndroid Build Coastguard Worker break;
1325*e5436536SAndroid Build Coastguard Worker case 3:
1326*e5436536SAndroid Build Coastguard Worker factor_m = invCubeRootNorm2(energy, &factor_e);
1327*e5436536SAndroid Build Coastguard Worker break;
1328*e5436536SAndroid Build Coastguard Worker case 4:
1329*e5436536SAndroid Build Coastguard Worker factor_m = inv3EigthRootNorm2(energy, &factor_e);
1330*e5436536SAndroid Build Coastguard Worker break;
1331*e5436536SAndroid Build Coastguard Worker }
1332*e5436536SAndroid Build Coastguard Worker
1333*e5436536SAndroid Build Coastguard Worker factor_m = fMult(factor_m, mult);
1334*e5436536SAndroid Build Coastguard Worker
1335*e5436536SAndroid Build Coastguard Worker FIXP_DBL tmp_r, tmp_i;
1336*e5436536SAndroid Build Coastguard Worker cplxMultDiv2(&tmp_r, &tmp_i, g_r_m, g_i_m, gammaCenterReal_m,
1337*e5436536SAndroid Build Coastguard Worker gammaCenterImag_m);
1338*e5436536SAndroid Build Coastguard Worker
1339*e5436536SAndroid Build Coastguard Worker g_r_m = fMultDiv2(tmp_r, factor_m) << shift;
1340*e5436536SAndroid Build Coastguard Worker g_i_m = fMultDiv2(tmp_i, factor_m) << shift;
1341*e5436536SAndroid Build Coastguard Worker g_e = scale_factor_hbe - (g_e + factor_e + gammaCenter_e + add);
1342*e5436536SAndroid Build Coastguard Worker g_e = fMax((INT)0, g_e);
1343*e5436536SAndroid Build Coastguard Worker *qmfHBEBufReal_F += g_r_m >> g_e;
1344*e5436536SAndroid Build Coastguard Worker *qmfHBEBufImag_F += g_i_m >> g_e;
1345*e5436536SAndroid Build Coastguard Worker }
1346*e5436536SAndroid Build Coastguard Worker }
1347*e5436536SAndroid Build Coastguard Worker
QmfTransposerApply(HANDLE_HBE_TRANSPOSER hQmfTransposer,FIXP_DBL ** qmfBufferCodecReal,FIXP_DBL ** qmfBufferCodecImag,int nColsIn,FIXP_DBL ** ppQmfBufferOutReal_F,FIXP_DBL ** ppQmfBufferOutImag_F,FIXP_DBL lpcFilterStatesReal[2+(3* (4))][(64)],FIXP_DBL lpcFilterStatesImag[2+(3* (4))][(64)],int pitchInBins,int scale_lb,int scale_hbe,int * scale_hb,int timeStep,int firstSlotOffsset,int ov_len,KEEP_STATES_SYNCED_MODE keepStatesSyncedMode)1348*e5436536SAndroid Build Coastguard Worker void QmfTransposerApply(HANDLE_HBE_TRANSPOSER hQmfTransposer,
1349*e5436536SAndroid Build Coastguard Worker FIXP_DBL** qmfBufferCodecReal,
1350*e5436536SAndroid Build Coastguard Worker FIXP_DBL** qmfBufferCodecImag, int nColsIn,
1351*e5436536SAndroid Build Coastguard Worker FIXP_DBL** ppQmfBufferOutReal_F,
1352*e5436536SAndroid Build Coastguard Worker FIXP_DBL** ppQmfBufferOutImag_F,
1353*e5436536SAndroid Build Coastguard Worker FIXP_DBL lpcFilterStatesReal[2 + (3 * (4))][(64)],
1354*e5436536SAndroid Build Coastguard Worker FIXP_DBL lpcFilterStatesImag[2 + (3 * (4))][(64)],
1355*e5436536SAndroid Build Coastguard Worker int pitchInBins, int scale_lb, int scale_hbe,
1356*e5436536SAndroid Build Coastguard Worker int* scale_hb, int timeStep, int firstSlotOffsset,
1357*e5436536SAndroid Build Coastguard Worker int ov_len,
1358*e5436536SAndroid Build Coastguard Worker KEEP_STATES_SYNCED_MODE keepStatesSyncedMode) {
1359*e5436536SAndroid Build Coastguard Worker int i, j, stretch, band, sourceband, r, s;
1360*e5436536SAndroid Build Coastguard Worker int qmfVocoderColsIn = hQmfTransposer->noCols / 2;
1361*e5436536SAndroid Build Coastguard Worker int bSbr41 = hQmfTransposer->bSbr41;
1362*e5436536SAndroid Build Coastguard Worker
1363*e5436536SAndroid Build Coastguard Worker const int winLength[3] = {10, 8, 6};
1364*e5436536SAndroid Build Coastguard Worker const int slotOffset = 6; /* hQmfTransposer->winLen-6; */
1365*e5436536SAndroid Build Coastguard Worker
1366*e5436536SAndroid Build Coastguard Worker int qmfOffset = 2 * hQmfTransposer->kstart;
1367*e5436536SAndroid Build Coastguard Worker int scale_border = (nColsIn == 64) ? 32 : nColsIn;
1368*e5436536SAndroid Build Coastguard Worker
1369*e5436536SAndroid Build Coastguard Worker INT slot_stretch4[9] = {0, 0, 0, 0, 2, 4, 6, 8, 10};
1370*e5436536SAndroid Build Coastguard Worker INT slot_stretch2[11] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
1371*e5436536SAndroid Build Coastguard Worker INT slot_stretch3[10] = {0, 0, 0, 1, 3, 4, 6, 7, 9, 10};
1372*e5436536SAndroid Build Coastguard Worker INT filt_stretch3[10] = {0, 0, 0, 1, 0, 1, 0, 1, 0, 1};
1373*e5436536SAndroid Build Coastguard Worker INT filt_dummy[11] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1374*e5436536SAndroid Build Coastguard Worker INT* pSlotStretch;
1375*e5436536SAndroid Build Coastguard Worker INT* pFilt;
1376*e5436536SAndroid Build Coastguard Worker
1377*e5436536SAndroid Build Coastguard Worker int offset = 0; /* where to take QmfTransposer data */
1378*e5436536SAndroid Build Coastguard Worker
1379*e5436536SAndroid Build Coastguard Worker int signPreMod =
1380*e5436536SAndroid Build Coastguard Worker (hQmfTransposer->synthesisQmfPreModCos_F[0] < FL2FXCONST_DBL(0.f)) ? 1
1381*e5436536SAndroid Build Coastguard Worker : -1;
1382*e5436536SAndroid Build Coastguard Worker
1383*e5436536SAndroid Build Coastguard Worker int scale_factor_hbe =
1384*e5436536SAndroid Build Coastguard Worker getHBEScaleFactorFrame(bSbr41, hQmfTransposer->maxStretch, pitchInBins);
1385*e5436536SAndroid Build Coastguard Worker
1386*e5436536SAndroid Build Coastguard Worker if (keepStatesSyncedMode != KEEP_STATES_SYNCED_OFF) {
1387*e5436536SAndroid Build Coastguard Worker offset = hQmfTransposer->noCols - ov_len - LPC_ORDER;
1388*e5436536SAndroid Build Coastguard Worker }
1389*e5436536SAndroid Build Coastguard Worker
1390*e5436536SAndroid Build Coastguard Worker hQmfTransposer->highband_exp[0] = hQmfTransposer->highband_exp[1];
1391*e5436536SAndroid Build Coastguard Worker hQmfTransposer->target_exp[0] = hQmfTransposer->target_exp[1];
1392*e5436536SAndroid Build Coastguard Worker
1393*e5436536SAndroid Build Coastguard Worker hQmfTransposer->highband_exp[1] = scale_factor_hbe;
1394*e5436536SAndroid Build Coastguard Worker hQmfTransposer->target_exp[1] =
1395*e5436536SAndroid Build Coastguard Worker fixMax(hQmfTransposer->highband_exp[1], hQmfTransposer->highband_exp[0]);
1396*e5436536SAndroid Build Coastguard Worker
1397*e5436536SAndroid Build Coastguard Worker scale_factor_hbe = hQmfTransposer->target_exp[1];
1398*e5436536SAndroid Build Coastguard Worker
1399*e5436536SAndroid Build Coastguard Worker int shift_ov = hQmfTransposer->target_exp[0] - hQmfTransposer->target_exp[1];
1400*e5436536SAndroid Build Coastguard Worker
1401*e5436536SAndroid Build Coastguard Worker if (shift_ov != 0) {
1402*e5436536SAndroid Build Coastguard Worker for (i = 0; i < HBE_MAX_OUT_SLOTS; i++) {
1403*e5436536SAndroid Build Coastguard Worker scaleValuesSaturate(&hQmfTransposer->qmfHBEBufReal_F[i][0],
1404*e5436536SAndroid Build Coastguard Worker QMF_SYNTH_CHANNELS, shift_ov);
1405*e5436536SAndroid Build Coastguard Worker scaleValuesSaturate(&hQmfTransposer->qmfHBEBufImag_F[i][0],
1406*e5436536SAndroid Build Coastguard Worker QMF_SYNTH_CHANNELS, shift_ov);
1407*e5436536SAndroid Build Coastguard Worker }
1408*e5436536SAndroid Build Coastguard Worker
1409*e5436536SAndroid Build Coastguard Worker if (keepStatesSyncedMode == KEEP_STATES_SYNCED_OFF) {
1410*e5436536SAndroid Build Coastguard Worker int nBands =
1411*e5436536SAndroid Build Coastguard Worker fMax(0, hQmfTransposer->stopBand - hQmfTransposer->startBand);
1412*e5436536SAndroid Build Coastguard Worker
1413*e5436536SAndroid Build Coastguard Worker for (i = timeStep * firstSlotOffsset; i < ov_len; i++) {
1414*e5436536SAndroid Build Coastguard Worker scaleValuesSaturate(&ppQmfBufferOutReal_F[i][hQmfTransposer->startBand],
1415*e5436536SAndroid Build Coastguard Worker nBands, shift_ov);
1416*e5436536SAndroid Build Coastguard Worker scaleValuesSaturate(&ppQmfBufferOutImag_F[i][hQmfTransposer->startBand],
1417*e5436536SAndroid Build Coastguard Worker nBands, shift_ov);
1418*e5436536SAndroid Build Coastguard Worker }
1419*e5436536SAndroid Build Coastguard Worker
1420*e5436536SAndroid Build Coastguard Worker /* shift lpc filterstates */
1421*e5436536SAndroid Build Coastguard Worker for (i = 0; i < timeStep * firstSlotOffsset + LPC_ORDER; i++) {
1422*e5436536SAndroid Build Coastguard Worker scaleValuesSaturate(&lpcFilterStatesReal[i][0], (64), shift_ov);
1423*e5436536SAndroid Build Coastguard Worker scaleValuesSaturate(&lpcFilterStatesImag[i][0], (64), shift_ov);
1424*e5436536SAndroid Build Coastguard Worker }
1425*e5436536SAndroid Build Coastguard Worker }
1426*e5436536SAndroid Build Coastguard Worker }
1427*e5436536SAndroid Build Coastguard Worker
1428*e5436536SAndroid Build Coastguard Worker FIXP_DBL twid_m_new[3][2]; /* [stretch][cos/sin] */
1429*e5436536SAndroid Build Coastguard Worker INT stepsize = 1 + !bSbr41, sine_offset = 24, mod = 96;
1430*e5436536SAndroid Build Coastguard Worker INT mult[3] = {1, 2, 3};
1431*e5436536SAndroid Build Coastguard Worker
1432*e5436536SAndroid Build Coastguard Worker for (s = 0; s <= MAX_STRETCH_HBE - 2; s++) {
1433*e5436536SAndroid Build Coastguard Worker twid_m_new[s][0] = twiddle[(mult[s] * (stepsize * pitchInBins)) % mod];
1434*e5436536SAndroid Build Coastguard Worker twid_m_new[s][1] =
1435*e5436536SAndroid Build Coastguard Worker twiddle[((mult[s] * (stepsize * pitchInBins)) + sine_offset) % mod];
1436*e5436536SAndroid Build Coastguard Worker }
1437*e5436536SAndroid Build Coastguard Worker
1438*e5436536SAndroid Build Coastguard Worker /* Time-stretch */
1439*e5436536SAndroid Build Coastguard Worker for (j = 0; j < qmfVocoderColsIn; j++) {
1440*e5436536SAndroid Build Coastguard Worker int sign = -1, k, z, addrshift, codecTemp_e;
1441*e5436536SAndroid Build Coastguard Worker /* update inbuf */
1442*e5436536SAndroid Build Coastguard Worker for (i = 0; i < hQmfTransposer->synthSize; i++) {
1443*e5436536SAndroid Build Coastguard Worker hQmfTransposer->inBuf_F[i] =
1444*e5436536SAndroid Build Coastguard Worker hQmfTransposer->inBuf_F[i + 2 * hQmfTransposer->synthSize];
1445*e5436536SAndroid Build Coastguard Worker }
1446*e5436536SAndroid Build Coastguard Worker
1447*e5436536SAndroid Build Coastguard Worker /* run synthesis for two sbr slots as transposer uses
1448*e5436536SAndroid Build Coastguard Worker half slots double bands representation */
1449*e5436536SAndroid Build Coastguard Worker for (z = 0; z < 2; z++) {
1450*e5436536SAndroid Build Coastguard Worker int scale_factor = ((nColsIn == 64) && ((2 * j + z) < scale_border))
1451*e5436536SAndroid Build Coastguard Worker ? scale_lb
1452*e5436536SAndroid Build Coastguard Worker : scale_hbe;
1453*e5436536SAndroid Build Coastguard Worker codecTemp_e = scale_factor - 1; /* -2 for Div2 and cos/sin scale of 1 */
1454*e5436536SAndroid Build Coastguard Worker
1455*e5436536SAndroid Build Coastguard Worker for (k = 0; k < hQmfTransposer->synthSize; k++) {
1456*e5436536SAndroid Build Coastguard Worker int ki = hQmfTransposer->kstart + k;
1457*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfBufferCodecTempSlot_F[k] =
1458*e5436536SAndroid Build Coastguard Worker fMultDiv2(signPreMod * hQmfTransposer->synthesisQmfPreModCos_F[k],
1459*e5436536SAndroid Build Coastguard Worker qmfBufferCodecReal[2 * j + z][ki]);
1460*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfBufferCodecTempSlot_F[k] +=
1461*e5436536SAndroid Build Coastguard Worker fMultDiv2(signPreMod * hQmfTransposer->synthesisQmfPreModSin_F[k],
1462*e5436536SAndroid Build Coastguard Worker qmfBufferCodecImag[2 * j + z][ki]);
1463*e5436536SAndroid Build Coastguard Worker }
1464*e5436536SAndroid Build Coastguard Worker
1465*e5436536SAndroid Build Coastguard Worker C_AALLOC_SCRATCH_START(pWorkBuffer, FIXP_DBL, (HBE_MAX_QMF_BANDS << 1));
1466*e5436536SAndroid Build Coastguard Worker
1467*e5436536SAndroid Build Coastguard Worker qmfSynthesisFilteringSlot(
1468*e5436536SAndroid Build Coastguard Worker &hQmfTransposer->HBESynthesisQMF,
1469*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfBufferCodecTempSlot_F, NULL, 0,
1470*e5436536SAndroid Build Coastguard Worker -7 - hQmfTransposer->HBESynthesisQMF.filterScale - codecTemp_e + 1,
1471*e5436536SAndroid Build Coastguard Worker hQmfTransposer->inBuf_F + hQmfTransposer->synthSize * (z + 1), 1,
1472*e5436536SAndroid Build Coastguard Worker pWorkBuffer);
1473*e5436536SAndroid Build Coastguard Worker
1474*e5436536SAndroid Build Coastguard Worker C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_DBL, (HBE_MAX_QMF_BANDS << 1));
1475*e5436536SAndroid Build Coastguard Worker }
1476*e5436536SAndroid Build Coastguard Worker
1477*e5436536SAndroid Build Coastguard Worker C_AALLOC_SCRATCH_START(pWorkBuffer, FIXP_DBL, (HBE_MAX_QMF_BANDS << 1));
1478*e5436536SAndroid Build Coastguard Worker
1479*e5436536SAndroid Build Coastguard Worker qmfAnalysisFilteringSlot(&hQmfTransposer->HBEAnalysiscQMF,
1480*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufReal_F[QMF_WIN_LEN - 1],
1481*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufImag_F[QMF_WIN_LEN - 1],
1482*e5436536SAndroid Build Coastguard Worker hQmfTransposer->inBuf_F + 1, 1, pWorkBuffer);
1483*e5436536SAndroid Build Coastguard Worker
1484*e5436536SAndroid Build Coastguard Worker C_AALLOC_SCRATCH_END(pWorkBuffer, FIXP_DBL, (HBE_MAX_QMF_BANDS << 1));
1485*e5436536SAndroid Build Coastguard Worker
1486*e5436536SAndroid Build Coastguard Worker if ((keepStatesSyncedMode == KEEP_STATES_SYNCED_NORMAL) &&
1487*e5436536SAndroid Build Coastguard Worker j <= qmfVocoderColsIn - ((LPC_ORDER + ov_len + QMF_WIN_LEN - 1) >> 1)) {
1488*e5436536SAndroid Build Coastguard Worker /* update in buffer */
1489*e5436536SAndroid Build Coastguard Worker for (i = 0; i < QMF_WIN_LEN - 1; i++) {
1490*e5436536SAndroid Build Coastguard Worker FDKmemcpy(
1491*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufReal_F[i],
1492*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufReal_F[i + 1],
1493*e5436536SAndroid Build Coastguard Worker sizeof(FIXP_DBL) * hQmfTransposer->HBEAnalysiscQMF.no_channels);
1494*e5436536SAndroid Build Coastguard Worker FDKmemcpy(
1495*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufImag_F[i],
1496*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufImag_F[i + 1],
1497*e5436536SAndroid Build Coastguard Worker sizeof(FIXP_DBL) * hQmfTransposer->HBEAnalysiscQMF.no_channels);
1498*e5436536SAndroid Build Coastguard Worker }
1499*e5436536SAndroid Build Coastguard Worker continue;
1500*e5436536SAndroid Build Coastguard Worker }
1501*e5436536SAndroid Build Coastguard Worker
1502*e5436536SAndroid Build Coastguard Worker for (stretch = 2; stretch <= hQmfTransposer->maxStretch; stretch++) {
1503*e5436536SAndroid Build Coastguard Worker int start = slotOffset - winLength[stretch - 2] / 2;
1504*e5436536SAndroid Build Coastguard Worker int stop = slotOffset + winLength[stretch - 2] / 2;
1505*e5436536SAndroid Build Coastguard Worker
1506*e5436536SAndroid Build Coastguard Worker FIXP_DBL factor = FL2FXCONST_DBL(1.f / 3.f);
1507*e5436536SAndroid Build Coastguard Worker
1508*e5436536SAndroid Build Coastguard Worker for (band = hQmfTransposer->xOverQmf[stretch - 2];
1509*e5436536SAndroid Build Coastguard Worker band < hQmfTransposer->xOverQmf[stretch - 1]; band++) {
1510*e5436536SAndroid Build Coastguard Worker FIXP_DBL gammaCenterReal_m[2] = {(FIXP_DBL)0, (FIXP_DBL)0},
1511*e5436536SAndroid Build Coastguard Worker gammaCenterImag_m[2] = {(FIXP_DBL)0, (FIXP_DBL)0};
1512*e5436536SAndroid Build Coastguard Worker INT gammaCenter_e[2] = {0, 0};
1513*e5436536SAndroid Build Coastguard Worker
1514*e5436536SAndroid Build Coastguard Worker FIXP_DBL gammaVecReal_m[2] = {(FIXP_DBL)0, (FIXP_DBL)0},
1515*e5436536SAndroid Build Coastguard Worker gammaVecImag_m[2] = {(FIXP_DBL)0, (FIXP_DBL)0};
1516*e5436536SAndroid Build Coastguard Worker INT gammaVec_e[2] = {0, 0};
1517*e5436536SAndroid Build Coastguard Worker
1518*e5436536SAndroid Build Coastguard Worker FIXP_DBL wingain = (FIXP_DBL)0;
1519*e5436536SAndroid Build Coastguard Worker
1520*e5436536SAndroid Build Coastguard Worker gammaCenter_e[0] =
1521*e5436536SAndroid Build Coastguard Worker SCALE2EXP(-hQmfTransposer->HBEAnalysiscQMF.outScalefactor);
1522*e5436536SAndroid Build Coastguard Worker gammaCenter_e[1] =
1523*e5436536SAndroid Build Coastguard Worker SCALE2EXP(-hQmfTransposer->HBEAnalysiscQMF.outScalefactor);
1524*e5436536SAndroid Build Coastguard Worker
1525*e5436536SAndroid Build Coastguard Worker /* interpolation filters for 3rd order */
1526*e5436536SAndroid Build Coastguard Worker sourceband = 2 * band / stretch - qmfOffset;
1527*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(sourceband >= 0);
1528*e5436536SAndroid Build Coastguard Worker
1529*e5436536SAndroid Build Coastguard Worker /* maximum gammaCenter_e == 20 */
1530*e5436536SAndroid Build Coastguard Worker calculateCenterFIXP(
1531*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufReal_F[slotOffset][sourceband],
1532*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufImag_F[slotOffset][sourceband],
1533*e5436536SAndroid Build Coastguard Worker &gammaCenterReal_m[0], &gammaCenterImag_m[0], &gammaCenter_e[0],
1534*e5436536SAndroid Build Coastguard Worker stretch, stretch - 2);
1535*e5436536SAndroid Build Coastguard Worker
1536*e5436536SAndroid Build Coastguard Worker if (stretch == 4) {
1537*e5436536SAndroid Build Coastguard Worker r = band - 2 * (band / 2);
1538*e5436536SAndroid Build Coastguard Worker sourceband += (r == 0) ? -1 : 1;
1539*e5436536SAndroid Build Coastguard Worker pSlotStretch = slot_stretch4;
1540*e5436536SAndroid Build Coastguard Worker factor = FL2FXCONST_DBL(2.f / 3.f);
1541*e5436536SAndroid Build Coastguard Worker pFilt = filt_dummy;
1542*e5436536SAndroid Build Coastguard Worker } else if (stretch == 2) {
1543*e5436536SAndroid Build Coastguard Worker r = 0;
1544*e5436536SAndroid Build Coastguard Worker sourceband = 2 * band / stretch - qmfOffset;
1545*e5436536SAndroid Build Coastguard Worker pSlotStretch = slot_stretch2;
1546*e5436536SAndroid Build Coastguard Worker factor = FL2FXCONST_DBL(1.f / 3.f);
1547*e5436536SAndroid Build Coastguard Worker pFilt = filt_dummy;
1548*e5436536SAndroid Build Coastguard Worker } else {
1549*e5436536SAndroid Build Coastguard Worker r = 2 * band - 3 * (2 * band / 3);
1550*e5436536SAndroid Build Coastguard Worker sourceband = 2 * band / stretch - qmfOffset;
1551*e5436536SAndroid Build Coastguard Worker pSlotStretch = slot_stretch3;
1552*e5436536SAndroid Build Coastguard Worker factor = FL2FXCONST_DBL(1.4142f / 3.0f);
1553*e5436536SAndroid Build Coastguard Worker pFilt = filt_stretch3;
1554*e5436536SAndroid Build Coastguard Worker }
1555*e5436536SAndroid Build Coastguard Worker
1556*e5436536SAndroid Build Coastguard Worker if (r == 2) {
1557*e5436536SAndroid Build Coastguard Worker calculateCenterFIXP(
1558*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufReal_F[slotOffset][sourceband + 1],
1559*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufImag_F[slotOffset][sourceband + 1],
1560*e5436536SAndroid Build Coastguard Worker &gammaCenterReal_m[1], &gammaCenterImag_m[1], &gammaCenter_e[1],
1561*e5436536SAndroid Build Coastguard Worker stretch, stretch - 2);
1562*e5436536SAndroid Build Coastguard Worker
1563*e5436536SAndroid Build Coastguard Worker factor = FL2FXCONST_DBL(1.4142f / 6.0f);
1564*e5436536SAndroid Build Coastguard Worker }
1565*e5436536SAndroid Build Coastguard Worker
1566*e5436536SAndroid Build Coastguard Worker if (r == 2) {
1567*e5436536SAndroid Build Coastguard Worker for (k = start; k < stop; k++) {
1568*e5436536SAndroid Build Coastguard Worker gammaVecReal_m[0] =
1569*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufReal_F[pSlotStretch[k]][sourceband];
1570*e5436536SAndroid Build Coastguard Worker gammaVecReal_m[1] =
1571*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufReal_F[pSlotStretch[k]][sourceband + 1];
1572*e5436536SAndroid Build Coastguard Worker gammaVecImag_m[0] =
1573*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufImag_F[pSlotStretch[k]][sourceband];
1574*e5436536SAndroid Build Coastguard Worker gammaVecImag_m[1] =
1575*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufImag_F[pSlotStretch[k]][sourceband + 1];
1576*e5436536SAndroid Build Coastguard Worker gammaVec_e[0] = gammaVec_e[1] =
1577*e5436536SAndroid Build Coastguard Worker SCALE2EXP(-hQmfTransposer->HBEAnalysiscQMF.outScalefactor);
1578*e5436536SAndroid Build Coastguard Worker
1579*e5436536SAndroid Build Coastguard Worker if (pFilt[k] == 1) {
1580*e5436536SAndroid Build Coastguard Worker FIXP_DBL tmpRealF = gammaVecReal_m[0], tmpImagF;
1581*e5436536SAndroid Build Coastguard Worker gammaVecReal_m[0] =
1582*e5436536SAndroid Build Coastguard Worker (fMult(gammaVecReal_m[0], hintReal_F[sourceband % 4][1]) -
1583*e5436536SAndroid Build Coastguard Worker fMult(gammaVecImag_m[0],
1584*e5436536SAndroid Build Coastguard Worker hintReal_F[(sourceband + 3) % 4][1])) >>
1585*e5436536SAndroid Build Coastguard Worker 1; /* sum should be <= 1 because of sin/cos multiplication */
1586*e5436536SAndroid Build Coastguard Worker gammaVecImag_m[0] =
1587*e5436536SAndroid Build Coastguard Worker (fMult(tmpRealF, hintReal_F[(sourceband + 3) % 4][1]) +
1588*e5436536SAndroid Build Coastguard Worker fMult(gammaVecImag_m[0], hintReal_F[sourceband % 4][1])) >>
1589*e5436536SAndroid Build Coastguard Worker 1; /* sum should be <= 1 because of sin/cos multiplication */
1590*e5436536SAndroid Build Coastguard Worker
1591*e5436536SAndroid Build Coastguard Worker tmpRealF = hQmfTransposer
1592*e5436536SAndroid Build Coastguard Worker ->qmfInBufReal_F[pSlotStretch[k] + 1][sourceband];
1593*e5436536SAndroid Build Coastguard Worker tmpImagF = hQmfTransposer
1594*e5436536SAndroid Build Coastguard Worker ->qmfInBufImag_F[pSlotStretch[k] + 1][sourceband];
1595*e5436536SAndroid Build Coastguard Worker
1596*e5436536SAndroid Build Coastguard Worker gammaVecReal_m[0] +=
1597*e5436536SAndroid Build Coastguard Worker (fMult(tmpRealF, hintReal_F[sourceband % 4][1]) -
1598*e5436536SAndroid Build Coastguard Worker fMult(tmpImagF, hintReal_F[(sourceband + 1) % 4][1])) >>
1599*e5436536SAndroid Build Coastguard Worker 1; /* sum should be <= 1 because of sin/cos multiplication */
1600*e5436536SAndroid Build Coastguard Worker gammaVecImag_m[0] +=
1601*e5436536SAndroid Build Coastguard Worker (fMult(tmpRealF, hintReal_F[(sourceband + 1) % 4][1]) +
1602*e5436536SAndroid Build Coastguard Worker fMult(tmpImagF, hintReal_F[sourceband % 4][1])) >>
1603*e5436536SAndroid Build Coastguard Worker 1; /* sum should be <= 1 because of sin/cos multiplication */
1604*e5436536SAndroid Build Coastguard Worker gammaVec_e[0]++;
1605*e5436536SAndroid Build Coastguard Worker
1606*e5436536SAndroid Build Coastguard Worker tmpRealF = gammaVecReal_m[1];
1607*e5436536SAndroid Build Coastguard Worker
1608*e5436536SAndroid Build Coastguard Worker gammaVecReal_m[1] =
1609*e5436536SAndroid Build Coastguard Worker (fMult(gammaVecReal_m[1], hintReal_F[sourceband % 4][2]) -
1610*e5436536SAndroid Build Coastguard Worker fMult(gammaVecImag_m[1],
1611*e5436536SAndroid Build Coastguard Worker hintReal_F[(sourceband + 3) % 4][2])) >>
1612*e5436536SAndroid Build Coastguard Worker 1;
1613*e5436536SAndroid Build Coastguard Worker gammaVecImag_m[1] =
1614*e5436536SAndroid Build Coastguard Worker (fMult(tmpRealF, hintReal_F[(sourceband + 3) % 4][2]) +
1615*e5436536SAndroid Build Coastguard Worker fMult(gammaVecImag_m[1], hintReal_F[sourceband % 4][2])) >>
1616*e5436536SAndroid Build Coastguard Worker 1;
1617*e5436536SAndroid Build Coastguard Worker
1618*e5436536SAndroid Build Coastguard Worker tmpRealF =
1619*e5436536SAndroid Build Coastguard Worker hQmfTransposer
1620*e5436536SAndroid Build Coastguard Worker ->qmfInBufReal_F[pSlotStretch[k] + 1][sourceband + 1];
1621*e5436536SAndroid Build Coastguard Worker tmpImagF =
1622*e5436536SAndroid Build Coastguard Worker hQmfTransposer
1623*e5436536SAndroid Build Coastguard Worker ->qmfInBufImag_F[pSlotStretch[k] + 1][sourceband + 1];
1624*e5436536SAndroid Build Coastguard Worker
1625*e5436536SAndroid Build Coastguard Worker gammaVecReal_m[1] +=
1626*e5436536SAndroid Build Coastguard Worker (fMult(tmpRealF, hintReal_F[sourceband % 4][2]) -
1627*e5436536SAndroid Build Coastguard Worker fMult(tmpImagF, hintReal_F[(sourceband + 1) % 4][2])) >>
1628*e5436536SAndroid Build Coastguard Worker 1;
1629*e5436536SAndroid Build Coastguard Worker gammaVecImag_m[1] +=
1630*e5436536SAndroid Build Coastguard Worker (fMult(tmpRealF, hintReal_F[(sourceband + 1) % 4][2]) +
1631*e5436536SAndroid Build Coastguard Worker fMult(tmpImagF, hintReal_F[sourceband % 4][2])) >>
1632*e5436536SAndroid Build Coastguard Worker 1;
1633*e5436536SAndroid Build Coastguard Worker gammaVec_e[1]++;
1634*e5436536SAndroid Build Coastguard Worker }
1635*e5436536SAndroid Build Coastguard Worker
1636*e5436536SAndroid Build Coastguard Worker addHighBandPart(gammaVecReal_m[1], gammaVecImag_m[1], gammaVec_e[1],
1637*e5436536SAndroid Build Coastguard Worker factor, gammaCenterReal_m[0], gammaCenterImag_m[0],
1638*e5436536SAndroid Build Coastguard Worker gammaCenter_e[0], stretch, scale_factor_hbe,
1639*e5436536SAndroid Build Coastguard Worker &hQmfTransposer->qmfHBEBufReal_F[k][band],
1640*e5436536SAndroid Build Coastguard Worker &hQmfTransposer->qmfHBEBufImag_F[k][band]);
1641*e5436536SAndroid Build Coastguard Worker
1642*e5436536SAndroid Build Coastguard Worker addHighBandPart(gammaVecReal_m[0], gammaVecImag_m[0], gammaVec_e[0],
1643*e5436536SAndroid Build Coastguard Worker factor, gammaCenterReal_m[1], gammaCenterImag_m[1],
1644*e5436536SAndroid Build Coastguard Worker gammaCenter_e[1], stretch, scale_factor_hbe,
1645*e5436536SAndroid Build Coastguard Worker &hQmfTransposer->qmfHBEBufReal_F[k][band],
1646*e5436536SAndroid Build Coastguard Worker &hQmfTransposer->qmfHBEBufImag_F[k][band]);
1647*e5436536SAndroid Build Coastguard Worker }
1648*e5436536SAndroid Build Coastguard Worker } else {
1649*e5436536SAndroid Build Coastguard Worker for (k = start; k < stop; k++) {
1650*e5436536SAndroid Build Coastguard Worker gammaVecReal_m[0] =
1651*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufReal_F[pSlotStretch[k]][sourceband];
1652*e5436536SAndroid Build Coastguard Worker gammaVecImag_m[0] =
1653*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufImag_F[pSlotStretch[k]][sourceband];
1654*e5436536SAndroid Build Coastguard Worker gammaVec_e[0] =
1655*e5436536SAndroid Build Coastguard Worker SCALE2EXP(-hQmfTransposer->HBEAnalysiscQMF.outScalefactor);
1656*e5436536SAndroid Build Coastguard Worker
1657*e5436536SAndroid Build Coastguard Worker if (pFilt[k] == 1) {
1658*e5436536SAndroid Build Coastguard Worker FIXP_DBL tmpRealF = gammaVecReal_m[0], tmpImagF;
1659*e5436536SAndroid Build Coastguard Worker gammaVecReal_m[0] =
1660*e5436536SAndroid Build Coastguard Worker (fMult(gammaVecReal_m[0], hintReal_F[sourceband % 4][1]) -
1661*e5436536SAndroid Build Coastguard Worker fMult(gammaVecImag_m[0],
1662*e5436536SAndroid Build Coastguard Worker hintReal_F[(sourceband + 3) % 4][1])) >>
1663*e5436536SAndroid Build Coastguard Worker 1; /* sum should be <= 1 because of sin/cos multiplication */
1664*e5436536SAndroid Build Coastguard Worker gammaVecImag_m[0] =
1665*e5436536SAndroid Build Coastguard Worker (fMult(tmpRealF, hintReal_F[(sourceband + 3) % 4][1]) +
1666*e5436536SAndroid Build Coastguard Worker fMult(gammaVecImag_m[0], hintReal_F[sourceband % 4][1])) >>
1667*e5436536SAndroid Build Coastguard Worker 1; /* sum should be <= 1 because of sin/cos multiplication */
1668*e5436536SAndroid Build Coastguard Worker
1669*e5436536SAndroid Build Coastguard Worker tmpRealF = hQmfTransposer
1670*e5436536SAndroid Build Coastguard Worker ->qmfInBufReal_F[pSlotStretch[k] + 1][sourceband];
1671*e5436536SAndroid Build Coastguard Worker tmpImagF = hQmfTransposer
1672*e5436536SAndroid Build Coastguard Worker ->qmfInBufImag_F[pSlotStretch[k] + 1][sourceband];
1673*e5436536SAndroid Build Coastguard Worker
1674*e5436536SAndroid Build Coastguard Worker gammaVecReal_m[0] +=
1675*e5436536SAndroid Build Coastguard Worker (fMult(tmpRealF, hintReal_F[sourceband % 4][1]) -
1676*e5436536SAndroid Build Coastguard Worker fMult(tmpImagF, hintReal_F[(sourceband + 1) % 4][1])) >>
1677*e5436536SAndroid Build Coastguard Worker 1; /* sum should be <= 1 because of sin/cos multiplication */
1678*e5436536SAndroid Build Coastguard Worker gammaVecImag_m[0] +=
1679*e5436536SAndroid Build Coastguard Worker (fMult(tmpRealF, hintReal_F[(sourceband + 1) % 4][1]) +
1680*e5436536SAndroid Build Coastguard Worker fMult(tmpImagF, hintReal_F[sourceband % 4][1])) >>
1681*e5436536SAndroid Build Coastguard Worker 1; /* sum should be <= 1 because of sin/cos multiplication */
1682*e5436536SAndroid Build Coastguard Worker gammaVec_e[0]++;
1683*e5436536SAndroid Build Coastguard Worker }
1684*e5436536SAndroid Build Coastguard Worker
1685*e5436536SAndroid Build Coastguard Worker addHighBandPart(gammaVecReal_m[0], gammaVecImag_m[0], gammaVec_e[0],
1686*e5436536SAndroid Build Coastguard Worker factor, gammaCenterReal_m[0], gammaCenterImag_m[0],
1687*e5436536SAndroid Build Coastguard Worker gammaCenter_e[0], stretch, scale_factor_hbe,
1688*e5436536SAndroid Build Coastguard Worker &hQmfTransposer->qmfHBEBufReal_F[k][band],
1689*e5436536SAndroid Build Coastguard Worker &hQmfTransposer->qmfHBEBufImag_F[k][band]);
1690*e5436536SAndroid Build Coastguard Worker }
1691*e5436536SAndroid Build Coastguard Worker }
1692*e5436536SAndroid Build Coastguard Worker
1693*e5436536SAndroid Build Coastguard Worker /* pitchInBins is given with the resolution of a 768 bins FFT and we
1694*e5436536SAndroid Build Coastguard Worker * need 64 QMF units so factor 768/64 = 12 */
1695*e5436536SAndroid Build Coastguard Worker if (pitchInBins >= pmin * (1 + bSbr41)) {
1696*e5436536SAndroid Build Coastguard Worker int tr, ti1, ti2, mTr = 0, ts1 = 0, ts2 = 0, mVal_e = 0, temp_e = 0;
1697*e5436536SAndroid Build Coastguard Worker int sqmag0_e =
1698*e5436536SAndroid Build Coastguard Worker SCALE2EXP(-hQmfTransposer->HBEAnalysiscQMF.outScalefactor);
1699*e5436536SAndroid Build Coastguard Worker
1700*e5436536SAndroid Build Coastguard Worker FIXP_DBL mVal_F = FL2FXCONST_DBL(0.f), sqmag0_F, sqmag1_F, sqmag2_F,
1701*e5436536SAndroid Build Coastguard Worker temp_F, f1_F; /* all equal exponent */
1702*e5436536SAndroid Build Coastguard Worker sign = -1;
1703*e5436536SAndroid Build Coastguard Worker
1704*e5436536SAndroid Build Coastguard Worker sourceband = 2 * band / stretch - qmfOffset; /* consistent with the
1705*e5436536SAndroid Build Coastguard Worker already computed for
1706*e5436536SAndroid Build Coastguard Worker stretch = 3,4. */
1707*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(sourceband >= 0);
1708*e5436536SAndroid Build Coastguard Worker
1709*e5436536SAndroid Build Coastguard Worker FIXP_DBL sqmag0R_F =
1710*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufReal_F[slotOffset][sourceband];
1711*e5436536SAndroid Build Coastguard Worker FIXP_DBL sqmag0I_F =
1712*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufImag_F[slotOffset][sourceband];
1713*e5436536SAndroid Build Coastguard Worker scaleUp(&sqmag0R_F, &sqmag0I_F, &sqmag0_e);
1714*e5436536SAndroid Build Coastguard Worker
1715*e5436536SAndroid Build Coastguard Worker sqmag0_F = fPow2Div2(sqmag0R_F);
1716*e5436536SAndroid Build Coastguard Worker sqmag0_F += fPow2Div2(sqmag0I_F);
1717*e5436536SAndroid Build Coastguard Worker sqmag0_e = 2 * sqmag0_e + 1;
1718*e5436536SAndroid Build Coastguard Worker
1719*e5436536SAndroid Build Coastguard Worker for (tr = 1; tr < stretch; tr++) {
1720*e5436536SAndroid Build Coastguard Worker int sqmag1_e =
1721*e5436536SAndroid Build Coastguard Worker SCALE2EXP(-hQmfTransposer->HBEAnalysiscQMF.outScalefactor);
1722*e5436536SAndroid Build Coastguard Worker int sqmag2_e =
1723*e5436536SAndroid Build Coastguard Worker SCALE2EXP(-hQmfTransposer->HBEAnalysiscQMF.outScalefactor);
1724*e5436536SAndroid Build Coastguard Worker
1725*e5436536SAndroid Build Coastguard Worker FIXP_DBL tmp_band = band_F[band];
1726*e5436536SAndroid Build Coastguard Worker FIXP_DBL tr_p =
1727*e5436536SAndroid Build Coastguard Worker fMult(p_F[pitchInBins] >> bSbr41, tr_str[tr - 1]); /* scale 7 */
1728*e5436536SAndroid Build Coastguard Worker f1_F =
1729*e5436536SAndroid Build Coastguard Worker fMult(tmp_band - tr_p, stretchfac[stretch - 2]); /* scale 7 */
1730*e5436536SAndroid Build Coastguard Worker ti1 = (INT)(f1_F >> (DFRACT_BITS - 1 - 7)) - qmfOffset;
1731*e5436536SAndroid Build Coastguard Worker ti2 = (INT)(((f1_F) + ((p_F[pitchInBins] >> bSbr41) >> 2)) >>
1732*e5436536SAndroid Build Coastguard Worker (DFRACT_BITS - 1 - 7)) -
1733*e5436536SAndroid Build Coastguard Worker qmfOffset;
1734*e5436536SAndroid Build Coastguard Worker
1735*e5436536SAndroid Build Coastguard Worker if (ti1 >= 0 && ti2 < 2 * hQmfTransposer->synthSize) {
1736*e5436536SAndroid Build Coastguard Worker FIXP_DBL sqmag1R_F =
1737*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufReal_F[slotOffset][ti1];
1738*e5436536SAndroid Build Coastguard Worker FIXP_DBL sqmag1I_F =
1739*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufImag_F[slotOffset][ti1];
1740*e5436536SAndroid Build Coastguard Worker scaleUp(&sqmag1R_F, &sqmag1I_F, &sqmag1_e);
1741*e5436536SAndroid Build Coastguard Worker sqmag1_F = fPow2Div2(sqmag1R_F);
1742*e5436536SAndroid Build Coastguard Worker sqmag1_F += fPow2Div2(sqmag1I_F);
1743*e5436536SAndroid Build Coastguard Worker sqmag1_e = 2 * sqmag1_e + 1;
1744*e5436536SAndroid Build Coastguard Worker
1745*e5436536SAndroid Build Coastguard Worker FIXP_DBL sqmag2R_F =
1746*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufReal_F[slotOffset][ti2];
1747*e5436536SAndroid Build Coastguard Worker FIXP_DBL sqmag2I_F =
1748*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufImag_F[slotOffset][ti2];
1749*e5436536SAndroid Build Coastguard Worker scaleUp(&sqmag2R_F, &sqmag2I_F, &sqmag2_e);
1750*e5436536SAndroid Build Coastguard Worker sqmag2_F = fPow2Div2(sqmag2R_F);
1751*e5436536SAndroid Build Coastguard Worker sqmag2_F += fPow2Div2(sqmag2I_F);
1752*e5436536SAndroid Build Coastguard Worker sqmag2_e = 2 * sqmag2_e + 1;
1753*e5436536SAndroid Build Coastguard Worker
1754*e5436536SAndroid Build Coastguard Worker int shift1 = fMin(fMax(sqmag1_e, sqmag2_e) - sqmag1_e, 31);
1755*e5436536SAndroid Build Coastguard Worker int shift2 = fMin(fMax(sqmag1_e, sqmag2_e) - sqmag2_e, 31);
1756*e5436536SAndroid Build Coastguard Worker
1757*e5436536SAndroid Build Coastguard Worker temp_F = fMin((sqmag1_F >> shift1), (sqmag2_F >> shift2));
1758*e5436536SAndroid Build Coastguard Worker temp_e = fMax(sqmag1_e, sqmag2_e);
1759*e5436536SAndroid Build Coastguard Worker
1760*e5436536SAndroid Build Coastguard Worker int shift3 = fMin(fMax(temp_e, mVal_e) - temp_e, 31);
1761*e5436536SAndroid Build Coastguard Worker int shift4 = fMin(fMax(temp_e, mVal_e) - mVal_e, 31);
1762*e5436536SAndroid Build Coastguard Worker
1763*e5436536SAndroid Build Coastguard Worker if ((temp_F >> shift3) > (mVal_F >> shift4)) {
1764*e5436536SAndroid Build Coastguard Worker mVal_F = temp_F;
1765*e5436536SAndroid Build Coastguard Worker mVal_e = temp_e; /* equals sqmag2_e + shift2 */
1766*e5436536SAndroid Build Coastguard Worker mTr = tr;
1767*e5436536SAndroid Build Coastguard Worker ts1 = ti1;
1768*e5436536SAndroid Build Coastguard Worker ts2 = ti2;
1769*e5436536SAndroid Build Coastguard Worker }
1770*e5436536SAndroid Build Coastguard Worker }
1771*e5436536SAndroid Build Coastguard Worker }
1772*e5436536SAndroid Build Coastguard Worker
1773*e5436536SAndroid Build Coastguard Worker int shift1 = fMin(fMax(sqmag0_e, mVal_e) - sqmag0_e, 31);
1774*e5436536SAndroid Build Coastguard Worker int shift2 = fMin(fMax(sqmag0_e, mVal_e) - mVal_e, 31);
1775*e5436536SAndroid Build Coastguard Worker
1776*e5436536SAndroid Build Coastguard Worker if ((mVal_F >> shift2) > (sqmag0_F >> shift1) && ts1 >= 0 &&
1777*e5436536SAndroid Build Coastguard Worker ts2 < 2 * hQmfTransposer->synthSize) {
1778*e5436536SAndroid Build Coastguard Worker INT gammaOut_e[2];
1779*e5436536SAndroid Build Coastguard Worker FIXP_DBL gammaOutReal_m[2], gammaOutImag_m[2];
1780*e5436536SAndroid Build Coastguard Worker FIXP_DBL tmpReal_m = (FIXP_DBL)0, tmpImag_m = (FIXP_DBL)0;
1781*e5436536SAndroid Build Coastguard Worker
1782*e5436536SAndroid Build Coastguard Worker int Tcenter, Tvec;
1783*e5436536SAndroid Build Coastguard Worker
1784*e5436536SAndroid Build Coastguard Worker Tcenter = stretch - mTr; /* default phase power parameters */
1785*e5436536SAndroid Build Coastguard Worker Tvec = mTr;
1786*e5436536SAndroid Build Coastguard Worker switch (stretch) /* 2 tap block creation design depends on stretch
1787*e5436536SAndroid Build Coastguard Worker order */
1788*e5436536SAndroid Build Coastguard Worker {
1789*e5436536SAndroid Build Coastguard Worker case 2:
1790*e5436536SAndroid Build Coastguard Worker wingain =
1791*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(5.f / 12.f); /* sum of taps divided by two */
1792*e5436536SAndroid Build Coastguard Worker
1793*e5436536SAndroid Build Coastguard Worker if (hQmfTransposer->bXProducts[0]) {
1794*e5436536SAndroid Build Coastguard Worker gammaCenterReal_m[0] =
1795*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufReal_F[slotOffset][ts1];
1796*e5436536SAndroid Build Coastguard Worker gammaCenterImag_m[0] =
1797*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufImag_F[slotOffset][ts1];
1798*e5436536SAndroid Build Coastguard Worker
1799*e5436536SAndroid Build Coastguard Worker for (k = 0; k < 2; k++) {
1800*e5436536SAndroid Build Coastguard Worker gammaVecReal_m[k] =
1801*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufReal_F[slotOffset - 1 + k][ts2];
1802*e5436536SAndroid Build Coastguard Worker gammaVecImag_m[k] =
1803*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufImag_F[slotOffset - 1 + k][ts2];
1804*e5436536SAndroid Build Coastguard Worker }
1805*e5436536SAndroid Build Coastguard Worker
1806*e5436536SAndroid Build Coastguard Worker gammaCenter_e[0] = SCALE2EXP(
1807*e5436536SAndroid Build Coastguard Worker -hQmfTransposer->HBEAnalysiscQMF.outScalefactor);
1808*e5436536SAndroid Build Coastguard Worker gammaVec_e[0] = gammaVec_e[1] = SCALE2EXP(
1809*e5436536SAndroid Build Coastguard Worker -hQmfTransposer->HBEAnalysiscQMF.outScalefactor);
1810*e5436536SAndroid Build Coastguard Worker }
1811*e5436536SAndroid Build Coastguard Worker break;
1812*e5436536SAndroid Build Coastguard Worker
1813*e5436536SAndroid Build Coastguard Worker case 4:
1814*e5436536SAndroid Build Coastguard Worker wingain =
1815*e5436536SAndroid Build Coastguard Worker FL2FXCONST_DBL(6.f / 12.f); /* sum of taps divided by two */
1816*e5436536SAndroid Build Coastguard Worker if (hQmfTransposer->bXProducts[2]) {
1817*e5436536SAndroid Build Coastguard Worker if (mTr == 1) {
1818*e5436536SAndroid Build Coastguard Worker gammaCenterReal_m[0] =
1819*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufReal_F[slotOffset][ts1];
1820*e5436536SAndroid Build Coastguard Worker gammaCenterImag_m[0] =
1821*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufImag_F[slotOffset][ts1];
1822*e5436536SAndroid Build Coastguard Worker
1823*e5436536SAndroid Build Coastguard Worker for (k = 0; k < 2; k++) {
1824*e5436536SAndroid Build Coastguard Worker gammaVecReal_m[k] =
1825*e5436536SAndroid Build Coastguard Worker hQmfTransposer
1826*e5436536SAndroid Build Coastguard Worker ->qmfInBufReal_F[slotOffset + 2 * (k - 1)][ts2];
1827*e5436536SAndroid Build Coastguard Worker gammaVecImag_m[k] =
1828*e5436536SAndroid Build Coastguard Worker hQmfTransposer
1829*e5436536SAndroid Build Coastguard Worker ->qmfInBufImag_F[slotOffset + 2 * (k - 1)][ts2];
1830*e5436536SAndroid Build Coastguard Worker }
1831*e5436536SAndroid Build Coastguard Worker } else if (mTr == 2) {
1832*e5436536SAndroid Build Coastguard Worker gammaCenterReal_m[0] =
1833*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufReal_F[slotOffset][ts1];
1834*e5436536SAndroid Build Coastguard Worker gammaCenterImag_m[0] =
1835*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufImag_F[slotOffset][ts1];
1836*e5436536SAndroid Build Coastguard Worker
1837*e5436536SAndroid Build Coastguard Worker for (k = 0; k < 2; k++) {
1838*e5436536SAndroid Build Coastguard Worker gammaVecReal_m[k] =
1839*e5436536SAndroid Build Coastguard Worker hQmfTransposer
1840*e5436536SAndroid Build Coastguard Worker ->qmfInBufReal_F[slotOffset + (k - 1)][ts2];
1841*e5436536SAndroid Build Coastguard Worker gammaVecImag_m[k] =
1842*e5436536SAndroid Build Coastguard Worker hQmfTransposer
1843*e5436536SAndroid Build Coastguard Worker ->qmfInBufImag_F[slotOffset + (k - 1)][ts2];
1844*e5436536SAndroid Build Coastguard Worker }
1845*e5436536SAndroid Build Coastguard Worker } else /* (mTr == 3) */
1846*e5436536SAndroid Build Coastguard Worker {
1847*e5436536SAndroid Build Coastguard Worker sign = 1;
1848*e5436536SAndroid Build Coastguard Worker Tcenter = mTr; /* opposite phase power parameters as ts2 is
1849*e5436536SAndroid Build Coastguard Worker center */
1850*e5436536SAndroid Build Coastguard Worker Tvec = stretch - mTr;
1851*e5436536SAndroid Build Coastguard Worker
1852*e5436536SAndroid Build Coastguard Worker gammaCenterReal_m[0] =
1853*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufReal_F[slotOffset][ts2];
1854*e5436536SAndroid Build Coastguard Worker gammaCenterImag_m[0] =
1855*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufImag_F[slotOffset][ts2];
1856*e5436536SAndroid Build Coastguard Worker
1857*e5436536SAndroid Build Coastguard Worker for (k = 0; k < 2; k++) {
1858*e5436536SAndroid Build Coastguard Worker gammaVecReal_m[k] =
1859*e5436536SAndroid Build Coastguard Worker hQmfTransposer
1860*e5436536SAndroid Build Coastguard Worker ->qmfInBufReal_F[slotOffset + 2 * (k - 1)][ts1];
1861*e5436536SAndroid Build Coastguard Worker gammaVecImag_m[k] =
1862*e5436536SAndroid Build Coastguard Worker hQmfTransposer
1863*e5436536SAndroid Build Coastguard Worker ->qmfInBufImag_F[slotOffset + 2 * (k - 1)][ts1];
1864*e5436536SAndroid Build Coastguard Worker }
1865*e5436536SAndroid Build Coastguard Worker }
1866*e5436536SAndroid Build Coastguard Worker
1867*e5436536SAndroid Build Coastguard Worker gammaCenter_e[0] = SCALE2EXP(
1868*e5436536SAndroid Build Coastguard Worker -hQmfTransposer->HBEAnalysiscQMF.outScalefactor);
1869*e5436536SAndroid Build Coastguard Worker gammaVec_e[0] = gammaVec_e[1] = SCALE2EXP(
1870*e5436536SAndroid Build Coastguard Worker -hQmfTransposer->HBEAnalysiscQMF.outScalefactor);
1871*e5436536SAndroid Build Coastguard Worker }
1872*e5436536SAndroid Build Coastguard Worker break;
1873*e5436536SAndroid Build Coastguard Worker
1874*e5436536SAndroid Build Coastguard Worker case 3:
1875*e5436536SAndroid Build Coastguard Worker wingain = FL2FXCONST_DBL(5.6568f /
1876*e5436536SAndroid Build Coastguard Worker 12.f); /* sum of taps divided by two */
1877*e5436536SAndroid Build Coastguard Worker
1878*e5436536SAndroid Build Coastguard Worker if (hQmfTransposer->bXProducts[1]) {
1879*e5436536SAndroid Build Coastguard Worker FIXP_DBL tmpReal_F, tmpImag_F;
1880*e5436536SAndroid Build Coastguard Worker if (mTr == 1) {
1881*e5436536SAndroid Build Coastguard Worker gammaCenterReal_m[0] =
1882*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufReal_F[slotOffset][ts1];
1883*e5436536SAndroid Build Coastguard Worker gammaCenterImag_m[0] =
1884*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufImag_F[slotOffset][ts1];
1885*e5436536SAndroid Build Coastguard Worker gammaVecReal_m[1] =
1886*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufReal_F[slotOffset][ts2];
1887*e5436536SAndroid Build Coastguard Worker gammaVecImag_m[1] =
1888*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufImag_F[slotOffset][ts2];
1889*e5436536SAndroid Build Coastguard Worker
1890*e5436536SAndroid Build Coastguard Worker addrshift = -2;
1891*e5436536SAndroid Build Coastguard Worker tmpReal_F =
1892*e5436536SAndroid Build Coastguard Worker hQmfTransposer
1893*e5436536SAndroid Build Coastguard Worker ->qmfInBufReal_F[addrshift + slotOffset][ts2];
1894*e5436536SAndroid Build Coastguard Worker tmpImag_F =
1895*e5436536SAndroid Build Coastguard Worker hQmfTransposer
1896*e5436536SAndroid Build Coastguard Worker ->qmfInBufImag_F[addrshift + slotOffset][ts2];
1897*e5436536SAndroid Build Coastguard Worker
1898*e5436536SAndroid Build Coastguard Worker gammaVecReal_m[0] =
1899*e5436536SAndroid Build Coastguard Worker (fMult(factors[ts2 % 4], tmpReal_F) -
1900*e5436536SAndroid Build Coastguard Worker fMult(factors[(ts2 + 3) % 4], tmpImag_F)) >>
1901*e5436536SAndroid Build Coastguard Worker 1;
1902*e5436536SAndroid Build Coastguard Worker gammaVecImag_m[0] =
1903*e5436536SAndroid Build Coastguard Worker (fMult(factors[(ts2 + 3) % 4], tmpReal_F) +
1904*e5436536SAndroid Build Coastguard Worker fMult(factors[ts2 % 4], tmpImag_F)) >>
1905*e5436536SAndroid Build Coastguard Worker 1;
1906*e5436536SAndroid Build Coastguard Worker
1907*e5436536SAndroid Build Coastguard Worker tmpReal_F =
1908*e5436536SAndroid Build Coastguard Worker hQmfTransposer
1909*e5436536SAndroid Build Coastguard Worker ->qmfInBufReal_F[addrshift + 1 + slotOffset][ts2];
1910*e5436536SAndroid Build Coastguard Worker tmpImag_F =
1911*e5436536SAndroid Build Coastguard Worker hQmfTransposer
1912*e5436536SAndroid Build Coastguard Worker ->qmfInBufImag_F[addrshift + 1 + slotOffset][ts2];
1913*e5436536SAndroid Build Coastguard Worker
1914*e5436536SAndroid Build Coastguard Worker gammaVecReal_m[0] +=
1915*e5436536SAndroid Build Coastguard Worker (fMult(factors[ts2 % 4], tmpReal_F) -
1916*e5436536SAndroid Build Coastguard Worker fMult(factors[(ts2 + 1) % 4], tmpImag_F)) >>
1917*e5436536SAndroid Build Coastguard Worker 1;
1918*e5436536SAndroid Build Coastguard Worker gammaVecImag_m[0] +=
1919*e5436536SAndroid Build Coastguard Worker (fMult(factors[(ts2 + 1) % 4], tmpReal_F) +
1920*e5436536SAndroid Build Coastguard Worker fMult(factors[ts2 % 4], tmpImag_F)) >>
1921*e5436536SAndroid Build Coastguard Worker 1;
1922*e5436536SAndroid Build Coastguard Worker
1923*e5436536SAndroid Build Coastguard Worker } else /* (mTr == 2) */
1924*e5436536SAndroid Build Coastguard Worker {
1925*e5436536SAndroid Build Coastguard Worker sign = 1;
1926*e5436536SAndroid Build Coastguard Worker Tcenter = mTr; /* opposite phase power parameters as ts2 is
1927*e5436536SAndroid Build Coastguard Worker center */
1928*e5436536SAndroid Build Coastguard Worker Tvec = stretch - mTr;
1929*e5436536SAndroid Build Coastguard Worker
1930*e5436536SAndroid Build Coastguard Worker gammaCenterReal_m[0] =
1931*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufReal_F[slotOffset][ts2];
1932*e5436536SAndroid Build Coastguard Worker gammaCenterImag_m[0] =
1933*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufImag_F[slotOffset][ts2];
1934*e5436536SAndroid Build Coastguard Worker gammaVecReal_m[1] =
1935*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufReal_F[slotOffset][ts1];
1936*e5436536SAndroid Build Coastguard Worker gammaVecImag_m[1] =
1937*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufImag_F[slotOffset][ts1];
1938*e5436536SAndroid Build Coastguard Worker
1939*e5436536SAndroid Build Coastguard Worker addrshift = -2;
1940*e5436536SAndroid Build Coastguard Worker tmpReal_F =
1941*e5436536SAndroid Build Coastguard Worker hQmfTransposer
1942*e5436536SAndroid Build Coastguard Worker ->qmfInBufReal_F[addrshift + slotOffset][ts1];
1943*e5436536SAndroid Build Coastguard Worker tmpImag_F =
1944*e5436536SAndroid Build Coastguard Worker hQmfTransposer
1945*e5436536SAndroid Build Coastguard Worker ->qmfInBufImag_F[addrshift + slotOffset][ts1];
1946*e5436536SAndroid Build Coastguard Worker
1947*e5436536SAndroid Build Coastguard Worker gammaVecReal_m[0] =
1948*e5436536SAndroid Build Coastguard Worker (fMult(factors[ts1 % 4], tmpReal_F) -
1949*e5436536SAndroid Build Coastguard Worker fMult(factors[(ts1 + 3) % 4], tmpImag_F)) >>
1950*e5436536SAndroid Build Coastguard Worker 1;
1951*e5436536SAndroid Build Coastguard Worker gammaVecImag_m[0] =
1952*e5436536SAndroid Build Coastguard Worker (fMult(factors[(ts1 + 3) % 4], tmpReal_F) +
1953*e5436536SAndroid Build Coastguard Worker fMult(factors[ts1 % 4], tmpImag_F)) >>
1954*e5436536SAndroid Build Coastguard Worker 1;
1955*e5436536SAndroid Build Coastguard Worker
1956*e5436536SAndroid Build Coastguard Worker tmpReal_F =
1957*e5436536SAndroid Build Coastguard Worker hQmfTransposer
1958*e5436536SAndroid Build Coastguard Worker ->qmfInBufReal_F[addrshift + 1 + slotOffset][ts1];
1959*e5436536SAndroid Build Coastguard Worker tmpImag_F =
1960*e5436536SAndroid Build Coastguard Worker hQmfTransposer
1961*e5436536SAndroid Build Coastguard Worker ->qmfInBufImag_F[addrshift + 1 + slotOffset][ts1];
1962*e5436536SAndroid Build Coastguard Worker
1963*e5436536SAndroid Build Coastguard Worker gammaVecReal_m[0] +=
1964*e5436536SAndroid Build Coastguard Worker (fMult(factors[ts1 % 4], tmpReal_F) -
1965*e5436536SAndroid Build Coastguard Worker fMult(factors[(ts1 + 1) % 4], tmpImag_F)) >>
1966*e5436536SAndroid Build Coastguard Worker 1;
1967*e5436536SAndroid Build Coastguard Worker gammaVecImag_m[0] +=
1968*e5436536SAndroid Build Coastguard Worker (fMult(factors[(ts1 + 1) % 4], tmpReal_F) +
1969*e5436536SAndroid Build Coastguard Worker fMult(factors[ts1 % 4], tmpImag_F)) >>
1970*e5436536SAndroid Build Coastguard Worker 1;
1971*e5436536SAndroid Build Coastguard Worker }
1972*e5436536SAndroid Build Coastguard Worker
1973*e5436536SAndroid Build Coastguard Worker gammaCenter_e[0] = gammaVec_e[1] = SCALE2EXP(
1974*e5436536SAndroid Build Coastguard Worker -hQmfTransposer->HBEAnalysiscQMF.outScalefactor);
1975*e5436536SAndroid Build Coastguard Worker gammaVec_e[0] =
1976*e5436536SAndroid Build Coastguard Worker SCALE2EXP(
1977*e5436536SAndroid Build Coastguard Worker -hQmfTransposer->HBEAnalysiscQMF.outScalefactor) +
1978*e5436536SAndroid Build Coastguard Worker 1;
1979*e5436536SAndroid Build Coastguard Worker }
1980*e5436536SAndroid Build Coastguard Worker break;
1981*e5436536SAndroid Build Coastguard Worker default:
1982*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(0);
1983*e5436536SAndroid Build Coastguard Worker break;
1984*e5436536SAndroid Build Coastguard Worker } /* stretch cases */
1985*e5436536SAndroid Build Coastguard Worker
1986*e5436536SAndroid Build Coastguard Worker /* parameter controlled phase modification parts */
1987*e5436536SAndroid Build Coastguard Worker /* maximum *_e == 20 */
1988*e5436536SAndroid Build Coastguard Worker calculateCenterFIXP(gammaCenterReal_m[0], gammaCenterImag_m[0],
1989*e5436536SAndroid Build Coastguard Worker &gammaCenterReal_m[0], &gammaCenterImag_m[0],
1990*e5436536SAndroid Build Coastguard Worker &gammaCenter_e[0], stretch, Tcenter - 1);
1991*e5436536SAndroid Build Coastguard Worker calculateCenterFIXP(gammaVecReal_m[0], gammaVecImag_m[0],
1992*e5436536SAndroid Build Coastguard Worker &gammaVecReal_m[0], &gammaVecImag_m[0],
1993*e5436536SAndroid Build Coastguard Worker &gammaVec_e[0], stretch, Tvec - 1);
1994*e5436536SAndroid Build Coastguard Worker calculateCenterFIXP(gammaVecReal_m[1], gammaVecImag_m[1],
1995*e5436536SAndroid Build Coastguard Worker &gammaVecReal_m[1], &gammaVecImag_m[1],
1996*e5436536SAndroid Build Coastguard Worker &gammaVec_e[1], stretch, Tvec - 1);
1997*e5436536SAndroid Build Coastguard Worker
1998*e5436536SAndroid Build Coastguard Worker /* Final multiplication of prepared parts */
1999*e5436536SAndroid Build Coastguard Worker for (k = 0; k < 2; k++) {
2000*e5436536SAndroid Build Coastguard Worker gammaOutReal_m[k] =
2001*e5436536SAndroid Build Coastguard Worker fMultDiv2(gammaVecReal_m[k], gammaCenterReal_m[0]) -
2002*e5436536SAndroid Build Coastguard Worker fMultDiv2(gammaVecImag_m[k], gammaCenterImag_m[0]);
2003*e5436536SAndroid Build Coastguard Worker gammaOutImag_m[k] =
2004*e5436536SAndroid Build Coastguard Worker fMultDiv2(gammaVecReal_m[k], gammaCenterImag_m[0]) +
2005*e5436536SAndroid Build Coastguard Worker fMultDiv2(gammaVecImag_m[k], gammaCenterReal_m[0]);
2006*e5436536SAndroid Build Coastguard Worker gammaOut_e[k] = gammaCenter_e[0] + gammaVec_e[k] + 1;
2007*e5436536SAndroid Build Coastguard Worker }
2008*e5436536SAndroid Build Coastguard Worker
2009*e5436536SAndroid Build Coastguard Worker scaleUp(&gammaOutReal_m[0], &gammaOutImag_m[0], &gammaOut_e[0]);
2010*e5436536SAndroid Build Coastguard Worker scaleUp(&gammaOutReal_m[1], &gammaOutImag_m[1], &gammaOut_e[1]);
2011*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(gammaOut_e[0] >= 0);
2012*e5436536SAndroid Build Coastguard Worker FDK_ASSERT(gammaOut_e[0] < 32);
2013*e5436536SAndroid Build Coastguard Worker
2014*e5436536SAndroid Build Coastguard Worker tmpReal_m = gammaOutReal_m[0];
2015*e5436536SAndroid Build Coastguard Worker tmpImag_m = gammaOutImag_m[0];
2016*e5436536SAndroid Build Coastguard Worker
2017*e5436536SAndroid Build Coastguard Worker INT modstretch4 = ((stretch == 4) && (mTr == 2));
2018*e5436536SAndroid Build Coastguard Worker
2019*e5436536SAndroid Build Coastguard Worker FIXP_DBL cos_twid = twid_m_new[stretch - 2 - modstretch4][0];
2020*e5436536SAndroid Build Coastguard Worker FIXP_DBL sin_twid = sign * twid_m_new[stretch - 2 - modstretch4][1];
2021*e5436536SAndroid Build Coastguard Worker
2022*e5436536SAndroid Build Coastguard Worker gammaOutReal_m[0] =
2023*e5436536SAndroid Build Coastguard Worker fMult(tmpReal_m, cos_twid) -
2024*e5436536SAndroid Build Coastguard Worker fMult(tmpImag_m, sin_twid); /* sum should be <= 1 because of
2025*e5436536SAndroid Build Coastguard Worker sin/cos multiplication */
2026*e5436536SAndroid Build Coastguard Worker gammaOutImag_m[0] =
2027*e5436536SAndroid Build Coastguard Worker fMult(tmpImag_m, cos_twid) +
2028*e5436536SAndroid Build Coastguard Worker fMult(tmpReal_m, sin_twid); /* sum should be <= 1 because of
2029*e5436536SAndroid Build Coastguard Worker sin/cos multiplication */
2030*e5436536SAndroid Build Coastguard Worker
2031*e5436536SAndroid Build Coastguard Worker /* wingain */
2032*e5436536SAndroid Build Coastguard Worker for (k = 0; k < 2; k++) {
2033*e5436536SAndroid Build Coastguard Worker gammaOutReal_m[k] = (fMult(gammaOutReal_m[k], wingain) << 1);
2034*e5436536SAndroid Build Coastguard Worker gammaOutImag_m[k] = (fMult(gammaOutImag_m[k], wingain) << 1);
2035*e5436536SAndroid Build Coastguard Worker }
2036*e5436536SAndroid Build Coastguard Worker
2037*e5436536SAndroid Build Coastguard Worker gammaOutReal_m[1] >>= 1;
2038*e5436536SAndroid Build Coastguard Worker gammaOutImag_m[1] >>= 1;
2039*e5436536SAndroid Build Coastguard Worker gammaOut_e[0] += 2;
2040*e5436536SAndroid Build Coastguard Worker gammaOut_e[1] += 2;
2041*e5436536SAndroid Build Coastguard Worker
2042*e5436536SAndroid Build Coastguard Worker /* OLA including window scaling by wingain/3 */
2043*e5436536SAndroid Build Coastguard Worker for (k = 0; k < 2; k++) /* need k=1 to correspond to
2044*e5436536SAndroid Build Coastguard Worker grainModImag[slotOffset] -> out to
2045*e5436536SAndroid Build Coastguard Worker j*2+(slotOffset-offset) */
2046*e5436536SAndroid Build Coastguard Worker {
2047*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfHBEBufReal_F[(k + slotOffset - 1)][band] +=
2048*e5436536SAndroid Build Coastguard Worker gammaOutReal_m[k] >> (scale_factor_hbe - gammaOut_e[k]);
2049*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfHBEBufImag_F[(k + slotOffset - 1)][band] +=
2050*e5436536SAndroid Build Coastguard Worker gammaOutImag_m[k] >> (scale_factor_hbe - gammaOut_e[k]);
2051*e5436536SAndroid Build Coastguard Worker }
2052*e5436536SAndroid Build Coastguard Worker } /* mVal > qThrQMF * qThrQMF * sqmag0 && ts1 > 0 && ts2 < 64 */
2053*e5436536SAndroid Build Coastguard Worker } /* p >= pmin */
2054*e5436536SAndroid Build Coastguard Worker } /* for band */
2055*e5436536SAndroid Build Coastguard Worker } /* for stretch */
2056*e5436536SAndroid Build Coastguard Worker
2057*e5436536SAndroid Build Coastguard Worker for (i = 0; i < QMF_WIN_LEN - 1; i++) {
2058*e5436536SAndroid Build Coastguard Worker FDKmemcpy(hQmfTransposer->qmfInBufReal_F[i],
2059*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufReal_F[i + 1],
2060*e5436536SAndroid Build Coastguard Worker sizeof(FIXP_DBL) * hQmfTransposer->HBEAnalysiscQMF.no_channels);
2061*e5436536SAndroid Build Coastguard Worker FDKmemcpy(hQmfTransposer->qmfInBufImag_F[i],
2062*e5436536SAndroid Build Coastguard Worker hQmfTransposer->qmfInBufImag_F[i + 1],
2063*e5436536SAndroid Build Coastguard Worker sizeof(FIXP_DBL) * hQmfTransposer->HBEAnalysiscQMF.no_channels);
2064*e5436536SAndroid Build Coastguard Worker }
2065*e5436536SAndroid Build Coastguard Worker
2066*e5436536SAndroid Build Coastguard Worker if (keepStatesSyncedMode != KEEP_STATES_SYNCED_NOOUT) {
2067*e5436536SAndroid Build Coastguard Worker if (2 * j >= offset) {
2068*e5436536SAndroid Build Coastguard Worker /* copy first two slots of internal buffer to output */
2069*e5436536SAndroid Build Coastguard Worker if (keepStatesSyncedMode == KEEP_STATES_SYNCED_OUTDIFF) {
2070*e5436536SAndroid Build Coastguard Worker for (i = 0; i < 2; i++) {
2071*e5436536SAndroid Build Coastguard Worker FDKmemcpy(&ppQmfBufferOutReal_F[2 * j - offset + i]
2072*e5436536SAndroid Build Coastguard Worker [hQmfTransposer->xOverQmf[0]],
2073*e5436536SAndroid Build Coastguard Worker &hQmfTransposer
2074*e5436536SAndroid Build Coastguard Worker ->qmfHBEBufReal_F[i][hQmfTransposer->xOverQmf[0]],
2075*e5436536SAndroid Build Coastguard Worker (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) *
2076*e5436536SAndroid Build Coastguard Worker sizeof(FIXP_DBL));
2077*e5436536SAndroid Build Coastguard Worker FDKmemcpy(&ppQmfBufferOutImag_F[2 * j - offset + i]
2078*e5436536SAndroid Build Coastguard Worker [hQmfTransposer->xOverQmf[0]],
2079*e5436536SAndroid Build Coastguard Worker &hQmfTransposer
2080*e5436536SAndroid Build Coastguard Worker ->qmfHBEBufImag_F[i][hQmfTransposer->xOverQmf[0]],
2081*e5436536SAndroid Build Coastguard Worker (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) *
2082*e5436536SAndroid Build Coastguard Worker sizeof(FIXP_DBL));
2083*e5436536SAndroid Build Coastguard Worker }
2084*e5436536SAndroid Build Coastguard Worker } else {
2085*e5436536SAndroid Build Coastguard Worker for (i = 0; i < 2; i++) {
2086*e5436536SAndroid Build Coastguard Worker FDKmemcpy(&ppQmfBufferOutReal_F[2 * j + i + ov_len]
2087*e5436536SAndroid Build Coastguard Worker [hQmfTransposer->xOverQmf[0]],
2088*e5436536SAndroid Build Coastguard Worker &hQmfTransposer
2089*e5436536SAndroid Build Coastguard Worker ->qmfHBEBufReal_F[i][hQmfTransposer->xOverQmf[0]],
2090*e5436536SAndroid Build Coastguard Worker (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) *
2091*e5436536SAndroid Build Coastguard Worker sizeof(FIXP_DBL));
2092*e5436536SAndroid Build Coastguard Worker FDKmemcpy(&ppQmfBufferOutImag_F[2 * j + i + ov_len]
2093*e5436536SAndroid Build Coastguard Worker [hQmfTransposer->xOverQmf[0]],
2094*e5436536SAndroid Build Coastguard Worker &hQmfTransposer
2095*e5436536SAndroid Build Coastguard Worker ->qmfHBEBufImag_F[i][hQmfTransposer->xOverQmf[0]],
2096*e5436536SAndroid Build Coastguard Worker (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) *
2097*e5436536SAndroid Build Coastguard Worker sizeof(FIXP_DBL));
2098*e5436536SAndroid Build Coastguard Worker }
2099*e5436536SAndroid Build Coastguard Worker }
2100*e5436536SAndroid Build Coastguard Worker }
2101*e5436536SAndroid Build Coastguard Worker }
2102*e5436536SAndroid Build Coastguard Worker
2103*e5436536SAndroid Build Coastguard Worker /* move slots up */
2104*e5436536SAndroid Build Coastguard Worker for (i = 0; i < HBE_MAX_OUT_SLOTS - 2; i++) {
2105*e5436536SAndroid Build Coastguard Worker FDKmemcpy(
2106*e5436536SAndroid Build Coastguard Worker &hQmfTransposer->qmfHBEBufReal_F[i][hQmfTransposer->xOverQmf[0]],
2107*e5436536SAndroid Build Coastguard Worker &hQmfTransposer->qmfHBEBufReal_F[i + 2][hQmfTransposer->xOverQmf[0]],
2108*e5436536SAndroid Build Coastguard Worker (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) *
2109*e5436536SAndroid Build Coastguard Worker sizeof(FIXP_DBL));
2110*e5436536SAndroid Build Coastguard Worker FDKmemcpy(
2111*e5436536SAndroid Build Coastguard Worker &hQmfTransposer->qmfHBEBufImag_F[i][hQmfTransposer->xOverQmf[0]],
2112*e5436536SAndroid Build Coastguard Worker &hQmfTransposer->qmfHBEBufImag_F[i + 2][hQmfTransposer->xOverQmf[0]],
2113*e5436536SAndroid Build Coastguard Worker (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) *
2114*e5436536SAndroid Build Coastguard Worker sizeof(FIXP_DBL));
2115*e5436536SAndroid Build Coastguard Worker }
2116*e5436536SAndroid Build Coastguard Worker
2117*e5436536SAndroid Build Coastguard Worker /* finally set last two slot to zero */
2118*e5436536SAndroid Build Coastguard Worker for (i = 0; i < 2; i++) {
2119*e5436536SAndroid Build Coastguard Worker FDKmemset(&hQmfTransposer->qmfHBEBufReal_F[HBE_MAX_OUT_SLOTS - 1 - i]
2120*e5436536SAndroid Build Coastguard Worker [hQmfTransposer->xOverQmf[0]],
2121*e5436536SAndroid Build Coastguard Worker 0,
2122*e5436536SAndroid Build Coastguard Worker (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) *
2123*e5436536SAndroid Build Coastguard Worker sizeof(FIXP_DBL));
2124*e5436536SAndroid Build Coastguard Worker FDKmemset(&hQmfTransposer->qmfHBEBufImag_F[HBE_MAX_OUT_SLOTS - 1 - i]
2125*e5436536SAndroid Build Coastguard Worker [hQmfTransposer->xOverQmf[0]],
2126*e5436536SAndroid Build Coastguard Worker 0,
2127*e5436536SAndroid Build Coastguard Worker (QMF_SYNTH_CHANNELS - hQmfTransposer->xOverQmf[0]) *
2128*e5436536SAndroid Build Coastguard Worker sizeof(FIXP_DBL));
2129*e5436536SAndroid Build Coastguard Worker }
2130*e5436536SAndroid Build Coastguard Worker } /* qmfVocoderColsIn */
2131*e5436536SAndroid Build Coastguard Worker
2132*e5436536SAndroid Build Coastguard Worker if (keepStatesSyncedMode != KEEP_STATES_SYNCED_NOOUT) {
2133*e5436536SAndroid Build Coastguard Worker if (keepStatesSyncedMode == KEEP_STATES_SYNCED_OUTDIFF) {
2134*e5436536SAndroid Build Coastguard Worker for (i = 0; i < ov_len + LPC_ORDER; i++) {
2135*e5436536SAndroid Build Coastguard Worker for (band = hQmfTransposer->startBand; band < hQmfTransposer->stopBand;
2136*e5436536SAndroid Build Coastguard Worker band++) {
2137*e5436536SAndroid Build Coastguard Worker FIXP_DBL tmpR = ppQmfBufferOutReal_F[i][band];
2138*e5436536SAndroid Build Coastguard Worker FIXP_DBL tmpI = ppQmfBufferOutImag_F[i][band];
2139*e5436536SAndroid Build Coastguard Worker
2140*e5436536SAndroid Build Coastguard Worker ppQmfBufferOutReal_F[i][band] =
2141*e5436536SAndroid Build Coastguard Worker fMult(tmpR, cos_F[band]) -
2142*e5436536SAndroid Build Coastguard Worker fMult(tmpI, (-cos_F[64 - band - 1])); /* sum should be <= 1
2143*e5436536SAndroid Build Coastguard Worker because of sin/cos
2144*e5436536SAndroid Build Coastguard Worker multiplication */
2145*e5436536SAndroid Build Coastguard Worker ppQmfBufferOutImag_F[i][band] =
2146*e5436536SAndroid Build Coastguard Worker fMult(tmpR, (-cos_F[64 - band - 1])) +
2147*e5436536SAndroid Build Coastguard Worker fMult(tmpI, cos_F[band]); /* sum should by <= 1 because of sin/cos
2148*e5436536SAndroid Build Coastguard Worker multiplication */
2149*e5436536SAndroid Build Coastguard Worker }
2150*e5436536SAndroid Build Coastguard Worker }
2151*e5436536SAndroid Build Coastguard Worker } else {
2152*e5436536SAndroid Build Coastguard Worker for (i = offset; i < hQmfTransposer->noCols; i++) {
2153*e5436536SAndroid Build Coastguard Worker for (band = hQmfTransposer->startBand; band < hQmfTransposer->stopBand;
2154*e5436536SAndroid Build Coastguard Worker band++) {
2155*e5436536SAndroid Build Coastguard Worker FIXP_DBL tmpR = ppQmfBufferOutReal_F[i + ov_len][band];
2156*e5436536SAndroid Build Coastguard Worker FIXP_DBL tmpI = ppQmfBufferOutImag_F[i + ov_len][band];
2157*e5436536SAndroid Build Coastguard Worker
2158*e5436536SAndroid Build Coastguard Worker ppQmfBufferOutReal_F[i + ov_len][band] =
2159*e5436536SAndroid Build Coastguard Worker fMult(tmpR, cos_F[band]) -
2160*e5436536SAndroid Build Coastguard Worker fMult(tmpI, (-cos_F[64 - band - 1])); /* sum should be <= 1
2161*e5436536SAndroid Build Coastguard Worker because of sin/cos
2162*e5436536SAndroid Build Coastguard Worker multiplication */
2163*e5436536SAndroid Build Coastguard Worker ppQmfBufferOutImag_F[i + ov_len][band] =
2164*e5436536SAndroid Build Coastguard Worker fMult(tmpR, (-cos_F[64 - band - 1])) +
2165*e5436536SAndroid Build Coastguard Worker fMult(tmpI, cos_F[band]); /* sum should by <= 1 because of sin/cos
2166*e5436536SAndroid Build Coastguard Worker multiplication */
2167*e5436536SAndroid Build Coastguard Worker }
2168*e5436536SAndroid Build Coastguard Worker }
2169*e5436536SAndroid Build Coastguard Worker }
2170*e5436536SAndroid Build Coastguard Worker }
2171*e5436536SAndroid Build Coastguard Worker
2172*e5436536SAndroid Build Coastguard Worker *scale_hb = EXP2SCALE(scale_factor_hbe);
2173*e5436536SAndroid Build Coastguard Worker }
2174*e5436536SAndroid Build Coastguard Worker
GetxOverBandQmfTransposer(HANDLE_HBE_TRANSPOSER hQmfTransposer)2175*e5436536SAndroid Build Coastguard Worker int* GetxOverBandQmfTransposer(HANDLE_HBE_TRANSPOSER hQmfTransposer) {
2176*e5436536SAndroid Build Coastguard Worker if (hQmfTransposer)
2177*e5436536SAndroid Build Coastguard Worker return hQmfTransposer->xOverQmf;
2178*e5436536SAndroid Build Coastguard Worker else
2179*e5436536SAndroid Build Coastguard Worker return NULL;
2180*e5436536SAndroid Build Coastguard Worker }
2181*e5436536SAndroid Build Coastguard Worker
Get41SbrQmfTransposer(HANDLE_HBE_TRANSPOSER hQmfTransposer)2182*e5436536SAndroid Build Coastguard Worker int Get41SbrQmfTransposer(HANDLE_HBE_TRANSPOSER hQmfTransposer) {
2183*e5436536SAndroid Build Coastguard Worker if (hQmfTransposer != NULL)
2184*e5436536SAndroid Build Coastguard Worker return hQmfTransposer->bSbr41;
2185*e5436536SAndroid Build Coastguard Worker else
2186*e5436536SAndroid Build Coastguard Worker return 0;
2187*e5436536SAndroid Build Coastguard Worker }
2188