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