/* | |
** 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); | |
} | |