1e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*
2e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc.
3e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
4e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License");
5e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** you may not use this file except in compliance with the License.
6e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** You may obtain a copy of the License at
7e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
8e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **     http://www.apache.org/licenses/LICENSE-2.0
9e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard **
10e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** Unless required by applicable law or agreed to in writing, software
11e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS,
12e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** See the License for the specific language governing permissions and
14e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ** limitations under the License.
15e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard */
16e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
17e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/************************************************************************
18e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*      File: c2t64fx.c                                                  *
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                       *
20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*	   Description:Performs algebraic codebook search for 6.60kbits mode*
21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                       *
22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*************************************************************************/
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h"
25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h"
26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "math_op.h"
27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "acelp.h"
28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "cnst.h"
29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define NB_TRACK  2
31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define STEP      2
32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define NB_POS    32
33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define MSIZE     1024
34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*************************************************************************
36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Function:  ACELP_2t64_fx()                                             *
37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                        *
38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* 12 bits algebraic codebook.                                            *
39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* 2 tracks x 32 positions per track = 64 samples.                        *
40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                        *
41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* 12 bits --> 2 pulses in a frame of 64 samples.                         *
42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                        *
43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* All pulses can have two (2) possible amplitudes: +1 or -1.             *
44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Each pulse can have 32 possible positions.                             *
45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard**************************************************************************/
46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid ACELP_2t64_fx(
48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 dn[],                          /* (i) <12b : correlation between target x[] and H[]      */
49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 cn[],                          /* (i) <12b : residual after long term prediction         */
50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 H[],                           /* (i) Q12: impulse response of weighted synthesis filter */
51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 code[],                        /* (o) Q9 : algebraic (fixed) codebook excitation         */
52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 y[],                           /* (o) Q9 : filtered fixed codebook excitation            */
53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		Word16 * index                        /* (o) : index (12): 5+1+5+1 = 11 bits.                   */
54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		)
55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word32 i, j, k, i0, i1, ix, iy, pos, pos2;
57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 ps, psk, ps1, ps2, alpk, alp1, alp2, sq;
58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 alp, val, exp, k_cn, k_dn;
59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 *p0, *p1, *p2, *psign;
60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf;
61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 sign[L_SUBFR], vec[L_SUBFR], dn2[L_SUBFR];
63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 h_buf[4 * L_SUBFR] = {0};
64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 rrixix[NB_TRACK][NB_POS];
65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word16 rrixiy[MSIZE];
66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Word32 s, cor;
67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*----------------------------------------------------------------*
69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * Find sign for each pulse position.                             *
70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *----------------------------------------------------------------*/
71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	alp = 8192;                              /* alp = 2.0 (Q12) */
72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* calculate energy for normalization of cn[] and dn[] */
74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* set k_cn = 32..32767 (ener_cn = 2^30..256-0) */
75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT             /* asm optimization branch */
76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	s = Dot_product12_asm(cn, cn, L_SUBFR, &exp);
77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	s = Dot_product12(cn, cn, L_SUBFR, &exp);
79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Isqrt_n(&s, &exp);
82b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	s = L_shl(s, add1(exp, 5));
83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	k_cn = vo_round(s);
84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* set k_dn = 32..512 (ener_dn = 2^30..2^22) */
86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT                  /* asm optimization branch */
87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	s = Dot_product12_asm(dn, dn, L_SUBFR, &exp);
88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	s = Dot_product12(dn, dn, L_SUBFR, &exp);
90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	Isqrt_n(&s, &exp);
93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	k_dn = vo_round(L_shl(s, (exp + 8)));    /* k_dn = 256..4096 */
94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	k_dn = vo_mult_r(alp, k_dn);              /* alp in Q12 */
95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* mix normalized cn[] and dn[] */
97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	p0 = cn;
98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	p1 = dn;
99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	p2 = dn2;
100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i = 0; i < L_SUBFR/4; i++)
102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		s = (k_cn* (*p0++))+(k_dn * (*p1++));
104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		*p2++ = s >> 7;
105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		s = (k_cn* (*p0++))+(k_dn * (*p1++));
106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		*p2++ = s >> 7;
107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		s = (k_cn* (*p0++))+(k_dn * (*p1++));
108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		*p2++ = s >> 7;
109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		s = (k_cn* (*p0++))+(k_dn * (*p1++));
110b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		*p2++ = s >> 7;
111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
113e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* set sign according to dn2[] = k_cn*cn[] + k_dn*dn[]    */
114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i = 0; i < L_SUBFR; i ++)
115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
116b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		val = dn[i];
117b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		ps = dn2[i];
118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if (ps >= 0)
119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			sign[i] = 32767;             /* sign = +1 (Q12) */
121b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			vec[i] = -32768;
122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		} else
123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			sign[i] = -32768;            /* sign = -1 (Q12) */
125b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			vec[i] = 32767;
126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			dn[i] = -val;
127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*------------------------------------------------------------*
130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * Compute h_inv[i].                                          *
131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *------------------------------------------------------------*/
132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* impulse response buffer for fast computation */
133b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	h = h_buf + L_SUBFR;
134b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	h_inv = h + (L_SUBFR<<1);
135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i = 0; i < L_SUBFR; i++)
137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
138b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		h[i] = H[i];
139b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		h_inv[i] = vo_negate(h[i]);
140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*------------------------------------------------------------*
143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * Compute rrixix[][] needed for the codebook search.         *
144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * Result is multiplied by 0.5                                *
145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *------------------------------------------------------------*/
146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/* Init pointers to last position of rrixix[] */
147b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	p0 = &rrixix[0][NB_POS - 1];
148b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	p1 = &rrixix[1][NB_POS - 1];
149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
150b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	ptr_h1 = h;
151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	cor = 0x00010000L;                          /* for rounding */
152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i = 0; i < NB_POS; i++)
153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		cor += ((*ptr_h1) * (*ptr_h1) << 1);
155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		ptr_h1++;
156b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		*p1-- = (extract_h(cor) >> 1);
157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		cor += ((*ptr_h1) * (*ptr_h1) << 1);
158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		ptr_h1++;
159b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		*p0-- = (extract_h(cor) >> 1);
160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
162e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*------------------------------------------------------------*
163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * Compute rrixiy[][] needed for the codebook search.         *
164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *------------------------------------------------------------*/
165b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	pos = MSIZE - 1;
166b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	pos2 = MSIZE - 2;
167b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	ptr_hf = h + 1;
168e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
169e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (k = 0; k < NB_POS; k++)
170e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
171b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		p1 = &rrixiy[pos];
172b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		p0 = &rrixiy[pos2];
173e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		cor = 0x00008000L;                        /* for rounding */
174b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		ptr_h1 = h;
175b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		ptr_h2 = ptr_hf;
176e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
177e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for (i = (k + 1); i < NB_POS; i++)
178e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
179e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			cor += ((*ptr_h1) * (*ptr_h2))<<1;
180e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			ptr_h1++;
181e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			ptr_h2++;
182b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			*p1 = extract_h(cor);
183e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			cor += ((*ptr_h1) * (*ptr_h2))<<1;
184e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			ptr_h1++;
185e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			ptr_h2++;
186b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			*p0 = extract_h(cor);
187e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
188e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			p1 -= (NB_POS + 1);
189e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			p0 -= (NB_POS + 1);
190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
191e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		cor += ((*ptr_h1) * (*ptr_h2))<<1;
192e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		ptr_h1++;
193e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		ptr_h2++;
194b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		*p1 = extract_h(cor);
195e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
196e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		pos -= NB_POS;
197e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		pos2--;
198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		ptr_hf += STEP;
199e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
200e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
201e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*------------------------------------------------------------*
202e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * Modification of rrixiy[][] to take signs into account.     *
203e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *------------------------------------------------------------*/
204b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	p0 = rrixiy;
205e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i = 0; i < L_SUBFR; i += STEP)
206e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
207b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		psign = sign;
208e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if (psign[i] < 0)
209e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
210b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			psign = vec;
211e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
212e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for (j = 1; j < L_SUBFR; j += STEP)
213e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
214b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			*p0 = vo_mult(*p0, psign[j]);
215e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			p0++;
216e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
217e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
218e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*-------------------------------------------------------------------*
219e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * search 2 pulses:                                                  *
220e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * ~@~~~~~~~~~~~~~~                                                  *
221e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * 32 pos x 32 pos = 1024 tests (all combinaisons is tested)         *
222e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *-------------------------------------------------------------------*/
223b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	p0 = rrixix[0];
224b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	p1 = rrixix[1];
225b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	p2 = rrixiy;
226e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
227b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	psk = -1;
228b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	alpk = 1;
229b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	ix = 0;
230b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	iy = 1;
231e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
232e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i0 = 0; i0 < L_SUBFR; i0 += STEP)
233e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
234b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		ps1 = dn[i0];
235b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		alp1 = (*p0++);
236b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		pos = -1;
237e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		for (i1 = 1; i1 < L_SUBFR; i1 += STEP)
238e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
239e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			ps2 = add1(ps1, dn[i1]);
240e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			alp2 = add1(alp1, add1(*p1++, *p2++));
241e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			sq = vo_mult(ps2, ps2);
242e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			s = vo_L_mult(alpk, sq) - ((psk * alp2)<<1);
243e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			if (s > 0)
244e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			{
245b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard				psk = sq;
246b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard				alpk = alp2;
247b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard				pos = i1;
248e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard			}
249e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
250e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		p1 -= NB_POS;
251e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		if (pos >= 0)
252e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		{
253b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			ix = i0;
254b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard			iy = pos;
255e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		}
256e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
257e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	/*-------------------------------------------------------------------*
258e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 * Build the codeword, the filtered codeword and index of codevector.*
259e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	 *-------------------------------------------------------------------*/
260e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
261e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i = 0; i < L_SUBFR; i++)
262e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
263b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		code[i] = 0;
264e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
265e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
266e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	i0 = (ix >> 1);                       /* pos of pulse 1 (0..31) */
267e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	i1 = (iy >> 1);                       /* pos of pulse 2 (0..31) */
268e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (sign[ix] > 0)
269e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
270e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		code[ix] = 512;                     /* codeword in Q9 format */
271b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		p0 = h - ix;
272e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	} else
273e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
274b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		code[ix] = -512;
275b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		i0 += NB_POS;
276b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		p0 = h_inv - ix;
277e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
278e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	if (sign[iy] > 0)
279e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
280b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		code[iy] = 512;
281b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		p1 = h - iy;
282e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	} else
283e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
284b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		code[iy] = -512;
285b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		i1 += NB_POS;
286b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard		p1 = h_inv - iy;
287e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
288b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard	*index = add1((i0 << 6), i1);
289e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	for (i = 0; i < L_SUBFR; i++)
290e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	{
291e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard		y[i] = vo_shr_r(add1((*p0++), (*p1++)), 3);
292e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	}
293e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard	return;
294e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
295e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
296e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
297e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
298