117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*
217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** Copyright 2003-2010, VisualOn, Inc.
317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong **
417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** Licensed under the Apache License, Version 2.0 (the "License");
517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** you may not use this file except in compliance with the License.
617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** You may obtain a copy of the License at
717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong **
817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong **     http://www.apache.org/licenses/LICENSE-2.0
917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong **
1017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** Unless required by applicable law or agreed to in writing, software
1117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** distributed under the License is distributed on an "AS IS" BASIS,
1217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** See the License for the specific language governing permissions and
1417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong ** limitations under the License.
1517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong */
1617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
1717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________
1817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|                                                                           |
1917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|  This file contains mathematic operations in fixed point.                 |
2017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|                                                                           |
2117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|  Isqrt()              : inverse square root (16 bits precision).          |
2217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|  Pow2()               : 2^x  (16 bits precision).                         |
2317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|  Log2()               : log2 (16 bits precision).                         |
2417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|  Dot_product()        : scalar product of <x[],y[]>                       |
2517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|                                                                           |
2617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|  These operations are not standard double precision operations.           |
2717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|  They are used where low complexity is important and the full 32 bits     |
2817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|  precision is not necessary. For example, the function Div_32() has a     |
2917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|  24 bits precision which is enough for our purposes.                      |
3017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|                                                                           |
3117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|  In this file, the values use theses representations:                     |
3217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|                                                                           |
3317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|  Word32 L_32     : standard signed 32 bits format                         |
3417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|  Word16 hi, lo   : L_32 = hi<<16 + lo<<1  (DPF - Double Precision Format) |
3517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|  Word32 frac, Word16 exp : L_32 = frac << exp-31  (normalised format)     |
3617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|  Word16 int, frac        : L_32 = int.frac        (fractional format)     |
3717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________|
3817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/
3917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "typedef.h"
4017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "basic_op.h"
4117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong#include "math_op.h"
4217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
4317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________
4417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|                                                                           |
4517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|   Function Name : Isqrt                                                   |
4617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|                                                                           |
4717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|       Compute 1/sqrt(L_x).                                                |
4817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|       if L_x is negative or zero, result is 1 (7fffffff).                 |
4917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|---------------------------------------------------------------------------|
5017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|  Algorithm:                                                               |
5117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|                                                                           |
5217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|   1- Normalization of L_x.                                                |
5317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|   2- call Isqrt_n(L_x, exponant)                                          |
5417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|   3- L_y = L_x << exponant                                                |
5517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________|
5617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/
5717299ab50ceb70d904e610e3b2d7fb2361a11e03James DongWord32 Isqrt(                              /* (o) Q31 : output value (range: 0<=val<1)         */
5817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong		Word32 L_x                            /* (i) Q0  : input value  (range: 0<=val<=7fffffff) */
5917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	    )
6017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{
6117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	Word16 exp;
6217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	Word32 L_y;
6317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	exp = norm_l(L_x);
6417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	L_x = (L_x << exp);                 /* L_x is normalized */
6517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	exp = (31 - exp);
6617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	Isqrt_n(&L_x, &exp);
6717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	L_y = (L_x << exp);                 /* denormalization   */
6817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	return (L_y);
6917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong}
7017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
7117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________
7217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|                                                                           |
7317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|   Function Name : Isqrt_n                                                 |
7417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|                                                                           |
7517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|       Compute 1/sqrt(value).                                              |
7617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|       if value is negative or zero, result is 1 (frac=7fffffff, exp=0).   |
7717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|---------------------------------------------------------------------------|
7817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|  Algorithm:                                                               |
7917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|                                                                           |
8017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|   The function 1/sqrt(value) is approximated by a table and linear        |
8117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|   interpolation.                                                          |
8217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|                                                                           |
8317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|   1- If exponant is odd then shift fraction right once.                   |
8417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|   2- exponant = -((exponant-1)>>1)                                        |
8517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|   3- i = bit25-b30 of fraction, 16 <= i <= 63 ->because of normalization. |
8617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|   4- a = bit10-b24                                                        |
8717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|   5- i -=16                                                               |
8817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|   6- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2            |
8917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________|
9017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/
9117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic Word16 table_isqrt[49] =
9217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{
9317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	32767, 31790, 30894, 30070, 29309, 28602, 27945, 27330, 26755, 26214,
9417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	25705, 25225, 24770, 24339, 23930, 23541, 23170, 22817, 22479, 22155,
9517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	21845, 21548, 21263, 20988, 20724, 20470, 20225, 19988, 19760, 19539,
9617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	19326, 19119, 18919, 18725, 18536, 18354, 18176, 18004, 17837, 17674,
9717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	17515, 17361, 17211, 17064, 16921, 16782, 16646, 16514, 16384
9817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong};
9917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
10017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongvoid Isqrt_n(
10117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong		Word32 * frac,                        /* (i/o) Q31: normalized value (1.0 < frac <= 0.5) */
10217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong		Word16 * exp                          /* (i/o)    : exponent (value = frac x 2^exponent) */
10317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	    )
10417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{
10517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	Word16 i, a, tmp;
10617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
10717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	if (*frac <= (Word32) 0)
10817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	{
10917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong		*exp = 0;
11017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong		*frac = 0x7fffffffL;
11117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong		return;
11217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	}
11317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
11417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	if((*exp & 1) == 1)                       /*If exponant odd -> shift right */
11517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong		*frac = (*frac) >> 1;
11617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
11717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	*exp = negate((*exp - 1) >> 1);
11817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
11917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	*frac = (*frac >> 9);
12017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	i = extract_h(*frac);                  /* Extract b25-b31 */
12117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	*frac = (*frac >> 1);
12217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	a = (Word16)(*frac);                  /* Extract b10-b24 */
12317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	a = (Word16) (a & (Word16) 0x7fff);
12417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	i -= 16;
12517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	*frac = L_deposit_h(table_isqrt[i]);   /* table[i] << 16         */
12617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	tmp = vo_sub(table_isqrt[i], table_isqrt[i + 1]);      /* table[i] - table[i+1]) */
12717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	*frac = vo_L_msu(*frac, tmp, a);          /* frac -=  tmp*a*2       */
12817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
12917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	return;
13017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong}
13117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
13217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________
13317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|                                                                           |
13417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|   Function Name : Pow2()                                                  |
13517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|                                                                           |
13617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|     L_x = pow(2.0, exponant.fraction)         (exponant = interger part)  |
13717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|         = pow(2.0, 0.fraction) << exponant                                |
13817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|---------------------------------------------------------------------------|
13917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|  Algorithm:                                                               |
14017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|                                                                           |
14117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|   The function Pow2(L_x) is approximated by a table and linear            |
14217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|   interpolation.                                                          |
14317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|                                                                           |
14417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|   1- i = bit10-b15 of fraction,   0 <= i <= 31                            |
14517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|   2- a = bit0-b9   of fraction                                            |
14617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|   3- L_x = table[i]<<16 - (table[i] - table[i+1]) * a * 2                 |
14717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|   4- L_x = L_x >> (30-exponant)     (with rounding)                       |
14817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________|
14917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/
15017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dongstatic Word16 table_pow2[33] =
15117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{
15217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	16384, 16743, 17109, 17484, 17867, 18258, 18658, 19066, 19484, 19911,
15317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	20347, 20792, 21247, 21713, 22188, 22674, 23170, 23678, 24196, 24726,
15417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	25268, 25821, 26386, 26964, 27554, 28158, 28774, 29405, 30048, 30706,
15517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	31379, 32066, 32767
15617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong};
15717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
15817299ab50ceb70d904e610e3b2d7fb2361a11e03James DongWord32 Pow2(                               /* (o) Q0  : result       (range: 0<=val<=0x7fffffff) */
15917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong		Word16 exponant,                      /* (i) Q0  : Integer part.      (range: 0<=val<=30)   */
16017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong		Word16 fraction                       /* (i) Q15 : Fractionnal part.  (range: 0.0<=val<1.0) */
16117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	   )
16217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{
16317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	Word16 exp, i, a, tmp;
16417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	Word32 L_x;
16517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
16617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	L_x = vo_L_mult(fraction, 32);            /* L_x = fraction<<6           */
16717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	i = extract_h(L_x);                    /* Extract b10-b16 of fraction */
16817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	L_x =L_x >> 1;
16917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	a = (Word16)(L_x);                    /* Extract b0-b9   of fraction */
17017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	a = (Word16) (a & (Word16) 0x7fff);
17117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
17217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	L_x = L_deposit_h(table_pow2[i]);      /* table[i] << 16        */
17317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	tmp = vo_sub(table_pow2[i], table_pow2[i + 1]);        /* table[i] - table[i+1] */
17417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	L_x -= (tmp * a)<<1;              /* L_x -= tmp*a*2        */
17517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
17617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	exp = vo_sub(30, exponant);
17717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	L_x = vo_L_shr_r(L_x, exp);
17817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
17917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	return (L_x);
18017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong}
18117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
18217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong/*___________________________________________________________________________
18317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|                                                                           |
18417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|   Function Name : Dot_product12()                                         |
18517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|                                                                           |
18617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|       Compute scalar product of <x[],y[]> using accumulator.              |
18717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|                                                                           |
18817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|       The result is normalized (in Q31) with exponent (0..30).            |
18917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|---------------------------------------------------------------------------|
19017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|  Algorithm:                                                               |
19117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|                                                                           |
19217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|       dot_product = sum(x[i]*y[i])     i=0..N-1                           |
19317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong|___________________________________________________________________________|
19417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong*/
19517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
19617299ab50ceb70d904e610e3b2d7fb2361a11e03James DongWord32 Dot_product12(                      /* (o) Q31: normalized result (1 < val <= -1) */
19717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong		Word16 x[],                           /* (i) 12bits: x vector                       */
19817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong		Word16 y[],                           /* (i) 12bits: y vector                       */
19917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong		Word16 lg,                            /* (i)    : vector length                     */
20017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong		Word16 * exp                          /* (o)    : exponent of result (0..+30)       */
20117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong		)
20217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong{
20317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	Word16 sft;
20417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	Word32 i, L_sum;
20517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	L_sum = 0;
20617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	for (i = 0; i < lg; i++)
20717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	{
20817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong		L_sum += x[i] * y[i];
20917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	}
21017299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	L_sum = (L_sum << 1) + 1;
21117299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	/* Normalize acc in Q31 */
21217299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	sft = norm_l(L_sum);
21317299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	L_sum = L_sum << sft;
21417299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	*exp = 30 - sft;            /* exponent = 0..30 */
21517299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong	return (L_sum);
21617299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
21717299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong}
21817299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
21917299ab50ceb70d904e610e3b2d7fb2361a11e03James Dong
220