xref: /aosp_15_r20/external/aac/libSACenc/src/sacenc_vectorfunctions.h (revision e54365361535b070c2db7374cec45c159c7d0e7a)
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 - 2018 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 /*********************** MPEG surround encoder library *************************
96*e5436536SAndroid Build Coastguard Worker 
97*e5436536SAndroid Build Coastguard Worker    Author(s):   Josef Hoepfl
98*e5436536SAndroid Build Coastguard Worker 
99*e5436536SAndroid Build Coastguard Worker    Description: Encoder Library Interface
100*e5436536SAndroid Build Coastguard Worker                 vector functions
101*e5436536SAndroid Build Coastguard Worker 
102*e5436536SAndroid Build Coastguard Worker *******************************************************************************/
103*e5436536SAndroid Build Coastguard Worker 
104*e5436536SAndroid Build Coastguard Worker /*****************************************************************************
105*e5436536SAndroid Build Coastguard Worker \file
106*e5436536SAndroid Build Coastguard Worker This file contains vector functions
107*e5436536SAndroid Build Coastguard Worker ******************************************************************************/
108*e5436536SAndroid Build Coastguard Worker 
109*e5436536SAndroid Build Coastguard Worker #ifndef SACENC_VECTORFUNCTIONS_H
110*e5436536SAndroid Build Coastguard Worker #define SACENC_VECTORFUNCTIONS_H
111*e5436536SAndroid Build Coastguard Worker 
112*e5436536SAndroid Build Coastguard Worker /* Includes ******************************************************************/
113*e5436536SAndroid Build Coastguard Worker #include "common_fix.h"
114*e5436536SAndroid Build Coastguard Worker 
115*e5436536SAndroid Build Coastguard Worker /* Defines *******************************************************************/
116*e5436536SAndroid Build Coastguard Worker #define SUM_UP_STATIC_SCALE 0
117*e5436536SAndroid Build Coastguard Worker #define SUM_UP_DYNAMIC_SCALE 1
118*e5436536SAndroid Build Coastguard Worker 
119*e5436536SAndroid Build Coastguard Worker /* Data Types ****************************************************************/
120*e5436536SAndroid Build Coastguard Worker 
121*e5436536SAndroid Build Coastguard Worker /* Constants *****************************************************************/
122*e5436536SAndroid Build Coastguard Worker 
123*e5436536SAndroid Build Coastguard Worker /* Function / Class Declarations *********************************************/
124*e5436536SAndroid Build Coastguard Worker 
125*e5436536SAndroid Build Coastguard Worker /**
126*e5436536SAndroid Build Coastguard Worker  * \brief          Vector function : Sum up complex power
127*e5436536SAndroid Build Coastguard Worker  *
128*e5436536SAndroid Build Coastguard Worker  *                 Description : ret = sum( re{X[i]} * re{X[i]} + im{X[i]} *
129*e5436536SAndroid Build Coastguard Worker  * im{X[i]} ),  i=0,...,n-1 ret is scaled by outScaleFactor
130*e5436536SAndroid Build Coastguard Worker  *
131*e5436536SAndroid Build Coastguard Worker  * \param          const FIXP_DPK x[]
132*e5436536SAndroid Build Coastguard Worker  *                 Input: complex vector of the length n
133*e5436536SAndroid Build Coastguard Worker  *
134*e5436536SAndroid Build Coastguard Worker  * \param          int scaleMode
135*e5436536SAndroid Build Coastguard Worker  *                 Input: choose static or dynamic scaling
136*e5436536SAndroid Build Coastguard Worker  * (SUM_UP_DYNAMIC_SCALE/SUM_UP_STATIC_SCALE)
137*e5436536SAndroid Build Coastguard Worker  *
138*e5436536SAndroid Build Coastguard Worker  * \param          int inScaleFactor
139*e5436536SAndroid Build Coastguard Worker  *                 Input: determine headroom bits for the complex input vector
140*e5436536SAndroid Build Coastguard Worker  *
141*e5436536SAndroid Build Coastguard Worker  * \param          int outScaleFactor
142*e5436536SAndroid Build Coastguard Worker  *                 Output: complete scaling in energy calculation
143*e5436536SAndroid Build Coastguard Worker  *
144*e5436536SAndroid Build Coastguard Worker  * \return         FIXP_DBL ret
145*e5436536SAndroid Build Coastguard Worker  */
146*e5436536SAndroid Build Coastguard Worker FIXP_DBL sumUpCplxPow2(const FIXP_DPK *const x, const INT scaleMode,
147*e5436536SAndroid Build Coastguard Worker                        const INT inScaleFactor, INT *const outScaleFactor,
148*e5436536SAndroid Build Coastguard Worker                        const INT n);
149*e5436536SAndroid Build Coastguard Worker 
150*e5436536SAndroid Build Coastguard Worker /**
151*e5436536SAndroid Build Coastguard Worker  * \brief          Vector function : Sum up complex power
152*e5436536SAndroid Build Coastguard Worker  *
153*e5436536SAndroid Build Coastguard Worker  *                 Description : ret = sum( re{X[i][j]} * re{X[i][]} +
154*e5436536SAndroid Build Coastguard Worker  * im{X[i][]} * im{X[i][]} ),  i=sDim1,...,nDim1-1 i=sDim2,...,nDim2-1 ret is
155*e5436536SAndroid Build Coastguard Worker  * scaled by outScaleFactor
156*e5436536SAndroid Build Coastguard Worker  *
157*e5436536SAndroid Build Coastguard Worker  * \param          const FIXP_DPK x[]
158*e5436536SAndroid Build Coastguard Worker  *                 Input: complex vector of the length n
159*e5436536SAndroid Build Coastguard Worker  *
160*e5436536SAndroid Build Coastguard Worker  * \param          int scaleMode
161*e5436536SAndroid Build Coastguard Worker  *                 Input: choose static or dynamic scaling
162*e5436536SAndroid Build Coastguard Worker  * (SUM_UP_DYNAMIC_SCALE/SUM_UP_STATIC_SCALE)
163*e5436536SAndroid Build Coastguard Worker  *
164*e5436536SAndroid Build Coastguard Worker  * \param          int inScaleFactor
165*e5436536SAndroid Build Coastguard Worker  *                 Input: determine headroom bits for the complex input vector
166*e5436536SAndroid Build Coastguard Worker  *
167*e5436536SAndroid Build Coastguard Worker  * \param          int outScaleFactor
168*e5436536SAndroid Build Coastguard Worker  *                 Output: complete scaling in energy calculation
169*e5436536SAndroid Build Coastguard Worker  *
170*e5436536SAndroid Build Coastguard Worker  * \param          int sDim1
171*e5436536SAndroid Build Coastguard Worker  *                 Input: start index for loop counter in dimension 1
172*e5436536SAndroid Build Coastguard Worker  *
173*e5436536SAndroid Build Coastguard Worker  * \param          int nDim1
174*e5436536SAndroid Build Coastguard Worker  *                 Input: loop counter in dimension 1
175*e5436536SAndroid Build Coastguard Worker  *
176*e5436536SAndroid Build Coastguard Worker  * \param          int sDim2
177*e5436536SAndroid Build Coastguard Worker  *                 Input: start index for loop counter in dimension 2
178*e5436536SAndroid Build Coastguard Worker  *
179*e5436536SAndroid Build Coastguard Worker  * \param          int nDim2
180*e5436536SAndroid Build Coastguard Worker  *                 Input: loop counter in dimension 2
181*e5436536SAndroid Build Coastguard Worker  *
182*e5436536SAndroid Build Coastguard Worker  * \return         FIXP_DBL ret
183*e5436536SAndroid Build Coastguard Worker  */
184*e5436536SAndroid Build Coastguard Worker FIXP_DBL sumUpCplxPow2Dim2(const FIXP_DPK *const *const x, const INT scaleMode,
185*e5436536SAndroid Build Coastguard Worker                            const INT inScaleFactor, INT *const outScaleFactor,
186*e5436536SAndroid Build Coastguard Worker                            const INT sDim1, const INT nDim1, const INT sDim2,
187*e5436536SAndroid Build Coastguard Worker                            const INT nDim2);
188*e5436536SAndroid Build Coastguard Worker 
189*e5436536SAndroid Build Coastguard Worker /**
190*e5436536SAndroid Build Coastguard Worker  * \brief          Vector function : Z[i] = X[i],  i=0,...,n-1
191*e5436536SAndroid Build Coastguard Worker  *
192*e5436536SAndroid Build Coastguard Worker  *                 Description : re{Z[i]} = re{X[i]},  i=0,...,n-1
193*e5436536SAndroid Build Coastguard Worker  *                               im{Z[i]} = im{X[i]},  i=0,...,n-1
194*e5436536SAndroid Build Coastguard Worker  *
195*e5436536SAndroid Build Coastguard Worker  *                 Copy complex vector X[] to complex vector Z[].
196*e5436536SAndroid Build Coastguard Worker  *                 It is allowed to overlay X[] with Z[].
197*e5436536SAndroid Build Coastguard Worker  *
198*e5436536SAndroid Build Coastguard Worker  * \param          FIXP_DPK Z[]
199*e5436536SAndroid Build Coastguard Worker  *                 Output: vector of the length n
200*e5436536SAndroid Build Coastguard Worker  *
201*e5436536SAndroid Build Coastguard Worker  * \param          const FIXP_DPK X[]
202*e5436536SAndroid Build Coastguard Worker  *                 Input: vector of the length n
203*e5436536SAndroid Build Coastguard Worker  *
204*e5436536SAndroid Build Coastguard Worker  * \param          int n
205*e5436536SAndroid Build Coastguard Worker  *                 Input: length of vector Z[] and X[]
206*e5436536SAndroid Build Coastguard Worker  *
207*e5436536SAndroid Build Coastguard Worker  * \return         void
208*e5436536SAndroid Build Coastguard Worker  */
209*e5436536SAndroid Build Coastguard Worker void copyCplxVec(FIXP_DPK *const Z, const FIXP_DPK *const X, const INT n);
210*e5436536SAndroid Build Coastguard Worker 
211*e5436536SAndroid Build Coastguard Worker /**
212*e5436536SAndroid Build Coastguard Worker  * \brief          Vector function : Z[i] = a,  i=0,...,n-1
213*e5436536SAndroid Build Coastguard Worker  *
214*e5436536SAndroid Build Coastguard Worker  *                 Description : re{Z[i]} = a,  i=0,...,n-1
215*e5436536SAndroid Build Coastguard Worker  *                               im{Z[i]} = a,  i=0,...,n-1
216*e5436536SAndroid Build Coastguard Worker  *
217*e5436536SAndroid Build Coastguard Worker  *                 Set real and imaginary part of the complex value Z to a.
218*e5436536SAndroid Build Coastguard Worker  *
219*e5436536SAndroid Build Coastguard Worker  * \param          FIPX_DPK Z[]
220*e5436536SAndroid Build Coastguard Worker  *                 Output: vector of the length n
221*e5436536SAndroid Build Coastguard Worker  *
222*e5436536SAndroid Build Coastguard Worker  * \param          const FIXP_DBL a
223*e5436536SAndroid Build Coastguard Worker  *                 Input: constant value
224*e5436536SAndroid Build Coastguard Worker  *
225*e5436536SAndroid Build Coastguard Worker  * \param          int n
226*e5436536SAndroid Build Coastguard Worker  *                 Input: length of vector Z[]
227*e5436536SAndroid Build Coastguard Worker  *
228*e5436536SAndroid Build Coastguard Worker  * \return         void
229*e5436536SAndroid Build Coastguard Worker  */
230*e5436536SAndroid Build Coastguard Worker void setCplxVec(FIXP_DPK *const Z, const FIXP_DBL a, const INT n);
231*e5436536SAndroid Build Coastguard Worker 
232*e5436536SAndroid Build Coastguard Worker /**
233*e5436536SAndroid Build Coastguard Worker  * \brief          Vector function : Calculate complex-valued result of complex
234*e5436536SAndroid Build Coastguard Worker  * scalar product
235*e5436536SAndroid Build Coastguard Worker  *
236*e5436536SAndroid Build Coastguard Worker  *                 Description : re{Z} = sum( re{X[i]} * re{Y[i]} + im{X[i]} *
237*e5436536SAndroid Build Coastguard Worker  * im{Y[i]},  i=0,...,n-1 ) im{Z} = sum( im{X[i]} * re{Y[i]} - re{X[i]} *
238*e5436536SAndroid Build Coastguard Worker  * im{Y[i]},  i=0,...,n-1 )
239*e5436536SAndroid Build Coastguard Worker  *
240*e5436536SAndroid Build Coastguard Worker  *                 The function returns the complex-valued result of the complex
241*e5436536SAndroid Build Coastguard Worker  * scalar product at the address of Z. The result is scaled by scaleZ.
242*e5436536SAndroid Build Coastguard Worker  *
243*e5436536SAndroid Build Coastguard Worker  * \param          FIXP_DPK *Z
244*e5436536SAndroid Build Coastguard Worker  *                 Output: pointer to Z
245*e5436536SAndroid Build Coastguard Worker  *
246*e5436536SAndroid Build Coastguard Worker  * \param          const FIXP_DPK *const *const X
247*e5436536SAndroid Build Coastguard Worker  *                 Input: vector of the length n
248*e5436536SAndroid Build Coastguard Worker  *
249*e5436536SAndroid Build Coastguard Worker  * \param          const FIXP_DPK *const *const Y
250*e5436536SAndroid Build Coastguard Worker  *                 Input: vector of the length n
251*e5436536SAndroid Build Coastguard Worker  *
252*e5436536SAndroid Build Coastguard Worker  * \param          int scaleX
253*e5436536SAndroid Build Coastguard Worker  *                 Input: scalefactor of vector X[]
254*e5436536SAndroid Build Coastguard Worker  *
255*e5436536SAndroid Build Coastguard Worker  * \param          int scaleY
256*e5436536SAndroid Build Coastguard Worker  *                 Input: scalefactor of vector Y[]
257*e5436536SAndroid Build Coastguard Worker  *
258*e5436536SAndroid Build Coastguard Worker  * \param          int scaleZ
259*e5436536SAndroid Build Coastguard Worker  *                 Output: scalefactor of vector Z[]
260*e5436536SAndroid Build Coastguard Worker  *
261*e5436536SAndroid Build Coastguard Worker  * \param          int sDim1
262*e5436536SAndroid Build Coastguard Worker  *                 Input: start index for loop counter in dimension 1
263*e5436536SAndroid Build Coastguard Worker  *
264*e5436536SAndroid Build Coastguard Worker  * \param          int nDim1
265*e5436536SAndroid Build Coastguard Worker  *                 Input: loop counter in dimension 1
266*e5436536SAndroid Build Coastguard Worker  *
267*e5436536SAndroid Build Coastguard Worker  * \param          int sDim2
268*e5436536SAndroid Build Coastguard Worker  *                 Input: start index for loop counter in dimension 2
269*e5436536SAndroid Build Coastguard Worker  *
270*e5436536SAndroid Build Coastguard Worker  * \param          int nDim2
271*e5436536SAndroid Build Coastguard Worker  *                 Input: loop counter in dimension 2
272*e5436536SAndroid Build Coastguard Worker  *
273*e5436536SAndroid Build Coastguard Worker  * \return         void
274*e5436536SAndroid Build Coastguard Worker  */
275*e5436536SAndroid Build Coastguard Worker void cplx_cplxScalarProduct(FIXP_DPK *const Z, const FIXP_DPK *const *const X,
276*e5436536SAndroid Build Coastguard Worker                             const FIXP_DPK *const *const Y, const INT scaleX,
277*e5436536SAndroid Build Coastguard Worker                             const INT scaleY, INT *const scaleZ,
278*e5436536SAndroid Build Coastguard Worker                             const INT sDim1, const INT nDim1, const INT sDim2,
279*e5436536SAndroid Build Coastguard Worker                             const INT nDim2);
280*e5436536SAndroid Build Coastguard Worker 
281*e5436536SAndroid Build Coastguard Worker /**
282*e5436536SAndroid Build Coastguard Worker  * \brief          Vector function : Calculate correlation
283*e5436536SAndroid Build Coastguard Worker  *
284*e5436536SAndroid Build Coastguard Worker  *                 Description : z[i] = pr12[i] / sqrt(p1[i]*p2[i]) ,
285*e5436536SAndroid Build Coastguard Worker  * i=0,...,n-1
286*e5436536SAndroid Build Coastguard Worker  *
287*e5436536SAndroid Build Coastguard Worker  * \param          FIXP_DBL z[]
288*e5436536SAndroid Build Coastguard Worker  *                 Output: vector of length n
289*e5436536SAndroid Build Coastguard Worker  *
290*e5436536SAndroid Build Coastguard Worker  * \param          const FIXP_DBL pr12[]
291*e5436536SAndroid Build Coastguard Worker  *                 Input: vector of the length n
292*e5436536SAndroid Build Coastguard Worker  *
293*e5436536SAndroid Build Coastguard Worker  * \param          const FIXP_DBL p1[]
294*e5436536SAndroid Build Coastguard Worker  *                 Input: vector of the length n
295*e5436536SAndroid Build Coastguard Worker  *
296*e5436536SAndroid Build Coastguard Worker  * \param          const FIXP_DBL p2[]
297*e5436536SAndroid Build Coastguard Worker  *                 Input: vector of the length n
298*e5436536SAndroid Build Coastguard Worker  *
299*e5436536SAndroid Build Coastguard Worker  * \param          int n
300*e5436536SAndroid Build Coastguard Worker  *                 Input: length of vector pr12[], p1[] and p2[]
301*e5436536SAndroid Build Coastguard Worker  *
302*e5436536SAndroid Build Coastguard Worker  * \return         void
303*e5436536SAndroid Build Coastguard Worker  */
304*e5436536SAndroid Build Coastguard Worker void FDKcalcCorrelationVec(FIXP_DBL *const z, const FIXP_DBL *const pr12,
305*e5436536SAndroid Build Coastguard Worker                            const FIXP_DBL *const p1, const FIXP_DBL *const p2,
306*e5436536SAndroid Build Coastguard Worker                            const INT n);
307*e5436536SAndroid Build Coastguard Worker 
308*e5436536SAndroid Build Coastguard Worker /**
309*e5436536SAndroid Build Coastguard Worker  * \brief          Vector function : Calculate coherence
310*e5436536SAndroid Build Coastguard Worker  *
311*e5436536SAndroid Build Coastguard Worker  *                 Description : z[i] = sqrt( (p12r[i]*p12r[i] +
312*e5436536SAndroid Build Coastguard Worker  * p12i[i]*p12i[i]) / (p1[i]*p2[i]) ),  i=0,...,n-1
313*e5436536SAndroid Build Coastguard Worker  *
314*e5436536SAndroid Build Coastguard Worker  * \param          FIXP_DBL z[]
315*e5436536SAndroid Build Coastguard Worker  *                 Output: vector of length n
316*e5436536SAndroid Build Coastguard Worker  *
317*e5436536SAndroid Build Coastguard Worker  * \param          const FIXP_DBL p12r[]
318*e5436536SAndroid Build Coastguard Worker  *                 Input: vector of the length n
319*e5436536SAndroid Build Coastguard Worker  *
320*e5436536SAndroid Build Coastguard Worker  * \param          const FIXP_DBL p12i[]
321*e5436536SAndroid Build Coastguard Worker  *                 Input: vector of the length n
322*e5436536SAndroid Build Coastguard Worker  *
323*e5436536SAndroid Build Coastguard Worker  * \param          const FIXP_DBL p1[]
324*e5436536SAndroid Build Coastguard Worker  *                 Input: vector of the length n
325*e5436536SAndroid Build Coastguard Worker  *
326*e5436536SAndroid Build Coastguard Worker  * \param          const FIXP_DBL p2[]
327*e5436536SAndroid Build Coastguard Worker  *                 Input: vector of the length n
328*e5436536SAndroid Build Coastguard Worker  *
329*e5436536SAndroid Build Coastguard Worker  * \param          int scaleP12[]
330*e5436536SAndroid Build Coastguard Worker  *                 Input: scalefactor of p12r and p12i
331*e5436536SAndroid Build Coastguard Worker  *
332*e5436536SAndroid Build Coastguard Worker  * \param          int scaleP
333*e5436536SAndroid Build Coastguard Worker  *                 Input: scalefactor of p1 and p2
334*e5436536SAndroid Build Coastguard Worker  *
335*e5436536SAndroid Build Coastguard Worker  * \param          int n
336*e5436536SAndroid Build Coastguard Worker  *                 Input: length of vector p12r[], p12i[], p1[] and p2[]
337*e5436536SAndroid Build Coastguard Worker  *
338*e5436536SAndroid Build Coastguard Worker  * \return         void
339*e5436536SAndroid Build Coastguard Worker  */
340*e5436536SAndroid Build Coastguard Worker void calcCoherenceVec(FIXP_DBL *const z, const FIXP_DBL *const p12r,
341*e5436536SAndroid Build Coastguard Worker                       const FIXP_DBL *const p12i, const FIXP_DBL *const p1,
342*e5436536SAndroid Build Coastguard Worker                       const FIXP_DBL *const p2, const INT scaleP12,
343*e5436536SAndroid Build Coastguard Worker                       const INT scaleP, const INT n);
344*e5436536SAndroid Build Coastguard Worker 
345*e5436536SAndroid Build Coastguard Worker /**
346*e5436536SAndroid Build Coastguard Worker  * \brief          Vector function : Z[j][i] = a[pb] * X[j][i] + b[pb] *
347*e5436536SAndroid Build Coastguard Worker  * Y[j][i],  j=0,...,nHybridBands-1;  i=startTimeSlot,...,nTimeSlots-1;
348*e5436536SAndroid Build Coastguard Worker  * pb=0,...,nParameterBands-1
349*e5436536SAndroid Build Coastguard Worker  *
350*e5436536SAndroid Build Coastguard Worker  *                 Description : re{Z[j][i]} = a[pb] * re{X[j][i]} + b[pb] *
351*e5436536SAndroid Build Coastguard Worker  * re{Y[j][i]},  j=0,...,nHybridBands-1;  i=startTimeSlot,...,nTimeSlots-1;
352*e5436536SAndroid Build Coastguard Worker  * pb=0,...,nParameterBands-1 im{Z[j][i]} = a[pb] * im{X[j][i]} + b[pb] *
353*e5436536SAndroid Build Coastguard Worker  * im{Y[j][i]},  j=0,...,nHybridBands-1;
354*e5436536SAndroid Build Coastguard Worker  * i=startTimeSlot,...,nTimeSlots-1;  pb=0,...,nParameterBands-1
355*e5436536SAndroid Build Coastguard Worker  *
356*e5436536SAndroid Build Coastguard Worker  *                 It is allowed to overlay X[] or Y[] with Z[]. The scalefactor
357*e5436536SAndroid Build Coastguard Worker  * of channel 1 is updated with the common scalefactor of channel 1 and
358*e5436536SAndroid Build Coastguard Worker  * channel 2.
359*e5436536SAndroid Build Coastguard Worker  *
360*e5436536SAndroid Build Coastguard Worker  * \param          FIXP_DPK **Z
361*e5436536SAndroid Build Coastguard Worker  *                 Output: vector of the length nHybridBands*nTimeSlots
362*e5436536SAndroid Build Coastguard Worker  *
363*e5436536SAndroid Build Coastguard Worker  * \param          const FIXP_DBL *a
364*e5436536SAndroid Build Coastguard Worker  *                 Input: vector of length nParameterBands
365*e5436536SAndroid Build Coastguard Worker  *
366*e5436536SAndroid Build Coastguard Worker  * \param          const FIXP_DPK **X
367*e5436536SAndroid Build Coastguard Worker  *                 Input: vector of the length nHybridBands*nTimeSlots
368*e5436536SAndroid Build Coastguard Worker  *
369*e5436536SAndroid Build Coastguard Worker  * \param          const FIXP_DBL *b
370*e5436536SAndroid Build Coastguard Worker  *                 Input: vector of length nParameterBands
371*e5436536SAndroid Build Coastguard Worker  *
372*e5436536SAndroid Build Coastguard Worker  * \param          const FIXP_DPK **Y
373*e5436536SAndroid Build Coastguard Worker  *                 Input: vector of the length nHybridBands*nTimeSlots
374*e5436536SAndroid Build Coastguard Worker  *
375*e5436536SAndroid Build Coastguard Worker  * \param          int scale
376*e5436536SAndroid Build Coastguard Worker  *                 Input: scale of vector a and b
377*e5436536SAndroid Build Coastguard Worker  *
378*e5436536SAndroid Build Coastguard Worker  * \param          int *scaleCh1
379*e5436536SAndroid Build Coastguard Worker  *                 Input: scale of ch1
380*e5436536SAndroid Build Coastguard Worker  *
381*e5436536SAndroid Build Coastguard Worker  * \param          int scaleCh2
382*e5436536SAndroid Build Coastguard Worker  *                 Input: scale of ch2
383*e5436536SAndroid Build Coastguard Worker  *
384*e5436536SAndroid Build Coastguard Worker  * \param          UCHAR *pParameterBand2HybridBandOffset
385*e5436536SAndroid Build Coastguard Worker  *                 Input: vector of length nParameterBands
386*e5436536SAndroid Build Coastguard Worker  *
387*e5436536SAndroid Build Coastguard Worker  * \param          int nTimeSlots
388*e5436536SAndroid Build Coastguard Worker  *                 Input: number of time slots
389*e5436536SAndroid Build Coastguard Worker  *
390*e5436536SAndroid Build Coastguard Worker  * \param          int startTimeSlot
391*e5436536SAndroid Build Coastguard Worker  *                 Input: start time slot
392*e5436536SAndroid Build Coastguard Worker  *
393*e5436536SAndroid Build Coastguard Worker  * \return         void
394*e5436536SAndroid Build Coastguard Worker  */
395*e5436536SAndroid Build Coastguard Worker void addWeightedCplxVec(FIXP_DPK *const *const Z, const FIXP_DBL *const a,
396*e5436536SAndroid Build Coastguard Worker                         const FIXP_DPK *const *const X, const FIXP_DBL *const b,
397*e5436536SAndroid Build Coastguard Worker                         const FIXP_DPK *const *const Y, const INT scale,
398*e5436536SAndroid Build Coastguard Worker                         INT *const scaleCh1, const INT scaleCh2,
399*e5436536SAndroid Build Coastguard Worker                         const UCHAR *const pParameterBand2HybridBandOffset,
400*e5436536SAndroid Build Coastguard Worker                         const INT nParameterBands, const INT nTimeSlots,
401*e5436536SAndroid Build Coastguard Worker                         const INT startTimeSlot);
402*e5436536SAndroid Build Coastguard Worker 
403*e5436536SAndroid Build Coastguard Worker /**
404*e5436536SAndroid Build Coastguard Worker  * \brief          Vector function : Calculate the headroom of a complex vector
405*e5436536SAndroid Build Coastguard Worker  * in a parameter band grid
406*e5436536SAndroid Build Coastguard Worker  *
407*e5436536SAndroid Build Coastguard Worker  * \param          FIXP_DPK **x
408*e5436536SAndroid Build Coastguard Worker  *                 Input: pointer to complex input vector
409*e5436536SAndroid Build Coastguard Worker  *
410*e5436536SAndroid Build Coastguard Worker  * \param          UCHAR *pParameterBand2HybridBandOffset
411*e5436536SAndroid Build Coastguard Worker  *                 Input: pointer to hybrid band offsets
412*e5436536SAndroid Build Coastguard Worker  *
413*e5436536SAndroid Build Coastguard Worker  * \param          int *outScaleFactor
414*e5436536SAndroid Build Coastguard Worker  *                 Input: pointer to ouput scalefactor
415*e5436536SAndroid Build Coastguard Worker  *
416*e5436536SAndroid Build Coastguard Worker  * \param          int startTimeSlot
417*e5436536SAndroid Build Coastguard Worker  *                 Input: start time slot
418*e5436536SAndroid Build Coastguard Worker  *
419*e5436536SAndroid Build Coastguard Worker  * \param          int nTimeSlots
420*e5436536SAndroid Build Coastguard Worker  *                 Input: number of time slot
421*e5436536SAndroid Build Coastguard Worker  *
422*e5436536SAndroid Build Coastguard Worker  * \param          int nParamBands
423*e5436536SAndroid Build Coastguard Worker  *                 Input: number of parameter bands
424*e5436536SAndroid Build Coastguard Worker  *
425*e5436536SAndroid Build Coastguard Worker  * \return         void
426*e5436536SAndroid Build Coastguard Worker  */
427*e5436536SAndroid Build Coastguard Worker void FDKcalcPbScaleFactor(const FIXP_DPK *const *const x,
428*e5436536SAndroid Build Coastguard Worker                           const UCHAR *const pParameterBand2HybridBandOffset,
429*e5436536SAndroid Build Coastguard Worker                           INT *const outScaleFactor, const INT startTimeSlot,
430*e5436536SAndroid Build Coastguard Worker                           const INT nTimeSlots, const INT nParamBands);
431*e5436536SAndroid Build Coastguard Worker 
432*e5436536SAndroid Build Coastguard Worker /**
433*e5436536SAndroid Build Coastguard Worker  * \brief          Vector function : Calculate the common headroom of two
434*e5436536SAndroid Build Coastguard Worker  * sparate vectors
435*e5436536SAndroid Build Coastguard Worker  *
436*e5436536SAndroid Build Coastguard Worker  * \param          FIXP_DBL *x
437*e5436536SAndroid Build Coastguard Worker  *                 Input: pointer to first input vector
438*e5436536SAndroid Build Coastguard Worker  *
439*e5436536SAndroid Build Coastguard Worker  * \param          FIXP_DBL *y
440*e5436536SAndroid Build Coastguard Worker  *                 Input: pointer to second input vector
441*e5436536SAndroid Build Coastguard Worker  *
442*e5436536SAndroid Build Coastguard Worker  * \param          int n
443*e5436536SAndroid Build Coastguard Worker  *                 Input: number of samples
444*e5436536SAndroid Build Coastguard Worker  *
445*e5436536SAndroid Build Coastguard Worker  * \return         int headromm in bits
446*e5436536SAndroid Build Coastguard Worker  */
447*e5436536SAndroid Build Coastguard Worker INT FDKcalcScaleFactor(const FIXP_DBL *const x, const FIXP_DBL *const y,
448*e5436536SAndroid Build Coastguard Worker                        const INT n);
449*e5436536SAndroid Build Coastguard Worker 
450*e5436536SAndroid Build Coastguard Worker /**
451*e5436536SAndroid Build Coastguard Worker  * \brief          Vector function : Calculate the headroom of a complex vector
452*e5436536SAndroid Build Coastguard Worker  *
453*e5436536SAndroid Build Coastguard Worker  * \param          FIXP_DPK *x
454*e5436536SAndroid Build Coastguard Worker  *                 Input: pointer to complex input vector
455*e5436536SAndroid Build Coastguard Worker  *
456*e5436536SAndroid Build Coastguard Worker  * \param          INT startBand
457*e5436536SAndroid Build Coastguard Worker  *                 Input: start band
458*e5436536SAndroid Build Coastguard Worker  *
459*e5436536SAndroid Build Coastguard Worker  * \param          INT bands
460*e5436536SAndroid Build Coastguard Worker  *                 Input: number of bands
461*e5436536SAndroid Build Coastguard Worker  *
462*e5436536SAndroid Build Coastguard Worker  * \return         int headromm in bits
463*e5436536SAndroid Build Coastguard Worker  */
464*e5436536SAndroid Build Coastguard Worker INT FDKcalcScaleFactorDPK(const FIXP_DPK *RESTRICT x, const INT startBand,
465*e5436536SAndroid Build Coastguard Worker                           const INT bands);
466*e5436536SAndroid Build Coastguard Worker 
467*e5436536SAndroid Build Coastguard Worker /* Function / Class Definition ***********************************************/
468*e5436536SAndroid Build Coastguard Worker template <class T>
FDKmemcpy_flex(T * const dst,const INT dstStride,const T * const src,const INT srcStride,const INT nSamples)469*e5436536SAndroid Build Coastguard Worker inline void FDKmemcpy_flex(T *const dst, const INT dstStride,
470*e5436536SAndroid Build Coastguard Worker                            const T *const src, const INT srcStride,
471*e5436536SAndroid Build Coastguard Worker                            const INT nSamples) {
472*e5436536SAndroid Build Coastguard Worker   int i;
473*e5436536SAndroid Build Coastguard Worker 
474*e5436536SAndroid Build Coastguard Worker   for (i = 0; i < nSamples; i++) {
475*e5436536SAndroid Build Coastguard Worker     dst[i * dstStride] = src[i * srcStride];
476*e5436536SAndroid Build Coastguard Worker   }
477*e5436536SAndroid Build Coastguard Worker }
478*e5436536SAndroid Build Coastguard Worker 
479*e5436536SAndroid Build Coastguard Worker template <class T>
FDKmemset_flex(T * const x,const T c,const INT nSamples)480*e5436536SAndroid Build Coastguard Worker inline void FDKmemset_flex(T *const x, const T c, const INT nSamples) {
481*e5436536SAndroid Build Coastguard Worker   int i;
482*e5436536SAndroid Build Coastguard Worker 
483*e5436536SAndroid Build Coastguard Worker   for (i = 0; i < nSamples; i++) {
484*e5436536SAndroid Build Coastguard Worker     x[i] = c;
485*e5436536SAndroid Build Coastguard Worker   }
486*e5436536SAndroid Build Coastguard Worker }
487*e5436536SAndroid Build Coastguard Worker 
488*e5436536SAndroid Build Coastguard Worker #endif /* SACENC_VECTORFUNCTIONS_H */
489