blob: f14058e2737f50a174f569d8f4706b038a7a60d6 [file] [log] [blame]
/*
** Copyright 2003-2010, VisualOn, Inc.
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
/***********************************************************************
* *
* File : log2.c *
* Purpose : Computes log2(L_x) *
* *
************************************************************************/
#include "log2.h"
/********************************************************************************
* INCLUDE FILES
*********************************************************************************/
#include "typedef.h"
#include "basic_op.h"
/*********************************************************************************
* LOCAL VARIABLES AND TABLES
**********************************************************************************/
#include "log2_tab.h" /* Table for Log2() */
/*************************************************************************
*
* FUNCTION: Log2_norm()
*
* PURPOSE: Computes log2(L_x, exp), where L_x is positive and
* normalized, and exp is the normalisation exponent
* If L_x is negative or zero, the result is 0.
*
* DESCRIPTION:
* The function Log2(L_x) is approximated by a table and linear
* interpolation. The following steps are used to compute Log2(L_x)
*
* 1- exponent = 30-norm_exponent
* 2- i = bit25-b31 of L_x; 32<=i<=63 (because of normalization).
* 3- a = bit10-b24
* 4- i -=32
* 5- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2
*
*************************************************************************/
void Log2_norm (
Word32 L_x, /* (i) : input value (normalized) */
Word16 exp, /* (i) : norm_l (L_x) */
Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */
Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */
)
{
Word16 i, a, tmp;
Word32 L_y;
if (L_x <= (Word32) 0)
{
*exponent = 0;
*fraction = 0;
return;
}
*exponent = (30 - exp);
L_x = (L_x >> 9);
i = extract_h (L_x); /* Extract b25-b31 */
L_x = (L_x >> 1);
a = (Word16)(L_x); /* Extract b10-b24 of fraction */
a = (Word16)(a & (Word16)0x7fff);
i -= 32;
L_y = L_deposit_h (table[i]); /* table[i] << 16 */
tmp = vo_sub(table[i], table[i + 1]); /* table[i] - table[i+1] */
L_y = vo_L_msu (L_y, tmp, a); /* L_y -= tmp*a*2 */
*fraction = extract_h (L_y);
return;
}
/*************************************************************************
*
* FUNCTION: Log2()
*
* PURPOSE: Computes log2(L_x), where L_x is positive.
* If L_x is negative or zero, the result is 0.
*
* DESCRIPTION:
* normalizes L_x and then calls Log2_norm().
*
*************************************************************************/
void Log2 (
Word32 L_x, /* (i) : input value */
Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */
Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */
)
{
Word16 exp;
exp = norm_l(L_x);
Log2_norm ((L_x << exp), exp, exponent, fraction);
}