1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*
2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc.
3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License");
5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** you may not use this file except in compliance with the License.
6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** You may obtain a copy of the License at
7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **     http://www.apache.org/licenses/LICENSE-2.0
9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Unless required by applicable law or agreed to in writing, software
11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS,
12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** See the License for the specific language governing permissions and
14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** limitations under the License.
15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */
16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/***********************************************************************
18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                      *
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*      File             : log2.c                                       *
20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*      Purpose          : Computes log2(L_x)                           *
21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                      *
22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard************************************************************************/
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "log2.h"
25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/********************************************************************************
26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                         INCLUDE FILES
27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*********************************************************************************/
28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h"
29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h"
30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*********************************************************************************
32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                         LOCAL VARIABLES AND TABLES
33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard**********************************************************************************/
34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "log2_tab.h"     /* Table for Log2() */
35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*************************************************************************
37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*   FUNCTION:   Log2_norm()
39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*   PURPOSE:   Computes log2(L_x, exp),  where   L_x is positive and
41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*              normalized, and exp is the normalisation exponent
42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*              If L_x is negative or zero, the result is 0.
43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*   DESCRIPTION:
45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*        The function Log2(L_x) is approximated by a table and linear
46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*        interpolation. The following steps are used to compute Log2(L_x)
47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*           1- exponent = 30-norm_exponent
49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*           2- i = bit25-b31 of L_x;  32<=i<=63  (because of normalization).
50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*           3- a = bit10-b24
51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*           4- i -=32
52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*           5- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2
53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*************************************************************************/
55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Log2_norm (
57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word32 L_x,         /* (i) : input value (normalized)                    */
58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 exp,         /* (i) : norm_l (L_x)                                */
59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 *exponent,   /* (o) : Integer part of Log2.   (range: 0<=val<=30) */
60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 *fraction    /* (o) : Fractional part of Log2. (range: 0<=val<1)  */
61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	       )
62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 i, a, tmp;
64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word32 L_y;
65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (L_x <= (Word32) 0)
66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
67b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		*exponent = 0;
68b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		*fraction = 0;
69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		return;
70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
71b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	*exponent = (30 - exp);
72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	L_x = (L_x >> 9);
73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	i = extract_h (L_x);                /* Extract b25-b31 */
74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	L_x = (L_x >> 1);
75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	a = (Word16)(L_x);                /* Extract b10-b24 of fraction */
76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	a = (Word16)(a & (Word16)0x7fff);
77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	i -= 32;
78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	L_y = L_deposit_h (table[i]);       /* table[i] << 16        */
79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	tmp = vo_sub(table[i], table[i + 1]); /* table[i] - table[i+1] */
80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	L_y = vo_L_msu (L_y, tmp, a);          /* L_y -= tmp*a*2        */
81b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	*fraction = extract_h (L_y);
82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return;
84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*************************************************************************
87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*   FUNCTION:   Log2()
89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*   PURPOSE:   Computes log2(L_x),  where   L_x is positive.
91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*              If L_x is negative or zero, the result is 0.
92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*   DESCRIPTION:
94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*        normalizes L_x and then calls Log2_norm().
95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*
96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*************************************************************************/
97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid Log2 (
99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word32 L_x,         /* (i) : input value                                 */
100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 *exponent,   /* (o) : Integer part of Log2.   (range: 0<=val<=30) */
101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 *fraction    /* (o) : Fractional part of Log2. (range: 0<=val<1) */
102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	  )
103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 exp;
105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	exp = norm_l(L_x);
107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Log2_norm ((L_x << exp), exp, exponent, fraction);
108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
112