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 ( 575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_x, /* (i) : input value (normalized) */ 585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 exp, /* (i) : norm_l (L_x) */ 595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */ 605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */ 615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ) 62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 i, a, tmp; 645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_y; 655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen if (L_x <= (Word32) 0) 665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen { 675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen *exponent = 0; 685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen *fraction = 0; 695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen return; 705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen } 715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen *exponent = (30 - exp); 725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_x = (L_x >> 9); 735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen i = extract_h (L_x); /* Extract b25-b31 */ 745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_x = (L_x >> 1); 755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen a = (Word16)(L_x); /* Extract b10-b24 of fraction */ 765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen a = (Word16)(a & (Word16)0x7fff); 775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen i -= 32; 785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_y = L_deposit_h (table[i]); /* table[i] << 16 */ 795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen tmp = vo_sub(table[i], table[i + 1]); /* table[i] - table[i+1] */ 805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen L_y = vo_L_msu (L_y, tmp, a); /* L_y -= tmp*a*2 */ 815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen *fraction = extract_h (L_y); 82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen 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 ( 995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word32 L_x, /* (i) : input value */ 1005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */ 1015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */ 1025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen ) 103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 1045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Word16 exp; 105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 1065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen exp = norm_l(L_x); 1075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen Log2_norm ((L_x << exp), exp, exponent, fraction); 108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 110e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 112