1d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/* ------------------------------------------------------------------ 2d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Copyright (C) 1998-2009 PacketVideo 3d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 4d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Licensed under the Apache License, Version 2.0 (the "License"); 5d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * you may not use this file except in compliance with the License. 6d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * You may obtain a copy of the License at 7d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 8d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * http://www.apache.org/licenses/LICENSE-2.0 9d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * 10d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * Unless required by applicable law or agreed to in writing, software 11d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * distributed under the License is distributed on an "AS IS" BASIS, 12d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * express or implied. 14d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * See the License for the specific language governing permissions 15d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * and limitations under the License. 16d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi * ------------------------------------------------------------------- 17d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi */ 18d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/**************************************************************************************** 19d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiPortions of this file are derived from the following 3GPP standard: 20d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 21e6748ce31f18782b7a47a5b2eb251efd83e7b609Andreas Gampe 3GPP TS 26.073 22d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec 23d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Available from http://www.3gpp.org 240e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber 250e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC) 260e092f806b0a4b81785a52da8ba22d2d47087de5Bill GruberPermission to distribute, modify and use this file under the standard license 270e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruberterms listed above has been obtained from the copyright holder. 280e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber****************************************************************************************/ 290e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber/* 300e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber 310e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber Filename: /audio/gsm_amr/c/src/div_32.c 320e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber 330e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber------------------------------------------------------------------------------ 345cb68c86ccb34d42bd4fb59128043037f74763a3James Dong REVISION HISTORY 355cb68c86ccb34d42bd4fb59128043037f74763a3James Dong 365cb68c86ccb34d42bd4fb59128043037f74763a3James Dong Description: Updated template. Changed function interface to pass in a 375cb68c86ccb34d42bd4fb59128043037f74763a3James Dong pointer to overflow flag into the function instead of using a 385cb68c86ccb34d42bd4fb59128043037f74763a3James Dong global flag. Removed inclusion of unwanted header files. Changed 39d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi the name of input and output variables for clarity. 40d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 41d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Description: 42d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 1. Eliminated unused include files. 43d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 2. Replaced l_extract functionality, code size and speed 445cb68c86ccb34d42bd4fb59128043037f74763a3James Dong do not justify calling this function 455cb68c86ccb34d42bd4fb59128043037f74763a3James Dong 3. Eliminated sub() function call, replace by (-), this knowing 46d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi that the result will not saturate. 47d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 480e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber Description: Added casting to eliminate warnings 49d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 500e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber Who: Date: 515cb68c86ccb34d42bd4fb59128043037f74763a3James Dong Description: 52d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 53d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 54d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi------------------------------------------------------------------------------ 55d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi*/ 56d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 57d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/*---------------------------------------------------------------------------- 58d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi; INCLUDES 590e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber----------------------------------------------------------------------------*/ 60d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi#include "basic_op.h" 610e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber 625cb68c86ccb34d42bd4fb59128043037f74763a3James Dong/*---------------------------------------------------------------------------- 630e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber; MACROS 64d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi; [Define module specific macros here] 65d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi----------------------------------------------------------------------------*/ 66d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 67d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/*---------------------------------------------------------------------------- 685cb68c86ccb34d42bd4fb59128043037f74763a3James Dong; DEFINES 69d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi; [Include all pre-processor statements here. Include conditional 70d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi; compile variables also.] 71d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi----------------------------------------------------------------------------*/ 720e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber 73d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/*---------------------------------------------------------------------------- 740e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber; LOCAL FUNCTION DEFINITIONS 755cb68c86ccb34d42bd4fb59128043037f74763a3James Dong; [List function prototypes here] 760e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber----------------------------------------------------------------------------*/ 770e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber 78d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/*---------------------------------------------------------------------------- 79d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi; LOCAL VARIABLE DEFINITIONS 80d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi; [Variable declaration - defined here and used outside this module] 81d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi----------------------------------------------------------------------------*/ 82d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 835cb68c86ccb34d42bd4fb59128043037f74763a3James Dong 845cb68c86ccb34d42bd4fb59128043037f74763a3James Dong/* 85d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi------------------------------------------------------------------------------ 86d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi FUNCTION NAME: div_32 87d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi------------------------------------------------------------------------------ 880e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber INPUT AND OUTPUT DEFINITIONS 89d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 900e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber Inputs: 915cb68c86ccb34d42bd4fb59128043037f74763a3James Dong L_num = 32 bit signed integer (Word32) whose value falls in the 92d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi range : 0x0000 0000 < L_num < L_denom 93d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi L_denom_hi = 16 bit positive normalized integer whose value falls in 94d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi the range : 0x4000 < hi < 0x7fff 95d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi L_denom_lo = 16 bit positive integer whose value falls in the range : 96d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 0 < lo < 0x7fff 97d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 98d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi pOverflow = pointer to overflow (Flag) 99d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 100d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Outputs: 101d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi pOverflow -> 1 if the 32 bit divide operation resulted in overflow 102d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 103d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Returns: 104d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi result = 32-bit quotient of of the division of two 32 bit integers 1056c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong L_num / L_denom (Word32) 1066c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong 107e6748ce31f18782b7a47a5b2eb251efd83e7b609Andreas Gampe Global Variables Used: 1086c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong None 1096c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong 110d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Local Variables Needed: 111d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi None 112d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 1130e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber------------------------------------------------------------------------------ 114d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi FUNCTION DESCRIPTION 115b7e7bdfe784959ac8615851c2741eb9518a5afcfGloria Wang 1165cb68c86ccb34d42bd4fb59128043037f74763a3James Dong This function is a fractional integer division of two 32 bit numbers, the 1175cb68c86ccb34d42bd4fb59128043037f74763a3James Dong numerator L_num and the denominator L_denom. The denominator is formed by 118d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi combining denom_hi and denom_lo. Note that denom_hi is a normalized numbers. 119d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi The numerator and denominator must be positive and the numerator must be 1205cb68c86ccb34d42bd4fb59128043037f74763a3James Dong less than the denominator. 1215cb68c86ccb34d42bd4fb59128043037f74763a3James Dong 122d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi The division is done as follows: 123d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 1. Find 1/L_denom by first approximating: approx = 1 / denom_hi. 1245cb68c86ccb34d42bd4fb59128043037f74763a3James Dong 2. 1/L_denom = approx * (2.0 - L_denom * approx ). 1255cb68c86ccb34d42bd4fb59128043037f74763a3James Dong 3. result = L_num * (1/L_denom). 1265cb68c86ccb34d42bd4fb59128043037f74763a3James Dong 127d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi------------------------------------------------------------------------------ 1285cb68c86ccb34d42bd4fb59128043037f74763a3James Dong REQUIREMENTS 1296c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong 1306c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong None 131e6748ce31f18782b7a47a5b2eb251efd83e7b609Andreas Gampe 1326c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong------------------------------------------------------------------------------ 1336c95d4ff1656007ab5cbf0a6406d80a33bf8b109James Dong REFERENCES 134d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 135d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi [1] div_32() function in oper_32b.c, UMTS GSM AMR speech codec, R99 - 136d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Version 3.2.0, March 2, 2001 1370e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber 138d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi------------------------------------------------------------------------------ 1390e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber PSEUDO-CODE 140d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 141d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 142d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi------------------------------------------------------------------------------ 143d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi RESOURCES USED [optional] 144d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 145d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi When the code is written for a specific target processor the 1460e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber the resources used should be documented below. 147d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 1480e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber HEAP MEMORY USED: x bytes 149d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 150d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi STACK MEMORY USED: x bytes 151d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 152d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi CLOCK CYCLES: (cycle count equation for this function) + (variable 153d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi used to represent cycle count for each subroutine 154d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi called) 1550e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber where: (cycle count variable) = cycle count for [subroutine 156d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi name] 1570e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber 158d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi------------------------------------------------------------------------------ 159d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi CAUTION [optional] 160d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi [State any special notes, constraints or cautions for users of this function] 161d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 162d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi------------------------------------------------------------------------------ 163d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi*/ 1640e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber 165d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi/*---------------------------------------------------------------------------- 1660e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber; FUNCTION CODE 167d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi----------------------------------------------------------------------------*/ 168d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshiWord32 Div_32(Word32 L_num, 169d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Word16 L_denom_hi, 170d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Word16 L_denom_lo, 171d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Flag *pOverflow) 172d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi{ 1730e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber 174d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Word16 approx; 1750e092f806b0a4b81785a52da8ba22d2d47087de5Bill Gruber Word16 hi; 176d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Word16 lo; 177d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Word16 n_hi; 178d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Word16 n_lo; 179d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi Word32 result; 180d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 181d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi /* First approximation: 1 / L_denom = 1/L_denom_hi */ 182d074e30ce44b9e33da43b67a4515b8986ca72b26aimitakeshi 183 approx = div_s((Word16) 0x3fff, L_denom_hi); 184 185 /* 1/L_denom = approx * (2.0 - L_denom * approx) */ 186 187 result = Mpy_32_16(L_denom_hi, L_denom_lo, approx, pOverflow); 188 /* result is > 0 , and less than 1.0 */ 189 result = 0x7fffffffL - result; 190 191 hi = (Word16)(result >> 16); 192 lo = (result >> 1) - (hi << 15); 193 194 result = Mpy_32_16(hi, lo, approx, pOverflow); 195 196 /* L_num * (1/L_denom) */ 197 198 hi = (Word16)(result >> 16); 199 lo = (result >> 1) - (hi << 15); 200 201 n_hi = (Word16)(L_num >> 16); 202 n_lo = (L_num >> 1) - (n_hi << 15); 203 204 result = Mpy_32(n_hi, n_lo, hi, lo, pOverflow); 205 result = L_shl(result, 2, pOverflow); 206 207 return (result); 208} 209 210