q_pulse.c revision f3664ae9369a861ffbc2354e8e93e48983802062
1/*
2 ** Copyright 2003-2010, VisualOn, Inc.
3 **
4 ** Licensed under the Apache License, Version 2.0 (the "License");
5 ** you may not use this file except in compliance with the License.
6 ** You may obtain a copy of the License at
7 **
8 **     http://www.apache.org/licenses/LICENSE-2.0
9 **
10 ** Unless required by applicable law or agreed to in writing, software
11 ** distributed under the License is distributed on an "AS IS" BASIS,
12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 ** See the License for the specific language governing permissions and
14 ** limitations under the License.
15 */
16
17/***********************************************************************
18*      File: q_pulse.c                                                 *
19*                                                                      *
20*      Description: Coding and decoding of algebraic codebook          *
21*                                                                      *
22************************************************************************/
23
24#include <stdio.h>
25#include "typedef.h"
26#include "basic_op.h"
27#include "q_pulse.h"
28
29#define NB_POS 16                          /* pos in track, mask for sign bit */
30
31Word32 quant_1p_N1(                        /* (o) return N+1 bits             */
32		Word16 pos,                        /* (i) position of the pulse       */
33		Word16 N)                          /* (i) number of bits for position */
34{
35	Word16 mask;
36	Word32 index;
37
38	mask = (1 << N) - 1;              /* mask = ((1<<N)-1); */
39	/*-------------------------------------------------------*
40	 * Quantization of 1 pulse with N+1 bits:                *
41	 *-------------------------------------------------------*/
42	index = L_deposit_l((Word16) (pos & mask));
43	if ((pos & NB_POS) != 0)
44	{
45		index = vo_L_add(index, L_deposit_l(1 << N));   /* index += 1 << N; */
46	}
47	return (index);
48}
49
50
51Word32 quant_2p_2N1(                       /* (o) return (2*N)+1 bits         */
52		Word16 pos1,                          /* (i) position of the pulse 1     */
53		Word16 pos2,                          /* (i) position of the pulse 2     */
54		Word16 N)                             /* (i) number of bits for position */
55{
56	Word16 mask, tmp;
57	Word32 index;
58	mask = (1 << N) - 1;              /* mask = ((1<<N)-1); */
59	/*-------------------------------------------------------*
60	 * Quantization of 2 pulses with 2*N+1 bits:             *
61	 *-------------------------------------------------------*/
62	if (((pos2 ^ pos1) & NB_POS) == 0)
63	{
64		/* sign of 1st pulse == sign of 2th pulse */
65		if(pos1 <= pos2)          /* ((pos1 - pos2) <= 0) */
66		{
67			/* index = ((pos1 & mask) << N) + (pos2 & mask); */
68			index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask))));
69		} else
70		{
71			/* ((pos2 & mask) << N) + (pos1 & mask); */
72			index = L_deposit_l(add1((((Word16) (pos2 & mask)) << N), ((Word16) (pos1 & mask))));
73		}
74		if ((pos1 & NB_POS) != 0)
75		{
76			tmp = (N << 1);
77			index = vo_L_add(index, (1L << tmp));       /* index += 1 << (2*N); */
78		}
79	} else
80	{
81		/* sign of 1st pulse != sign of 2th pulse */
82		if (vo_sub((Word16) (pos1 & mask), (Word16) (pos2 & mask)) <= 0)
83		{
84			/* index = ((pos2 & mask) << N) + (pos1 & mask); */
85			index = L_deposit_l(add1((((Word16) (pos2 & mask)) << N), ((Word16) (pos1 & mask))));
86			if ((pos2 & NB_POS) != 0)
87			{
88				tmp = (N << 1);           /* index += 1 << (2*N); */
89				index = vo_L_add(index, (1L << tmp));
90			}
91		} else
92		{
93			/* index = ((pos1 & mask) << N) + (pos2 & mask);	 */
94			index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask))));
95			if ((pos1 & NB_POS) != 0)
96			{
97				tmp = (N << 1);
98				index = vo_L_add(index, (1 << tmp));    /* index += 1 << (2*N); */
99			}
100		}
101	}
102	return (index);
103}
104
105
106Word32 quant_3p_3N1(                       /* (o) return (3*N)+1 bits         */
107		Word16 pos1,                          /* (i) position of the pulse 1     */
108		Word16 pos2,                          /* (i) position of the pulse 2     */
109		Word16 pos3,                          /* (i) position of the pulse 3     */
110		Word16 N)                             /* (i) number of bits for position */
111{
112	Word16 nb_pos;
113	Word32 index;
114
115	nb_pos =(1 <<(N - 1));            /* nb_pos = (1<<(N-1)); */
116	/*-------------------------------------------------------*
117	 * Quantization of 3 pulses with 3*N+1 bits:             *
118	 *-------------------------------------------------------*/
119	if (((pos1 ^ pos2) & nb_pos) == 0)
120	{
121		index = quant_2p_2N1(pos1, pos2, sub(N, 1));    /* index = quant_2p_2N1(pos1, pos2, (N-1)); */
122		/* index += (pos1 & nb_pos) << N; */
123		index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
124		/* index += quant_1p_N1(pos3, N) << (2*N); */
125		index = vo_L_add(index, (quant_1p_N1(pos3, N)<<(N << 1)));
126
127	} else if (((pos1 ^ pos3) & nb_pos) == 0)
128	{
129		index = quant_2p_2N1(pos1, pos3, sub(N, 1));    /* index = quant_2p_2N1(pos1, pos3, (N-1)); */
130		index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
131		/* index += (pos1 & nb_pos) << N; */
132		index = vo_L_add(index, (quant_1p_N1(pos2, N) << (N << 1)));
133		/* index += quant_1p_N1(pos2, N) <<
134		 * (2*N); */
135	} else
136	{
137		index = quant_2p_2N1(pos2, pos3, (N - 1));    /* index = quant_2p_2N1(pos2, pos3, (N-1)); */
138		/* index += (pos2 & nb_pos) << N;			 */
139		index = vo_L_add(index, (L_deposit_l((Word16) (pos2 & nb_pos)) << N));
140		/* index += quant_1p_N1(pos1, N) << (2*N);	 */
141		index = vo_L_add(index, (quant_1p_N1(pos1, N) << (N << 1)));
142	}
143	return (index);
144}
145
146
147Word32 quant_4p_4N1(                       /* (o) return (4*N)+1 bits         */
148		Word16 pos1,                          /* (i) position of the pulse 1     */
149		Word16 pos2,                          /* (i) position of the pulse 2     */
150		Word16 pos3,                          /* (i) position of the pulse 3     */
151		Word16 pos4,                          /* (i) position of the pulse 4     */
152		Word16 N)                             /* (i) number of bits for position */
153{
154	Word16 nb_pos;
155	Word32 index;
156
157	nb_pos = 1 << (N - 1);            /* nb_pos = (1<<(N-1));  */
158	/*-------------------------------------------------------*
159	 * Quantization of 4 pulses with 4*N+1 bits:             *
160	 *-------------------------------------------------------*/
161	if (((pos1 ^ pos2) & nb_pos) == 0)
162	{
163		index = quant_2p_2N1(pos1, pos2, sub(N, 1));    /* index = quant_2p_2N1(pos1, pos2, (N-1)); */
164		/* index += (pos1 & nb_pos) << N;	 */
165		index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
166		/* index += quant_2p_2N1(pos3, pos4, N) << (2*N); */
167		index = vo_L_add(index, (quant_2p_2N1(pos3, pos4, N) << (N << 1)));
168	} else if (((pos1 ^ pos3) & nb_pos) == 0)
169	{
170		index = quant_2p_2N1(pos1, pos3, (N - 1));
171		/* index += (pos1 & nb_pos) << N; */
172		index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
173		/* index += quant_2p_2N1(pos2, pos4, N) << (2*N); */
174		index = vo_L_add(index, (quant_2p_2N1(pos2, pos4, N) << (N << 1)));
175	} else
176	{
177		index = quant_2p_2N1(pos2, pos3, (N - 1));
178		/* index += (pos2 & nb_pos) << N; */
179		index = vo_L_add(index, (L_deposit_l((Word16) (pos2 & nb_pos)) << N));
180		/* index += quant_2p_2N1(pos1, pos4, N) << (2*N); */
181		index = vo_L_add(index, (quant_2p_2N1(pos1, pos4, N) << (N << 1)));
182	}
183	return (index);
184}
185
186
187Word32 quant_4p_4N(                        /* (o) return 4*N bits             */
188		Word16 pos[],                         /* (i) position of the pulse 1..4  */
189		Word16 N)                             /* (i) number of bits for position */
190{
191	Word16 nb_pos, mask, n_1, tmp;
192	Word16 posA[4], posB[4];
193	Word32 i, j, k, index;
194
195	n_1 = (Word16) (N - 1);
196	nb_pos = (1 << n_1);                  /* nb_pos = (1<<n_1); */
197	mask = vo_sub((1 << N), 1);              /* mask = ((1<<N)-1); */
198
199	i = 0;
200	j = 0;
201	for (k = 0; k < 4; k++)
202	{
203		if ((pos[k] & nb_pos) == 0)
204		{
205			posA[i++] = pos[k];
206		} else
207		{
208			posB[j++] = pos[k];
209		}
210	}
211
212	switch (i)
213	{
214		case 0:
215			tmp = vo_sub((N << 2), 3);           /* index = 1 << ((4*N)-3); */
216			index = (1L << tmp);
217			/* index += quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1); */
218			index = vo_L_add(index, quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1));
219			break;
220		case 1:
221			/* index = quant_1p_N1(posA[0], n_1) << ((3*n_1)+1); */
222			tmp = add1((Word16)((vo_L_mult(3, n_1) >> 1)), 1);
223			index = L_shl(quant_1p_N1(posA[0], n_1), tmp);
224			/* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */
225			index = vo_L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1));
226			break;
227		case 2:
228			tmp = ((n_1 << 1) + 1);         /* index = quant_2p_2N1(posA[0], posA[1], n_1) << ((2*n_1)+1); */
229			index = L_shl(quant_2p_2N1(posA[0], posA[1], n_1), tmp);
230			/* index += quant_2p_2N1(posB[0], posB[1], n_1); */
231			index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], n_1));
232			break;
233		case 3:
234			/* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << N; */
235			index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), N);
236			index = vo_L_add(index, quant_1p_N1(posB[0], n_1));        /* index += quant_1p_N1(posB[0], n_1); */
237			break;
238		case 4:
239			index = quant_4p_4N1(posA[0], posA[1], posA[2], posA[3], n_1);
240			break;
241		default:
242			index = 0;
243			fprintf(stderr, "Error in function quant_4p_4N\n");
244	}
245	tmp = ((N << 2) - 2);               /* index += (i & 3) << ((4*N)-2); */
246	index = vo_L_add(index, L_shl((L_deposit_l(i) & (3L)), tmp));
247
248	return (index);
249}
250
251
252
253Word32 quant_5p_5N(                        /* (o) return 5*N bits             */
254		Word16 pos[],                         /* (i) position of the pulse 1..5  */
255		Word16 N)                             /* (i) number of bits for position */
256{
257	Word16 nb_pos, n_1, tmp;
258	Word16 posA[5], posB[5];
259	Word32 i, j, k, index, tmp2;
260
261	n_1 = (Word16) (N - 1);
262	nb_pos = (1 << n_1);                  /* nb_pos = (1<<n_1); */
263
264	i = 0;
265	j = 0;
266	for (k = 0; k < 5; k++)
267	{
268		if ((pos[k] & nb_pos) == 0)
269		{
270			posA[i++] = pos[k];
271		} else
272		{
273			posB[j++] = pos[k];
274		}
275	}
276
277	switch (i)
278	{
279		case 0:
280			tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1);        /* ((5*N)-1)) */
281			index = L_shl(1L, tmp);   /* index = 1 << ((5*N)-1); */
282			tmp = add1((N << 1), 1);  /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1);*/
283			tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
284			index = vo_L_add(index, tmp2);
285			index = vo_L_add(index, quant_2p_2N1(posB[3], posB[4], N));        /* index += quant_2p_2N1(posB[3], posB[4], N); */
286			break;
287		case 1:
288			tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1);        /* index = 1 << ((5*N)-1); */
289			index = L_shl(1L, tmp);
290			tmp = add1((N << 1), 1);   /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) <<((2*N)+1);  */
291			tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
292			index = vo_L_add(index, tmp2);
293			index = vo_L_add(index, quant_2p_2N1(posB[3], posA[0], N));        /* index += quant_2p_2N1(posB[3], posA[0], N); */
294			break;
295		case 2:
296			tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1);        /* ((5*N)-1)) */
297			index = L_shl(1L, tmp);            /* index = 1 << ((5*N)-1); */
298			tmp = add1((N << 1), 1);           /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1);  */
299			tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
300			index = vo_L_add(index, tmp2);
301			index = vo_L_add(index, quant_2p_2N1(posA[0], posA[1], N));        /* index += quant_2p_2N1(posA[0], posA[1], N); */
302			break;
303		case 3:
304			tmp = add1((N << 1), 1);           /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1);  */
305			index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
306			index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], N));        /* index += quant_2p_2N1(posB[0], posB[1], N); */
307			break;
308		case 4:
309			tmp = add1((N << 1), 1);           /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1);  */
310			index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
311			index = vo_L_add(index, quant_2p_2N1(posA[3], posB[0], N));        /* index += quant_2p_2N1(posA[3], posB[0], N); */
312			break;
313		case 5:
314			tmp = add1((N << 1), 1);           /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1);  */
315			index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
316			index = vo_L_add(index, quant_2p_2N1(posA[3], posA[4], N));        /* index += quant_2p_2N1(posA[3], posA[4], N); */
317			break;
318		default:
319			index = 0;
320			fprintf(stderr, "Error in function quant_5p_5N\n");
321	}
322
323	return (index);
324}
325
326
327Word32 quant_6p_6N_2(                      /* (o) return (6*N)-2 bits         */
328		Word16 pos[],                         /* (i) position of the pulse 1..6  */
329		Word16 N)                             /* (i) number of bits for position */
330{
331	Word16 nb_pos, n_1;
332	Word16 posA[6], posB[6];
333	Word32 i, j, k, index;
334
335	/* !!  N and n_1 are constants -> it doesn't need to be operated by Basic Operators */
336	n_1 = (Word16) (N - 1);
337	nb_pos = (1 << n_1);                  /* nb_pos = (1<<n_1); */
338
339	i = 0;
340	j = 0;
341	for (k = 0; k < 6; k++)
342	{
343		if ((pos[k] & nb_pos) == 0)
344		{
345			posA[i++] = pos[k];
346		} else
347		{
348			posB[j++] = pos[k];
349		}
350	}
351
352	switch (i)
353	{
354		case 0:
355			index = (1 << (Word16) (6 * N - 5));        /* index = 1 << ((6*N)-5); */
356			index = vo_L_add(index, (quant_5p_5N(posB, n_1) << N)); /* index += quant_5p_5N(posB, n_1) << N; */
357			index = vo_L_add(index, quant_1p_N1(posB[5], n_1));        /* index += quant_1p_N1(posB[5], n_1); */
358			break;
359		case 1:
360			index = (1L << (Word16) (6 * N - 5));        /* index = 1 << ((6*N)-5); */
361			index = vo_L_add(index, (quant_5p_5N(posB, n_1) << N)); /* index += quant_5p_5N(posB, n_1) << N; */
362			index = vo_L_add(index, quant_1p_N1(posA[0], n_1));        /* index += quant_1p_N1(posA[0], n_1); */
363			break;
364		case 2:
365			index = (1L << (Word16) (6 * N - 5));        /* index = 1 << ((6*N)-5); */
366			/* index += quant_4p_4N(posB, n_1) << ((2*n_1)+1); */
367			index = vo_L_add(index, (quant_4p_4N(posB, n_1) << (Word16) (2 * n_1 + 1)));
368			index = vo_L_add(index, quant_2p_2N1(posA[0], posA[1], n_1));      /* index += quant_2p_2N1(posA[0], posA[1], n_1); */
369			break;
370		case 3:
371			index = (quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << (Word16) (3 * n_1 + 1));
372			                                  /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((3*n_1)+1); */
373			index =vo_L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1));
374			                                 /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */
375			break;
376		case 4:
377			i = 2;
378			index = (quant_4p_4N(posA, n_1) << (Word16) (2 * n_1 + 1));  /* index = quant_4p_4N(posA, n_1) << ((2*n_1)+1); */
379			index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], n_1));      /* index += quant_2p_2N1(posB[0], posB[1], n_1); */
380			break;
381		case 5:
382			i = 1;
383			index = (quant_5p_5N(posA, n_1) << N);       /* index = quant_5p_5N(posA, n_1) << N; */
384			index = vo_L_add(index, quant_1p_N1(posB[0], n_1));        /* index += quant_1p_N1(posB[0], n_1); */
385			break;
386		case 6:
387			i = 0;
388			index = (quant_5p_5N(posA, n_1) << N);       /* index = quant_5p_5N(posA, n_1) << N; */
389			index = vo_L_add(index, quant_1p_N1(posA[5], n_1));        /* index += quant_1p_N1(posA[5], n_1); */
390			break;
391		default:
392			index = 0;
393			fprintf(stderr, "Error in function quant_6p_6N_2\n");
394	}
395	index = vo_L_add(index, ((L_deposit_l(i) & 3L) << (Word16) (6 * N - 4)));   /* index += (i & 3) << ((6*N)-4); */
396
397	return (index);
398}
399
400
401