1dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/* ------------------------------------------------------------------
2dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Copyright (C) 1998-2009 PacketVideo
3dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
4dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License");
5dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * you may not use this file except in compliance with the License.
6dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * You may obtain a copy of the License at
7dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
8dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *      http://www.apache.org/licenses/LICENSE-2.0
9dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber *
10dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * Unless required by applicable law or agreed to in writing, software
11dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS,
12dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * express or implied.
14dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * See the License for the specific language governing permissions
15dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * and limitations under the License.
16dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber * -------------------------------------------------------------------
17dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber */
18dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*
19dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
20dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Filename: pv_sqrt.c
21dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
22dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
23dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REVISION HISTORY
24dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
25dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
26dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Who:                                   Date: MM/DD/YYYY
27dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber Description:
28dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
29dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
30dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber INPUT AND OUTPUT DEFINITIONS
31dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
32dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 x             32-bit integer
33dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
34dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32 y             32-bit integer
35dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
36dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
37dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
38dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber FUNCTION DESCRIPTION
39dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
40dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Implement root squared of a number
41dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
42dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
43dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REQUIREMENTS
44dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
45dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
46dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
47dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber REFERENCES
48dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
49dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
50dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber PSEUDO-CODE
51dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
52dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber------------------------------------------------------------------------------
53dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber*/
54dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
55dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
56dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
57dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; INCLUDES
58dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
59dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
60dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#ifdef AAC_PLUS
61dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
62dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
63dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_audio_type_defs.h"
64dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
65dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "fxp_mul32.h"
66dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#include "pv_sqrt.h"
67dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
68dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
69dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
70dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; MACROS
71dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Define module specific macros here
72dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
73dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
74dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
75dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
76dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; DEFINES
77dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Include all pre-processor statements here. Include conditional
78dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; compile variables also.
79dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
80dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
81dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
82dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL FUNCTION DEFINITIONS
83dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Function Prototype declaration
84dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
85dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define R_SHIFT     28
86dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#define Q_fmt(x)   (Int32)(x*((Int32)1<<R_SHIFT) + (x>=0?0.5F:-0.5F))
87dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
88dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
89dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huberconst Int32 sqrt_table[9] =
90dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
91dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Q_fmt(-0.13829740941110F),  Q_fmt(0.95383399963991F),
92dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Q_fmt(-2.92784603873353F),  Q_fmt(5.27429191920042F),
93dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Q_fmt(-6.20272445821478F),  Q_fmt(5.04717433019620F),
94dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Q_fmt(-3.03362807640415F),  Q_fmt(1.86178814410910F),
95dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Q_fmt(0.16540758699193F)
96dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber};
97dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
98dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
99dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; LOCAL STORE/BUFFER/POINTER DEFINITIONS
100dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Variable declaration - defined here and used outside this module
101dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
102dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
103dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
104dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL FUNCTION REFERENCES
105dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare functions defined elsewhere and referenced in this module
106dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
107dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
108dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
109dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; EXTERNAL GLOBAL STORE/BUFFER/POINTER REFERENCES
110dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; Declare variables used in this module but defined elsewhere
111dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
112dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
113dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber/*----------------------------------------------------------------------------
114dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber; FUNCTION CODE
115dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber----------------------------------------------------------------------------*/
116dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
117dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
118dacaa73ae5010b66f4224d70a520945e5b653544Andreas Hubervoid pv_sqrt(Int32 man, Int32 exp, Root_sq *result, Int32 *sqrt_cache)
119dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber{
120dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
121dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32   y;
122dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32   xx;
123dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32   nn;
124dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    Int32   i;
125dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    const Int32 *pt_table = sqrt_table;
126dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
127dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
128dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    if (sqrt_cache[0] == man && sqrt_cache[1] == exp)
129dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
130dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        result->root         =        sqrt_cache[2];
131dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        result->shift_factor = (Int16)sqrt_cache[3];
132dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
133dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    else
134dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    {
135dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
136dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        sqrt_cache[0] = man;
137dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        sqrt_cache[1] = exp;
138dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
139dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
140dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        if (man > 0)
141dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
142dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            xx =  man;
143dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (man >= Q_fmt(1.0f))
144dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
145dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                nn = exp + 1;
146dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                while ((xx >>= 1) > Q_fmt(1.0f))
147dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
148dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    nn++;
149dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
150dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
151dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            else if (man < Q_fmt(0.5f))
152dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
153dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                nn = exp - 1;
154dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                while ((xx <<= 1) < Q_fmt(0.5f))
155dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
156dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    nn--;
157dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
158dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
159dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            else
160dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
161dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                nn = exp;
162dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
163dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
164dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
165dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            y  = fxp_mul32_Q28(*(pt_table++), xx);
166dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
167dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            for (i = 3; i != 0; i--)
168dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
169dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                y += *(pt_table++);
170dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                y  = fxp_mul32_Q28(y, xx);
171dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                y += *(pt_table++);
172dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                y  = fxp_mul32_Q28(y, xx);
173dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
174dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            y += *(pt_table++);
175dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            y  = fxp_mul32_Q28(y, xx) + *(pt_table++);
176dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
177dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            if (nn >= 0)
178dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
179dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                if (nn&1)
180dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
181dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    y = fxp_mul32_Q29(y, Q_fmt(1.41421356237310F));
182dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    result->shift_factor = (nn >> 1) - 28;
183dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
184dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                else
185dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
186dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    result->shift_factor = (nn >> 1) - 29;
187dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
188dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
189dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            else
190dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            {
191dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                if (nn&1)
192dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                {
193dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                    y = fxp_mul32_Q28(y, Q_fmt(0.70710678118655F));
194dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                }
195dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
196dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber                result->shift_factor = -((-nn) >> 1) - 29;
197dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            }
198dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
199dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            result->root = y;
200dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
201dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
202dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        else
203dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        {
204dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            result->root = 0;
205dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber            result->shift_factor = 0;
206dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber        }
207dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
208dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    }
209dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
210dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    sqrt_cache[2] = result->root;
211dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber    sqrt_cache[3] = result->shift_factor;
212dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
213dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber}
214dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
215dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
216dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber#endif
217dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
218dacaa73ae5010b66f4224d70a520945e5b653544Andreas Huber
219