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