1a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* ------------------------------------------------------------------ 2a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Copyright (C) 1998-2009 PacketVideo 3a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 4a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * you may not use this file except in compliance with the License. 6a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * You may obtain a copy of the License at 7a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 8a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 10a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Unless required by applicable law or agreed to in writing, software 11a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * express or implied. 14a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * See the License for the specific language governing permissions 15a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * and limitations under the License. 16a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * ------------------------------------------------------------------- 17a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber */ 18a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/**************************************************************************************** 19a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberPortions of this file are derived from the following 3GPP standard: 20a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 21a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 3GPP TS 26.173 22a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ANSI-C code for the Adaptive Multi-Rate - Wideband (AMR-WB) speech codec 23a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Available from http://www.3gpp.org 24a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 25a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber(C) 2007, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC) 26a30d40083856cb4edd225faf8b488fab156e5976Andreas HuberPermission to distribute, modify and use this file under the standard license 27a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberterms listed above has been obtained from the copyright holder. 28a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber****************************************************************************************/ 29a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*___________________________________________________________________________ 30a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 31a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber This file contains mathematic operations in fixed point. 32a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 33a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mult_int16_r() : Same as mult_int16 with rounding 34a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber shr_rnd() : Same as shr(var1,var2) but with rounding 35a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber div_16by16() : fractional integer division 36a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber one_ov_sqrt() : Compute 1/sqrt(L_x) 37a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber one_ov_sqrt_norm() : Compute 1/sqrt(x) 38a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber power_of_2() : power of 2 39a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Dot_product12() : Compute scalar product of <x[],y[]> using accumulator 40a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Isqrt() : inverse square root (16 bits precision). 41a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber amrwb_log_2() : log2 (16 bits precision). 42a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 43a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber These operations are not standard double precision operations. 44a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber They are used where low complexity is important and the full 32 bits 45a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber precision is not necessary. For example, the function Div_32() has a 46a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 24 bits precision which is enough for our purposes. 47a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 48a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber In this file, the values use theses representations: 49a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 50a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int32 L_32 : standard signed 32 bits format 51a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 hi, lo : L_32 = hi<<16 + lo<<1 (DPF - Double Precision Format) 52a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int32 frac, int16 exp : L_32 = frac << exp-31 (normalised format) 53a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 int, frac : L_32 = int.frac (fractional format) 54a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/ 55a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 56a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "pv_amr_wb_type_defs.h" 57a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "pvamrwbdecoder_basic_op.h" 58a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber#include "pvamrwb_math_op.h" 59a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 60a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 61a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 62a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 63a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Function Name : mult_int16_r 64a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 65a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Purpose : 66a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 67a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Same as mult_int16 with rounding, i.e.: 68a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mult_int16_r(var1,var2) = extract_l(L_shr(((var1 * var2) + 16384),15)) and 69a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber mult_int16_r(-32768,-32768) = 32767. 70a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 71a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Complexity weight : 2 72a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 73a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs : 74a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 75a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber var1 76a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 16 bit short signed integer (int16) whose value falls in the 77a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber range : 0xffff 8000 <= var1 <= 0x0000 7fff. 78a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 79a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber var2 80a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 16 bit short signed integer (int16) whose value falls in the 81a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber range : 0xffff 8000 <= var1 <= 0x0000 7fff. 82a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 83a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs : 84a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 85a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber none 86a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 87a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Return Value : 88a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 89a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber var_out 90a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 16 bit short signed integer (int16) whose value falls in the 91a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber range : 0xffff 8000 <= var_out <= 0x0000 7fff. 92a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/ 93a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 94a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint16 mult_int16_r(int16 var1, int16 var2) 95a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 96a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int32 L_product_arr; 97a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 98a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_product_arr = (int32) var1 * (int32) var2; /* product */ 99a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_product_arr += (int32) 0x00004000L; /* round */ 100a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_product_arr >>= 15; /* shift */ 101a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((L_product_arr >> 15) != (L_product_arr >> 31)) 102a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 103a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_product_arr = (L_product_arr >> 31) ^ MAX_16; 104a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 105a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 106a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return ((int16)L_product_arr); 107a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 108a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 109a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 110a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 111a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 112a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 113a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Function Name : shr_rnd 114a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 115a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Purpose : 116a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 117a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Same as shr(var1,var2) but with rounding. Saturate the result in case of| 118a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber underflows or overflows : 119a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber - If var2 is greater than zero : 120a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (sub(shl_int16(shr(var1,var2),1),shr(var1,sub(var2,1)))) 121a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber is equal to zero 122a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber then 123a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber shr_rnd(var1,var2) = shr(var1,var2) 124a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 125a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber shr_rnd(var1,var2) = add_int16(shr(var1,var2),1) 126a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber - If var2 is less than or equal to zero : 127a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber shr_rnd(var1,var2) = shr(var1,var2). 128a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 129a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Complexity weight : 2 130a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 131a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs : 132a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 133a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber var1 134a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 16 bit short signed integer (int16) whose value falls in the 135a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber range : 0xffff 8000 <= var1 <= 0x0000 7fff. 136a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 137a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber var2 138a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 16 bit short signed integer (int16) whose value falls in the 139a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber range : 0x0000 0000 <= var2 <= 0x0000 7fff. 140a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 141a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs : 142a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 143a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber none 144a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 145a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Return Value : 146a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 147a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber var_out 148a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 16 bit short signed integer (int16) whose value falls in the 149a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber range : 0xffff 8000 <= var_out <= 0x0000 7fff. 150a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/ 151a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 152a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint16 shr_rnd(int16 var1, int16 var2) 153a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 154a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 var_out; 155a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 156a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber var_out = (int16)(var1 >> (var2 & 0xf)); 157a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (var2) 158a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 159a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((var1 & ((int16) 1 << (var2 - 1))) != 0) 160a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 161a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber var_out++; 162a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 163a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 164a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return (var_out); 165a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 166a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 167a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 168a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 169a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 170a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Function Name : div_16by16 171a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 172a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Purpose : 173a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 174a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Produces a result which is the fractional integer division of var1 by 175a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber var2; var1 and var2 must be positive and var2 must be greater or equal 176a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber to var1; the result is positive (leading bit equal to 0) and truncated 177a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber to 16 bits. 178a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber If var1 = var2 then div(var1,var2) = 32767. 179a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 180a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Complexity weight : 18 181a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 182a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Inputs : 183a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 184a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber var1 185a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 16 bit short signed integer (int16) whose value falls in the 186a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber range : 0x0000 0000 <= var1 <= var2 and var2 != 0. 187a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 188a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber var2 189a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 16 bit short signed integer (int16) whose value falls in the 190a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber range : var1 <= var2 <= 0x0000 7fff and var2 != 0. 191a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 192a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Outputs : 193a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 194a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber none 195a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 196a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Return Value : 197a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 198a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber var_out 199a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 16 bit short signed integer (int16) whose value falls in the 200a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber range : 0x0000 0000 <= var_out <= 0x0000 7fff. 201a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber It's a Q15 value (point between b15 and b14). 202a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/ 203a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 204a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint16 div_16by16(int16 var1, int16 var2) 205a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 206a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 207a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 var_out = 0; 208a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber register int16 iteration; 209a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int32 L_num; 210a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int32 L_denom; 211a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int32 L_denom_by_2; 212a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int32 L_denom_by_4; 213a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 214a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((var1 > var2) || (var1 < 0)) 215a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 216a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return 0; // used to exit(0); 217a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 218a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (var1) 219a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 220a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (var1 != var2) 221a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 222a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 223a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_num = (int32) var1; 224a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_denom = (int32) var2; 225a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_denom_by_2 = (L_denom << 1); 226a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_denom_by_4 = (L_denom << 2); 227a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (iteration = 5; iteration > 0; iteration--) 228a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 229a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber var_out <<= 3; 230a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_num <<= 3; 231a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 232a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (L_num >= L_denom_by_4) 233a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 234a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_num -= L_denom_by_4; 235a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber var_out |= 4; 236a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 237a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 238a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (L_num >= L_denom_by_2) 239a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 240a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_num -= L_denom_by_2; 241a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber var_out |= 2; 242a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 243a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 244a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (L_num >= (L_denom)) 245a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 246a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_num -= (L_denom); 247a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber var_out |= 1; 248a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 249a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 250a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 251a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 252a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber else 253a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 254a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber var_out = MAX_16; 255a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 256a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 257a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 258a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return (var_out); 259a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 260a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 261a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 262a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 263a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 264a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 265a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 266a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Function Name : one_ov_sqrt 267a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 268a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Compute 1/sqrt(L_x). 269a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if L_x is negative or zero, result is 1 (7fffffff). 270a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 271a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Algorithm: 272a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 273a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1- Normalization of L_x. 274a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2- call Isqrt_n(L_x, exponant) 275a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 3- L_y = L_x << exponant 276a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/ 277a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint32 one_ov_sqrt( /* (o) Q31 : output value (range: 0<=val<1) */ 278a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int32 L_x /* (i) Q0 : input value (range: 0<=val<=7fffffff) */ 279a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber) 280a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 281a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 exp; 282a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int32 L_y; 283a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 284a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber exp = normalize_amr_wb(L_x); 285a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_x <<= exp; /* L_x is normalized */ 286a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber exp = 31 - exp; 287a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 288a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber one_ov_sqrt_norm(&L_x, &exp); 289a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 290a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_y = shl_int32(L_x, exp); /* denormalization */ 291a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 292a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return (L_y); 293a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 294a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 295a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 296a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 297a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Function Name : one_ov_sqrt_norm 298a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 299a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Compute 1/sqrt(value). 300a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if value is negative or zero, result is 1 (frac=7fffffff, exp=0). 301a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 302a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Algorithm: 303a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 304a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber The function 1/sqrt(value) is approximated by a table and linear 305a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber interpolation. 306a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 307a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1- If exponant is odd then shift fraction right once. 308a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2- exponant = -((exponant-1)>>1) 309a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 3- i = bit25-b30 of fraction, 16 <= i <= 63 ->because of normalization. 310a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 4- a = bit10-b24 311a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 5- i -=16 312a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 6- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2 313a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/ 314a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberstatic const int16 table_isqrt[49] = 315a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 316a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 32767, 31790, 30894, 30070, 29309, 28602, 27945, 27330, 26755, 26214, 317a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 25705, 25225, 24770, 24339, 23930, 23541, 23170, 22817, 22479, 22155, 318a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 21845, 21548, 21263, 20988, 20724, 20470, 20225, 19988, 19760, 19539, 319a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 19326, 19119, 18919, 18725, 18536, 18354, 18176, 18004, 17837, 17674, 320a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 17515, 17361, 17211, 17064, 16921, 16782, 16646, 16514, 16384 321a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}; 322a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 323a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid one_ov_sqrt_norm( 324a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int32 * frac, /* (i/o) Q31: normalized value (1.0 < frac <= 0.5) */ 325a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 * exp /* (i/o) : exponent (value = frac x 2^exponent) */ 326a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber) 327a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 328a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 i, a, tmp; 329a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 330a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 331a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (*frac <= (int32) 0) 332a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 333a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *exp = 0; 334a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *frac = 0x7fffffffL; 335a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return; 336a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 337a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 338a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if ((*exp & 1) == 1) /* If exponant odd -> shift right */ 339a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *frac >>= 1; 340a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 341a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *exp = negate_int16((*exp - 1) >> 1); 342a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 343a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *frac >>= 9; 344a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber i = extract_h(*frac); /* Extract b25-b31 */ 345a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *frac >>= 1; 346a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber a = (int16)(*frac); /* Extract b10-b24 */ 347a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber a = (int16)(a & (int16) 0x7fff); 348a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 349a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber i -= 16; 350a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 351a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *frac = L_deposit_h(table_isqrt[i]); /* table[i] << 16 */ 352a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber tmp = table_isqrt[i] - table_isqrt[i + 1]; /* table[i] - table[i+1]) */ 353a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 354a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *frac = msu_16by16_from_int32(*frac, tmp, a); /* frac -= tmp*a*2 */ 355a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 356a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return; 357a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 358a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 359a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 360a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 361a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Function Name : power_2() 362a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 363a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_x = pow(2.0, exponant.fraction) (exponant = interger part) 364a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber = pow(2.0, 0.fraction) << exponant 365a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 366a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Algorithm: 367a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 368a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber The function power_2(L_x) is approximated by a table and linear 369a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber interpolation. 370a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 371a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 1- i = bit10-b15 of fraction, 0 <= i <= 31 372a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 2- a = bit0-b9 of fraction 373a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 3- L_x = table[i]<<16 - (table[i] - table[i+1]) * a * 2 374a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 4- L_x = L_x >> (30-exponant) (with rounding) 375a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/ 376a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberconst int16 table_pow2[33] = 377a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 378a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 16384, 16743, 17109, 17484, 17867, 18258, 18658, 19066, 19484, 19911, 379a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 20347, 20792, 21247, 21713, 22188, 22674, 23170, 23678, 24196, 24726, 380a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 25268, 25821, 26386, 26964, 27554, 28158, 28774, 29405, 30048, 30706, 381a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 31379, 32066, 32767 382a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}; 383a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 384a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint32 power_of_2( /* (o) Q0 : result (range: 0<=val<=0x7fffffff) */ 385a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 exponant, /* (i) Q0 : Integer part. (range: 0<=val<=30) */ 386a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 fraction /* (i) Q15 : Fractionnal part. (range: 0.0<=val<1.0) */ 387a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber) 388a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 389a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 exp, i, a, tmp; 390a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int32 L_x; 391a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 392a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_x = fraction << 5; /* L_x = fraction<<6 */ 393a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber i = (fraction >> 10); /* Extract b10-b16 of fraction */ 394a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber a = (int16)(L_x); /* Extract b0-b9 of fraction */ 395a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber a = (int16)(a & (int16) 0x7fff); 396a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 397a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_x = ((int32)table_pow2[i]) << 15; /* table[i] << 16 */ 398a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber tmp = table_pow2[i] - table_pow2[i + 1]; /* table[i] - table[i+1] */ 399a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_x -= ((int32)tmp * a); /* L_x -= tmp*a*2 */ 400a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 401a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber exp = 29 - exponant ; 402a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 403a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (exp) 404a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 405a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_x = ((L_x >> exp) + ((L_x >> (exp - 1)) & 1)); 406a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 407a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 408a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return (L_x); 409a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 410a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 411a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 412a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 413a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Function Name : Dot_product12() 414a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 415a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Compute scalar product of <x[],y[]> using accumulator. 416a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 417a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * The result is normalized (in Q31) with exponent (0..30). 418a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 419a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Algorithm: 420a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 421a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * dot_product = sum(x[i]*y[i]) i=0..N-1 422a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/ 423a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 424a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint32 Dot_product12( /* (o) Q31: normalized result (1 < val <= -1) */ 425a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 x[], /* (i) 12bits: x vector */ 426a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 y[], /* (i) 12bits: y vector */ 427a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 lg, /* (i) : vector length */ 428a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 * exp /* (o) : exponent of result (0..+30) */ 429a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber) 430a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 431a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 i, sft; 432a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int32 L_sum; 433a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 *pt_x = x; 434a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 *pt_y = y; 435a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 436a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_sum = 1L; 437a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 438a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 439a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber for (i = lg >> 3; i != 0; i--) 440a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 441a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++)); 442a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++)); 443a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++)); 444a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++)); 445a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++)); 446a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++)); 447a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++)); 448a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_sum = mac_16by16_to_int32(L_sum, *(pt_x++), *(pt_y++)); 449a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 450a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 451a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber /* Normalize acc in Q31 */ 452a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 453a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber sft = normalize_amr_wb(L_sum); 454a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_sum <<= sft; 455a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 456a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *exp = 30 - sft; /* exponent = 0..30 */ 457a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 458a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return (L_sum); 459a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 460a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 461a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/* Table for Log2() */ 462a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberconst int16 Log2_norm_table[33] = 463a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 464a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 0, 1455, 2866, 4236, 5568, 6863, 8124, 9352, 10549, 11716, 465a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 12855, 13967, 15054, 16117, 17156, 18172, 19167, 20142, 21097, 22033, 466a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 22951, 23852, 24735, 25603, 26455, 27291, 28113, 28922, 29716, 30497, 467a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 31266, 32023, 32767 468a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber}; 469a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 470a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 471a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 472a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * FUNCTION: Lg2_normalized() 473a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 474a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * PURPOSE: Computes log2(L_x, exp), where L_x is positive and 475a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * normalized, and exp is the normalisation exponent 476a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * If L_x is negative or zero, the result is 0. 477a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 478a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * DESCRIPTION: 479a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * The function Log2(L_x) is approximated by a table and linear 480a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * interpolation. The following steps are used to compute Log2(L_x) 481a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 482a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 1- exponent = 30-norm_exponent 483a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 2- i = bit25-b31 of L_x; 32<=i<=63 (because of normalization). 484a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 3- a = bit10-b24 485a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 4- i -=32 486a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 5- fraction = table[i]<<16 - (table[i] - table[i+1]) * a * 2 487a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 488a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber----------------------------------------------------------------------------*/ 489a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid Lg2_normalized( 490a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int32 L_x, /* (i) : input value (normalized) */ 491a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 exp, /* (i) : norm_l (L_x) */ 492a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */ 493a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */ 494a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber) 495a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 496a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 i, a, tmp; 497a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int32 L_y; 498a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 499a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber if (L_x <= (int32) 0) 500a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber { 501a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *exponent = 0; 502a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *fraction = 0;; 503a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return; 504a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber } 505a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 506a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *exponent = 30 - exp; 507a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 508a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_x >>= 9; 509a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber i = extract_h(L_x); /* Extract b25-b31 */ 510a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_x >>= 1; 511a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber a = (int16)(L_x); /* Extract b10-b24 of fraction */ 512a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber a &= 0x7fff; 513a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 514a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber i -= 32; 515a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 516a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_y = L_deposit_h(Log2_norm_table[i]); /* table[i] << 16 */ 517a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber tmp = Log2_norm_table[i] - Log2_norm_table[i + 1]; /* table[i] - table[i+1] */ 518a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_y = msu_16by16_from_int32(L_y, tmp, a); /* L_y -= tmp*a*2 */ 519a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 520a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *fraction = extract_h(L_y); 521a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 522a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return; 523a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 524a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 525a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 526a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 527a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 528a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 529a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * FUNCTION: amrwb_log_2() 530a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 531a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * PURPOSE: Computes log2(L_x), where L_x is positive. 532a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * If L_x is negative or zero, the result is 0. 533a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 534a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * DESCRIPTION: 535a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * normalizes L_x and then calls Lg2_normalized(). 536a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 537a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/ 538a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid amrwb_log_2( 539a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int32 L_x, /* (i) : input value */ 540a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */ 541a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */ 542a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber) 543a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 544a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int16 exp; 545a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 546a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber exp = normalize_amr_wb(L_x); 547a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber Lg2_normalized(shl_int32(L_x, exp), exp, exponent, fraction); 548a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 549a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 550a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 551a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/***************************************************************************** 552a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 553a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * These operations are not standard double precision operations. * 554a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * They are used where single precision is not enough but the full 32 bits * 555a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * precision is not necessary. For example, the function Div_32() has a * 556a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 24 bits precision which is enough for our purposes. * 557a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * * 558a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * The double precision numbers use a special representation: * 559a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * * 560a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * L_32 = hi<<16 + lo<<1 * 561a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * * 562a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * L_32 is a 32 bit integer. * 563a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * hi and lo are 16 bit signed integers. * 564a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * As the low part also contains the sign, this allows fast multiplication. * 565a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * * 566a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 0x8000 0000 <= L_32 <= 0x7fff fffe. * 567a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * * 568a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * We will use DPF (Double Precision Format )in this file to specify * 569a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * this special format. * 570a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ***************************************************************************** 571a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber*/ 572a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 573a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 574a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 575a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 576a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Function int32_to_dpf() 577a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 578a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Extract from a 32 bit integer two 16 bit DPF. 579a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 580a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Arguments: 581a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 582a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * L_32 : 32 bit integer. 583a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 0x8000 0000 <= L_32 <= 0x7fff ffff. 584a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * hi : b16 to b31 of L_32 585a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * lo : (L_32 - hi<<16)>>1 586a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 587a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/ 588a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 589a30d40083856cb4edd225faf8b488fab156e5976Andreas Hubervoid int32_to_dpf(int32 L_32, int16 *hi, int16 *lo) 590a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 591a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *hi = (int16)(L_32 >> 16); 592a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber *lo = (int16)((L_32 - (*hi << 16)) >> 1); 593a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return; 594a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 595a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 596a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 597a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber/*---------------------------------------------------------------------------- 598a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Function mpy_dpf_32() 599a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 600a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Multiply two 32 bit integers (DPF). The result is divided by 2**31 601a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 602a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * L_32 = (hi1*hi2)<<1 + ( (hi1*lo2)>>15 + (lo1*hi2)>>15 )<<1 603a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 604a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * This operation can also be viewed as the multiplication of two Q31 605a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * number and the result is also in Q31. 606a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 607a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * Arguments: 608a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 609a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * hi1 hi part of first number 610a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * lo1 lo part of first number 611a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * hi2 hi part of second number 612a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * lo2 lo part of second number 613a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber * 614a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber ----------------------------------------------------------------------------*/ 615a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 616a30d40083856cb4edd225faf8b488fab156e5976Andreas Huberint32 mpy_dpf_32(int16 hi1, int16 lo1, int16 hi2, int16 lo2) 617a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber{ 618a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber int32 L_32; 619a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 620a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_32 = mul_16by16_to_int32(hi1, hi2); 621a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_32 = mac_16by16_to_int32(L_32, mult_int16(hi1, lo2), 1); 622a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber L_32 = mac_16by16_to_int32(L_32, mult_int16(lo1, hi2), 1); 623a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 624a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber return (L_32); 625a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber} 626a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 627a30d40083856cb4edd225faf8b488fab156e5976Andreas Huber 628