• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  ** Copyright 2003-2010, VisualOn, Inc.
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 express or implied.
13  ** See the License for the specific language governing permissions and
14  ** limitations under the License.
15  */
16 
17 /***********************************************************************
18 *                                                                      *
19 *      File             : log2.c                                       *
20 *      Purpose          : Computes log2(L_x)                           *
21 *                                                                      *
22 ************************************************************************/
23 
24 #include "log2.h"
25 /********************************************************************************
26 *                         INCLUDE FILES
27 *********************************************************************************/
28 #include "typedef.h"
29 #include "basic_op.h"
30 
31 /*********************************************************************************
32 *                         LOCAL VARIABLES AND TABLES
33 **********************************************************************************/
34 #include "log2_tab.h"     /* Table for Log2() */
35 
36 /*************************************************************************
37 *
38 *   FUNCTION:   Log2_norm()
39 *
40 *   PURPOSE:   Computes log2(L_x, exp),  where   L_x is positive and
41 *              normalized, and exp is the normalisation exponent
42 *              If L_x is negative or zero, the result is 0.
43 *
44 *   DESCRIPTION:
45 *        The function Log2(L_x) is approximated by a table and linear
46 *        interpolation. The following steps are used to compute Log2(L_x)
47 *
48 *           1- exponent = 30-norm_exponent
49 *           2- i = bit25-b31 of L_x;  32<=i<=63  (because of normalization).
50 *           3- a = bit10-b24
51 *           4- i -=32
52 *           5- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2
53 *
54 *************************************************************************/
55 
Log2_norm(Word32 L_x,Word16 exp,Word16 * exponent,Word16 * fraction)56 void Log2_norm (
57         Word32 L_x,         /* (i) : input value (normalized)                    */
58         Word16 exp,         /* (i) : norm_l (L_x)                                */
59         Word16 *exponent,   /* (o) : Integer part of Log2.   (range: 0<=val<=30) */
60         Word16 *fraction    /* (o) : Fractional part of Log2. (range: 0<=val<1)  */
61            )
62 {
63     Word16 i, a, tmp;
64     Word32 L_y;
65     if (L_x <= (Word32) 0)
66     {
67         *exponent = 0;
68         *fraction = 0;
69         return;
70     }
71     *exponent = (30 - exp);
72     L_x = (L_x >> 9);
73     i = extract_h (L_x);                /* Extract b25-b31 */
74     L_x = (L_x >> 1);
75     a = (Word16)(L_x);                /* Extract b10-b24 of fraction */
76     a = (Word16)(a & (Word16)0x7fff);
77     i -= 32;
78     L_y = L_deposit_h (table[i]);       /* table[i] << 16        */
79     tmp = vo_sub(table[i], table[i + 1]); /* table[i] - table[i+1] */
80     L_y = vo_L_msu (L_y, tmp, a);          /* L_y -= tmp*a*2        */
81     *fraction = extract_h (L_y);
82 
83     return;
84 }
85 
86 /*************************************************************************
87 *
88 *   FUNCTION:   Log2()
89 *
90 *   PURPOSE:   Computes log2(L_x),  where   L_x is positive.
91 *              If L_x is negative or zero, the result is 0.
92 *
93 *   DESCRIPTION:
94 *        normalizes L_x and then calls Log2_norm().
95 *
96 *************************************************************************/
97 
Log2(Word32 L_x,Word16 * exponent,Word16 * fraction)98 void Log2 (
99         Word32 L_x,         /* (i) : input value                                 */
100         Word16 *exponent,   /* (o) : Integer part of Log2.   (range: 0<=val<=30) */
101         Word16 *fraction    /* (o) : Fractional part of Log2. (range: 0<=val<1) */
102       )
103 {
104     Word16 exp;
105 
106     exp = norm_l(L_x);
107     Log2_norm ((L_x << exp), exp, exponent, fraction);
108 }
109 
110 
111 
112