xref: /aosp_15_r20/external/libxaac/encoder/iusace_acelp_tools.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
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 
21*15dc779aSAndroid Build Coastguard Worker #include <string.h>
22*15dc779aSAndroid Build Coastguard Worker #include <math.h>
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
24*15dc779aSAndroid Build Coastguard Worker #include "iusace_cnst.h"
25*15dc779aSAndroid Build Coastguard Worker #include "iusace_lpd_rom.h"
26*15dc779aSAndroid Build Coastguard Worker 
iusace_acelp_ir_vec_corr1(FLOAT32 * ir,FLOAT32 * vec,UWORD8 track,FLOAT32 * sign,FLOAT32 (* corr_ir)[16],FLOAT32 * corr_out,WORD32 * dn2_pos,WORD32 num_pluse_pos)27*15dc779aSAndroid Build Coastguard Worker static VOID iusace_acelp_ir_vec_corr1(FLOAT32 *ir, FLOAT32 *vec, UWORD8 track, FLOAT32 *sign,
28*15dc779aSAndroid Build Coastguard Worker                                       FLOAT32 (*corr_ir)[16], FLOAT32 *corr_out, WORD32 *dn2_pos,
29*15dc779aSAndroid Build Coastguard Worker                                       WORD32 num_pluse_pos) {
30*15dc779aSAndroid Build Coastguard Worker   WORD16 i, j;
31*15dc779aSAndroid Build Coastguard Worker   WORD32 dn;
32*15dc779aSAndroid Build Coastguard Worker   WORD32 *dn2;
33*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *p0;
34*15dc779aSAndroid Build Coastguard Worker   FLOAT32 s;
35*15dc779aSAndroid Build Coastguard Worker   dn2 = &dn2_pos[track * 8];
36*15dc779aSAndroid Build Coastguard Worker   p0 = corr_ir[track];
37*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < num_pluse_pos; i++) {
38*15dc779aSAndroid Build Coastguard Worker     dn = dn2[i];
39*15dc779aSAndroid Build Coastguard Worker     s = 0.0F;
40*15dc779aSAndroid Build Coastguard Worker     for (j = 0; j < (LEN_SUBFR - dn); j++) {
41*15dc779aSAndroid Build Coastguard Worker       s += ir[j] * vec[dn + j];
42*15dc779aSAndroid Build Coastguard Worker     }
43*15dc779aSAndroid Build Coastguard Worker     corr_out[dn >> 2] = sign[dn] * s + p0[dn >> 2];
44*15dc779aSAndroid Build Coastguard Worker   }
45*15dc779aSAndroid Build Coastguard Worker }
46*15dc779aSAndroid Build Coastguard Worker 
iusace_acelp_ir_vec_corr2(FLOAT32 * ir,FLOAT32 * vec,UWORD8 track,FLOAT32 * sign,FLOAT32 (* corr_ir)[16],FLOAT32 * corr_out)47*15dc779aSAndroid Build Coastguard Worker static VOID iusace_acelp_ir_vec_corr2(FLOAT32 *ir, FLOAT32 *vec, UWORD8 track, FLOAT32 *sign,
48*15dc779aSAndroid Build Coastguard Worker                                       FLOAT32 (*corr_ir)[16], FLOAT32 *corr_out) {
49*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j;
50*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *p0;
51*15dc779aSAndroid Build Coastguard Worker   FLOAT32 s;
52*15dc779aSAndroid Build Coastguard Worker   p0 = corr_ir[track];
53*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 16; i++) {
54*15dc779aSAndroid Build Coastguard Worker     s = 0.0F;
55*15dc779aSAndroid Build Coastguard Worker     for (j = 0; j < LEN_SUBFR - track; j++) {
56*15dc779aSAndroid Build Coastguard Worker       s += ir[j] * vec[track + j];
57*15dc779aSAndroid Build Coastguard Worker     }
58*15dc779aSAndroid Build Coastguard Worker     corr_out[i] = s * sign[track] + p0[i];
59*15dc779aSAndroid Build Coastguard Worker     track += 4;
60*15dc779aSAndroid Build Coastguard Worker   }
61*15dc779aSAndroid Build Coastguard Worker }
62*15dc779aSAndroid Build Coastguard Worker 
iusace_acelp_get_2p_pos(WORD32 nb_pos_ix,UWORD8 track_p1,UWORD8 track_p2,FLOAT32 * corr_pulses,FLOAT32 * ener_pulses,WORD32 * pos_p1,WORD32 * pos_p2,FLOAT32 * dn,WORD32 * dn2,FLOAT32 * corr_p1,FLOAT32 * corr_p2,FLOAT32 (* corr_p1p2)[256])63*15dc779aSAndroid Build Coastguard Worker static VOID iusace_acelp_get_2p_pos(WORD32 nb_pos_ix, UWORD8 track_p1, UWORD8 track_p2,
64*15dc779aSAndroid Build Coastguard Worker                                     FLOAT32 *corr_pulses, FLOAT32 *ener_pulses, WORD32 *pos_p1,
65*15dc779aSAndroid Build Coastguard Worker                                     WORD32 *pos_p2, FLOAT32 *dn, WORD32 *dn2, FLOAT32 *corr_p1,
66*15dc779aSAndroid Build Coastguard Worker                                     FLOAT32 *corr_p2, FLOAT32 (*corr_p1p2)[256]) {
67*15dc779aSAndroid Build Coastguard Worker   WORD32 x, x2, y, x_save = 0, y_save = 0, i, *pos_x;
68*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ps0, alp0;
69*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ps1, ps2, sq, sqk;
70*15dc779aSAndroid Build Coastguard Worker   FLOAT32 alp1, alp2, alpk;
71*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *p1, *p2;
72*15dc779aSAndroid Build Coastguard Worker   FLOAT32 s;
73*15dc779aSAndroid Build Coastguard Worker   pos_x = &dn2[track_p1 << 3];
74*15dc779aSAndroid Build Coastguard Worker   ps0 = *corr_pulses;
75*15dc779aSAndroid Build Coastguard Worker   alp0 = *ener_pulses;
76*15dc779aSAndroid Build Coastguard Worker   sqk = -1.0F;
77*15dc779aSAndroid Build Coastguard Worker   alpk = 1.0F;
78*15dc779aSAndroid Build Coastguard Worker 
79*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < nb_pos_ix; i++) {
80*15dc779aSAndroid Build Coastguard Worker     x = pos_x[i];
81*15dc779aSAndroid Build Coastguard Worker     x2 = x >> 2;
82*15dc779aSAndroid Build Coastguard Worker 
83*15dc779aSAndroid Build Coastguard Worker     ps1 = ps0 + dn[x];
84*15dc779aSAndroid Build Coastguard Worker     alp1 = alp0 + corr_p1[x2];
85*15dc779aSAndroid Build Coastguard Worker     p1 = corr_p2;
86*15dc779aSAndroid Build Coastguard Worker     p2 = &corr_p1p2[track_p1][x2 << 4];
87*15dc779aSAndroid Build Coastguard Worker     for (y = track_p2; y < LEN_SUBFR; y += 4) {
88*15dc779aSAndroid Build Coastguard Worker       ps2 = ps1 + dn[y];
89*15dc779aSAndroid Build Coastguard Worker       alp2 = alp1 + (*p1++) + (*p2++);
90*15dc779aSAndroid Build Coastguard Worker       sq = ps2 * ps2;
91*15dc779aSAndroid Build Coastguard Worker       s = (alpk * sq) - (sqk * alp2);
92*15dc779aSAndroid Build Coastguard Worker       if (s > 0.0F) {
93*15dc779aSAndroid Build Coastguard Worker         sqk = sq;
94*15dc779aSAndroid Build Coastguard Worker         alpk = alp2;
95*15dc779aSAndroid Build Coastguard Worker         y_save = y;
96*15dc779aSAndroid Build Coastguard Worker         x_save = x;
97*15dc779aSAndroid Build Coastguard Worker       }
98*15dc779aSAndroid Build Coastguard Worker     }
99*15dc779aSAndroid Build Coastguard Worker   }
100*15dc779aSAndroid Build Coastguard Worker   *corr_pulses = ps0 + dn[x_save] + dn[y_save];
101*15dc779aSAndroid Build Coastguard Worker   *ener_pulses = alpk;
102*15dc779aSAndroid Build Coastguard Worker   *pos_p1 = x_save;
103*15dc779aSAndroid Build Coastguard Worker   *pos_p2 = y_save;
104*15dc779aSAndroid Build Coastguard Worker }
105*15dc779aSAndroid Build Coastguard Worker 
iusace_acelp_get_1p_pos(UWORD8 track_p1,UWORD8 track_p2,FLOAT32 * corr_pulses,FLOAT32 * alp,WORD32 * pos_p1,FLOAT32 * dn,FLOAT32 * corr_p1,FLOAT32 * corr_p2)106*15dc779aSAndroid Build Coastguard Worker static VOID iusace_acelp_get_1p_pos(UWORD8 track_p1, UWORD8 track_p2, FLOAT32 *corr_pulses,
107*15dc779aSAndroid Build Coastguard Worker                                     FLOAT32 *alp, WORD32 *pos_p1, FLOAT32 *dn, FLOAT32 *corr_p1,
108*15dc779aSAndroid Build Coastguard Worker                                     FLOAT32 *corr_p2) {
109*15dc779aSAndroid Build Coastguard Worker   WORD32 x, x_save = 0;
110*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ps0, alp0;
111*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ps1, sq, sqk;
112*15dc779aSAndroid Build Coastguard Worker   FLOAT32 alp1, alpk;
113*15dc779aSAndroid Build Coastguard Worker   FLOAT32 s;
114*15dc779aSAndroid Build Coastguard Worker 
115*15dc779aSAndroid Build Coastguard Worker   ps0 = *corr_pulses;
116*15dc779aSAndroid Build Coastguard Worker   alp0 = *alp;
117*15dc779aSAndroid Build Coastguard Worker   sqk = -1.0F;
118*15dc779aSAndroid Build Coastguard Worker   alpk = 1.0F;
119*15dc779aSAndroid Build Coastguard Worker 
120*15dc779aSAndroid Build Coastguard Worker   for (x = track_p1; x < LEN_SUBFR; x += 4) {
121*15dc779aSAndroid Build Coastguard Worker     ps1 = ps0 + dn[x];
122*15dc779aSAndroid Build Coastguard Worker     alp1 = alp0 + corr_p1[x >> 2];
123*15dc779aSAndroid Build Coastguard Worker     sq = ps1 * ps1;
124*15dc779aSAndroid Build Coastguard Worker     s = (alpk * sq) - (sqk * alp1);
125*15dc779aSAndroid Build Coastguard Worker     if (s > 0.0F) {
126*15dc779aSAndroid Build Coastguard Worker       sqk = sq;
127*15dc779aSAndroid Build Coastguard Worker       alpk = alp1;
128*15dc779aSAndroid Build Coastguard Worker       x_save = x;
129*15dc779aSAndroid Build Coastguard Worker     }
130*15dc779aSAndroid Build Coastguard Worker   }
131*15dc779aSAndroid Build Coastguard Worker 
132*15dc779aSAndroid Build Coastguard Worker   if (track_p2 != track_p1) {
133*15dc779aSAndroid Build Coastguard Worker     for (x = track_p2; x < LEN_SUBFR; x += 4) {
134*15dc779aSAndroid Build Coastguard Worker       ps1 = ps0 + dn[x];
135*15dc779aSAndroid Build Coastguard Worker       alp1 = alp0 + corr_p2[x >> 2];
136*15dc779aSAndroid Build Coastguard Worker       sq = ps1 * ps1;
137*15dc779aSAndroid Build Coastguard Worker       s = (alpk * sq) - (sqk * alp1);
138*15dc779aSAndroid Build Coastguard Worker       if (s > 0.0F) {
139*15dc779aSAndroid Build Coastguard Worker         sqk = sq;
140*15dc779aSAndroid Build Coastguard Worker         alpk = alp1;
141*15dc779aSAndroid Build Coastguard Worker         x_save = x;
142*15dc779aSAndroid Build Coastguard Worker       }
143*15dc779aSAndroid Build Coastguard Worker     }
144*15dc779aSAndroid Build Coastguard Worker   }
145*15dc779aSAndroid Build Coastguard Worker 
146*15dc779aSAndroid Build Coastguard Worker   *corr_pulses = ps0 + dn[x_save];
147*15dc779aSAndroid Build Coastguard Worker   *alp = alpk;
148*15dc779aSAndroid Build Coastguard Worker   *pos_p1 = x_save;
149*15dc779aSAndroid Build Coastguard Worker }
150*15dc779aSAndroid Build Coastguard Worker 
iusace_acelp_quant_1p_n1bits(WORD32 pos_pulse,WORD32 num_bits_pos)151*15dc779aSAndroid Build Coastguard Worker static WORD32 iusace_acelp_quant_1p_n1bits(WORD32 pos_pulse, WORD32 num_bits_pos) {
152*15dc779aSAndroid Build Coastguard Worker   WORD32 mask;
153*15dc779aSAndroid Build Coastguard Worker   WORD32 index;
154*15dc779aSAndroid Build Coastguard Worker   mask = ((1 << num_bits_pos) - 1);
155*15dc779aSAndroid Build Coastguard Worker 
156*15dc779aSAndroid Build Coastguard Worker   index = (pos_pulse & mask);
157*15dc779aSAndroid Build Coastguard Worker   if ((pos_pulse & 16) != 0) {
158*15dc779aSAndroid Build Coastguard Worker     index += 1 << num_bits_pos;
159*15dc779aSAndroid Build Coastguard Worker   }
160*15dc779aSAndroid Build Coastguard Worker   return (index);
161*15dc779aSAndroid Build Coastguard Worker }
162*15dc779aSAndroid Build Coastguard Worker 
iusace_acelp_quant_2p_2n1bits(WORD32 pos_p1,WORD32 pos_p2,WORD32 num_bits_pos)163*15dc779aSAndroid Build Coastguard Worker static WORD32 iusace_acelp_quant_2p_2n1bits(WORD32 pos_p1, WORD32 pos_p2, WORD32 num_bits_pos) {
164*15dc779aSAndroid Build Coastguard Worker   WORD32 mask;
165*15dc779aSAndroid Build Coastguard Worker   WORD32 index;
166*15dc779aSAndroid Build Coastguard Worker   mask = ((1 << num_bits_pos) - 1);
167*15dc779aSAndroid Build Coastguard Worker 
168*15dc779aSAndroid Build Coastguard Worker   if (((pos_p2 ^ pos_p1) & 16) == 0) {
169*15dc779aSAndroid Build Coastguard Worker     if ((pos_p1 - pos_p2) <= 0) {
170*15dc779aSAndroid Build Coastguard Worker       index = ((pos_p1 & mask) << num_bits_pos) + (pos_p2 & mask);
171*15dc779aSAndroid Build Coastguard Worker     } else {
172*15dc779aSAndroid Build Coastguard Worker       index = ((pos_p2 & mask) << num_bits_pos) + (pos_p1 & mask);
173*15dc779aSAndroid Build Coastguard Worker     }
174*15dc779aSAndroid Build Coastguard Worker     if ((pos_p1 & 16) != 0) {
175*15dc779aSAndroid Build Coastguard Worker       index += 1 << (2 * num_bits_pos);
176*15dc779aSAndroid Build Coastguard Worker     }
177*15dc779aSAndroid Build Coastguard Worker   } else {
178*15dc779aSAndroid Build Coastguard Worker     if (((pos_p1 & mask) - (pos_p2 & mask)) <= 0) {
179*15dc779aSAndroid Build Coastguard Worker       index = ((pos_p2 & mask) << num_bits_pos) + (pos_p1 & mask);
180*15dc779aSAndroid Build Coastguard Worker       if ((pos_p2 & 16) != 0) {
181*15dc779aSAndroid Build Coastguard Worker         index += 1 << (2 * num_bits_pos);
182*15dc779aSAndroid Build Coastguard Worker       }
183*15dc779aSAndroid Build Coastguard Worker     } else {
184*15dc779aSAndroid Build Coastguard Worker       index = ((pos_p1 & mask) << num_bits_pos) + (pos_p2 & mask);
185*15dc779aSAndroid Build Coastguard Worker       if ((pos_p1 & 16) != 0) {
186*15dc779aSAndroid Build Coastguard Worker         index += 1 << (2 * num_bits_pos);
187*15dc779aSAndroid Build Coastguard Worker       }
188*15dc779aSAndroid Build Coastguard Worker     }
189*15dc779aSAndroid Build Coastguard Worker   }
190*15dc779aSAndroid Build Coastguard Worker   return (index);
191*15dc779aSAndroid Build Coastguard Worker }
192*15dc779aSAndroid Build Coastguard Worker 
iusace_acelp_quant_3p_3n1bits(WORD32 pos_p1,WORD32 pos_p2,WORD32 pos_p3,WORD32 num_bits_pos)193*15dc779aSAndroid Build Coastguard Worker static WORD32 iusace_acelp_quant_3p_3n1bits(WORD32 pos_p1, WORD32 pos_p2, WORD32 pos_p3,
194*15dc779aSAndroid Build Coastguard Worker                                             WORD32 num_bits_pos) {
195*15dc779aSAndroid Build Coastguard Worker   WORD32 nb_pos;
196*15dc779aSAndroid Build Coastguard Worker   WORD32 index;
197*15dc779aSAndroid Build Coastguard Worker   nb_pos = (1 << (num_bits_pos - 1));
198*15dc779aSAndroid Build Coastguard Worker 
199*15dc779aSAndroid Build Coastguard Worker   if (((pos_p1 ^ pos_p2) & nb_pos) == 0) {
200*15dc779aSAndroid Build Coastguard Worker     index = iusace_acelp_quant_2p_2n1bits(pos_p1, pos_p2, (num_bits_pos - 1));
201*15dc779aSAndroid Build Coastguard Worker     index += (pos_p1 & nb_pos) << num_bits_pos;
202*15dc779aSAndroid Build Coastguard Worker     index += iusace_acelp_quant_1p_n1bits(pos_p3, num_bits_pos) << (2 * num_bits_pos);
203*15dc779aSAndroid Build Coastguard Worker   } else if (((pos_p1 ^ pos_p3) & nb_pos) == 0) {
204*15dc779aSAndroid Build Coastguard Worker     index = iusace_acelp_quant_2p_2n1bits(pos_p1, pos_p3, (num_bits_pos - 1));
205*15dc779aSAndroid Build Coastguard Worker     index += (pos_p1 & nb_pos) << num_bits_pos;
206*15dc779aSAndroid Build Coastguard Worker     index += iusace_acelp_quant_1p_n1bits(pos_p2, num_bits_pos) << (2 * num_bits_pos);
207*15dc779aSAndroid Build Coastguard Worker   } else {
208*15dc779aSAndroid Build Coastguard Worker     index = iusace_acelp_quant_2p_2n1bits(pos_p2, pos_p3, (num_bits_pos - 1));
209*15dc779aSAndroid Build Coastguard Worker     index += (pos_p2 & nb_pos) << num_bits_pos;
210*15dc779aSAndroid Build Coastguard Worker     index += iusace_acelp_quant_1p_n1bits(pos_p1, num_bits_pos) << (2 * num_bits_pos);
211*15dc779aSAndroid Build Coastguard Worker   }
212*15dc779aSAndroid Build Coastguard Worker   return (index);
213*15dc779aSAndroid Build Coastguard Worker }
214*15dc779aSAndroid Build Coastguard Worker 
iusace_acelp_quant_4p_4n1bits(WORD32 pos_p1,WORD32 pos_p2,WORD32 pos_p3,WORD32 pos_p4,WORD32 num_bits_pos)215*15dc779aSAndroid Build Coastguard Worker static WORD32 iusace_acelp_quant_4p_4n1bits(WORD32 pos_p1, WORD32 pos_p2, WORD32 pos_p3,
216*15dc779aSAndroid Build Coastguard Worker                                             WORD32 pos_p4, WORD32 num_bits_pos) {
217*15dc779aSAndroid Build Coastguard Worker   WORD32 nb_pos;
218*15dc779aSAndroid Build Coastguard Worker   WORD32 index;
219*15dc779aSAndroid Build Coastguard Worker   nb_pos = (1 << (num_bits_pos - 1));
220*15dc779aSAndroid Build Coastguard Worker 
221*15dc779aSAndroid Build Coastguard Worker   if (((pos_p1 ^ pos_p2) & nb_pos) == 0) {
222*15dc779aSAndroid Build Coastguard Worker     index = iusace_acelp_quant_2p_2n1bits(pos_p1, pos_p2, (num_bits_pos - 1));
223*15dc779aSAndroid Build Coastguard Worker     index += (pos_p1 & nb_pos) << num_bits_pos;
224*15dc779aSAndroid Build Coastguard Worker     index += iusace_acelp_quant_2p_2n1bits(pos_p3, pos_p4, num_bits_pos) << (2 * num_bits_pos);
225*15dc779aSAndroid Build Coastguard Worker   } else if (((pos_p1 ^ pos_p3) & nb_pos) == 0) {
226*15dc779aSAndroid Build Coastguard Worker     index = iusace_acelp_quant_2p_2n1bits(pos_p1, pos_p3, (num_bits_pos - 1));
227*15dc779aSAndroid Build Coastguard Worker     index += (pos_p1 & nb_pos) << num_bits_pos;
228*15dc779aSAndroid Build Coastguard Worker     index += iusace_acelp_quant_2p_2n1bits(pos_p2, pos_p4, num_bits_pos) << (2 * num_bits_pos);
229*15dc779aSAndroid Build Coastguard Worker   } else {
230*15dc779aSAndroid Build Coastguard Worker     index = iusace_acelp_quant_2p_2n1bits(pos_p2, pos_p3, (num_bits_pos - 1));
231*15dc779aSAndroid Build Coastguard Worker     index += (pos_p2 & nb_pos) << num_bits_pos;
232*15dc779aSAndroid Build Coastguard Worker     index += iusace_acelp_quant_2p_2n1bits(pos_p1, pos_p4, num_bits_pos) << (2 * num_bits_pos);
233*15dc779aSAndroid Build Coastguard Worker   }
234*15dc779aSAndroid Build Coastguard Worker   return (index);
235*15dc779aSAndroid Build Coastguard Worker }
236*15dc779aSAndroid Build Coastguard Worker 
iusace_acelp_quant_4p_4nbits(WORD32 * pos_pulses,WORD32 num_bits_pos)237*15dc779aSAndroid Build Coastguard Worker static WORD32 iusace_acelp_quant_4p_4nbits(WORD32 *pos_pulses, WORD32 num_bits_pos) {
238*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j, k, nb_pos, n_1;
239*15dc779aSAndroid Build Coastguard Worker   WORD32 pos_a[4], pos_b[4];
240*15dc779aSAndroid Build Coastguard Worker   WORD32 index = 0;
241*15dc779aSAndroid Build Coastguard Worker   n_1 = num_bits_pos - 1;
242*15dc779aSAndroid Build Coastguard Worker   nb_pos = (1 << n_1);
243*15dc779aSAndroid Build Coastguard Worker   i = 0;
244*15dc779aSAndroid Build Coastguard Worker   j = 0;
245*15dc779aSAndroid Build Coastguard Worker   for (k = 0; k < 4; k++) {
246*15dc779aSAndroid Build Coastguard Worker     if ((pos_pulses[k] & nb_pos) == 0) {
247*15dc779aSAndroid Build Coastguard Worker       pos_a[i++] = pos_pulses[k];
248*15dc779aSAndroid Build Coastguard Worker     } else {
249*15dc779aSAndroid Build Coastguard Worker       pos_b[j++] = pos_pulses[k];
250*15dc779aSAndroid Build Coastguard Worker     }
251*15dc779aSAndroid Build Coastguard Worker   }
252*15dc779aSAndroid Build Coastguard Worker   switch (i) {
253*15dc779aSAndroid Build Coastguard Worker     case 0:
254*15dc779aSAndroid Build Coastguard Worker       index = 1 << ((4 * num_bits_pos) - 3);
255*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_4p_4n1bits(pos_b[0], pos_b[1], pos_b[2], pos_b[3], n_1);
256*15dc779aSAndroid Build Coastguard Worker       break;
257*15dc779aSAndroid Build Coastguard Worker     case 1:
258*15dc779aSAndroid Build Coastguard Worker       index = iusace_acelp_quant_1p_n1bits(pos_a[0], n_1) << ((3 * n_1) + 1);
259*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_3p_3n1bits(pos_b[0], pos_b[1], pos_b[2], n_1);
260*15dc779aSAndroid Build Coastguard Worker       break;
261*15dc779aSAndroid Build Coastguard Worker     case 2:
262*15dc779aSAndroid Build Coastguard Worker       index = iusace_acelp_quant_2p_2n1bits(pos_a[0], pos_a[1], n_1) << ((2 * n_1) + 1);
263*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_2p_2n1bits(pos_b[0], pos_b[1], n_1);
264*15dc779aSAndroid Build Coastguard Worker       break;
265*15dc779aSAndroid Build Coastguard Worker     case 3:
266*15dc779aSAndroid Build Coastguard Worker       index = iusace_acelp_quant_3p_3n1bits(pos_a[0], pos_a[1], pos_a[2], n_1) << num_bits_pos;
267*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_1p_n1bits(pos_b[0], n_1);
268*15dc779aSAndroid Build Coastguard Worker       break;
269*15dc779aSAndroid Build Coastguard Worker     case 4:
270*15dc779aSAndroid Build Coastguard Worker       index = iusace_acelp_quant_4p_4n1bits(pos_a[0], pos_a[1], pos_a[2], pos_a[3], n_1);
271*15dc779aSAndroid Build Coastguard Worker       break;
272*15dc779aSAndroid Build Coastguard Worker   }
273*15dc779aSAndroid Build Coastguard Worker   index += (i & 3) << ((4 * num_bits_pos) - 2);
274*15dc779aSAndroid Build Coastguard Worker   return (index);
275*15dc779aSAndroid Build Coastguard Worker }
276*15dc779aSAndroid Build Coastguard Worker 
iusace_acelp_quant_5p_5nbits(WORD32 * pos_pulses,WORD32 num_bits_pos)277*15dc779aSAndroid Build Coastguard Worker static WORD32 iusace_acelp_quant_5p_5nbits(WORD32 *pos_pulses, WORD32 num_bits_pos) {
278*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j, k, nb_pos, n_1;
279*15dc779aSAndroid Build Coastguard Worker   WORD32 pos_a[5], pos_b[5];
280*15dc779aSAndroid Build Coastguard Worker   WORD32 index = 0;
281*15dc779aSAndroid Build Coastguard Worker   n_1 = num_bits_pos - 1;
282*15dc779aSAndroid Build Coastguard Worker   nb_pos = (1 << n_1);
283*15dc779aSAndroid Build Coastguard Worker   i = 0;
284*15dc779aSAndroid Build Coastguard Worker   j = 0;
285*15dc779aSAndroid Build Coastguard Worker   for (k = 0; k < 5; k++) {
286*15dc779aSAndroid Build Coastguard Worker     if ((pos_pulses[k] & nb_pos) == 0) {
287*15dc779aSAndroid Build Coastguard Worker       pos_a[i++] = pos_pulses[k];
288*15dc779aSAndroid Build Coastguard Worker     } else {
289*15dc779aSAndroid Build Coastguard Worker       pos_b[j++] = pos_pulses[k];
290*15dc779aSAndroid Build Coastguard Worker     }
291*15dc779aSAndroid Build Coastguard Worker   }
292*15dc779aSAndroid Build Coastguard Worker   switch (i) {
293*15dc779aSAndroid Build Coastguard Worker     case 0:
294*15dc779aSAndroid Build Coastguard Worker       index = 1 << ((5 * num_bits_pos) - 1);
295*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_3p_3n1bits(pos_b[0], pos_b[1], pos_b[2], n_1)
296*15dc779aSAndroid Build Coastguard Worker                << ((2 * num_bits_pos) + 1);
297*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_2p_2n1bits(pos_b[3], pos_b[4], num_bits_pos);
298*15dc779aSAndroid Build Coastguard Worker       break;
299*15dc779aSAndroid Build Coastguard Worker     case 1:
300*15dc779aSAndroid Build Coastguard Worker       index = 1 << ((5 * num_bits_pos) - 1);
301*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_3p_3n1bits(pos_b[0], pos_b[1], pos_b[2], n_1)
302*15dc779aSAndroid Build Coastguard Worker                << ((2 * num_bits_pos) + 1);
303*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_2p_2n1bits(pos_b[3], pos_a[0], num_bits_pos);
304*15dc779aSAndroid Build Coastguard Worker       break;
305*15dc779aSAndroid Build Coastguard Worker     case 2:
306*15dc779aSAndroid Build Coastguard Worker       index = 1 << ((5 * num_bits_pos) - 1);
307*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_3p_3n1bits(pos_b[0], pos_b[1], pos_b[2], n_1)
308*15dc779aSAndroid Build Coastguard Worker                << ((2 * num_bits_pos) + 1);
309*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_2p_2n1bits(pos_a[0], pos_a[1], num_bits_pos);
310*15dc779aSAndroid Build Coastguard Worker       break;
311*15dc779aSAndroid Build Coastguard Worker     case 3:
312*15dc779aSAndroid Build Coastguard Worker       index = iusace_acelp_quant_3p_3n1bits(pos_a[0], pos_a[1], pos_a[2], n_1)
313*15dc779aSAndroid Build Coastguard Worker               << ((2 * num_bits_pos) + 1);
314*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_2p_2n1bits(pos_b[0], pos_b[1], num_bits_pos);
315*15dc779aSAndroid Build Coastguard Worker       break;
316*15dc779aSAndroid Build Coastguard Worker     case 4:
317*15dc779aSAndroid Build Coastguard Worker       index = iusace_acelp_quant_3p_3n1bits(pos_a[0], pos_a[1], pos_a[2], n_1)
318*15dc779aSAndroid Build Coastguard Worker               << ((2 * num_bits_pos) + 1);
319*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_2p_2n1bits(pos_a[3], pos_b[0], num_bits_pos);
320*15dc779aSAndroid Build Coastguard Worker       break;
321*15dc779aSAndroid Build Coastguard Worker     case 5:
322*15dc779aSAndroid Build Coastguard Worker       index = iusace_acelp_quant_3p_3n1bits(pos_a[0], pos_a[1], pos_a[2], n_1)
323*15dc779aSAndroid Build Coastguard Worker               << ((2 * num_bits_pos) + 1);
324*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_2p_2n1bits(pos_a[3], pos_a[4], num_bits_pos);
325*15dc779aSAndroid Build Coastguard Worker       break;
326*15dc779aSAndroid Build Coastguard Worker   }
327*15dc779aSAndroid Build Coastguard Worker   return (index);
328*15dc779aSAndroid Build Coastguard Worker }
329*15dc779aSAndroid Build Coastguard Worker 
iusace_acelp_quant_6p_6n_2bits(WORD32 * pos_pulses,WORD32 num_bits_pos)330*15dc779aSAndroid Build Coastguard Worker static WORD32 iusace_acelp_quant_6p_6n_2bits(WORD32 *pos_pulses, WORD32 num_bits_pos) {
331*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j, k, nb_pos, n_1;
332*15dc779aSAndroid Build Coastguard Worker   WORD32 pos_a[6], pos_b[6];
333*15dc779aSAndroid Build Coastguard Worker   WORD32 index = 0;
334*15dc779aSAndroid Build Coastguard Worker   n_1 = num_bits_pos - 1;
335*15dc779aSAndroid Build Coastguard Worker   nb_pos = 1 << n_1;
336*15dc779aSAndroid Build Coastguard Worker   i = 0;
337*15dc779aSAndroid Build Coastguard Worker   j = 0;
338*15dc779aSAndroid Build Coastguard Worker   for (k = 0; k < 6; k++) {
339*15dc779aSAndroid Build Coastguard Worker     if ((pos_pulses[k] & nb_pos) == 0) {
340*15dc779aSAndroid Build Coastguard Worker       pos_a[i++] = pos_pulses[k];
341*15dc779aSAndroid Build Coastguard Worker     } else {
342*15dc779aSAndroid Build Coastguard Worker       pos_b[j++] = pos_pulses[k];
343*15dc779aSAndroid Build Coastguard Worker     }
344*15dc779aSAndroid Build Coastguard Worker   }
345*15dc779aSAndroid Build Coastguard Worker 
346*15dc779aSAndroid Build Coastguard Worker   switch (i) {
347*15dc779aSAndroid Build Coastguard Worker     case 0:
348*15dc779aSAndroid Build Coastguard Worker       index = 1 << ((6 * num_bits_pos) - 5);
349*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_5p_5nbits(pos_b, n_1) << num_bits_pos;
350*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_1p_n1bits(pos_b[5], n_1);
351*15dc779aSAndroid Build Coastguard Worker       break;
352*15dc779aSAndroid Build Coastguard Worker     case 1:
353*15dc779aSAndroid Build Coastguard Worker       index = 1 << ((6 * num_bits_pos) - 5);
354*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_5p_5nbits(pos_b, n_1) << num_bits_pos;
355*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_1p_n1bits(pos_a[0], n_1);
356*15dc779aSAndroid Build Coastguard Worker       break;
357*15dc779aSAndroid Build Coastguard Worker     case 2:
358*15dc779aSAndroid Build Coastguard Worker       index = 1 << ((6 * num_bits_pos) - 5);
359*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_4p_4nbits(pos_b, n_1) << ((2 * n_1) + 1);
360*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_2p_2n1bits(pos_a[0], pos_a[1], n_1);
361*15dc779aSAndroid Build Coastguard Worker       break;
362*15dc779aSAndroid Build Coastguard Worker     case 3:
363*15dc779aSAndroid Build Coastguard Worker       index = iusace_acelp_quant_3p_3n1bits(pos_a[0], pos_a[1], pos_a[2], n_1) << ((3 * n_1) + 1);
364*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_3p_3n1bits(pos_b[0], pos_b[1], pos_b[2], n_1);
365*15dc779aSAndroid Build Coastguard Worker       break;
366*15dc779aSAndroid Build Coastguard Worker     case 4:
367*15dc779aSAndroid Build Coastguard Worker       i = 2;
368*15dc779aSAndroid Build Coastguard Worker       index = iusace_acelp_quant_4p_4nbits(pos_a, n_1) << ((2 * n_1) + 1);
369*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_2p_2n1bits(pos_b[0], pos_b[1], n_1);
370*15dc779aSAndroid Build Coastguard Worker       break;
371*15dc779aSAndroid Build Coastguard Worker     case 5:
372*15dc779aSAndroid Build Coastguard Worker       i = 1;
373*15dc779aSAndroid Build Coastguard Worker       index = iusace_acelp_quant_5p_5nbits(pos_a, n_1) << num_bits_pos;
374*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_1p_n1bits(pos_b[0], n_1);
375*15dc779aSAndroid Build Coastguard Worker       break;
376*15dc779aSAndroid Build Coastguard Worker     case 6:
377*15dc779aSAndroid Build Coastguard Worker       i = 0;
378*15dc779aSAndroid Build Coastguard Worker       index = iusace_acelp_quant_5p_5nbits(pos_a, n_1) << num_bits_pos;
379*15dc779aSAndroid Build Coastguard Worker       index += iusace_acelp_quant_1p_n1bits(pos_a[5], n_1);
380*15dc779aSAndroid Build Coastguard Worker       break;
381*15dc779aSAndroid Build Coastguard Worker   }
382*15dc779aSAndroid Build Coastguard Worker   index += (i & 3) << ((6 * num_bits_pos) - 4);
383*15dc779aSAndroid Build Coastguard Worker   return (index);
384*15dc779aSAndroid Build Coastguard Worker }
385*15dc779aSAndroid Build Coastguard Worker 
iusace_acelp_tgt_ir_corr(FLOAT32 * x,FLOAT32 * ir_wsyn,FLOAT32 * corr_out)386*15dc779aSAndroid Build Coastguard Worker VOID iusace_acelp_tgt_ir_corr(FLOAT32 *x, FLOAT32 *ir_wsyn, FLOAT32 *corr_out) {
387*15dc779aSAndroid Build Coastguard Worker   WORD16 i, j;
388*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sum;
389*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < LEN_SUBFR; i++) {
390*15dc779aSAndroid Build Coastguard Worker     sum = 0.0F;
391*15dc779aSAndroid Build Coastguard Worker     for (j = i; j < LEN_SUBFR; j++) {
392*15dc779aSAndroid Build Coastguard Worker       sum += x[j] * ir_wsyn[j - i];
393*15dc779aSAndroid Build Coastguard Worker     }
394*15dc779aSAndroid Build Coastguard Worker     corr_out[i] = sum;
395*15dc779aSAndroid Build Coastguard Worker   }
396*15dc779aSAndroid Build Coastguard Worker }
397*15dc779aSAndroid Build Coastguard Worker 
iusace_acelp_tgt_cb_corr2(FLOAT32 * xn,FLOAT32 * y1,FLOAT32 * corr_out)398*15dc779aSAndroid Build Coastguard Worker FLOAT32 iusace_acelp_tgt_cb_corr2(FLOAT32 *xn, FLOAT32 *y1, FLOAT32 *corr_out) {
399*15dc779aSAndroid Build Coastguard Worker   FLOAT32 gain;
400*15dc779aSAndroid Build Coastguard Worker   FLOAT32 t0, t1;
401*15dc779aSAndroid Build Coastguard Worker   WORD16 i;
402*15dc779aSAndroid Build Coastguard Worker   t0 = xn[0] * y1[0];
403*15dc779aSAndroid Build Coastguard Worker   t1 = y1[0] * y1[0];
404*15dc779aSAndroid Build Coastguard Worker   for (i = 1; i < LEN_SUBFR; i += 7) {
405*15dc779aSAndroid Build Coastguard Worker     t0 += xn[i] * y1[i];
406*15dc779aSAndroid Build Coastguard Worker     t1 += y1[i] * y1[i];
407*15dc779aSAndroid Build Coastguard Worker     t0 += xn[i + 1] * y1[i + 1];
408*15dc779aSAndroid Build Coastguard Worker     t1 += y1[i + 1] * y1[i + 1];
409*15dc779aSAndroid Build Coastguard Worker     t0 += xn[i + 2] * y1[i + 2];
410*15dc779aSAndroid Build Coastguard Worker     t1 += y1[i + 2] * y1[i + 2];
411*15dc779aSAndroid Build Coastguard Worker     t0 += xn[i + 3] * y1[i + 3];
412*15dc779aSAndroid Build Coastguard Worker     t1 += y1[i + 3] * y1[i + 3];
413*15dc779aSAndroid Build Coastguard Worker     t0 += xn[i + 4] * y1[i + 4];
414*15dc779aSAndroid Build Coastguard Worker     t1 += y1[i + 4] * y1[i + 4];
415*15dc779aSAndroid Build Coastguard Worker     t0 += xn[i + 5] * y1[i + 5];
416*15dc779aSAndroid Build Coastguard Worker     t1 += y1[i + 5] * y1[i + 5];
417*15dc779aSAndroid Build Coastguard Worker     t0 += xn[i + 6] * y1[i + 6];
418*15dc779aSAndroid Build Coastguard Worker     t1 += y1[i + 6] * y1[i + 6];
419*15dc779aSAndroid Build Coastguard Worker   }
420*15dc779aSAndroid Build Coastguard Worker   corr_out[0] = t1;
421*15dc779aSAndroid Build Coastguard Worker   corr_out[1] = -2.0F * t0 + 0.01F;
422*15dc779aSAndroid Build Coastguard Worker 
423*15dc779aSAndroid Build Coastguard Worker   if (t1) {
424*15dc779aSAndroid Build Coastguard Worker     gain = t0 / t1;
425*15dc779aSAndroid Build Coastguard Worker   } else {
426*15dc779aSAndroid Build Coastguard Worker     gain = 1.0F;
427*15dc779aSAndroid Build Coastguard Worker   }
428*15dc779aSAndroid Build Coastguard Worker   if (gain < 0.0) {
429*15dc779aSAndroid Build Coastguard Worker     gain = 0.0;
430*15dc779aSAndroid Build Coastguard Worker   } else if (gain > 1.2F) {
431*15dc779aSAndroid Build Coastguard Worker     gain = 1.2F;
432*15dc779aSAndroid Build Coastguard Worker   }
433*15dc779aSAndroid Build Coastguard Worker   return gain;
434*15dc779aSAndroid Build Coastguard Worker }
435*15dc779aSAndroid Build Coastguard Worker 
iusace_acelp_tgt_cb_corr1(FLOAT32 * xn,FLOAT32 * y1,FLOAT32 * y2,FLOAT32 * corr_out)436*15dc779aSAndroid Build Coastguard Worker VOID iusace_acelp_tgt_cb_corr1(FLOAT32 *xn, FLOAT32 *y1, FLOAT32 *y2, FLOAT32 *corr_out) {
437*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
438*15dc779aSAndroid Build Coastguard Worker   FLOAT32 temp1, temp2, temp3;
439*15dc779aSAndroid Build Coastguard Worker   temp1 = 0.01F + y2[0] * y2[0];
440*15dc779aSAndroid Build Coastguard Worker   temp2 = 0.01F + xn[0] * y2[0];
441*15dc779aSAndroid Build Coastguard Worker   temp3 = 0.01F + y1[0] * y2[0];
442*15dc779aSAndroid Build Coastguard Worker   temp1 += y2[1] * y2[1];
443*15dc779aSAndroid Build Coastguard Worker   temp2 += xn[1] * y2[1];
444*15dc779aSAndroid Build Coastguard Worker   temp3 += y1[1] * y2[1];
445*15dc779aSAndroid Build Coastguard Worker   temp1 += y2[2] * y2[2];
446*15dc779aSAndroid Build Coastguard Worker   temp2 += xn[2] * y2[2];
447*15dc779aSAndroid Build Coastguard Worker   temp3 += y1[2] * y2[2];
448*15dc779aSAndroid Build Coastguard Worker   temp1 += y2[3] * y2[3];
449*15dc779aSAndroid Build Coastguard Worker   temp2 += xn[3] * y2[3];
450*15dc779aSAndroid Build Coastguard Worker   temp3 += y1[3] * y2[3];
451*15dc779aSAndroid Build Coastguard Worker   for (i = 4; i < LEN_SUBFR; i += 6) {
452*15dc779aSAndroid Build Coastguard Worker     temp1 += y2[i] * y2[i];
453*15dc779aSAndroid Build Coastguard Worker     temp2 += xn[i] * y2[i];
454*15dc779aSAndroid Build Coastguard Worker     temp3 += y1[i] * y2[i];
455*15dc779aSAndroid Build Coastguard Worker     temp1 += y2[i + 1] * y2[i + 1];
456*15dc779aSAndroid Build Coastguard Worker     temp2 += xn[i + 1] * y2[i + 1];
457*15dc779aSAndroid Build Coastguard Worker     temp3 += y1[i + 1] * y2[i + 1];
458*15dc779aSAndroid Build Coastguard Worker     temp1 += y2[i + 2] * y2[i + 2];
459*15dc779aSAndroid Build Coastguard Worker     temp2 += xn[i + 2] * y2[i + 2];
460*15dc779aSAndroid Build Coastguard Worker     temp3 += y1[i + 2] * y2[i + 2];
461*15dc779aSAndroid Build Coastguard Worker     temp1 += y2[i + 3] * y2[i + 3];
462*15dc779aSAndroid Build Coastguard Worker     temp2 += xn[i + 3] * y2[i + 3];
463*15dc779aSAndroid Build Coastguard Worker     temp3 += y1[i + 3] * y2[i + 3];
464*15dc779aSAndroid Build Coastguard Worker     temp1 += y2[i + 4] * y2[i + 4];
465*15dc779aSAndroid Build Coastguard Worker     temp2 += xn[i + 4] * y2[i + 4];
466*15dc779aSAndroid Build Coastguard Worker     temp3 += y1[i + 4] * y2[i + 4];
467*15dc779aSAndroid Build Coastguard Worker     temp1 += y2[i + 5] * y2[i + 5];
468*15dc779aSAndroid Build Coastguard Worker     temp2 += xn[i + 5] * y2[i + 5];
469*15dc779aSAndroid Build Coastguard Worker     temp3 += y1[i + 5] * y2[i + 5];
470*15dc779aSAndroid Build Coastguard Worker   }
471*15dc779aSAndroid Build Coastguard Worker   corr_out[2] = temp1;
472*15dc779aSAndroid Build Coastguard Worker   corr_out[3] = -2.0F * temp2;
473*15dc779aSAndroid Build Coastguard Worker   corr_out[4] = 2.0F * temp3;
474*15dc779aSAndroid Build Coastguard Worker }
475*15dc779aSAndroid Build Coastguard Worker 
iusace_acelp_cb_target_update(FLOAT32 * x,FLOAT32 * new_x,FLOAT32 * cb_vec,FLOAT32 gain)476*15dc779aSAndroid Build Coastguard Worker VOID iusace_acelp_cb_target_update(FLOAT32 *x, FLOAT32 *new_x, FLOAT32 *cb_vec, FLOAT32 gain) {
477*15dc779aSAndroid Build Coastguard Worker   WORD16 i;
478*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < LEN_SUBFR; i++) {
479*15dc779aSAndroid Build Coastguard Worker     new_x[i] = x[i] - gain * cb_vec[i];
480*15dc779aSAndroid Build Coastguard Worker   }
481*15dc779aSAndroid Build Coastguard Worker }
482*15dc779aSAndroid Build Coastguard Worker 
iusace_acelp_cb_exc(FLOAT32 * corr_input,FLOAT32 * lp_residual,FLOAT32 * ir_wsyn,WORD16 * alg_cb_exc_out,FLOAT32 * filt_cb_exc,WORD32 num_bits_cb,WORD32 * acelp_param_out,FLOAT32 * scratch_acelp_ir_buf)483*15dc779aSAndroid Build Coastguard Worker VOID iusace_acelp_cb_exc(FLOAT32 *corr_input, FLOAT32 *lp_residual, FLOAT32 *ir_wsyn,
484*15dc779aSAndroid Build Coastguard Worker                          WORD16 *alg_cb_exc_out, FLOAT32 *filt_cb_exc, WORD32 num_bits_cb,
485*15dc779aSAndroid Build Coastguard Worker                          WORD32 *acelp_param_out, FLOAT32 *scratch_acelp_ir_buf) {
486*15dc779aSAndroid Build Coastguard Worker   FLOAT32 sign[LEN_SUBFR], vec[LEN_SUBFR];
487*15dc779aSAndroid Build Coastguard Worker   FLOAT32 corr_x[16], corr_y[16];
488*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *ir_buf = scratch_acelp_ir_buf;
489*15dc779aSAndroid Build Coastguard Worker   FLOAT32 corr_ir[4][16];
490*15dc779aSAndroid Build Coastguard Worker   FLOAT32 corr_p1p2[4][256];
491*15dc779aSAndroid Build Coastguard Worker   FLOAT32 dn2[LEN_SUBFR];
492*15dc779aSAndroid Build Coastguard Worker   WORD32 pulse_pos[NPMAXPT * 4] = {0};
493*15dc779aSAndroid Build Coastguard Worker   WORD32 codvec[MAX_NUM_PULSES] = {0};
494*15dc779aSAndroid Build Coastguard Worker   WORD32 num_pulse_position[10] = {0};
495*15dc779aSAndroid Build Coastguard Worker   WORD32 pos_max[4];
496*15dc779aSAndroid Build Coastguard Worker   WORD32 dn2_pos[8 * 4];
497*15dc779aSAndroid Build Coastguard Worker   UWORD8 ipos[MAX_NUM_PULSES] = {0};
498*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j, k, st, pos = 0, index, track, num_pulses = 0, num_iter = 4;
499*15dc779aSAndroid Build Coastguard Worker   WORD32 l_index;
500*15dc779aSAndroid Build Coastguard Worker   FLOAT32 psk, ps, alpk, alp = 0.0F;
501*15dc779aSAndroid Build Coastguard Worker   FLOAT32 val;
502*15dc779aSAndroid Build Coastguard Worker   FLOAT32 s, cor;
503*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *p0, *p1, *p2, *p3, *psign;
504*15dc779aSAndroid Build Coastguard Worker   FLOAT32 *p1_ir_buf, *p2_ir_buf, *p3_ir_buf, *p4_ir_buf, *ir_sign_inv;
505*15dc779aSAndroid Build Coastguard Worker   switch (num_bits_cb) {
506*15dc779aSAndroid Build Coastguard Worker     case ACELP_NUM_BITS_20:
507*15dc779aSAndroid Build Coastguard Worker       num_iter = 4;
508*15dc779aSAndroid Build Coastguard Worker       alp = 2.0;
509*15dc779aSAndroid Build Coastguard Worker       num_pulses = 4;
510*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[0] = 4;
511*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[1] = 8;
512*15dc779aSAndroid Build Coastguard Worker       break;
513*15dc779aSAndroid Build Coastguard Worker     case ACELP_NUM_BITS_28:
514*15dc779aSAndroid Build Coastguard Worker       num_iter = 4;
515*15dc779aSAndroid Build Coastguard Worker       alp = 1.5;
516*15dc779aSAndroid Build Coastguard Worker       num_pulses = 6;
517*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[0] = 4;
518*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[1] = 8;
519*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[2] = 8;
520*15dc779aSAndroid Build Coastguard Worker       break;
521*15dc779aSAndroid Build Coastguard Worker 
522*15dc779aSAndroid Build Coastguard Worker     case ACELP_NUM_BITS_36:
523*15dc779aSAndroid Build Coastguard Worker       num_iter = 4;
524*15dc779aSAndroid Build Coastguard Worker       alp = 1.0;
525*15dc779aSAndroid Build Coastguard Worker       num_pulses = 8;
526*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[0] = 4;
527*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[1] = 8;
528*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[2] = 8;
529*15dc779aSAndroid Build Coastguard Worker       break;
530*15dc779aSAndroid Build Coastguard Worker     case ACELP_NUM_BITS_44:
531*15dc779aSAndroid Build Coastguard Worker       num_iter = 4;
532*15dc779aSAndroid Build Coastguard Worker       alp = 1.0;
533*15dc779aSAndroid Build Coastguard Worker       num_pulses = 10;
534*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[0] = 4;
535*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[1] = 6;
536*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[2] = 8;
537*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[3] = 8;
538*15dc779aSAndroid Build Coastguard Worker       break;
539*15dc779aSAndroid Build Coastguard Worker     case ACELP_NUM_BITS_52:
540*15dc779aSAndroid Build Coastguard Worker       num_iter = 4;
541*15dc779aSAndroid Build Coastguard Worker       alp = 1.0;
542*15dc779aSAndroid Build Coastguard Worker       num_pulses = 12;
543*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[0] = 4;
544*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[1] = 6;
545*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[2] = 8;
546*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[3] = 8;
547*15dc779aSAndroid Build Coastguard Worker       break;
548*15dc779aSAndroid Build Coastguard Worker     case ACELP_NUM_BITS_64:
549*15dc779aSAndroid Build Coastguard Worker       num_iter = 3;
550*15dc779aSAndroid Build Coastguard Worker       alp = 0.8F;
551*15dc779aSAndroid Build Coastguard Worker       num_pulses = 16;
552*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[0] = 4;
553*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[1] = 4;
554*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[2] = 6;
555*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[3] = 6;
556*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[4] = 8;
557*15dc779aSAndroid Build Coastguard Worker       num_pulse_position[5] = 8;
558*15dc779aSAndroid Build Coastguard Worker       break;
559*15dc779aSAndroid Build Coastguard Worker   }
560*15dc779aSAndroid Build Coastguard Worker 
561*15dc779aSAndroid Build Coastguard Worker   val = (lp_residual[0] * lp_residual[0]) + 1.0F;
562*15dc779aSAndroid Build Coastguard Worker   cor = (corr_input[0] * corr_input[0]) + 1.0F;
563*15dc779aSAndroid Build Coastguard Worker   for (i = 1; i < LEN_SUBFR; i += 7) {
564*15dc779aSAndroid Build Coastguard Worker     val += (lp_residual[i] * lp_residual[i]);
565*15dc779aSAndroid Build Coastguard Worker     cor += (corr_input[i] * corr_input[i]);
566*15dc779aSAndroid Build Coastguard Worker     val += (lp_residual[i + 1] * lp_residual[i + 1]);
567*15dc779aSAndroid Build Coastguard Worker     cor += (corr_input[i + 1] * corr_input[i + 1]);
568*15dc779aSAndroid Build Coastguard Worker     val += (lp_residual[i + 2] * lp_residual[i + 2]);
569*15dc779aSAndroid Build Coastguard Worker     cor += (corr_input[i + 2] * corr_input[i + 2]);
570*15dc779aSAndroid Build Coastguard Worker     val += (lp_residual[i + 3] * lp_residual[i + 3]);
571*15dc779aSAndroid Build Coastguard Worker     cor += (corr_input[i + 3] * corr_input[i + 3]);
572*15dc779aSAndroid Build Coastguard Worker     val += (lp_residual[i + 4] * lp_residual[i + 4]);
573*15dc779aSAndroid Build Coastguard Worker     cor += (corr_input[i + 4] * corr_input[i + 4]);
574*15dc779aSAndroid Build Coastguard Worker     val += (lp_residual[i + 5] * lp_residual[i + 5]);
575*15dc779aSAndroid Build Coastguard Worker     cor += (corr_input[i + 5] * corr_input[i + 5]);
576*15dc779aSAndroid Build Coastguard Worker     val += (lp_residual[i + 6] * lp_residual[i + 6]);
577*15dc779aSAndroid Build Coastguard Worker     cor += (corr_input[i + 6] * corr_input[i + 6]);
578*15dc779aSAndroid Build Coastguard Worker   }
579*15dc779aSAndroid Build Coastguard Worker   s = (FLOAT32)sqrt(cor / val);
580*15dc779aSAndroid Build Coastguard Worker   for (j = 0; j < LEN_SUBFR; j++) {
581*15dc779aSAndroid Build Coastguard Worker     cor = (s * lp_residual[j]) + (alp * corr_input[j]);
582*15dc779aSAndroid Build Coastguard Worker     if (cor >= 0.0F) {
583*15dc779aSAndroid Build Coastguard Worker       sign[j] = 1.0F;
584*15dc779aSAndroid Build Coastguard Worker       vec[j] = -1.0F;
585*15dc779aSAndroid Build Coastguard Worker       dn2[j] = cor;
586*15dc779aSAndroid Build Coastguard Worker     } else {
587*15dc779aSAndroid Build Coastguard Worker       sign[j] = -1.0F;
588*15dc779aSAndroid Build Coastguard Worker       vec[j] = 1.0F;
589*15dc779aSAndroid Build Coastguard Worker       corr_input[j] = -corr_input[j];
590*15dc779aSAndroid Build Coastguard Worker       dn2[j] = -cor;
591*15dc779aSAndroid Build Coastguard Worker     }
592*15dc779aSAndroid Build Coastguard Worker   }
593*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 4; i++) {
594*15dc779aSAndroid Build Coastguard Worker     for (k = 0; k < 8; k++) {
595*15dc779aSAndroid Build Coastguard Worker       ps = -1;
596*15dc779aSAndroid Build Coastguard Worker       for (j = i; j < LEN_SUBFR; j += 4) {
597*15dc779aSAndroid Build Coastguard Worker         if (dn2[j] > ps) {
598*15dc779aSAndroid Build Coastguard Worker           ps = dn2[j];
599*15dc779aSAndroid Build Coastguard Worker           pos = j;
600*15dc779aSAndroid Build Coastguard Worker         }
601*15dc779aSAndroid Build Coastguard Worker       }
602*15dc779aSAndroid Build Coastguard Worker       dn2[pos] = (FLOAT32)k - 8;
603*15dc779aSAndroid Build Coastguard Worker       dn2_pos[i * 8 + k] = pos;
604*15dc779aSAndroid Build Coastguard Worker     }
605*15dc779aSAndroid Build Coastguard Worker     pos_max[i] = dn2_pos[i * 8];
606*15dc779aSAndroid Build Coastguard Worker   }
607*15dc779aSAndroid Build Coastguard Worker 
608*15dc779aSAndroid Build Coastguard Worker   memset(ir_buf, 0, LEN_SUBFR * sizeof(FLOAT32));
609*15dc779aSAndroid Build Coastguard Worker   memset(ir_buf + (2 * LEN_SUBFR), 0, LEN_SUBFR * sizeof(FLOAT32));
610*15dc779aSAndroid Build Coastguard Worker   p1_ir_buf = ir_buf + LEN_SUBFR;
611*15dc779aSAndroid Build Coastguard Worker   ir_sign_inv = ir_buf + (3 * LEN_SUBFR);
612*15dc779aSAndroid Build Coastguard Worker   memcpy(p1_ir_buf, ir_wsyn, LEN_SUBFR * sizeof(FLOAT32));
613*15dc779aSAndroid Build Coastguard Worker   ir_sign_inv[0] = -p1_ir_buf[0];
614*15dc779aSAndroid Build Coastguard Worker   ir_sign_inv[1] = -p1_ir_buf[1];
615*15dc779aSAndroid Build Coastguard Worker   ir_sign_inv[2] = -p1_ir_buf[2];
616*15dc779aSAndroid Build Coastguard Worker   ir_sign_inv[3] = -p1_ir_buf[3];
617*15dc779aSAndroid Build Coastguard Worker   for (i = 4; i < LEN_SUBFR; i += 6) {
618*15dc779aSAndroid Build Coastguard Worker     ir_sign_inv[i] = -p1_ir_buf[i];
619*15dc779aSAndroid Build Coastguard Worker     ir_sign_inv[i + 1] = -p1_ir_buf[i + 1];
620*15dc779aSAndroid Build Coastguard Worker     ir_sign_inv[i + 2] = -p1_ir_buf[i + 2];
621*15dc779aSAndroid Build Coastguard Worker     ir_sign_inv[i + 3] = -p1_ir_buf[i + 3];
622*15dc779aSAndroid Build Coastguard Worker     ir_sign_inv[i + 4] = -p1_ir_buf[i + 4];
623*15dc779aSAndroid Build Coastguard Worker     ir_sign_inv[i + 5] = -p1_ir_buf[i + 5];
624*15dc779aSAndroid Build Coastguard Worker   }
625*15dc779aSAndroid Build Coastguard Worker 
626*15dc779aSAndroid Build Coastguard Worker   p0 = &corr_ir[0][16 - 1];
627*15dc779aSAndroid Build Coastguard Worker   p1 = &corr_ir[1][16 - 1];
628*15dc779aSAndroid Build Coastguard Worker   p2 = &corr_ir[2][16 - 1];
629*15dc779aSAndroid Build Coastguard Worker   p3 = &corr_ir[3][16 - 1];
630*15dc779aSAndroid Build Coastguard Worker   p2_ir_buf = p1_ir_buf;
631*15dc779aSAndroid Build Coastguard Worker   cor = 0.0F;
632*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < 16; i++) {
633*15dc779aSAndroid Build Coastguard Worker     cor += (*p2_ir_buf) * (*p2_ir_buf);
634*15dc779aSAndroid Build Coastguard Worker     p2_ir_buf++;
635*15dc779aSAndroid Build Coastguard Worker     *p3-- = cor * 0.5F;
636*15dc779aSAndroid Build Coastguard Worker     cor += (*p2_ir_buf) * (*p2_ir_buf);
637*15dc779aSAndroid Build Coastguard Worker     p2_ir_buf++;
638*15dc779aSAndroid Build Coastguard Worker     *p2-- = cor * 0.5F;
639*15dc779aSAndroid Build Coastguard Worker     cor += (*p2_ir_buf) * (*p2_ir_buf);
640*15dc779aSAndroid Build Coastguard Worker     p2_ir_buf++;
641*15dc779aSAndroid Build Coastguard Worker     *p1-- = cor * 0.5F;
642*15dc779aSAndroid Build Coastguard Worker     cor += (*p2_ir_buf) * (*p2_ir_buf);
643*15dc779aSAndroid Build Coastguard Worker     p2_ir_buf++;
644*15dc779aSAndroid Build Coastguard Worker     *p0-- = cor * 0.5F;
645*15dc779aSAndroid Build Coastguard Worker   }
646*15dc779aSAndroid Build Coastguard Worker   pos = 256 - 1;
647*15dc779aSAndroid Build Coastguard Worker   p4_ir_buf = p1_ir_buf + 1;
648*15dc779aSAndroid Build Coastguard Worker   for (k = 0; k < 16; k++) {
649*15dc779aSAndroid Build Coastguard Worker     p3 = &corr_p1p2[2][pos];
650*15dc779aSAndroid Build Coastguard Worker     p2 = &corr_p1p2[1][pos];
651*15dc779aSAndroid Build Coastguard Worker     p1 = &corr_p1p2[0][pos];
652*15dc779aSAndroid Build Coastguard Worker     if (k == 15) {
653*15dc779aSAndroid Build Coastguard Worker       p0 = &corr_p1p2[3][pos - 15];
654*15dc779aSAndroid Build Coastguard Worker     } else {
655*15dc779aSAndroid Build Coastguard Worker       p0 = &corr_p1p2[3][pos - 16];
656*15dc779aSAndroid Build Coastguard Worker     }
657*15dc779aSAndroid Build Coastguard Worker     cor = 0.0F;
658*15dc779aSAndroid Build Coastguard Worker     p2_ir_buf = p1_ir_buf;
659*15dc779aSAndroid Build Coastguard Worker     p3_ir_buf = p4_ir_buf;
660*15dc779aSAndroid Build Coastguard Worker     for (i = k + 1; i < 16; i++) {
661*15dc779aSAndroid Build Coastguard Worker       cor += (*p2_ir_buf) * (*p3_ir_buf);
662*15dc779aSAndroid Build Coastguard Worker       p2_ir_buf++;
663*15dc779aSAndroid Build Coastguard Worker       p3_ir_buf++;
664*15dc779aSAndroid Build Coastguard Worker       *p3 = cor;
665*15dc779aSAndroid Build Coastguard Worker       cor += (*p2_ir_buf) * (*p3_ir_buf);
666*15dc779aSAndroid Build Coastguard Worker       p2_ir_buf++;
667*15dc779aSAndroid Build Coastguard Worker       p3_ir_buf++;
668*15dc779aSAndroid Build Coastguard Worker       *p2 = cor;
669*15dc779aSAndroid Build Coastguard Worker       cor += (*p2_ir_buf) * (*p3_ir_buf);
670*15dc779aSAndroid Build Coastguard Worker       p2_ir_buf++;
671*15dc779aSAndroid Build Coastguard Worker       p3_ir_buf++;
672*15dc779aSAndroid Build Coastguard Worker       *p1 = cor;
673*15dc779aSAndroid Build Coastguard Worker       cor += (*p2_ir_buf) * (*p3_ir_buf);
674*15dc779aSAndroid Build Coastguard Worker       p2_ir_buf++;
675*15dc779aSAndroid Build Coastguard Worker       p3_ir_buf++;
676*15dc779aSAndroid Build Coastguard Worker       *p0 = cor;
677*15dc779aSAndroid Build Coastguard Worker       p3 -= (16 + 1);
678*15dc779aSAndroid Build Coastguard Worker       p2 -= (16 + 1);
679*15dc779aSAndroid Build Coastguard Worker       p1 -= (16 + 1);
680*15dc779aSAndroid Build Coastguard Worker       p0 -= (16 + 1);
681*15dc779aSAndroid Build Coastguard Worker     }
682*15dc779aSAndroid Build Coastguard Worker     cor += (*p2_ir_buf) * (*p3_ir_buf);
683*15dc779aSAndroid Build Coastguard Worker     p2_ir_buf++;
684*15dc779aSAndroid Build Coastguard Worker     p3_ir_buf++;
685*15dc779aSAndroid Build Coastguard Worker     *p3 = cor;
686*15dc779aSAndroid Build Coastguard Worker     cor += (*p2_ir_buf) * (*p3_ir_buf);
687*15dc779aSAndroid Build Coastguard Worker     p2_ir_buf++;
688*15dc779aSAndroid Build Coastguard Worker     p3_ir_buf++;
689*15dc779aSAndroid Build Coastguard Worker     *p2 = cor;
690*15dc779aSAndroid Build Coastguard Worker     cor += (*p2_ir_buf) * (*p3_ir_buf);
691*15dc779aSAndroid Build Coastguard Worker     p2_ir_buf++;
692*15dc779aSAndroid Build Coastguard Worker     p3_ir_buf++;
693*15dc779aSAndroid Build Coastguard Worker     *p1 = cor;
694*15dc779aSAndroid Build Coastguard Worker     pos -= 16;
695*15dc779aSAndroid Build Coastguard Worker     p4_ir_buf += 4;
696*15dc779aSAndroid Build Coastguard Worker   }
697*15dc779aSAndroid Build Coastguard Worker   pos = 256 - 1;
698*15dc779aSAndroid Build Coastguard Worker   p4_ir_buf = p1_ir_buf + 3;
699*15dc779aSAndroid Build Coastguard Worker   for (k = 0; k < 16; k++) {
700*15dc779aSAndroid Build Coastguard Worker     p3 = &corr_p1p2[3][pos];
701*15dc779aSAndroid Build Coastguard Worker     p2 = &corr_p1p2[2][pos - 1];
702*15dc779aSAndroid Build Coastguard Worker     p1 = &corr_p1p2[1][pos - 1];
703*15dc779aSAndroid Build Coastguard Worker     p0 = &corr_p1p2[0][pos - 1];
704*15dc779aSAndroid Build Coastguard Worker     cor = 0.0F;
705*15dc779aSAndroid Build Coastguard Worker     p2_ir_buf = p1_ir_buf;
706*15dc779aSAndroid Build Coastguard Worker     p3_ir_buf = p4_ir_buf;
707*15dc779aSAndroid Build Coastguard Worker     for (i = k + 1; i < 16; i++) {
708*15dc779aSAndroid Build Coastguard Worker       cor += (*p2_ir_buf) * (*p3_ir_buf);
709*15dc779aSAndroid Build Coastguard Worker       p2_ir_buf++;
710*15dc779aSAndroid Build Coastguard Worker       p3_ir_buf++;
711*15dc779aSAndroid Build Coastguard Worker       *p3 = cor;
712*15dc779aSAndroid Build Coastguard Worker       cor += (*p2_ir_buf) * (*p3_ir_buf);
713*15dc779aSAndroid Build Coastguard Worker       p2_ir_buf++;
714*15dc779aSAndroid Build Coastguard Worker       p3_ir_buf++;
715*15dc779aSAndroid Build Coastguard Worker       *p2 = cor;
716*15dc779aSAndroid Build Coastguard Worker       cor += (*p2_ir_buf) * (*p3_ir_buf);
717*15dc779aSAndroid Build Coastguard Worker       p2_ir_buf++;
718*15dc779aSAndroid Build Coastguard Worker       p3_ir_buf++;
719*15dc779aSAndroid Build Coastguard Worker       *p1 = cor;
720*15dc779aSAndroid Build Coastguard Worker       cor += (*p2_ir_buf) * (*p3_ir_buf);
721*15dc779aSAndroid Build Coastguard Worker       p2_ir_buf++;
722*15dc779aSAndroid Build Coastguard Worker       p3_ir_buf++;
723*15dc779aSAndroid Build Coastguard Worker       *p0 = cor;
724*15dc779aSAndroid Build Coastguard Worker       p3 -= (16 + 1);
725*15dc779aSAndroid Build Coastguard Worker       p2 -= (16 + 1);
726*15dc779aSAndroid Build Coastguard Worker       p1 -= (16 + 1);
727*15dc779aSAndroid Build Coastguard Worker       p0 -= (16 + 1);
728*15dc779aSAndroid Build Coastguard Worker     }
729*15dc779aSAndroid Build Coastguard Worker     cor += (*p2_ir_buf) * (*p3_ir_buf);
730*15dc779aSAndroid Build Coastguard Worker     p2_ir_buf++;
731*15dc779aSAndroid Build Coastguard Worker     p3_ir_buf++;
732*15dc779aSAndroid Build Coastguard Worker     *p3 = cor;
733*15dc779aSAndroid Build Coastguard Worker     pos--;
734*15dc779aSAndroid Build Coastguard Worker     p4_ir_buf += 4;
735*15dc779aSAndroid Build Coastguard Worker   }
736*15dc779aSAndroid Build Coastguard Worker 
737*15dc779aSAndroid Build Coastguard Worker   p0 = &corr_p1p2[0][0];
738*15dc779aSAndroid Build Coastguard Worker   for (k = 0; k < 4; k++) {
739*15dc779aSAndroid Build Coastguard Worker     for (i = k; i < LEN_SUBFR; i += 4) {
740*15dc779aSAndroid Build Coastguard Worker       psign = sign;
741*15dc779aSAndroid Build Coastguard Worker       if (psign[i] < 0.0F) {
742*15dc779aSAndroid Build Coastguard Worker         psign = vec;
743*15dc779aSAndroid Build Coastguard Worker       }
744*15dc779aSAndroid Build Coastguard Worker       j = (k + 1) % 4;
745*15dc779aSAndroid Build Coastguard Worker       p0[0] = p0[0] * psign[j];
746*15dc779aSAndroid Build Coastguard Worker       p0[1] = p0[1] * psign[j + 4];
747*15dc779aSAndroid Build Coastguard Worker       p0[2] = p0[2] * psign[j + 8];
748*15dc779aSAndroid Build Coastguard Worker       p0[3] = p0[3] * psign[j + 12];
749*15dc779aSAndroid Build Coastguard Worker       p0[4] = p0[4] * psign[j + 16];
750*15dc779aSAndroid Build Coastguard Worker       p0[5] = p0[5] * psign[j + 20];
751*15dc779aSAndroid Build Coastguard Worker       p0[6] = p0[6] * psign[j + 24];
752*15dc779aSAndroid Build Coastguard Worker       p0[7] = p0[7] * psign[j + 28];
753*15dc779aSAndroid Build Coastguard Worker       p0[8] = p0[8] * psign[j + 32];
754*15dc779aSAndroid Build Coastguard Worker       p0[9] = p0[9] * psign[j + 36];
755*15dc779aSAndroid Build Coastguard Worker       p0[10] = p0[10] * psign[j + 40];
756*15dc779aSAndroid Build Coastguard Worker       p0[11] = p0[11] * psign[j + 44];
757*15dc779aSAndroid Build Coastguard Worker       p0[12] = p0[12] * psign[j + 48];
758*15dc779aSAndroid Build Coastguard Worker       p0[13] = p0[13] * psign[j + 52];
759*15dc779aSAndroid Build Coastguard Worker       p0[14] = p0[14] * psign[j + 56];
760*15dc779aSAndroid Build Coastguard Worker       p0[15] = p0[15] * psign[j + 60];
761*15dc779aSAndroid Build Coastguard Worker       p0 += 16;
762*15dc779aSAndroid Build Coastguard Worker     }
763*15dc779aSAndroid Build Coastguard Worker   }
764*15dc779aSAndroid Build Coastguard Worker   psk = -1.0;
765*15dc779aSAndroid Build Coastguard Worker   alpk = 1.0;
766*15dc779aSAndroid Build Coastguard Worker   for (k = 0; k < num_iter; k++) {
767*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < num_pulses - (num_pulses % 3); i += 3) {
768*15dc779aSAndroid Build Coastguard Worker       ipos[i] = iusace_acelp_ipos[(k * 4) + i];
769*15dc779aSAndroid Build Coastguard Worker       ipos[i + 1] = iusace_acelp_ipos[(k * 4) + i + 1];
770*15dc779aSAndroid Build Coastguard Worker       ipos[i + 2] = iusace_acelp_ipos[(k * 4) + i + 2];
771*15dc779aSAndroid Build Coastguard Worker     }
772*15dc779aSAndroid Build Coastguard Worker     for (; i < num_pulses; i++) {
773*15dc779aSAndroid Build Coastguard Worker       ipos[i] = iusace_acelp_ipos[(k * 4) + i];
774*15dc779aSAndroid Build Coastguard Worker     }
775*15dc779aSAndroid Build Coastguard Worker 
776*15dc779aSAndroid Build Coastguard Worker     if ((num_bits_cb == 20) | (num_bits_cb == 28) | (num_bits_cb == 12) | (num_bits_cb == 16)) {
777*15dc779aSAndroid Build Coastguard Worker       pos = 0;
778*15dc779aSAndroid Build Coastguard Worker       ps = 0.0F;
779*15dc779aSAndroid Build Coastguard Worker       alp = 0.0F;
780*15dc779aSAndroid Build Coastguard Worker       memset(vec, 0, LEN_SUBFR * sizeof(FLOAT32));
781*15dc779aSAndroid Build Coastguard Worker       if (num_bits_cb == 28) {
782*15dc779aSAndroid Build Coastguard Worker         ipos[4] = 0;
783*15dc779aSAndroid Build Coastguard Worker         ipos[5] = 1;
784*15dc779aSAndroid Build Coastguard Worker       }
785*15dc779aSAndroid Build Coastguard Worker 
786*15dc779aSAndroid Build Coastguard Worker       if (num_bits_cb == 16) {
787*15dc779aSAndroid Build Coastguard Worker         ipos[0] = 0;
788*15dc779aSAndroid Build Coastguard Worker         ipos[1] = 2;
789*15dc779aSAndroid Build Coastguard Worker         ipos[2] = 1;
790*15dc779aSAndroid Build Coastguard Worker         ipos[3] = 3;
791*15dc779aSAndroid Build Coastguard Worker       }
792*15dc779aSAndroid Build Coastguard Worker     } else if ((num_bits_cb == 36) | (num_bits_cb == 44)) {
793*15dc779aSAndroid Build Coastguard Worker       pos = 2;
794*15dc779aSAndroid Build Coastguard Worker       pulse_pos[0] = pos_max[ipos[0]];
795*15dc779aSAndroid Build Coastguard Worker       pulse_pos[1] = pos_max[ipos[1]];
796*15dc779aSAndroid Build Coastguard Worker       ps = corr_input[pulse_pos[0]] + corr_input[pulse_pos[1]];
797*15dc779aSAndroid Build Coastguard Worker       alp = corr_ir[ipos[0]][pulse_pos[0] >> 2] + corr_ir[ipos[1]][pulse_pos[1] >> 2] +
798*15dc779aSAndroid Build Coastguard Worker             corr_p1p2[ipos[0]][((pulse_pos[0] >> 2) << 4) + (pulse_pos[1] >> 2)];
799*15dc779aSAndroid Build Coastguard Worker       if (sign[pulse_pos[0]] < 0.0) {
800*15dc779aSAndroid Build Coastguard Worker         p0 = ir_sign_inv - pulse_pos[0];
801*15dc779aSAndroid Build Coastguard Worker       } else {
802*15dc779aSAndroid Build Coastguard Worker         p0 = p1_ir_buf - pulse_pos[0];
803*15dc779aSAndroid Build Coastguard Worker       }
804*15dc779aSAndroid Build Coastguard Worker       if (sign[pulse_pos[1]] < 0.0) {
805*15dc779aSAndroid Build Coastguard Worker         p1 = ir_sign_inv - pulse_pos[1];
806*15dc779aSAndroid Build Coastguard Worker       } else {
807*15dc779aSAndroid Build Coastguard Worker         p1 = p1_ir_buf - pulse_pos[1];
808*15dc779aSAndroid Build Coastguard Worker       }
809*15dc779aSAndroid Build Coastguard Worker       vec[0] = p0[0] + p1[0];
810*15dc779aSAndroid Build Coastguard Worker       vec[1] = p0[1] + p1[1];
811*15dc779aSAndroid Build Coastguard Worker       vec[2] = p0[2] + p1[2];
812*15dc779aSAndroid Build Coastguard Worker       vec[3] = p0[3] + p1[3];
813*15dc779aSAndroid Build Coastguard Worker       for (i = 4; i < LEN_SUBFR; i += 6) {
814*15dc779aSAndroid Build Coastguard Worker         vec[i] = p0[i] + p1[i];
815*15dc779aSAndroid Build Coastguard Worker         vec[i + 1] = p0[i + 1] + p1[i + 1];
816*15dc779aSAndroid Build Coastguard Worker         vec[i + 2] = p0[i + 2] + p1[i + 2];
817*15dc779aSAndroid Build Coastguard Worker         vec[i + 3] = p0[i + 3] + p1[i + 3];
818*15dc779aSAndroid Build Coastguard Worker         vec[i + 4] = p0[i + 4] + p1[i + 4];
819*15dc779aSAndroid Build Coastguard Worker         vec[i + 5] = p0[i + 5] + p1[i + 5];
820*15dc779aSAndroid Build Coastguard Worker       }
821*15dc779aSAndroid Build Coastguard Worker       if (num_bits_cb == 44) {
822*15dc779aSAndroid Build Coastguard Worker         ipos[8] = 0;
823*15dc779aSAndroid Build Coastguard Worker         ipos[9] = 1;
824*15dc779aSAndroid Build Coastguard Worker       }
825*15dc779aSAndroid Build Coastguard Worker     } else {
826*15dc779aSAndroid Build Coastguard Worker       pos = 4;
827*15dc779aSAndroid Build Coastguard Worker       pulse_pos[0] = pos_max[ipos[0]];
828*15dc779aSAndroid Build Coastguard Worker       pulse_pos[1] = pos_max[ipos[1]];
829*15dc779aSAndroid Build Coastguard Worker       pulse_pos[2] = pos_max[ipos[2]];
830*15dc779aSAndroid Build Coastguard Worker       pulse_pos[3] = pos_max[ipos[3]];
831*15dc779aSAndroid Build Coastguard Worker       ps = corr_input[pulse_pos[0]] + corr_input[pulse_pos[1]] + corr_input[pulse_pos[2]] +
832*15dc779aSAndroid Build Coastguard Worker            corr_input[pulse_pos[3]];
833*15dc779aSAndroid Build Coastguard Worker       p0 = p1_ir_buf - pulse_pos[0];
834*15dc779aSAndroid Build Coastguard Worker       if (sign[pulse_pos[0]] < 0.0) {
835*15dc779aSAndroid Build Coastguard Worker         p0 = ir_sign_inv - pulse_pos[0];
836*15dc779aSAndroid Build Coastguard Worker       }
837*15dc779aSAndroid Build Coastguard Worker       p1 = p1_ir_buf - pulse_pos[1];
838*15dc779aSAndroid Build Coastguard Worker       if (sign[pulse_pos[1]] < 0.0) {
839*15dc779aSAndroid Build Coastguard Worker         p1 = ir_sign_inv - pulse_pos[1];
840*15dc779aSAndroid Build Coastguard Worker       }
841*15dc779aSAndroid Build Coastguard Worker       p2 = p1_ir_buf - pulse_pos[2];
842*15dc779aSAndroid Build Coastguard Worker       if (sign[pulse_pos[2]] < 0.0) {
843*15dc779aSAndroid Build Coastguard Worker         p2 = ir_sign_inv - pulse_pos[2];
844*15dc779aSAndroid Build Coastguard Worker       }
845*15dc779aSAndroid Build Coastguard Worker       p3 = p1_ir_buf - pulse_pos[3];
846*15dc779aSAndroid Build Coastguard Worker       if (sign[pulse_pos[3]] < 0.0) {
847*15dc779aSAndroid Build Coastguard Worker         p3 = ir_sign_inv - pulse_pos[3];
848*15dc779aSAndroid Build Coastguard Worker       }
849*15dc779aSAndroid Build Coastguard Worker       vec[0] = p0[0] + p1[0] + p2[0] + p3[0];
850*15dc779aSAndroid Build Coastguard Worker       for (i = 1; i < LEN_SUBFR; i += 3) {
851*15dc779aSAndroid Build Coastguard Worker         vec[i] = p0[i] + p1[i] + p2[i] + p3[i];
852*15dc779aSAndroid Build Coastguard Worker         vec[i + 1] = p0[i + 1] + p1[i + 1] + p2[i + 1] + p3[i + 1];
853*15dc779aSAndroid Build Coastguard Worker         vec[i + 2] = p0[i + 2] + p1[i + 2] + p2[i + 2] + p3[i + 2];
854*15dc779aSAndroid Build Coastguard Worker       }
855*15dc779aSAndroid Build Coastguard Worker       alp = 0.0F;
856*15dc779aSAndroid Build Coastguard Worker       alp += vec[0] * vec[0] + vec[1] * vec[1];
857*15dc779aSAndroid Build Coastguard Worker       alp += vec[2] * vec[2] + vec[3] * vec[3];
858*15dc779aSAndroid Build Coastguard Worker       for (i = 4; i < LEN_SUBFR; i += 6) {
859*15dc779aSAndroid Build Coastguard Worker         alp += vec[i] * vec[i];
860*15dc779aSAndroid Build Coastguard Worker         alp += vec[i + 1] * vec[i + 1];
861*15dc779aSAndroid Build Coastguard Worker         alp += vec[i + 2] * vec[i + 2];
862*15dc779aSAndroid Build Coastguard Worker         alp += vec[i + 3] * vec[i + 3];
863*15dc779aSAndroid Build Coastguard Worker         alp += vec[i + 4] * vec[i + 4];
864*15dc779aSAndroid Build Coastguard Worker         alp += vec[i + 5] * vec[i + 5];
865*15dc779aSAndroid Build Coastguard Worker       }
866*15dc779aSAndroid Build Coastguard Worker       alp *= 0.5F;
867*15dc779aSAndroid Build Coastguard Worker       if (num_bits_cb == 72) {
868*15dc779aSAndroid Build Coastguard Worker         ipos[16] = 0;
869*15dc779aSAndroid Build Coastguard Worker         ipos[17] = 1;
870*15dc779aSAndroid Build Coastguard Worker       }
871*15dc779aSAndroid Build Coastguard Worker     }
872*15dc779aSAndroid Build Coastguard Worker 
873*15dc779aSAndroid Build Coastguard Worker     for (j = pos, st = 0; j < num_pulses; j += 2, st++) {
874*15dc779aSAndroid Build Coastguard Worker       if ((num_pulses - j) >= 2) {
875*15dc779aSAndroid Build Coastguard Worker         iusace_acelp_ir_vec_corr1(p1_ir_buf, vec, ipos[j], sign, corr_ir, corr_x, dn2_pos,
876*15dc779aSAndroid Build Coastguard Worker                                   num_pulse_position[st]);
877*15dc779aSAndroid Build Coastguard Worker         iusace_acelp_ir_vec_corr2(p1_ir_buf, vec, ipos[j + 1], sign, corr_ir, corr_y);
878*15dc779aSAndroid Build Coastguard Worker 
879*15dc779aSAndroid Build Coastguard Worker         iusace_acelp_get_2p_pos(num_pulse_position[st], ipos[j], ipos[j + 1], &ps, &alp,
880*15dc779aSAndroid Build Coastguard Worker                                 &pulse_pos[j], &pulse_pos[j + 1], corr_input, dn2_pos, corr_x,
881*15dc779aSAndroid Build Coastguard Worker                                 corr_y, corr_p1p2);
882*15dc779aSAndroid Build Coastguard Worker       } else {
883*15dc779aSAndroid Build Coastguard Worker         iusace_acelp_ir_vec_corr2(p1_ir_buf, vec, ipos[j], sign, corr_ir, corr_x);
884*15dc779aSAndroid Build Coastguard Worker         iusace_acelp_ir_vec_corr2(p1_ir_buf, vec, ipos[j + 1], sign, corr_ir, corr_y);
885*15dc779aSAndroid Build Coastguard Worker         iusace_acelp_get_1p_pos(ipos[j], ipos[j + 1], &ps, &alp, &pulse_pos[j], corr_input,
886*15dc779aSAndroid Build Coastguard Worker                                 corr_x, corr_y);
887*15dc779aSAndroid Build Coastguard Worker       }
888*15dc779aSAndroid Build Coastguard Worker       if (j < (num_pulses - 2)) {
889*15dc779aSAndroid Build Coastguard Worker         p0 = p1_ir_buf - pulse_pos[j];
890*15dc779aSAndroid Build Coastguard Worker         if (sign[pulse_pos[j]] < 0.0) {
891*15dc779aSAndroid Build Coastguard Worker           p0 = ir_sign_inv - pulse_pos[j];
892*15dc779aSAndroid Build Coastguard Worker         }
893*15dc779aSAndroid Build Coastguard Worker         p1 = p1_ir_buf - pulse_pos[j + 1];
894*15dc779aSAndroid Build Coastguard Worker         if (sign[pulse_pos[j + 1]] < 0.0) {
895*15dc779aSAndroid Build Coastguard Worker           p1 = ir_sign_inv - pulse_pos[j + 1];
896*15dc779aSAndroid Build Coastguard Worker         }
897*15dc779aSAndroid Build Coastguard Worker         vec[0] += p0[0] + p1[0];
898*15dc779aSAndroid Build Coastguard Worker         vec[1] += p0[1] + p1[1];
899*15dc779aSAndroid Build Coastguard Worker         vec[2] += p0[2] + p1[2];
900*15dc779aSAndroid Build Coastguard Worker         vec[3] += p0[3] + p1[3];
901*15dc779aSAndroid Build Coastguard Worker         for (i = 4; i < LEN_SUBFR; i += 6) {
902*15dc779aSAndroid Build Coastguard Worker           vec[i] += p0[i] + p1[i];
903*15dc779aSAndroid Build Coastguard Worker           vec[i + 1] += p0[i + 1] + p1[i + 1];
904*15dc779aSAndroid Build Coastguard Worker           vec[i + 2] += p0[i + 2] + p1[i + 2];
905*15dc779aSAndroid Build Coastguard Worker           vec[i + 3] += p0[i + 3] + p1[i + 3];
906*15dc779aSAndroid Build Coastguard Worker           vec[i + 4] += p0[i + 4] + p1[i + 4];
907*15dc779aSAndroid Build Coastguard Worker           vec[i + 5] += p0[i + 5] + p1[i + 5];
908*15dc779aSAndroid Build Coastguard Worker         }
909*15dc779aSAndroid Build Coastguard Worker       }
910*15dc779aSAndroid Build Coastguard Worker     }
911*15dc779aSAndroid Build Coastguard Worker     ps = ps * ps;
912*15dc779aSAndroid Build Coastguard Worker     s = (alpk * ps) - (psk * alp);
913*15dc779aSAndroid Build Coastguard Worker     if (s > 0.0F) {
914*15dc779aSAndroid Build Coastguard Worker       psk = ps;
915*15dc779aSAndroid Build Coastguard Worker       alpk = alp;
916*15dc779aSAndroid Build Coastguard Worker       memcpy(codvec, pulse_pos, num_pulses * sizeof(WORD32));
917*15dc779aSAndroid Build Coastguard Worker     }
918*15dc779aSAndroid Build Coastguard Worker   }
919*15dc779aSAndroid Build Coastguard Worker 
920*15dc779aSAndroid Build Coastguard Worker   memset(alg_cb_exc_out, 0, LEN_SUBFR * sizeof(WORD16));
921*15dc779aSAndroid Build Coastguard Worker   memset(filt_cb_exc, 0, LEN_SUBFR * sizeof(FLOAT32));
922*15dc779aSAndroid Build Coastguard Worker   memset(pulse_pos, 0xffffffff, NPMAXPT * 4 * sizeof(WORD32));
923*15dc779aSAndroid Build Coastguard Worker   for (k = 0; k < num_pulses; k++) {
924*15dc779aSAndroid Build Coastguard Worker     i = codvec[k];
925*15dc779aSAndroid Build Coastguard Worker     val = sign[i];
926*15dc779aSAndroid Build Coastguard Worker     index = i / 4;
927*15dc779aSAndroid Build Coastguard Worker     track = i % 4;
928*15dc779aSAndroid Build Coastguard Worker     if (val > 0) {
929*15dc779aSAndroid Build Coastguard Worker       alg_cb_exc_out[i] += 512;
930*15dc779aSAndroid Build Coastguard Worker       codvec[k] += (2 * LEN_SUBFR);
931*15dc779aSAndroid Build Coastguard Worker     } else {
932*15dc779aSAndroid Build Coastguard Worker       alg_cb_exc_out[i] -= 512;
933*15dc779aSAndroid Build Coastguard Worker       index += 16;
934*15dc779aSAndroid Build Coastguard Worker     }
935*15dc779aSAndroid Build Coastguard Worker     i = track * NPMAXPT;
936*15dc779aSAndroid Build Coastguard Worker     while (pulse_pos[i] >= 0) {
937*15dc779aSAndroid Build Coastguard Worker       i++;
938*15dc779aSAndroid Build Coastguard Worker     }
939*15dc779aSAndroid Build Coastguard Worker     pulse_pos[i] = index;
940*15dc779aSAndroid Build Coastguard Worker     p0 = ir_sign_inv - codvec[k];
941*15dc779aSAndroid Build Coastguard Worker     filt_cb_exc[0] += p0[0];
942*15dc779aSAndroid Build Coastguard Worker     for (i = 1; i < LEN_SUBFR; i += 3) {
943*15dc779aSAndroid Build Coastguard Worker       filt_cb_exc[i] += p0[i];
944*15dc779aSAndroid Build Coastguard Worker       filt_cb_exc[i + 1] += p0[i + 1];
945*15dc779aSAndroid Build Coastguard Worker       filt_cb_exc[i + 2] += p0[i + 2];
946*15dc779aSAndroid Build Coastguard Worker     }
947*15dc779aSAndroid Build Coastguard Worker   }
948*15dc779aSAndroid Build Coastguard Worker 
949*15dc779aSAndroid Build Coastguard Worker   if (num_bits_cb == ACELP_NUM_BITS_20) {
950*15dc779aSAndroid Build Coastguard Worker     for (track = 0; track < 4; track++) {
951*15dc779aSAndroid Build Coastguard Worker       k = track * NPMAXPT;
952*15dc779aSAndroid Build Coastguard Worker       acelp_param_out[track] = iusace_acelp_quant_1p_n1bits(pulse_pos[k], 4);
953*15dc779aSAndroid Build Coastguard Worker     }
954*15dc779aSAndroid Build Coastguard Worker   } else if (num_bits_cb == ACELP_NUM_BITS_28) {
955*15dc779aSAndroid Build Coastguard Worker     for (track = 0; track < (4 - 2); track++) {
956*15dc779aSAndroid Build Coastguard Worker       k = track * NPMAXPT;
957*15dc779aSAndroid Build Coastguard Worker       acelp_param_out[track] = iusace_acelp_quant_2p_2n1bits(pulse_pos[k], pulse_pos[k + 1], 4);
958*15dc779aSAndroid Build Coastguard Worker     }
959*15dc779aSAndroid Build Coastguard Worker     for (track = 2; track < 4; track++) {
960*15dc779aSAndroid Build Coastguard Worker       k = track * NPMAXPT;
961*15dc779aSAndroid Build Coastguard Worker       acelp_param_out[track] = iusace_acelp_quant_1p_n1bits(pulse_pos[k], 4);
962*15dc779aSAndroid Build Coastguard Worker     }
963*15dc779aSAndroid Build Coastguard Worker   } else if (num_bits_cb == ACELP_NUM_BITS_36) {
964*15dc779aSAndroid Build Coastguard Worker     for (track = 0; track < 4; track++) {
965*15dc779aSAndroid Build Coastguard Worker       k = track * NPMAXPT;
966*15dc779aSAndroid Build Coastguard Worker       acelp_param_out[track] = iusace_acelp_quant_2p_2n1bits(pulse_pos[k], pulse_pos[k + 1], 4);
967*15dc779aSAndroid Build Coastguard Worker     }
968*15dc779aSAndroid Build Coastguard Worker   } else if (num_bits_cb == ACELP_NUM_BITS_44) {
969*15dc779aSAndroid Build Coastguard Worker     for (track = 0; track < (4 - 2); track++) {
970*15dc779aSAndroid Build Coastguard Worker       k = track * NPMAXPT;
971*15dc779aSAndroid Build Coastguard Worker       acelp_param_out[track] =
972*15dc779aSAndroid Build Coastguard Worker           iusace_acelp_quant_3p_3n1bits(pulse_pos[k], pulse_pos[k + 1], pulse_pos[k + 2], 4);
973*15dc779aSAndroid Build Coastguard Worker     }
974*15dc779aSAndroid Build Coastguard Worker     for (track = 2; track < 4; track++) {
975*15dc779aSAndroid Build Coastguard Worker       k = track * NPMAXPT;
976*15dc779aSAndroid Build Coastguard Worker       acelp_param_out[track] = iusace_acelp_quant_2p_2n1bits(pulse_pos[k], pulse_pos[k + 1], 4);
977*15dc779aSAndroid Build Coastguard Worker     }
978*15dc779aSAndroid Build Coastguard Worker   } else if (num_bits_cb == ACELP_NUM_BITS_52) {
979*15dc779aSAndroid Build Coastguard Worker     for (track = 0; track < 4; track++) {
980*15dc779aSAndroid Build Coastguard Worker       k = track * NPMAXPT;
981*15dc779aSAndroid Build Coastguard Worker       acelp_param_out[track] =
982*15dc779aSAndroid Build Coastguard Worker           iusace_acelp_quant_3p_3n1bits(pulse_pos[k], pulse_pos[k + 1], pulse_pos[k + 2], 4);
983*15dc779aSAndroid Build Coastguard Worker     }
984*15dc779aSAndroid Build Coastguard Worker   } else if (num_bits_cb == ACELP_NUM_BITS_64) {
985*15dc779aSAndroid Build Coastguard Worker     for (track = 0; track < 4; track++) {
986*15dc779aSAndroid Build Coastguard Worker       k = track * NPMAXPT;
987*15dc779aSAndroid Build Coastguard Worker       l_index = iusace_acelp_quant_4p_4nbits(&pulse_pos[k], 4);
988*15dc779aSAndroid Build Coastguard Worker       acelp_param_out[track] = ((l_index >> 14) & 3);
989*15dc779aSAndroid Build Coastguard Worker       acelp_param_out[track + 4] = (l_index & 0x3FFF);
990*15dc779aSAndroid Build Coastguard Worker     }
991*15dc779aSAndroid Build Coastguard Worker   } else if (num_bits_cb == ACELP_NUM_BITS_72) {
992*15dc779aSAndroid Build Coastguard Worker     for (track = 0; track < (4 - 2); track++) {
993*15dc779aSAndroid Build Coastguard Worker       k = track * NPMAXPT;
994*15dc779aSAndroid Build Coastguard Worker       l_index = iusace_acelp_quant_5p_5nbits(&pulse_pos[k], 4);
995*15dc779aSAndroid Build Coastguard Worker       acelp_param_out[track] = ((l_index >> 10) & 0x03FF);
996*15dc779aSAndroid Build Coastguard Worker       acelp_param_out[track + 4] = (l_index & 0x03FF);
997*15dc779aSAndroid Build Coastguard Worker     }
998*15dc779aSAndroid Build Coastguard Worker     for (track = 2; track < 4; track++) {
999*15dc779aSAndroid Build Coastguard Worker       k = track * NPMAXPT;
1000*15dc779aSAndroid Build Coastguard Worker       l_index = iusace_acelp_quant_4p_4nbits(&pulse_pos[k], 4);
1001*15dc779aSAndroid Build Coastguard Worker       acelp_param_out[track] = ((l_index >> 14) & 3);
1002*15dc779aSAndroid Build Coastguard Worker       acelp_param_out[track + 4] = (l_index & 0x3FFF);
1003*15dc779aSAndroid Build Coastguard Worker     }
1004*15dc779aSAndroid Build Coastguard Worker   } else if (num_bits_cb == ACELP_NUM_BITS_88) {
1005*15dc779aSAndroid Build Coastguard Worker     for (track = 0; track < 4; track++) {
1006*15dc779aSAndroid Build Coastguard Worker       k = track * NPMAXPT;
1007*15dc779aSAndroid Build Coastguard Worker       l_index = iusace_acelp_quant_6p_6n_2bits(&pulse_pos[k], 4);
1008*15dc779aSAndroid Build Coastguard Worker       acelp_param_out[track] = ((l_index >> 11) & 0x07FF);
1009*15dc779aSAndroid Build Coastguard Worker       acelp_param_out[track + 4] = (l_index & 0x07FF);
1010*15dc779aSAndroid Build Coastguard Worker     }
1011*15dc779aSAndroid Build Coastguard Worker   }
1012*15dc779aSAndroid Build Coastguard Worker   return;
1013*15dc779aSAndroid Build Coastguard Worker }
1014*15dc779aSAndroid Build Coastguard Worker 
iusace_acelp_ltpred_cb_exc(FLOAT32 * exc,WORD32 t0,WORD32 t0_frac,WORD32 len_subfrm)1015*15dc779aSAndroid Build Coastguard Worker VOID iusace_acelp_ltpred_cb_exc(FLOAT32 *exc, WORD32 t0, WORD32 t0_frac, WORD32 len_subfrm) {
1016*15dc779aSAndroid Build Coastguard Worker   WORD32 i, j;
1017*15dc779aSAndroid Build Coastguard Worker   FLOAT32 s, *x0, *x1, *x2;
1018*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *c1, *c2;
1019*15dc779aSAndroid Build Coastguard Worker 
1020*15dc779aSAndroid Build Coastguard Worker   x0 = &exc[-t0];
1021*15dc779aSAndroid Build Coastguard Worker   t0_frac = -t0_frac;
1022*15dc779aSAndroid Build Coastguard Worker   if (t0_frac < 0) {
1023*15dc779aSAndroid Build Coastguard Worker     t0_frac += T_UP_SAMP;
1024*15dc779aSAndroid Build Coastguard Worker     x0--;
1025*15dc779aSAndroid Build Coastguard Worker   }
1026*15dc779aSAndroid Build Coastguard Worker   for (j = 0; j < len_subfrm; j++) {
1027*15dc779aSAndroid Build Coastguard Worker     x1 = x0++;
1028*15dc779aSAndroid Build Coastguard Worker     x2 = x1 + 1;
1029*15dc779aSAndroid Build Coastguard Worker     c1 = &iusace_res_interp_filter1_4[t0_frac];
1030*15dc779aSAndroid Build Coastguard Worker     c2 = &iusace_res_interp_filter1_4[T_UP_SAMP - t0_frac];
1031*15dc779aSAndroid Build Coastguard Worker     s = 0.0;
1032*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < INTER_LP_FIL_ORDER; i++, c1 += T_UP_SAMP, c2 += T_UP_SAMP) {
1033*15dc779aSAndroid Build Coastguard Worker       s += (*x1--) * (*c1) + (*x2++) * (*c2);
1034*15dc779aSAndroid Build Coastguard Worker     }
1035*15dc779aSAndroid Build Coastguard Worker     exc[j] = s;
1036*15dc779aSAndroid Build Coastguard Worker   }
1037*15dc779aSAndroid Build Coastguard Worker }
1038*15dc779aSAndroid Build Coastguard Worker 
iusace_acelp_quant_gain(FLOAT32 * code,FLOAT32 * pitch_gain,FLOAT32 * code_gain,FLOAT32 * tgt_cb_corr_data,FLOAT32 mean_energy,WORD32 * qunt_idx)1039*15dc779aSAndroid Build Coastguard Worker VOID iusace_acelp_quant_gain(FLOAT32 *code, FLOAT32 *pitch_gain, FLOAT32 *code_gain,
1040*15dc779aSAndroid Build Coastguard Worker                              FLOAT32 *tgt_cb_corr_data, FLOAT32 mean_energy, WORD32 *qunt_idx) {
1041*15dc779aSAndroid Build Coastguard Worker   WORD32 i, indice = 0, min_pitch_idx;
1042*15dc779aSAndroid Build Coastguard Worker   FLOAT32 ener_code, pred_code_gain;
1043*15dc779aSAndroid Build Coastguard Worker   FLOAT32 dist, dist_min, g_pitch, g_code;
1044*15dc779aSAndroid Build Coastguard Worker   const FLOAT32 *p1_qua_gain_table, *p2_qua_gain_table;
1045*15dc779aSAndroid Build Coastguard Worker 
1046*15dc779aSAndroid Build Coastguard Worker   p1_qua_gain_table = iusace_acelp_quant_gain_table;
1047*15dc779aSAndroid Build Coastguard Worker   p2_qua_gain_table = (const FLOAT32 *)(iusace_acelp_quant_gain_table + ACELP_GAIN_TBL_OFFSET);
1048*15dc779aSAndroid Build Coastguard Worker   min_pitch_idx = 0;
1049*15dc779aSAndroid Build Coastguard Worker   g_pitch = *pitch_gain;
1050*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < ACELP_RANGE_GAIN_PT_IDX_SEARCH; i++, p2_qua_gain_table += 2) {
1051*15dc779aSAndroid Build Coastguard Worker     if (g_pitch > *p2_qua_gain_table) {
1052*15dc779aSAndroid Build Coastguard Worker       continue;
1053*15dc779aSAndroid Build Coastguard Worker     }
1054*15dc779aSAndroid Build Coastguard Worker   }
1055*15dc779aSAndroid Build Coastguard Worker   ener_code = 0.01F;
1056*15dc779aSAndroid Build Coastguard Worker 
1057*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < LEN_SUBFR; i++) {
1058*15dc779aSAndroid Build Coastguard Worker     ener_code += code[i] * code[i];
1059*15dc779aSAndroid Build Coastguard Worker   }
1060*15dc779aSAndroid Build Coastguard Worker 
1061*15dc779aSAndroid Build Coastguard Worker   ener_code = (FLOAT32)(10.0 * log10(ener_code / (FLOAT32)LEN_SUBFR));
1062*15dc779aSAndroid Build Coastguard Worker   pred_code_gain = mean_energy - ener_code;
1063*15dc779aSAndroid Build Coastguard Worker   pred_code_gain = (FLOAT32)pow(10.0, pred_code_gain / 20.0);
1064*15dc779aSAndroid Build Coastguard Worker 
1065*15dc779aSAndroid Build Coastguard Worker   dist_min = MAX_FLT_VAL;
1066*15dc779aSAndroid Build Coastguard Worker   p2_qua_gain_table = (const FLOAT32 *)(p1_qua_gain_table + min_pitch_idx * 2);
1067*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < ACELP_SEARCH_RANGE_QUANTIZER_IDX; i++) {
1068*15dc779aSAndroid Build Coastguard Worker     g_pitch = *p2_qua_gain_table++;
1069*15dc779aSAndroid Build Coastguard Worker     g_code = pred_code_gain * *p2_qua_gain_table++;
1070*15dc779aSAndroid Build Coastguard Worker     dist = g_pitch * g_pitch * tgt_cb_corr_data[0] + g_pitch * tgt_cb_corr_data[1] +
1071*15dc779aSAndroid Build Coastguard Worker            g_code * g_code * tgt_cb_corr_data[2] + g_code * tgt_cb_corr_data[3] +
1072*15dc779aSAndroid Build Coastguard Worker            g_pitch * g_code * tgt_cb_corr_data[4];
1073*15dc779aSAndroid Build Coastguard Worker     if (dist < dist_min) {
1074*15dc779aSAndroid Build Coastguard Worker       dist_min = dist;
1075*15dc779aSAndroid Build Coastguard Worker       indice = i;
1076*15dc779aSAndroid Build Coastguard Worker     }
1077*15dc779aSAndroid Build Coastguard Worker   }
1078*15dc779aSAndroid Build Coastguard Worker   indice += min_pitch_idx;
1079*15dc779aSAndroid Build Coastguard Worker   *pitch_gain = p1_qua_gain_table[indice * 2];
1080*15dc779aSAndroid Build Coastguard Worker   *code_gain = p1_qua_gain_table[indice * 2 + 1] * pred_code_gain;
1081*15dc779aSAndroid Build Coastguard Worker   *qunt_idx = indice;
1082*15dc779aSAndroid Build Coastguard Worker }
1083