1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker *
3*15dc779aSAndroid Build Coastguard Worker * Copyright (C) 2023 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker *
5*15dc779aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker *
9*15dc779aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker *
11*15dc779aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker *
17*15dc779aSAndroid Build Coastguard Worker *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker */
20*15dc779aSAndroid Build Coastguard Worker #ifndef IXHEAACD_MPS_BASIC_OP_H
21*15dc779aSAndroid Build Coastguard Worker #define IXHEAACD_MPS_BASIC_OP_H
22*15dc779aSAndroid Build Coastguard Worker
23*15dc779aSAndroid Build Coastguard Worker #define NORM32 (0x40000000)
24*15dc779aSAndroid Build Coastguard Worker #define INV_SQRT_2_Q31 (1518500250)
25*15dc779aSAndroid Build Coastguard Worker #define Q_SQRT_TAB (15)
26*15dc779aSAndroid Build Coastguard Worker #define LOG2XQ17 (5171707904LL)
27*15dc779aSAndroid Build Coastguard Worker #define LOG_COEFF1 (27890)
28*15dc779aSAndroid Build Coastguard Worker #define LOG_COEFF2 (16262)
29*15dc779aSAndroid Build Coastguard Worker #define LOG_COEFF3 (7574)
30*15dc779aSAndroid Build Coastguard Worker #define LOG_COEFF4 (1786)
31*15dc779aSAndroid Build Coastguard Worker
32*15dc779aSAndroid Build Coastguard Worker #define TRIG_TABLE_CONV_FAC 326
33*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_get_rshift_bits(WORD64 a)34*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_get_rshift_bits(WORD64 a) {
35*15dc779aSAndroid Build Coastguard Worker WORD32 temp_1, temp_2;
36*15dc779aSAndroid Build Coastguard Worker temp_1 = (WORD32)(a >> 32);
37*15dc779aSAndroid Build Coastguard Worker temp_2 = ixheaac_norm32(temp_1);
38*15dc779aSAndroid Build Coastguard Worker if (temp_2 < 31) {
39*15dc779aSAndroid Build Coastguard Worker return (32 - temp_2);
40*15dc779aSAndroid Build Coastguard Worker } else {
41*15dc779aSAndroid Build Coastguard Worker temp_2 = (WORD32)(a);
42*15dc779aSAndroid Build Coastguard Worker if ((temp_1 ^ temp_2) < 0) {
43*15dc779aSAndroid Build Coastguard Worker return 1;
44*15dc779aSAndroid Build Coastguard Worker } else {
45*15dc779aSAndroid Build Coastguard Worker return 0;
46*15dc779aSAndroid Build Coastguard Worker }
47*15dc779aSAndroid Build Coastguard Worker }
48*15dc779aSAndroid Build Coastguard Worker }
49*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_narrow(WORD64 a,WORD16 * qfac)50*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_narrow(WORD64 a, WORD16 *qfac) {
51*15dc779aSAndroid Build Coastguard Worker WORD32 x;
52*15dc779aSAndroid Build Coastguard Worker x = ixheaacd_mps_get_rshift_bits(a);
53*15dc779aSAndroid Build Coastguard Worker *qfac = 20 - x;
54*15dc779aSAndroid Build Coastguard Worker return (WORD32)((WORD64)a >> x);
55*15dc779aSAndroid Build Coastguard Worker }
56*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_sqrt(WORD32 num,WORD16 * q,const WORD32 * sqrt_tab)57*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_sqrt(WORD32 num, WORD16 *q, const WORD32 *sqrt_tab) {
58*15dc779aSAndroid Build Coastguard Worker WORD32 index, answer, temp;
59*15dc779aSAndroid Build Coastguard Worker WORD k;
60*15dc779aSAndroid Build Coastguard Worker
61*15dc779aSAndroid Build Coastguard Worker if (num == 0) return 0;
62*15dc779aSAndroid Build Coastguard Worker
63*15dc779aSAndroid Build Coastguard Worker k = ixheaac_norm32(num);
64*15dc779aSAndroid Build Coastguard Worker temp = ixheaac_shr32(ixheaac_shl32(num, k), 21);
65*15dc779aSAndroid Build Coastguard Worker *q += k;
66*15dc779aSAndroid Build Coastguard Worker index = temp & 0x1FF;
67*15dc779aSAndroid Build Coastguard Worker answer = sqrt_tab[index];
68*15dc779aSAndroid Build Coastguard Worker if (*q & 1) {
69*15dc779aSAndroid Build Coastguard Worker *q -= 1;
70*15dc779aSAndroid Build Coastguard Worker answer = ixheaac_mult32_shl(answer, INV_SQRT_2_Q31);
71*15dc779aSAndroid Build Coastguard Worker }
72*15dc779aSAndroid Build Coastguard Worker *q = *q >> 1;
73*15dc779aSAndroid Build Coastguard Worker *q += Q_SQRT_TAB;
74*15dc779aSAndroid Build Coastguard Worker return answer;
75*15dc779aSAndroid Build Coastguard Worker }
76*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_reshape_add32(WORD32 op1,WORD32 op2,WORD16 * qop1,WORD16 qop2)77*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_reshape_add32(WORD32 op1, WORD32 op2, WORD16 *qop1,
78*15dc779aSAndroid Build Coastguard Worker WORD16 qop2) {
79*15dc779aSAndroid Build Coastguard Worker WORD64 tempresult;
80*15dc779aSAndroid Build Coastguard Worker if (0 == op2) {
81*15dc779aSAndroid Build Coastguard Worker return op1;
82*15dc779aSAndroid Build Coastguard Worker }
83*15dc779aSAndroid Build Coastguard Worker if (0 == op1) {
84*15dc779aSAndroid Build Coastguard Worker *qop1 = qop2;
85*15dc779aSAndroid Build Coastguard Worker return op2;
86*15dc779aSAndroid Build Coastguard Worker }
87*15dc779aSAndroid Build Coastguard Worker if (*qop1 < qop2) {
88*15dc779aSAndroid Build Coastguard Worker if ((qop2 - *qop1) > 31)
89*15dc779aSAndroid Build Coastguard Worker op2 = 0;
90*15dc779aSAndroid Build Coastguard Worker else
91*15dc779aSAndroid Build Coastguard Worker op2 = op2 >> (qop2 - *qop1);
92*15dc779aSAndroid Build Coastguard Worker tempresult = (WORD64)op1 + (WORD64)op2;
93*15dc779aSAndroid Build Coastguard Worker } else {
94*15dc779aSAndroid Build Coastguard Worker if ((*qop1 - qop2) > 31)
95*15dc779aSAndroid Build Coastguard Worker op1 = 0;
96*15dc779aSAndroid Build Coastguard Worker else
97*15dc779aSAndroid Build Coastguard Worker op1 = op1 >> (*qop1 - qop2);
98*15dc779aSAndroid Build Coastguard Worker *qop1 = qop2;
99*15dc779aSAndroid Build Coastguard Worker tempresult = (WORD64)op1 + (WORD64)op2;
100*15dc779aSAndroid Build Coastguard Worker }
101*15dc779aSAndroid Build Coastguard Worker if (tempresult > (WORD32)0x7fffffff || tempresult < (WORD32)0x80000000) {
102*15dc779aSAndroid Build Coastguard Worker tempresult = tempresult >> 1;
103*15dc779aSAndroid Build Coastguard Worker *qop1 -= 1;
104*15dc779aSAndroid Build Coastguard Worker }
105*15dc779aSAndroid Build Coastguard Worker return (WORD32)tempresult;
106*15dc779aSAndroid Build Coastguard Worker }
107*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_add32(WORD32 a,WORD32 b,WORD16 * q_a,WORD16 q_b)108*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_add32(WORD32 a, WORD32 b, WORD16 *q_a, WORD16 q_b) {
109*15dc779aSAndroid Build Coastguard Worker WORD64 temp_result;
110*15dc779aSAndroid Build Coastguard Worker
111*15dc779aSAndroid Build Coastguard Worker if (a == 0 || b == 0) {
112*15dc779aSAndroid Build Coastguard Worker if (b == 0) {
113*15dc779aSAndroid Build Coastguard Worker return a;
114*15dc779aSAndroid Build Coastguard Worker } else {
115*15dc779aSAndroid Build Coastguard Worker *q_a = q_b;
116*15dc779aSAndroid Build Coastguard Worker return b;
117*15dc779aSAndroid Build Coastguard Worker }
118*15dc779aSAndroid Build Coastguard Worker }
119*15dc779aSAndroid Build Coastguard Worker if (*q_a > q_b) {
120*15dc779aSAndroid Build Coastguard Worker if (((*q_a) - q_b) > 31) {
121*15dc779aSAndroid Build Coastguard Worker a = 0;
122*15dc779aSAndroid Build Coastguard Worker *q_a = q_b;
123*15dc779aSAndroid Build Coastguard Worker } else {
124*15dc779aSAndroid Build Coastguard Worker a = (a >> ((*q_a) - q_b));
125*15dc779aSAndroid Build Coastguard Worker *q_a = q_b;
126*15dc779aSAndroid Build Coastguard Worker }
127*15dc779aSAndroid Build Coastguard Worker } else {
128*15dc779aSAndroid Build Coastguard Worker if ((q_b - (*q_a)) > 31) {
129*15dc779aSAndroid Build Coastguard Worker b = 0;
130*15dc779aSAndroid Build Coastguard Worker } else {
131*15dc779aSAndroid Build Coastguard Worker b = (b >> (q_b - (*q_a)));
132*15dc779aSAndroid Build Coastguard Worker q_b = *q_a;
133*15dc779aSAndroid Build Coastguard Worker }
134*15dc779aSAndroid Build Coastguard Worker }
135*15dc779aSAndroid Build Coastguard Worker temp_result = (WORD64)a + (WORD64)b;
136*15dc779aSAndroid Build Coastguard Worker if (temp_result > (WORD32)0x7fffffff || temp_result < (WORD32)0x80000000) {
137*15dc779aSAndroid Build Coastguard Worker temp_result = temp_result >> 1;
138*15dc779aSAndroid Build Coastguard Worker *q_a -= 1;
139*15dc779aSAndroid Build Coastguard Worker }
140*15dc779aSAndroid Build Coastguard Worker
141*15dc779aSAndroid Build Coastguard Worker return (WORD32)temp_result;
142*15dc779aSAndroid Build Coastguard Worker }
143*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_mult32(WORD32 a,WORD32 b,WORD16 * q_a,WORD16 q_b)144*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32(WORD32 a, WORD32 b, WORD16 *q_a, WORD16 q_b) {
145*15dc779aSAndroid Build Coastguard Worker WORD64 temp_result;
146*15dc779aSAndroid Build Coastguard Worker WORD32 temp;
147*15dc779aSAndroid Build Coastguard Worker
148*15dc779aSAndroid Build Coastguard Worker if (a == 0 || b == 0) {
149*15dc779aSAndroid Build Coastguard Worker temp_result = 0;
150*15dc779aSAndroid Build Coastguard Worker *q_a = 15;
151*15dc779aSAndroid Build Coastguard Worker return (WORD32)temp_result;
152*15dc779aSAndroid Build Coastguard Worker }
153*15dc779aSAndroid Build Coastguard Worker
154*15dc779aSAndroid Build Coastguard Worker *q_a = *q_a + q_b;
155*15dc779aSAndroid Build Coastguard Worker
156*15dc779aSAndroid Build Coastguard Worker temp_result = (WORD64)a * (WORD64)b;
157*15dc779aSAndroid Build Coastguard Worker temp = ixheaacd_mps_get_rshift_bits(temp_result);
158*15dc779aSAndroid Build Coastguard Worker if (0 != temp) {
159*15dc779aSAndroid Build Coastguard Worker *q_a -= temp;
160*15dc779aSAndroid Build Coastguard Worker temp_result = temp_result >> temp;
161*15dc779aSAndroid Build Coastguard Worker }
162*15dc779aSAndroid Build Coastguard Worker
163*15dc779aSAndroid Build Coastguard Worker return (WORD32)temp_result;
164*15dc779aSAndroid Build Coastguard Worker }
165*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_mult32x32(WORD32 a,WORD32 b,WORD16 * q_a,WORD16 q_b)166*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32x32(WORD32 a, WORD32 b, WORD16 *q_a,
167*15dc779aSAndroid Build Coastguard Worker WORD16 q_b) {
168*15dc779aSAndroid Build Coastguard Worker WORD64 temp_result;
169*15dc779aSAndroid Build Coastguard Worker if (a == 0 || b == 0) {
170*15dc779aSAndroid Build Coastguard Worker temp_result = 0;
171*15dc779aSAndroid Build Coastguard Worker *q_a = 15;
172*15dc779aSAndroid Build Coastguard Worker return (WORD32)temp_result;
173*15dc779aSAndroid Build Coastguard Worker }
174*15dc779aSAndroid Build Coastguard Worker *q_a = *q_a + q_b;
175*15dc779aSAndroid Build Coastguard Worker
176*15dc779aSAndroid Build Coastguard Worker temp_result = (WORD64)a * (WORD64)b;
177*15dc779aSAndroid Build Coastguard Worker while (temp_result > (WORD32)0x7fffffff || temp_result < (WORD32)0x80000000) {
178*15dc779aSAndroid Build Coastguard Worker temp_result = temp_result >> 1;
179*15dc779aSAndroid Build Coastguard Worker *q_a -= 1;
180*15dc779aSAndroid Build Coastguard Worker }
181*15dc779aSAndroid Build Coastguard Worker
182*15dc779aSAndroid Build Coastguard Worker return (WORD32)temp_result;
183*15dc779aSAndroid Build Coastguard Worker }
184*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_mult32_shr_n(WORD32 a,WORD32 b,WORD16 n)185*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32_shr_n(WORD32 a, WORD32 b, WORD16 n) {
186*15dc779aSAndroid Build Coastguard Worker WORD32 result;
187*15dc779aSAndroid Build Coastguard Worker WORD64 temp_result;
188*15dc779aSAndroid Build Coastguard Worker
189*15dc779aSAndroid Build Coastguard Worker temp_result = (WORD64)a * (WORD64)b;
190*15dc779aSAndroid Build Coastguard Worker result = (WORD32)(temp_result >> n);
191*15dc779aSAndroid Build Coastguard Worker
192*15dc779aSAndroid Build Coastguard Worker return (result);
193*15dc779aSAndroid Build Coastguard Worker }
194*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_mult32_shr_30(WORD32 a,WORD32 b)195*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32_shr_30(WORD32 a, WORD32 b) {
196*15dc779aSAndroid Build Coastguard Worker WORD32 result;
197*15dc779aSAndroid Build Coastguard Worker WORD64 temp_result;
198*15dc779aSAndroid Build Coastguard Worker
199*15dc779aSAndroid Build Coastguard Worker temp_result = (WORD64)a * (WORD64)b;
200*15dc779aSAndroid Build Coastguard Worker result = (WORD32)(temp_result >> 30);
201*15dc779aSAndroid Build Coastguard Worker
202*15dc779aSAndroid Build Coastguard Worker return (result);
203*15dc779aSAndroid Build Coastguard Worker }
204*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_mult32_shr_16(WORD32 a,WORD32 b)205*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32_shr_16(WORD32 a, WORD32 b) {
206*15dc779aSAndroid Build Coastguard Worker WORD32 result;
207*15dc779aSAndroid Build Coastguard Worker WORD64 temp_result;
208*15dc779aSAndroid Build Coastguard Worker
209*15dc779aSAndroid Build Coastguard Worker temp_result = (WORD64)a * (WORD64)b;
210*15dc779aSAndroid Build Coastguard Worker result = (WORD32)(temp_result >> 16);
211*15dc779aSAndroid Build Coastguard Worker return (result);
212*15dc779aSAndroid Build Coastguard Worker }
213*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_mult32x16_shr_16(WORD32 a,WORD32 b)214*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32x16_shr_16(WORD32 a, WORD32 b) {
215*15dc779aSAndroid Build Coastguard Worker WORD32 result;
216*15dc779aSAndroid Build Coastguard Worker WORD64 temp_result;
217*15dc779aSAndroid Build Coastguard Worker temp_result = (WORD64)a * (WORD64)b;
218*15dc779aSAndroid Build Coastguard Worker result = (WORD32)(temp_result >> 16);
219*15dc779aSAndroid Build Coastguard Worker return (result);
220*15dc779aSAndroid Build Coastguard Worker }
221*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_mult32_shr_15(WORD32 a,WORD32 b)222*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32_shr_15(WORD32 a, WORD32 b) {
223*15dc779aSAndroid Build Coastguard Worker WORD32 result;
224*15dc779aSAndroid Build Coastguard Worker WORD64 temp_result;
225*15dc779aSAndroid Build Coastguard Worker temp_result = (WORD64)a * (WORD64)b;
226*15dc779aSAndroid Build Coastguard Worker result = (WORD32)ixheaac_sat64_32(temp_result >> 15);
227*15dc779aSAndroid Build Coastguard Worker
228*15dc779aSAndroid Build Coastguard Worker return (result);
229*15dc779aSAndroid Build Coastguard Worker }
230*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_mult32_shr_14(WORD32 a,WORD32 b)231*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_mult32_shr_14(WORD32 a, WORD32 b) {
232*15dc779aSAndroid Build Coastguard Worker WORD32 result;
233*15dc779aSAndroid Build Coastguard Worker WORD64 temp_result;
234*15dc779aSAndroid Build Coastguard Worker
235*15dc779aSAndroid Build Coastguard Worker temp_result = (WORD64)a * (WORD64)b;
236*15dc779aSAndroid Build Coastguard Worker result = (WORD32)(temp_result >> 16);
237*15dc779aSAndroid Build Coastguard Worker result = result << 2;
238*15dc779aSAndroid Build Coastguard Worker
239*15dc779aSAndroid Build Coastguard Worker return (result);
240*15dc779aSAndroid Build Coastguard Worker }
241*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_div_32(WORD32 a,WORD32 b,WORD16 * q_format)242*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_div_32(WORD32 a, WORD32 b, WORD16 *q_format) {
243*15dc779aSAndroid Build Coastguard Worker WORD32 quotient;
244*15dc779aSAndroid Build Coastguard Worker UWORD32 mantissa_nr, mantissa_dr;
245*15dc779aSAndroid Build Coastguard Worker LOOPINDEX i;
246*15dc779aSAndroid Build Coastguard Worker WORD q_nr, q_dr;
247*15dc779aSAndroid Build Coastguard Worker
248*15dc779aSAndroid Build Coastguard Worker quotient = 0;
249*15dc779aSAndroid Build Coastguard Worker
250*15dc779aSAndroid Build Coastguard Worker if (0 == b) {
251*15dc779aSAndroid Build Coastguard Worker *q_format = 0;
252*15dc779aSAndroid Build Coastguard Worker return (a);
253*15dc779aSAndroid Build Coastguard Worker }
254*15dc779aSAndroid Build Coastguard Worker
255*15dc779aSAndroid Build Coastguard Worker quotient = 0;
256*15dc779aSAndroid Build Coastguard Worker
257*15dc779aSAndroid Build Coastguard Worker q_nr = ixheaac_norm32(a);
258*15dc779aSAndroid Build Coastguard Worker mantissa_nr = (UWORD32)a << (q_nr);
259*15dc779aSAndroid Build Coastguard Worker q_dr = ixheaac_norm32(b);
260*15dc779aSAndroid Build Coastguard Worker mantissa_dr = (UWORD32)b << (q_dr);
261*15dc779aSAndroid Build Coastguard Worker *q_format = (WORD)(30 + q_nr - q_dr);
262*15dc779aSAndroid Build Coastguard Worker
263*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < 31; i++) {
264*15dc779aSAndroid Build Coastguard Worker quotient <<= 1;
265*15dc779aSAndroid Build Coastguard Worker
266*15dc779aSAndroid Build Coastguard Worker if (mantissa_nr >= mantissa_dr) {
267*15dc779aSAndroid Build Coastguard Worker mantissa_nr -= mantissa_dr;
268*15dc779aSAndroid Build Coastguard Worker quotient += 1;
269*15dc779aSAndroid Build Coastguard Worker }
270*15dc779aSAndroid Build Coastguard Worker mantissa_nr <<= 1;
271*15dc779aSAndroid Build Coastguard Worker }
272*15dc779aSAndroid Build Coastguard Worker
273*15dc779aSAndroid Build Coastguard Worker if ((a ^ b) < 0) {
274*15dc779aSAndroid Build Coastguard Worker return -(quotient);
275*15dc779aSAndroid Build Coastguard Worker }
276*15dc779aSAndroid Build Coastguard Worker
277*15dc779aSAndroid Build Coastguard Worker return quotient;
278*15dc779aSAndroid Build Coastguard Worker }
279*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_convert_to_qn(WORD32 temp,WORD16 qtemp,WORD16 n)280*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaacd_mps_convert_to_qn(WORD32 temp, WORD16 qtemp, WORD16 n) {
281*15dc779aSAndroid Build Coastguard Worker WORD64 result;
282*15dc779aSAndroid Build Coastguard Worker if (qtemp == n)
283*15dc779aSAndroid Build Coastguard Worker return temp;
284*15dc779aSAndroid Build Coastguard Worker else if (qtemp > n)
285*15dc779aSAndroid Build Coastguard Worker temp = (WORD32)((WORD64)temp >> (qtemp - n));
286*15dc779aSAndroid Build Coastguard Worker else {
287*15dc779aSAndroid Build Coastguard Worker result = (WORD32)((WORD64)temp << (n - qtemp));
288*15dc779aSAndroid Build Coastguard Worker if (result > (WORD32)0x7fffffff || result < (WORD32)0x80000000) {
289*15dc779aSAndroid Build Coastguard Worker return 0;
290*15dc779aSAndroid Build Coastguard Worker } else
291*15dc779aSAndroid Build Coastguard Worker temp = (WORD32)result;
292*15dc779aSAndroid Build Coastguard Worker }
293*15dc779aSAndroid Build Coastguard Worker return temp;
294*15dc779aSAndroid Build Coastguard Worker }
295*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_div32_in_q15(WORD32 num,WORD32 den)296*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_div32_in_q15(WORD32 num, WORD32 den) {
297*15dc779aSAndroid Build Coastguard Worker WORD32 quotient;
298*15dc779aSAndroid Build Coastguard Worker WORD16 q_quotient;
299*15dc779aSAndroid Build Coastguard Worker
300*15dc779aSAndroid Build Coastguard Worker quotient = ixheaacd_mps_div_32(num, den, &q_quotient);
301*15dc779aSAndroid Build Coastguard Worker quotient = ixheaacd_mps_convert_to_qn(quotient, q_quotient, 15);
302*15dc779aSAndroid Build Coastguard Worker return quotient;
303*15dc779aSAndroid Build Coastguard Worker }
304*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_log10(WORD32 a,WORD16 q_a)305*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_log10(WORD32 a, WORD16 q_a) {
306*15dc779aSAndroid Build Coastguard Worker WORD32 x;
307*15dc779aSAndroid Build Coastguard Worker WORD16 q_x;
308*15dc779aSAndroid Build Coastguard Worker WORD32 j, k, temp;
309*15dc779aSAndroid Build Coastguard Worker WORD16 q_num;
310*15dc779aSAndroid Build Coastguard Worker q_num = ixheaac_norm32(a);
311*15dc779aSAndroid Build Coastguard Worker a = a << q_num;
312*15dc779aSAndroid Build Coastguard Worker x = ixheaacd_mps_div_32(a, NORM32, &q_x);
313*15dc779aSAndroid Build Coastguard Worker
314*15dc779aSAndroid Build Coastguard Worker if (q_x > 16)
315*15dc779aSAndroid Build Coastguard Worker x = x >> (q_x - 16);
316*15dc779aSAndroid Build Coastguard Worker else
317*15dc779aSAndroid Build Coastguard Worker x = x << (16 - q_x);
318*15dc779aSAndroid Build Coastguard Worker
319*15dc779aSAndroid Build Coastguard Worker q_num = 30 - (q_num + q_a);
320*15dc779aSAndroid Build Coastguard Worker
321*15dc779aSAndroid Build Coastguard Worker j = x - ONE_IN_Q16;
322*15dc779aSAndroid Build Coastguard Worker k = ixheaacd_mps_mult32_shr_16(SQRT_THREE_Q15, j);
323*15dc779aSAndroid Build Coastguard Worker temp = ixheaacd_mps_mult32_shr_16(j, j);
324*15dc779aSAndroid Build Coastguard Worker k -= ixheaacd_mps_mult32_shr_16(LOG_COEFF1, temp);
325*15dc779aSAndroid Build Coastguard Worker temp = ixheaacd_mps_mult32_shr_16(temp, j);
326*15dc779aSAndroid Build Coastguard Worker k += ixheaacd_mps_mult32_shr_16(LOG_COEFF2, temp);
327*15dc779aSAndroid Build Coastguard Worker temp = ixheaacd_mps_mult32_shr_16(temp, j);
328*15dc779aSAndroid Build Coastguard Worker k -= ixheaacd_mps_mult32_shr_16(LOG_COEFF3, temp);
329*15dc779aSAndroid Build Coastguard Worker temp = ixheaacd_mps_mult32_shr_16(temp, j);
330*15dc779aSAndroid Build Coastguard Worker k += ixheaacd_mps_mult32_shr_16(LOG_COEFF4, temp);
331*15dc779aSAndroid Build Coastguard Worker
332*15dc779aSAndroid Build Coastguard Worker k += (WORD32)(q_num * ((WORD32)LOG2XQ17));
333*15dc779aSAndroid Build Coastguard Worker
334*15dc779aSAndroid Build Coastguard Worker return (k >> 1);
335*15dc779aSAndroid Build Coastguard Worker }
336*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_cos(WORD32 a,const WORD32 * cosine_tab)337*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_cos(WORD32 a, const WORD32 *cosine_tab) {
338*15dc779aSAndroid Build Coastguard Worker WORD32 temp_result;
339*15dc779aSAndroid Build Coastguard Worker
340*15dc779aSAndroid Build Coastguard Worker if (a < 0) {
341*15dc779aSAndroid Build Coastguard Worker a = -a;
342*15dc779aSAndroid Build Coastguard Worker }
343*15dc779aSAndroid Build Coastguard Worker
344*15dc779aSAndroid Build Coastguard Worker a = a % TWO_PI_IN_Q15;
345*15dc779aSAndroid Build Coastguard Worker
346*15dc779aSAndroid Build Coastguard Worker temp_result = cosine_tab[((a * TRIG_TABLE_CONV_FAC) >> 15)];
347*15dc779aSAndroid Build Coastguard Worker return temp_result;
348*15dc779aSAndroid Build Coastguard Worker }
349*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_sin(WORD32 a,const WORD32 * sine_tab)350*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_sin(WORD32 a, const WORD32 *sine_tab) {
351*15dc779aSAndroid Build Coastguard Worker WORD32 temp_result, flag = 0;
352*15dc779aSAndroid Build Coastguard Worker
353*15dc779aSAndroid Build Coastguard Worker if (a < 0) {
354*15dc779aSAndroid Build Coastguard Worker a = -a;
355*15dc779aSAndroid Build Coastguard Worker flag = 1;
356*15dc779aSAndroid Build Coastguard Worker }
357*15dc779aSAndroid Build Coastguard Worker
358*15dc779aSAndroid Build Coastguard Worker a = a % TWO_PI_IN_Q15;
359*15dc779aSAndroid Build Coastguard Worker
360*15dc779aSAndroid Build Coastguard Worker temp_result = sine_tab[((a * TRIG_TABLE_CONV_FAC) >> 15)];
361*15dc779aSAndroid Build Coastguard Worker if (flag) temp_result = -temp_result;
362*15dc779aSAndroid Build Coastguard Worker
363*15dc779aSAndroid Build Coastguard Worker return temp_result;
364*15dc779aSAndroid Build Coastguard Worker }
365*15dc779aSAndroid Build Coastguard Worker
ixheaacd_mps_comp(WORD32 a,WORD32 b,WORD16 * q_a,WORD16 q_b)366*15dc779aSAndroid Build Coastguard Worker static PLATFORM_INLINE WORD32 ixheaacd_mps_comp(WORD32 a, WORD32 b, WORD16 *q_a, WORD16 q_b) {
367*15dc779aSAndroid Build Coastguard Worker if (a == 0 || b == 0) {
368*15dc779aSAndroid Build Coastguard Worker if (a == 0) {
369*15dc779aSAndroid Build Coastguard Worker if (b < 0)
370*15dc779aSAndroid Build Coastguard Worker return 1;
371*15dc779aSAndroid Build Coastguard Worker else
372*15dc779aSAndroid Build Coastguard Worker return 0;
373*15dc779aSAndroid Build Coastguard Worker } else if (b == 0) {
374*15dc779aSAndroid Build Coastguard Worker if (a > 0)
375*15dc779aSAndroid Build Coastguard Worker return 1;
376*15dc779aSAndroid Build Coastguard Worker else
377*15dc779aSAndroid Build Coastguard Worker return 0;
378*15dc779aSAndroid Build Coastguard Worker }
379*15dc779aSAndroid Build Coastguard Worker }
380*15dc779aSAndroid Build Coastguard Worker
381*15dc779aSAndroid Build Coastguard Worker if (*q_a > q_b) {
382*15dc779aSAndroid Build Coastguard Worker a = (a >> ((*q_a) - q_b));
383*15dc779aSAndroid Build Coastguard Worker } else {
384*15dc779aSAndroid Build Coastguard Worker b = (b >> (q_b - (*q_a)));
385*15dc779aSAndroid Build Coastguard Worker }
386*15dc779aSAndroid Build Coastguard Worker
387*15dc779aSAndroid Build Coastguard Worker if (a > b)
388*15dc779aSAndroid Build Coastguard Worker return 1;
389*15dc779aSAndroid Build Coastguard Worker else
390*15dc779aSAndroid Build Coastguard Worker return 0;
391*15dc779aSAndroid Build Coastguard Worker }
392*15dc779aSAndroid Build Coastguard Worker
393*15dc779aSAndroid Build Coastguard Worker #endif /* IXHEAACD_MPS_BASIC_OP_H */
394