xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_acelp_tools.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *                                                                            *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2018 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 #include <math.h>
21*15dc779aSAndroid Build Coastguard Worker #include <memory.h>
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
23*15dc779aSAndroid Build Coastguard Worker 
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_cnst.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
28*15dc779aSAndroid Build Coastguard Worker 
29*15dc779aSAndroid Build Coastguard Worker const FLOAT32 ixheaacd_gamma_table[17] = {
30*15dc779aSAndroid Build Coastguard Worker     1.0f,      0.92f,     0.8464f,   0.778688f, 0.716393f, 0.659082f,
31*15dc779aSAndroid Build Coastguard Worker     0.606355f, 0.557847f, 0.513219f, 0.472161f, 0.434389f, 0.399637f,
32*15dc779aSAndroid Build Coastguard Worker     0.367666f, 0.338253f, 0.311193f, 0.286298f, 0.263394f};
33*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_rand_gen(WORD16 * seed)34*15dc779aSAndroid Build Coastguard Worker WORD16 ixheaacd_rand_gen(WORD16 *seed) {
35*15dc779aSAndroid Build Coastguard Worker   *seed = (WORD16)(*seed * 31821L + 13849L);
36*15dc779aSAndroid Build Coastguard Worker   return (*seed);
37*15dc779aSAndroid Build Coastguard Worker }
38*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_preemphsis_tool(WORD32 * signal,WORD32 mu,WORD32 len,WORD32 mem)39*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_preemphsis_tool(WORD32 *signal, WORD32 mu, WORD32 len,
40*15dc779aSAndroid Build Coastguard Worker                               WORD32 mem) {
41*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
42*15dc779aSAndroid Build Coastguard Worker   for (i = len - 1; i > 0; i--) {
43*15dc779aSAndroid Build Coastguard Worker     signal[i] -= (WORD32)ixheaac_mul32_sh(mu, signal[i - 1], 16);
44*15dc779aSAndroid Build Coastguard Worker   }
45*15dc779aSAndroid Build Coastguard Worker   signal[0] -= (WORD32)ixheaac_mul32_sh(mu, mem, 16);
46*15dc779aSAndroid Build Coastguard Worker   return;
47*15dc779aSAndroid Build Coastguard Worker }
48*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_preemphsis_tool_float(FLOAT32 * signal,FLOAT32 mu,WORD32 len,FLOAT32 mem)49*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_preemphsis_tool_float(FLOAT32 *signal, FLOAT32 mu, WORD32 len,
50*15dc779aSAndroid Build Coastguard Worker                                     FLOAT32 mem) {
51*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
52*15dc779aSAndroid Build Coastguard Worker   for (i = len - 1; i > 0; i--) {
53*15dc779aSAndroid Build Coastguard Worker     signal[i] = signal[i] - mu * signal[i - 1];
54*15dc779aSAndroid Build Coastguard Worker   }
55*15dc779aSAndroid Build Coastguard Worker   signal[0] -= mu * mem;
56*15dc779aSAndroid Build Coastguard Worker   return;
57*15dc779aSAndroid Build Coastguard Worker }
58*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_deemphsis_tool(FLOAT32 * signal,WORD32 len,FLOAT32 mem)59*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_deemphsis_tool(FLOAT32 *signal, WORD32 len, FLOAT32 mem) {
60*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
61*15dc779aSAndroid Build Coastguard Worker   signal[0] = signal[0] + PREEMPH_FILT_FAC * mem;
62*15dc779aSAndroid Build Coastguard Worker   for (i = 1; i < len; i++) {
63*15dc779aSAndroid Build Coastguard Worker     signal[i] = signal[i] + PREEMPH_FILT_FAC * signal[i - 1];
64*15dc779aSAndroid Build Coastguard Worker   }
65*15dc779aSAndroid Build Coastguard Worker   return;
66*15dc779aSAndroid Build Coastguard Worker }
67*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_lpc_wt_synthesis_tool(FLOAT32 a[],FLOAT32 x[],WORD32 l)68*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_lpc_wt_synthesis_tool(FLOAT32 a[], FLOAT32 x[], WORD32 l) {
69*15dc779aSAndroid Build Coastguard Worker   FLOAT32 s;
70*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j;
71*15dc779aSAndroid Build Coastguard Worker 
72*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < l; i++) {
73*15dc779aSAndroid Build Coastguard Worker     s = x[i];
74*15dc779aSAndroid Build Coastguard Worker     for (j = 1; j <= ORDER; j += 4) {
75*15dc779aSAndroid Build Coastguard Worker       s -= (a[j] * ixheaacd_gamma_table[j]) * x[i - j];
76*15dc779aSAndroid Build Coastguard Worker       s -= (a[j + 1] * ixheaacd_gamma_table[j + 1]) * x[i - (j + 1)];
77*15dc779aSAndroid Build Coastguard Worker       s -= (a[j + 2] * ixheaacd_gamma_table[j + 2]) * x[i - (j + 2)];
78*15dc779aSAndroid Build Coastguard Worker       s -= (a[j + 3] * ixheaacd_gamma_table[j + 3]) * x[i - (j + 3)];
79*15dc779aSAndroid Build Coastguard Worker     }
80*15dc779aSAndroid Build Coastguard Worker     x[i] = s;
81*15dc779aSAndroid Build Coastguard Worker   }
82*15dc779aSAndroid Build Coastguard Worker 
83*15dc779aSAndroid Build Coastguard Worker   return;
84*15dc779aSAndroid Build Coastguard Worker }
85*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_synthesis_tool_float(FLOAT32 a[],FLOAT32 x[],FLOAT32 y[],WORD32 l,FLOAT32 mem[])86*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_synthesis_tool_float(FLOAT32 a[], FLOAT32 x[], FLOAT32 y[],
87*15dc779aSAndroid Build Coastguard Worker                                    WORD32 l, FLOAT32 mem[]) {
88*15dc779aSAndroid Build Coastguard Worker   FLOAT32 buf[LEN_FRAME * 2];
89*15dc779aSAndroid Build Coastguard Worker   FLOAT32 s;
90*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *yy;
91*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j;
92*15dc779aSAndroid Build Coastguard Worker   memcpy(buf, mem, ORDER * sizeof(FLOAT32));
93*15dc779aSAndroid Build Coastguard Worker   yy = &buf[ORDER];
94*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < l; i++) {
95*15dc779aSAndroid Build Coastguard Worker     s = x[i];
96*15dc779aSAndroid Build Coastguard Worker     for (j = 1; j <= ORDER; j += 4) {
97*15dc779aSAndroid Build Coastguard Worker       s -= a[j] * yy[i - j];
98*15dc779aSAndroid Build Coastguard Worker       s -= a[j + 1] * yy[i - (j + 1)];
99*15dc779aSAndroid Build Coastguard Worker       s -= a[j + 2] * yy[i - (j + 2)];
100*15dc779aSAndroid Build Coastguard Worker       s -= a[j + 3] * yy[i - (j + 3)];
101*15dc779aSAndroid Build Coastguard Worker     }
102*15dc779aSAndroid Build Coastguard Worker     yy[i] = s;
103*15dc779aSAndroid Build Coastguard Worker     y[i] = s;
104*15dc779aSAndroid Build Coastguard Worker   }
105*15dc779aSAndroid Build Coastguard Worker 
106*15dc779aSAndroid Build Coastguard Worker   return;
107*15dc779aSAndroid Build Coastguard Worker }
108*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_synthesis_tool_float1(FLOAT32 a[],FLOAT32 x[],WORD32 l)109*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_synthesis_tool_float1(FLOAT32 a[], FLOAT32 x[], WORD32 l) {
110*15dc779aSAndroid Build Coastguard Worker   FLOAT32 s;
111*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j;
112*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < l; i++) {
113*15dc779aSAndroid Build Coastguard Worker     s = x[i];
114*15dc779aSAndroid Build Coastguard Worker     for (j = 1; j <= ORDER; j += 4) {
115*15dc779aSAndroid Build Coastguard Worker       s -= a[j] * x[i - j];
116*15dc779aSAndroid Build Coastguard Worker       s -= a[j + 1] * x[i - (j + 1)];
117*15dc779aSAndroid Build Coastguard Worker       s -= a[j + 2] * x[i - (j + 2)];
118*15dc779aSAndroid Build Coastguard Worker       s -= a[j + 3] * x[i - (j + 3)];
119*15dc779aSAndroid Build Coastguard Worker     }
120*15dc779aSAndroid Build Coastguard Worker     x[i] = s;
121*15dc779aSAndroid Build Coastguard Worker   }
122*15dc779aSAndroid Build Coastguard Worker 
123*15dc779aSAndroid Build Coastguard Worker   return;
124*15dc779aSAndroid Build Coastguard Worker }
125*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_residual_tool(WORD32 * a,WORD32 * x,WORD32 * y,WORD32 l,WORD32 count)126*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_residual_tool(WORD32 *a, WORD32 *x, WORD32 *y, WORD32 l,
127*15dc779aSAndroid Build Coastguard Worker                             WORD32 count) {
128*15dc779aSAndroid Build Coastguard Worker   WORD32 s;
129*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j;
130*15dc779aSAndroid Build Coastguard Worker   WORD32 n = l * count;
131*15dc779aSAndroid Build Coastguard Worker 
132*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < n; i++) {
133*15dc779aSAndroid Build Coastguard Worker     s = x[i];
134*15dc779aSAndroid Build Coastguard Worker     for (j = 1; j <= 16; j++)
135*15dc779aSAndroid Build Coastguard Worker       s += (WORD32)ixheaac_mul32_sh(a[j], x[i - j], 24);
136*15dc779aSAndroid Build Coastguard Worker     y[i] = s;
137*15dc779aSAndroid Build Coastguard Worker   }
138*15dc779aSAndroid Build Coastguard Worker 
139*15dc779aSAndroid Build Coastguard Worker   return;
140*15dc779aSAndroid Build Coastguard Worker }
141*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_residual_tool_float(FLOAT32 * a,FLOAT32 * x,FLOAT32 * y,WORD32 l,WORD32 loop_count)142*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_residual_tool_float(FLOAT32 *a, FLOAT32 *x, FLOAT32 *y, WORD32 l,
143*15dc779aSAndroid Build Coastguard Worker                                   WORD32 loop_count) {
144*15dc779aSAndroid Build Coastguard Worker   FLOAT32 s;
145*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j;
146*15dc779aSAndroid Build Coastguard Worker   for (j = 0; j < loop_count; j++) {
147*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < l; i++) {
148*15dc779aSAndroid Build Coastguard Worker       s = x[i];
149*15dc779aSAndroid Build Coastguard Worker       s += a[1] * x[i - 1];
150*15dc779aSAndroid Build Coastguard Worker       s += a[2] * x[i - 2];
151*15dc779aSAndroid Build Coastguard Worker       s += a[3] * x[i - 3];
152*15dc779aSAndroid Build Coastguard Worker       s += a[4] * x[i - 4];
153*15dc779aSAndroid Build Coastguard Worker       s += a[5] * x[i - 5];
154*15dc779aSAndroid Build Coastguard Worker       s += a[6] * x[i - 6];
155*15dc779aSAndroid Build Coastguard Worker       s += a[7] * x[i - 7];
156*15dc779aSAndroid Build Coastguard Worker       s += a[8] * x[i - 8];
157*15dc779aSAndroid Build Coastguard Worker       s += a[9] * x[i - 9];
158*15dc779aSAndroid Build Coastguard Worker       s += a[10] * x[i - 10];
159*15dc779aSAndroid Build Coastguard Worker       s += a[11] * x[i - 11];
160*15dc779aSAndroid Build Coastguard Worker       s += a[12] * x[i - 12];
161*15dc779aSAndroid Build Coastguard Worker       s += a[13] * x[i - 13];
162*15dc779aSAndroid Build Coastguard Worker       s += a[14] * x[i - 14];
163*15dc779aSAndroid Build Coastguard Worker       s += a[15] * x[i - 15];
164*15dc779aSAndroid Build Coastguard Worker       s += a[16] * x[i - 16];
165*15dc779aSAndroid Build Coastguard Worker       y[i] = s;
166*15dc779aSAndroid Build Coastguard Worker     }
167*15dc779aSAndroid Build Coastguard Worker     a += 17;
168*15dc779aSAndroid Build Coastguard Worker     x += l;
169*15dc779aSAndroid Build Coastguard Worker     y += l;
170*15dc779aSAndroid Build Coastguard Worker   }
171*15dc779aSAndroid Build Coastguard Worker   return;
172*15dc779aSAndroid Build Coastguard Worker }
173*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_residual_tool_float1(FLOAT32 * a,FLOAT32 * x,FLOAT32 * y,WORD32 l,WORD32 loop_count)174*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_residual_tool_float1(FLOAT32 *a, FLOAT32 *x, FLOAT32 *y, WORD32 l,
175*15dc779aSAndroid Build Coastguard Worker                                    WORD32 loop_count) {
176*15dc779aSAndroid Build Coastguard Worker   FLOAT32 s;
177*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j;
178*15dc779aSAndroid Build Coastguard Worker   for (j = 0; j < loop_count; j++) {
179*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < l; i++) {
180*15dc779aSAndroid Build Coastguard Worker       s = x[i];
181*15dc779aSAndroid Build Coastguard Worker       s += a[1] * x[i - 1];
182*15dc779aSAndroid Build Coastguard Worker       s += a[2] * x[i - 2];
183*15dc779aSAndroid Build Coastguard Worker       s += a[3] * x[i - 3];
184*15dc779aSAndroid Build Coastguard Worker       s += a[4] * x[i - 4];
185*15dc779aSAndroid Build Coastguard Worker       s += a[5] * x[i - 5];
186*15dc779aSAndroid Build Coastguard Worker       s += a[6] * x[i - 6];
187*15dc779aSAndroid Build Coastguard Worker       s += a[7] * x[i - 7];
188*15dc779aSAndroid Build Coastguard Worker       s += a[8] * x[i - 8];
189*15dc779aSAndroid Build Coastguard Worker       s += a[9] * x[i - 9];
190*15dc779aSAndroid Build Coastguard Worker       s += a[10] * x[i - 10];
191*15dc779aSAndroid Build Coastguard Worker       s += a[11] * x[i - 11];
192*15dc779aSAndroid Build Coastguard Worker       s += a[12] * x[i - 12];
193*15dc779aSAndroid Build Coastguard Worker       s += a[13] * x[i - 13];
194*15dc779aSAndroid Build Coastguard Worker       s += a[14] * x[i - 14];
195*15dc779aSAndroid Build Coastguard Worker       s += a[15] * x[i - 15];
196*15dc779aSAndroid Build Coastguard Worker       s += a[16] * x[i - 16];
197*15dc779aSAndroid Build Coastguard Worker       y[i] = s;
198*15dc779aSAndroid Build Coastguard Worker     }
199*15dc779aSAndroid Build Coastguard Worker     x += l;
200*15dc779aSAndroid Build Coastguard Worker     y += l;
201*15dc779aSAndroid Build Coastguard Worker   }
202*15dc779aSAndroid Build Coastguard Worker   return;
203*15dc779aSAndroid Build Coastguard Worker }
204