log2.c revision e2e838afcf03e603a41a0455846eaf9614537c16
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 { 67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *exponent = 0; 68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *fraction = 0; 69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return; 70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 71e2e838afcf03e603a41a0455846eaf9614537c16Mans 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 */ 81e2e838afcf03e603a41a0455846eaf9614537c16Mans 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