1a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* ------------------------------------------------------------------
2a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
4a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * you may not use this file except in compliance with the License.
6a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * You may obtain a copy of the License at
7a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
8a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
10a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Unless required by applicable law or agreed to in writing, software
11a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * express or implied.
14a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * See the License for the specific language governing permissions
15a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * and limitations under the License.
16a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * -------------------------------------------------------------------
17a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber */
18a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/****************************************************************************************
19a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberPortions of this file are derived from the following 3GPP standard:
20a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
21a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    3GPP TS 26.173
22a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec
23a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Available from http://www.3gpp.org
24a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
25a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
26a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberPermission to distribute, modify and use this file under the standard license
27a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberterms listed above has been obtained from the copyright holder.
28a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber****************************************************************************************/
29a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*___________________________________________________________________________
30a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
31a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    This file contains mathematic operations in fixed point.
32a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
33a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    mult_int16_r()     : Same as mult_int16 with rounding
34a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    shr_rnd()          : Same as shr(var1,var2) but with rounding
35a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    div_16by16()       : fractional integer division
36a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    one_ov_sqrt()      : Compute 1/sqrt(L_x)
37a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    one_ov_sqrt_norm() : Compute 1/sqrt(x)
38a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    power_of_2()       : power of 2
39a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Dot_product12()    : Compute scalar product of <x[],y[]> using accumulator
40a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Isqrt()            : inverse square root (16 bits precision).
41a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    amrwb_log_2()      : log2 (16 bits precision).
42a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
43a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    These operations are not standard double precision operations.
44a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    They are used where low complexity is important and the full 32 bits
45a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    precision is not necessary. For example, the function Div_32() has a
46a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    24 bits precision which is enough for our purposes.
47a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
48a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    In this file, the values use theses representations:
49a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
50a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 L_32     : standard signed 32 bits format
51a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 hi, lo   : L_32 = hi<<16 + lo<<1  (DPF - Double Precision Format)
52a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 frac, int16 exp : L_32 = frac << exp-31  (normalised format)
53a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 int, frac        : L_32 = int.frac        (fractional format)
54a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/
55a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
56a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "pv_amr_wb_type_defs.h"
57a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "pvamrwbdecoder_basic_op.h"
58a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "pvamrwb_math_op.h"
59a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
60a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
61a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
62a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
63a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Function Name : mult_int16_r
64a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
65a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Purpose :
66a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
67a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Same as mult_int16 with rounding, i.e.:
68a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       mult_int16_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and
69a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       mult_int16_r(-32768,-32768) = 32767.
70a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
71a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Complexity weight : 2
72a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
73a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Inputs :
74a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
75a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      var1
76a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               16 bit short signed integer (int16) whose value falls in the
77a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               range : 0xffff 8000 <= var1 <= 0x0000 7fff.
78a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
79a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      var2
80a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               16 bit short signed integer (int16) whose value falls in the
81a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               range : 0xffff 8000 <= var1 <= 0x0000 7fff.
82a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
83a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Outputs :
84a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
85a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      none
86a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
87a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Return Value :
88a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
89a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      var_out
90a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               16 bit short signed integer (int16) whose value falls in the
91a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               range : 0xffff 8000 <= var_out <= 0x0000 7fff.
92a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/
93a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
94a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint16 mult_int16_r(int16 var1, int16 var2)
95a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
96a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 L_product_arr;
97a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
98a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_product_arr = (int32) var1 * (int32) var2;      /* product */
99a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_product_arr += (int32) 0x00004000L;      /* round */
100a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_product_arr >>= 15;       /* shift */
101a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if ((L_product_arr >> 15) != (L_product_arr >> 31))
102a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
103a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_product_arr = (L_product_arr >> 31) ^ MAX_16;
104a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
105a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
106a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return ((int16)L_product_arr);
107a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
108a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
109a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
110a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
111a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
112a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
113a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Function Name : shr_rnd
114a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
115a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Purpose :
116a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
117a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Same as shr(var1,var2) but with rounding. Saturate the result in case of|
118a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     underflows or overflows :
119a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      - If var2 is greater than zero :
120a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            if (sub(shl_int16(shr(var1,var2),1),shr(var1,sub(var2,1))))
121a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            is equal to zero
122a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                       then
123a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                       shr_rnd(var1,var2) = shr(var1,var2)
124a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                       else
125a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                       shr_rnd(var1,var2) = add_int16(shr(var1,var2),1)
126a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      - If var2 is less than or equal to zero :
127a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                       shr_rnd(var1,var2) = shr(var1,var2).
128a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
129a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Complexity weight : 2
130a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
131a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Inputs :
132a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
133a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      var1
134a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               16 bit short signed integer (int16) whose value falls in the
135a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               range : 0xffff 8000 <= var1 <= 0x0000 7fff.
136a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
137a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      var2
138a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               16 bit short signed integer (int16) whose value falls in the
139a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               range : 0x0000 0000 <= var2 <= 0x0000 7fff.
140a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
141a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Outputs :
142a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
143a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      none
144a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
145a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Return Value :
146a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
147a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      var_out
148a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               16 bit short signed integer (int16) whose value falls in the
149a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               range : 0xffff 8000 <= var_out <= 0x0000 7fff.
150a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/
151a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
152a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint16 shr_rnd(int16 var1, int16 var2)
153a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
154a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 var_out;
155a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
156a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    var_out = (int16)(var1 >> (var2 & 0xf));
157a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (var2)
158a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
159a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if ((var1 & ((int16) 1 << (var2 - 1))) != 0)
160a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
161a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            var_out++;
162a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
163a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
164a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return (var_out);
165a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
166a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
167a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
168a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
169a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
170a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Function Name : div_16by16
171a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
172a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Purpose :
173a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
174a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Produces a result which is the fractional integer division of var1  by
175a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     var2; var1 and var2 must be positive and var2 must be greater or equal
176a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     to var1; the result is positive (leading bit equal to 0) and truncated
177a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     to 16 bits.
178a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     If var1 = var2 then div(var1,var2) = 32767.
179a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
180a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Complexity weight : 18
181a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
182a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Inputs :
183a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
184a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      var1
185a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               16 bit short signed integer (int16) whose value falls in the
186a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               range : 0x0000 0000 <= var1 <= var2 and var2 != 0.
187a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
188a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      var2
189a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               16 bit short signed integer (int16) whose value falls in the
190a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               range : var1 <= var2 <= 0x0000 7fff and var2 != 0.
191a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
192a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Outputs :
193a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
194a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      none
195a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
196a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Return Value :
197a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
198a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber      var_out
199a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               16 bit short signed integer (int16) whose value falls in the
200a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               range : 0x0000 0000 <= var_out <= 0x0000 7fff.
201a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber               It's a Q15 value (point between b15 and b14).
202a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/
203a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
204a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint16 div_16by16(int16 var1, int16 var2)
205a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
206a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
207a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 var_out = 0;
208a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    register int16 iteration;
209a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 L_num;
210a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 L_denom;
211a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 L_denom_by_2;
212a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 L_denom_by_4;
213a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
214a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if ((var1 > var2) || (var1 < 0))
215a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
216a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        return 0; // used to exit(0);
217a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
218a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (var1)
219a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
220a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        if (var1 != var2)
221a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
222a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
223a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            L_num = (int32) var1;
224a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            L_denom = (int32) var2;
225a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            L_denom_by_2 = (L_denom << 1);
226a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            L_denom_by_4 = (L_denom << 2);
227a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            for (iteration = 5; iteration > 0; iteration--)
228a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            {
229a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                var_out <<= 3;
230a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                L_num   <<= 3;
231a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
232a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                if (L_num >= L_denom_by_4)
233a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
234a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    L_num -= L_denom_by_4;
235a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    var_out |= 4;
236a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
237a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
238a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                if (L_num >= L_denom_by_2)
239a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
240a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    L_num -= L_denom_by_2;
241a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    var_out |=  2;
242a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
243a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
244a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                if (L_num >= (L_denom))
245a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                {
246a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    L_num -= (L_denom);
247a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                    var_out |=  1;
248a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber                }
249a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
250a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            }
251a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
252a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        else
253a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        {
254a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber            var_out = MAX_16;
255a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        }
256a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
257a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
258a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return (var_out);
259a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
260a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
261a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
262a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
263a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
264a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
265a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
266a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Function Name : one_ov_sqrt
267a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
268a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         Compute 1/sqrt(L_x).
269a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         if L_x is negative or zero, result is 1 (7fffffff).
270a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
271a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  Algorithm:
272a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
273a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     1- Normalization of L_x.
274a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     2- call Isqrt_n(L_x, exponant)
275a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     3- L_y = L_x << exponant
276a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/
277a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint32 one_ov_sqrt(     /* (o) Q31 : output value (range: 0<=val<1)         */
278a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 L_x         /* (i) Q0  : input value  (range: 0<=val<=7fffffff) */
279a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
280a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
281a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 exp;
282a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 L_y;
283a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
284a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    exp = normalize_amr_wb(L_x);
285a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_x <<= exp;                 /* L_x is normalized */
286a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    exp = 31 - exp;
287a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
288a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    one_ov_sqrt_norm(&L_x, &exp);
289a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
290a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_y = shl_int32(L_x, exp);                 /* denormalization   */
291a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
292a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return (L_y);
293a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
294a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
295a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
296a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
297a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Function Name : one_ov_sqrt_norm
298a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
299a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         Compute 1/sqrt(value).
300a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber         if value is negative or zero, result is 1 (frac=7fffffff, exp=0).
301a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
302a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  Algorithm:
303a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
304a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     The function 1/sqrt(value) is approximated by a table and linear
305a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     interpolation.
306a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
307a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     1- If exponant is odd then shift fraction right once.
308a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     2- exponant = -((exponant-1)>>1)
309a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     3- i = bit25-b30 of fraction, 16 <= i <= 63 ->because of normalization.
310a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     4- a = bit10-b24
311a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     5- i -=16
312a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     6- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2
313a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/
314a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic const int16 table_isqrt[49] =
315a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
316a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    32767, 31790, 30894, 30070, 29309, 28602, 27945, 27330, 26755, 26214,
317a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    25705, 25225, 24770, 24339, 23930, 23541, 23170, 22817, 22479, 22155,
318a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    21845, 21548, 21263, 20988, 20724, 20470, 20225, 19988, 19760, 19539,
319a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    19326, 19119, 18919, 18725, 18536, 18354, 18176, 18004, 17837, 17674,
320a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    17515, 17361, 17211, 17064, 16921, 16782, 16646, 16514, 16384
321a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber};
322a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
323a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid one_ov_sqrt_norm(
324a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 * frac,                        /* (i/o) Q31: normalized value (1.0 < frac <= 0.5) */
325a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 * exp                          /* (i/o)    : exponent (value = frac x 2^exponent) */
326a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
327a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
328a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 i, a, tmp;
329a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
330a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
331a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (*frac <= (int32) 0)
332a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
333a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *exp = 0;
334a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *frac = 0x7fffffffL;
335a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        return;
336a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
337a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
338a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if ((*exp & 1) == 1)  /* If exponant odd -> shift right */
339a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *frac >>= 1;
340a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
341a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *exp = negate_int16((*exp -  1) >> 1);
342a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
343a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *frac >>= 9;
344a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    i = extract_h(*frac);                  /* Extract b25-b31 */
345a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *frac >>= 1;
346a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    a = (int16)(*frac);                  /* Extract b10-b24 */
347a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    a = (int16)(a & (int16) 0x7fff);
348a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
349a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    i -= 16;
350a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
351a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *frac = L_deposit_h(table_isqrt[i]);   /* table[i] << 16         */
352a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    tmp = table_isqrt[i] - table_isqrt[i + 1];      /* table[i] - table[i+1]) */
353a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
354a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *frac = msu_16by16_from_int32(*frac, tmp, a);          /* frac -=  tmp*a*2       */
355a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
356a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return;
357a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
358a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
359a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
360a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
361a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     Function Name : power_2()
362a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
363a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber       L_x = pow(2.0, exponant.fraction)         (exponant = interger part)
364a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber           = pow(2.0, 0.fraction) << exponant
365a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
366a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber  Algorithm:
367a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
368a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     The function power_2(L_x) is approximated by a table and linear
369a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     interpolation.
370a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
371a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     1- i = bit10-b15 of fraction,   0 <= i <= 31
372a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     2- a = bit0-b9   of fraction
373a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     3- L_x = table[i]<<16 - (table[i] - table[i+1]) * a * 2
374a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber     4- L_x = L_x >> (30-exponant)     (with rounding)
375a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/
376a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberconst int16 table_pow2[33] =
377a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
378a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    16384, 16743, 17109, 17484, 17867, 18258, 18658, 19066, 19484, 19911,
379a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    20347, 20792, 21247, 21713, 22188, 22674, 23170, 23678, 24196, 24726,
380a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    25268, 25821, 26386, 26964, 27554, 28158, 28774, 29405, 30048, 30706,
381a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    31379, 32066, 32767
382a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber};
383a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
384a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint32 power_of_2(                         /* (o) Q0  : result       (range: 0<=val<=0x7fffffff) */
385a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 exponant,                      /* (i) Q0  : Integer part.      (range: 0<=val<=30)   */
386a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 fraction                       /* (i) Q15 : Fractionnal part.  (range: 0.0<=val<1.0) */
387a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
388a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
389a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 exp, i, a, tmp;
390a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 L_x;
391a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
392a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_x = fraction << 5;          /* L_x = fraction<<6           */
393a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    i = (fraction >> 10);                  /* Extract b10-b16 of fraction */
394a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    a = (int16)(L_x);                    /* Extract b0-b9   of fraction */
395a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    a = (int16)(a & (int16) 0x7fff);
396a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
397a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_x = ((int32)table_pow2[i]) << 15;    /* table[i] << 16        */
398a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    tmp = table_pow2[i] - table_pow2[i + 1];        /* table[i] - table[i+1] */
399a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_x -= ((int32)tmp * a);             /* L_x -= tmp*a*2        */
400a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
401a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    exp = 29 - exponant ;
402a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
403a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (exp)
404a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
405a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_x = ((L_x >> exp) + ((L_x >> (exp - 1)) & 1));
406a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
407a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
408a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return (L_x);
409a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
410a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
411a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
412a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
413a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *   Function Name : Dot_product12()
414a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
415a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *       Compute scalar product of <x[],y[]> using accumulator.
416a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
417a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *       The result is normalized (in Q31) with exponent (0..30).
418a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
419a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *  Algorithm:
420a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
421a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *       dot_product = sum(x[i]*y[i])     i=0..N-1
422a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/
423a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
424a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint32 Dot_product12(   /* (o) Q31: normalized result (1 < val <= -1) */
425a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 x[],        /* (i) 12bits: x vector                       */
426a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 y[],        /* (i) 12bits: y vector                       */
427a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 lg,         /* (i)    : vector length                     */
428a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 * exp       /* (o)    : exponent of result (0..+30)       */
429a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
430a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
431a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 i, sft;
432a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 L_sum;
433a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 *pt_x = x;
434a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 *pt_y = y;
435a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
436a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_sum = 1L;
437a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
438a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
439a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    for (i = lg >> 3; i != 0; i--)
440a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
441a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++));
442a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++));
443a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++));
444a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++));
445a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++));
446a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++));
447a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++));
448a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++));
449a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
450a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
451a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    /* Normalize acc in Q31 */
452a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
453a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    sft = normalize_amr_wb(L_sum);
454a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_sum <<= sft;
455a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
456a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *exp = 30 - sft;                    /* exponent = 0..30 */
457a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
458a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return (L_sum);
459a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
460a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
461a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* Table for Log2() */
462a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberconst int16 Log2_norm_table[33] =
463a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
464a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    0, 1455, 2866, 4236, 5568, 6863, 8124, 9352, 10549, 11716,
465a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    12855, 13967, 15054, 16117, 17156, 18172, 19167, 20142, 21097, 22033,
466a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    22951, 23852, 24735, 25603, 26455, 27291, 28113, 28922, 29716, 30497,
467a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    31266, 32023, 32767
468a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber};
469a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
470a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
471a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
472a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *   FUNCTION:   Lg2_normalized()
473a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
474a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *   PURPOSE:   Computes log2(L_x, exp),  where   L_x is positive and
475a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *              normalized, and exp is the normalisation exponent
476a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *              If L_x is negative or zero, the result is 0.
477a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
478a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *   DESCRIPTION:
479a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *        The function Log2(L_x) is approximated by a table and linear
480a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *        interpolation. The following steps are used to compute Log2(L_x)
481a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
482a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *           1- exponent = 30-norm_exponent
483a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *           2- i = bit25-b31 of L_x;  32<=i<=63  (because of normalization).
484a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *           3- a = bit10-b24
485a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *           4- i -=32
486a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *           5- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2
487a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
488a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/
489a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid Lg2_normalized(
490a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 L_x,         /* (i) : input value (normalized)                    */
491a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 exp,         /* (i) : norm_l (L_x)                                */
492a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 *exponent,   /* (o) : Integer part of Log2.   (range: 0<=val<=30) */
493a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 *fraction    /* (o) : Fractional part of Log2. (range: 0<=val<1)  */
494a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
495a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
496a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 i, a, tmp;
497a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 L_y;
498a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
499a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    if (L_x <= (int32) 0)
500a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    {
501a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *exponent = 0;
502a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        *fraction = 0;;
503a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber        return;
504a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    }
505a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
506a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *exponent = 30 - exp;
507a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
508a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_x >>= 9;
509a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    i = extract_h(L_x);                 /* Extract b25-b31 */
510a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_x >>= 1;
511a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    a = (int16)(L_x);                 /* Extract b10-b24 of fraction */
512a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    a &= 0x7fff;
513a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
514a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    i -= 32;
515a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
516a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_y = L_deposit_h(Log2_norm_table[i]);             /* table[i] << 16        */
517a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    tmp = Log2_norm_table[i] - Log2_norm_table[i + 1]; /* table[i] - table[i+1] */
518a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_y = msu_16by16_from_int32(L_y, tmp, a);           /* L_y -= tmp*a*2        */
519a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
520a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *fraction = extract_h(L_y);
521a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
522a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return;
523a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
524a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
525a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
526a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
527a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
528a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
529a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *   FUNCTION:   amrwb_log_2()
530a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
531a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *   PURPOSE:   Computes log2(L_x),  where   L_x is positive.
532a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *              If L_x is negative or zero, the result is 0.
533a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
534a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *   DESCRIPTION:
535a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *        normalizes L_x and then calls Lg2_normalized().
536a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
537a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/
538a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid amrwb_log_2(
539a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 L_x,         /* (i) : input value                                 */
540a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 *exponent,   /* (o) : Integer part of Log2.   (range: 0<=val<=30) */
541a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 *fraction    /* (o) : Fractional part of Log2. (range: 0<=val<1) */
542a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber)
543a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
544a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int16 exp;
545a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
546a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    exp = normalize_amr_wb(L_x);
547a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    Lg2_normalized(shl_int32(L_x, exp), exp, exponent, fraction);
548a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
549a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
550a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
551a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*****************************************************************************
552a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
553a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *  These operations are not standard double precision operations.           *
554a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *  They are used where single precision is not enough but the full 32 bits  *
555a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *  precision is not necessary. For example, the function Div_32() has a     *
556a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *  24 bits precision which is enough for our purposes.                      *
557a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *                                                                           *
558a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *  The double precision numbers use a special representation:               *
559a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *                                                                           *
560a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *     L_32 = hi<<16 + lo<<1                                                 *
561a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *                                                                           *
562a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *  L_32 is a 32 bit integer.                                                *
563a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *  hi and lo are 16 bit signed integers.                                    *
564a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *  As the low part also contains the sign, this allows fast multiplication. *
565a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *                                                                           *
566a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *      0x8000 0000 <= L_32 <= 0x7fff fffe.                                  *
567a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *                                                                           *
568a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *  We will use DPF (Double Precision Format )in this file to specify        *
569a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *  this special format.                                                     *
570a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *****************************************************************************
571a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/
572a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
573a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
574a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
575a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
576a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *  Function int32_to_dpf()
577a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
578a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *  Extract from a 32 bit integer two 16 bit DPF.
579a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
580a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *  Arguments:
581a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
582a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *   L_32      : 32 bit integer.
583a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *               0x8000 0000 <= L_32 <= 0x7fff ffff.
584a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *   hi        : b16 to b31 of L_32
585a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *   lo        : (L_32 - hi<<16)>>1
586a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
587a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/
588a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
589a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid int32_to_dpf(int32 L_32, int16 *hi, int16 *lo)
590a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
591a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *hi = (int16)(L_32 >> 16);
592a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    *lo = (int16)((L_32 - (*hi << 16)) >> 1);
593a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return;
594a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
595a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
596a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
597a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*----------------------------------------------------------------------------
598a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Function mpy_dpf_32()
599a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
600a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *   Multiply two 32 bit integers (DPF). The result is divided by 2**31
601a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
602a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *   L_32 = (hi1*hi2)<<1 + ( (hi1*lo2)>>15 + (lo1*hi2)>>15 )<<1
603a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
604a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *   This operation can also be viewed as the multiplication of two Q31
605a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *   number and the result is also in Q31.
606a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
607a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Arguments:
608a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
609a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *  hi1         hi part of first number
610a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *  lo1         lo part of first number
611a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *  hi2         hi part of second number
612a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *  lo2         lo part of second number
613a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *
614a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/
615a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
616a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint32 mpy_dpf_32(int16 hi1, int16 lo1, int16 hi2, int16 lo2)
617a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{
618a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    int32 L_32;
619a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
620a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_32 = mul_16by16_to_int32(hi1, hi2);
621a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_32 = mac_16by16_to_int32(L_32, mult_int16(hi1, lo2), 1);
622a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    L_32 = mac_16by16_to_int32(L_32, mult_int16(lo1, hi2), 1);
623a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
624a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber    return (L_32);
625a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}
626a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
627a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber
628