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