1 /* ------------------------------------------------------------------ 2 * Copyright (C) 1998-2009 PacketVideo 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13 * express or implied. 14 * See the License for the specific language governing permissions 15 * and limitations under the License. 16 * ------------------------------------------------------------------- 17 */ 18 /**************************************************************************************** 19 Portions of this file are derived from the following 3GPP standard: 20 21 3GPP TS 26.073 22 ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec 23 Available from http://www.3gpp.org 24 25 (C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC) 26 Permission to distribute, modify and use this file under the standard license 27 terms listed above has been obtained from the copyright holder. 28 ****************************************************************************************/ 29 /* 30 31 Filename: /audio/gsm_amr/c/src/pow2.c 32 33 ------------------------------------------------------------------------------ 34 REVISION HISTORY 35 36 Description: Updated template. Changed function interface to pass in a 37 pointer to overflow flag into the function instead of using a 38 global flag. Removed inclusion of "pow2.tab" 39 40 Who: Date: 41 Description: 42 43 ------------------------------------------------------------------------------ 44 */ 45 46 /*---------------------------------------------------------------------------- 47 ; INCLUDES 48 ----------------------------------------------------------------------------*/ 49 #include "pow2.h" 50 #include "basic_op.h" 51 52 /*---------------------------------------------------------------------------- 53 ; MACROS 54 ; Define module specific macros here 55 ----------------------------------------------------------------------------*/ 56 57 58 /*---------------------------------------------------------------------------- 59 ; DEFINES 60 ; Include all pre-processor statements here. Include conditional 61 ; compile variables also. 62 ----------------------------------------------------------------------------*/ 63 64 /*---------------------------------------------------------------------------- 65 ; LOCAL FUNCTION DEFINITIONS 66 ; Function Prototype declaration 67 ----------------------------------------------------------------------------*/ 68 69 /*---------------------------------------------------------------------------- 70 ; LOCAL STORE/BUFFER/POINTER DEFINITIONS 71 ; Variable declaration - defined here and used outside this module 72 ----------------------------------------------------------------------------*/ 73 74 75 /* 76 ------------------------------------------------------------------------------ 77 FUNCTION NAME: Pow2 78 ------------------------------------------------------------------------------ 79 INPUT AND OUTPUT DEFINITIONS 80 81 Inputs: 82 exponent = Integer part whose valid range is: 0 <= value <= 30 (Word16) 83 fraction = Fractional part whose valid range is 0 <= value < 1 84 85 pOverflow = pointer to overflow flag 86 87 Outputs: 88 L_x = Result of the Pow2() computation (Word32) 89 pOverflow -> 1 if the Pow2() function results in saturation 90 91 Returns: 92 None 93 94 Global Variables Used: 95 None 96 97 Local Variables Needed: 98 None 99 100 ------------------------------------------------------------------------------ 101 FUNCTION DESCRIPTION 102 103 This function computes L_x = pow(2.0, exponent.fraction) 104 105 The function Pow2(L_x) is approximated by a table and linear interpolation. 106 107 1- i = bit10-b15 of fraction, 0 <= i <= 31 108 2- a = bit0-b9 of fraction 109 3- L_x = table[i]<<16 - (table[i] - table[i+1]) * a * 2 110 4- L_x = L_x >> (30-exponent) (with rounding) 111 112 ------------------------------------------------------------------------------ 113 REQUIREMENTS 114 115 None 116 117 ------------------------------------------------------------------------------ 118 REFERENCES 119 120 pow2.c, UMTS GSM AMR speech codec, R99 - Version 3.2.0, March 2, 2001 121 122 ------------------------------------------------------------------------------ 123 PSEUDO-CODE 124 125 Word32 Pow2 ( // (o) : result (range: 0<=val<=0x7fffffff) 126 Word16 exponent, // (i) : Integer part. (range: 0<=val<=30) 127 Word16 fraction // (i) : Fractional part. (range: 0.0<=val<1.0) 128 ) 129 { 130 Word16 exp, i, a, tmp; 131 Word32 L_x; 132 133 L_x = L_mult (fraction, 32); // L_x = fraction<<6 134 i = extract_h (L_x); // Extract b10-b16 of fraction 135 L_x = L_shr (L_x, 1); 136 a = extract_l (L_x); // Extract b0-b9 of fraction 137 a = a & (Word16) 0x7fff; 138 139 L_x = L_deposit_h (table[i]); // table[i] << 16 140 tmp = sub (table[i], table[i + 1]); // table[i] - table[i+1] 141 L_x = L_msu (L_x, tmp, a); // L_x -= tmp*a*2 142 143 exp = sub (30, exponent); 144 L_x = L_shr_r (L_x, exp); 145 146 return (L_x); 147 } 148 149 ------------------------------------------------------------------------------ 150 RESOURCES USED [optional] 151 152 When the code is written for a specific target processor the 153 the resources used should be documented below. 154 155 HEAP MEMORY USED: x bytes 156 157 STACK MEMORY USED: x bytes 158 159 CLOCK CYCLES: (cycle count equation for this function) + (variable 160 used to represent cycle count for each subroutine 161 called) 162 where: (cycle count variable) = cycle count for [subroutine 163 name] 164 165 ------------------------------------------------------------------------------ 166 CAUTION [optional] 167 [State any special notes, constraints or cautions for users of this function] 168 169 ------------------------------------------------------------------------------ 170 */ 171 172 /*---------------------------------------------------------------------------- 173 ; FUNCTION CODE 174 ----------------------------------------------------------------------------*/ 175 176 Word32 Pow2( /* (o) : result (range: 0<=val<=0x7fffffff) */ 177 Word16 exponent, /* (i) : Integer part. (range: 0<=val<=30) */ 178 Word16 fraction, /* (i) : Fractional part. (range: 0.0<=val<1.0) */ 179 Flag *pOverflow 180 ) 181 { 182 Word16 exp, i, a, tmp; 183 Word32 L_x; 184 185 L_x = L_mult(fraction, 32, pOverflow); /* L_x = fraction<<6 */ 186 187 /* Extract b0-b16 of fraction */ 188 189 i = ((Word16)(L_x >> 16)) & 31; /* ensure index i is bounded */ 190 a = (Word16)((L_x >> 1) & 0x7fff); 191 192 L_x = L_deposit_h(pow2_tbl[i]); /* pow2_tbl[i] << 16 */ 193 194 /* pow2_tbl[i] - pow2_tbl[i+1] */ 195 tmp = sub(pow2_tbl[i], pow2_tbl[i + 1], pOverflow); 196 L_x = L_msu(L_x, tmp, a, pOverflow); /* L_x -= tmp*a*2 */ 197 198 exp = sub(30, exponent, pOverflow); 199 L_x = L_shr_r(L_x, exp, pOverflow); 200 201 return (L_x); 202 } 203