Git init
[external/opencore-amr.git] / opencore / codecs_v2 / audio / gsm_amr / amr_nb / common / src / pow2.cpp
1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 /****************************************************************************************
19 Portions of this file are derived from the following 3GPP standard:
20
21     3GPP TS 26.073
22     ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
23     Available from http://www.3gpp.org
24
25 (C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26 Permission to distribute, modify and use this file under the standard license
27 terms listed above has been obtained from the copyright holder.
28 ****************************************************************************************/
29 /*
30
31  Filename: pow2.cpp
32
33 ------------------------------------------------------------------------------
34 */
35
36 /*----------------------------------------------------------------------------
37 ; INCLUDES
38 ----------------------------------------------------------------------------*/
39 #include    "pow2.h"
40 #include    "basic_op.h"
41
42 /*----------------------------------------------------------------------------
43 ; MACROS
44 ; Define module specific macros here
45 ----------------------------------------------------------------------------*/
46
47
48 /*----------------------------------------------------------------------------
49 ; DEFINES
50 ; Include all pre-processor statements here. Include conditional
51 ; compile variables also.
52 ----------------------------------------------------------------------------*/
53
54 /*----------------------------------------------------------------------------
55 ; LOCAL FUNCTION DEFINITIONS
56 ; Function Prototype declaration
57 ----------------------------------------------------------------------------*/
58
59 /*----------------------------------------------------------------------------
60 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS
61 ; Variable declaration - defined here and used outside this module
62 ----------------------------------------------------------------------------*/
63
64
65 /*
66 ------------------------------------------------------------------------------
67  FUNCTION NAME: Pow2
68 ------------------------------------------------------------------------------
69  INPUT AND OUTPUT DEFINITIONS
70
71  Inputs:
72     exponent = Integer part whose valid range is: 0 <= value <= 30 (Word16)
73     fraction = Fractional part whose valid range is 0 <= value < 1
74
75     pOverflow = pointer to overflow flag
76
77  Outputs:
78     L_x = Result of the Pow2() computation (Word32)
79     pOverflow -> 1 if the Pow2() function results in saturation
80
81  Returns:
82     None
83
84  Global Variables Used:
85     None
86
87  Local Variables Needed:
88     None
89
90 ------------------------------------------------------------------------------
91  FUNCTION DESCRIPTION
92
93  This function computes  L_x = pow(2.0, exponent.fraction)
94
95  The function Pow2(L_x) is approximated by a table and linear interpolation.
96
97  1- i = bit10-b15 of fraction,   0 <= i <= 31
98  2- a = bit0-b9   of fraction
99  3- L_x = table[i]<<16 - (table[i] - table[i+1]) * a * 2
100  4- L_x = L_x >> (30-exponent)     (with rounding)
101
102 ------------------------------------------------------------------------------
103  REQUIREMENTS
104
105  None
106
107 ------------------------------------------------------------------------------
108  REFERENCES
109
110  pow2.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001
111
112 ------------------------------------------------------------------------------
113  PSEUDO-CODE
114
115 Word32 Pow2 (           // (o)  : result       (range: 0<=val<=0x7fffffff)
116     Word16 exponent,    // (i)  : Integer part.      (range: 0<=val<=30)
117     Word16 fraction     // (i)  : Fractional part.  (range: 0.0<=val<1.0)
118 )
119 {
120     Word16 exp, i, a, tmp;
121     Word32 L_x;
122
123     L_x = L_mult (fraction, 32);        // L_x = fraction<<6
124     i = extract_h (L_x);                // Extract b10-b16 of fraction
125     L_x = L_shr (L_x, 1);
126     a = extract_l (L_x);                // Extract b0-b9   of fraction
127     a = a & (Word16) 0x7fff;
128
129     L_x = L_deposit_h (table[i]);       // table[i] << 16
130     tmp = sub (table[i], table[i + 1]); // table[i] - table[i+1]
131     L_x = L_msu (L_x, tmp, a);          // L_x -= tmp*a*2
132
133     exp = sub (30, exponent);
134     L_x = L_shr_r (L_x, exp);
135
136     return (L_x);
137 }
138
139 ------------------------------------------------------------------------------
140  CAUTION [optional]
141  [State any special notes, constraints or cautions for users of this function]
142
143 ------------------------------------------------------------------------------
144 */
145
146 /*----------------------------------------------------------------------------
147 ; FUNCTION CODE
148 ----------------------------------------------------------------------------*/
149
150 OSCL_EXPORT_REF Word32 Pow2(            /* (o)  : result       (range: 0<=val<=0x7fffffff) */
151     Word16 exponent,    /* (i)  : Integer part.      (range: 0<=val<=30)   */
152     Word16 fraction,    /* (i)  : Fractional part.  (range: 0.0<=val<1.0)  */
153     Flag *pOverflow
154 )
155 {
156     Word16 exp, i, a, tmp;
157     Word32 L_x;
158
159     L_x = L_mult(fraction, 32, pOverflow);      /* L_x = fraction<<6    */
160
161     /* Extract b0-b16 of fraction */
162
163     i = ((Word16)(L_x >> 16)) & 31;             /* ensure index i is bounded */
164     a = (Word16)((L_x >> 1) & 0x7fff);
165
166     L_x = ((Word32) pow2_tbl[i] << 16);             /* pow2_tbl[i] << 16       */
167
168     /* pow2_tbl[i] - pow2_tbl[i+1] */
169     tmp = pow2_tbl[i] - pow2_tbl[i + 1];
170     L_x = L_msu(L_x, tmp, a, pOverflow);        /* L_x -= tmp*a*2        */
171
172     exp = 30 - exponent;
173     L_x = L_shr_r(L_x, exp, pOverflow);
174
175     return (L_x);
176 }