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: apisf_2s.c                                               *
19 *                                                                      *
20 *       Description: Coding/Decodeing of ISF parameters with predication
21 *       The ISF vector is quantized using two-stage VQ with split-by-2 *
22 *       in 1st stage and split-by-5(or 3) in the second stage          *
23 *                                                                      *
24 ************************************************************************/
25 
26 #include "typedef.h"
27 #include "basic_op.h"
28 #include "cnst.h"
29 #include "acelp.h"
30 #include "qpisf_2s.tab"                    /* Codebooks of isfs */
31 
32 #define MU         10923                   /* Prediction factor   (1.0/3.0) in Q15 */
33 #define N_SURV_MAX 4                       /* 4 survivors max */
34 #define ALPHA      29491                   /* 0. 9 in Q15     */
35 #define ONE_ALPHA (32768-ALPHA)            /* (1.0 - ALPHA) in Q15 */
36 
37 /* private functions */
38 static void VQ_stage1(
39 		Word16 * x,                           /* input : ISF residual vector           */
40 		Word16 * dico,                        /* input : quantization codebook         */
41 		Word16 dim,                           /* input : dimention of vector           */
42 		Word16 dico_size,                     /* input : size of quantization codebook */
43 		Word16 * index,                       /* output: indices of survivors          */
44 		Word16 surv                           /* input : number of survivor            */
45 		);
46 
47 /**************************************************************************
48 * Function:   Qpisf_2s_46B()                                              *
49 *                                                                         *
50 * Description: Quantization of isf parameters with prediction. (46 bits)  *
51 *                                                                         *
52 * The isf vector is quantized using two-stage VQ with split-by-2 in       *
53 *  1st stage and split-by-5 in the second stage.                          *
54 ***************************************************************************/
55 
Qpisf_2s_46b(Word16 * isf1,Word16 * isf_q,Word16 * past_isfq,Word16 * indice,Word16 nb_surv)56 void Qpisf_2s_46b(
57 		Word16 * isf1,                        /* (i) Q15 : ISF in the frequency domain (0..0.5) */
58 		Word16 * isf_q,                       /* (o) Q15 : quantized ISF               (0..0.5) */
59 		Word16 * past_isfq,                   /* (io)Q15 : past ISF quantizer                   */
60 		Word16 * indice,                      /* (o)     : quantization indices                 */
61 		Word16 nb_surv                        /* (i)     : number of survivor (1, 2, 3 or 4)    */
62 		)
63 {
64 	Word16 tmp_ind[5];
65 	Word16 surv1[N_SURV_MAX];              /* indices of survivors from 1st stage */
66 	Word32 i, k, temp, min_err, distance;
67 	Word16 isf[ORDER];
68 	Word16 isf_stage2[ORDER];
69 
70 	for (i = 0; i < ORDER; i++)
71 	{
72 		isf[i] = vo_sub(isf1[i], mean_isf[i]);
73 		isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i]));
74 	}
75 
76 	VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
77 
78 	distance = MAX_32;
79 
80 	for (k = 0; k < nb_surv; k++)
81 	{
82 		for (i = 0; i < 9; i++)
83 		{
84 			isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]);
85 		}
86 		tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf, 3, SIZE_BK21, &min_err);
87 		temp = min_err;
88 		tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico22_isf, 3, SIZE_BK22, &min_err);
89 		temp = vo_L_add(temp, min_err);
90 		tmp_ind[2] = Sub_VQ(&isf_stage2[6], dico23_isf, 3, SIZE_BK23, &min_err);
91 		temp = vo_L_add(temp, min_err);
92 
93 		if(temp < distance)
94 		{
95 			distance = temp;
96 			indice[0] = surv1[k];
97 			for (i = 0; i < 3; i++)
98 			{
99 				indice[i + 2] = tmp_ind[i];
100 			}
101 		}
102 	}
103 
104 
105 	VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
106 
107 	distance = MAX_32;
108 
109 	for (k = 0; k < nb_surv; k++)
110 	{
111 		for (i = 0; i < 7; i++)
112 		{
113 			isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);
114 		}
115 
116 		tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico24_isf, 3, SIZE_BK24, &min_err);
117 		temp = min_err;
118 		tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico25_isf, 4, SIZE_BK25, &min_err);
119 		temp = vo_L_add(temp, min_err);
120 
121 		if(temp < distance)
122 		{
123 			distance = temp;
124 			indice[1] = surv1[k];
125 			for (i = 0; i < 2; i++)
126 			{
127 				indice[i + 5] = tmp_ind[i];
128 			}
129 		}
130 	}
131 
132 	Dpisf_2s_46b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);
133 
134 	return;
135 }
136 
137 /*****************************************************************************
138 * Function:   Qpisf_2s_36B()                                                 *
139 *                                                                            *
140 * Description: Quantization of isf parameters with prediction. (36 bits)     *
141 *                                                                            *
142 * The isf vector is quantized using two-stage VQ with split-by-2 in          *
143 *  1st stage and split-by-3 in the second stage.                             *
144 ******************************************************************************/
145 
Qpisf_2s_36b(Word16 * isf1,Word16 * isf_q,Word16 * past_isfq,Word16 * indice,Word16 nb_surv)146 void Qpisf_2s_36b(
147 		Word16 * isf1,                        /* (i) Q15 : ISF in the frequency domain (0..0.5) */
148 		Word16 * isf_q,                       /* (o) Q15 : quantized ISF               (0..0.5) */
149 		Word16 * past_isfq,                   /* (io)Q15 : past ISF quantizer                   */
150 		Word16 * indice,                      /* (o)     : quantization indices                 */
151 		Word16 nb_surv                        /* (i)     : number of survivor (1, 2, 3 or 4)    */
152 		)
153 {
154 	Word16 i, k, tmp_ind[5];
155 	Word16 surv1[N_SURV_MAX];              /* indices of survivors from 1st stage */
156 	Word32 temp, min_err, distance;
157 	Word16 isf[ORDER];
158 	Word16 isf_stage2[ORDER];
159 
160 	for (i = 0; i < ORDER; i++)
161 	{
162 		isf[i] = vo_sub(isf1[i], mean_isf[i]);
163 		isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i]));
164 	}
165 
166 	VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
167 
168 	distance = MAX_32;
169 
170 	for (k = 0; k < nb_surv; k++)
171 	{
172 		for (i = 0; i < 9; i++)
173 		{
174 			isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]);
175 		}
176 
177 		tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf_36b, 5, SIZE_BK21_36b, &min_err);
178 		temp = min_err;
179 		tmp_ind[1] = Sub_VQ(&isf_stage2[5], dico22_isf_36b, 4, SIZE_BK22_36b, &min_err);
180 		temp = vo_L_add(temp, min_err);
181 
182 		if(temp < distance)
183 		{
184 			distance = temp;
185 			indice[0] = surv1[k];
186 			for (i = 0; i < 2; i++)
187 			{
188 				indice[i + 2] = tmp_ind[i];
189 			}
190 		}
191 	}
192 
193 	VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
194 	distance = MAX_32;
195 
196 	for (k = 0; k < nb_surv; k++)
197 	{
198 		for (i = 0; i < 7; i++)
199 		{
200 			isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);
201 		}
202 
203 		tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico23_isf_36b, 7, SIZE_BK23_36b, &min_err);
204 		temp = min_err;
205 
206 		if(temp < distance)
207 		{
208 			distance = temp;
209 			indice[1] = surv1[k];
210 			indice[4] = tmp_ind[0];
211 		}
212 	}
213 
214 	Dpisf_2s_36b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);
215 
216 	return;
217 }
218 
219 /*********************************************************************
220 * Function: Dpisf_2s_46b()                                           *
221 *                                                                    *
222 * Description: Decoding of ISF parameters                            *
223 **********************************************************************/
224 
Dpisf_2s_46b(Word16 * indice,Word16 * isf_q,Word16 * past_isfq,Word16 * isfold,Word16 * isf_buf,Word16 bfi,Word16 enc_dec)225 void Dpisf_2s_46b(
226 		Word16 * indice,                      /* input:  quantization indices                       */
227 		Word16 * isf_q,                       /* output: quantized ISF in frequency domain (0..0.5) */
228 		Word16 * past_isfq,                   /* i/0   : past ISF quantizer                    */
229 		Word16 * isfold,                      /* input : past quantized ISF                    */
230 		Word16 * isf_buf,                     /* input : isf buffer                                                        */
231 		Word16 bfi,                           /* input : Bad frame indicator                   */
232 		Word16 enc_dec
233 		)
234 {
235 	Word16 ref_isf[M], tmp;
236 	Word32 i, j, L_tmp;
237 
238 	if (bfi == 0)                          /* Good frame */
239 	{
240 		for (i = 0; i < 9; i++)
241 		{
242 			isf_q[i] = dico1_isf[indice[0] * 9 + i];
243 		}
244 		for (i = 0; i < 7; i++)
245 		{
246 			isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];
247 		}
248 
249 		for (i = 0; i < 3; i++)
250 		{
251 			isf_q[i] = add1(isf_q[i], dico21_isf[indice[2] * 3 + i]);
252 			isf_q[i + 3] = add1(isf_q[i + 3], dico22_isf[indice[3] * 3 + i]);
253 			isf_q[i + 6] = add1(isf_q[i + 6], dico23_isf[indice[4] * 3 + i]);
254 			isf_q[i + 9] = add1(isf_q[i + 9], dico24_isf[indice[5] * 3 + i]);
255 		}
256 
257 		for (i = 0; i < 4; i++)
258 		{
259 			isf_q[i + 12] = add1(isf_q[i + 12], dico25_isf[indice[6] * 4 + i]);
260 		}
261 
262 		for (i = 0; i < ORDER; i++)
263 		{
264 			tmp = isf_q[i];
265 			isf_q[i] = add1(tmp, mean_isf[i]);
266 			isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));
267 			past_isfq[i] = tmp;
268 		}
269 
270 		if (enc_dec)
271 		{
272 			for (i = 0; i < M; i++)
273 			{
274 				for (j = (L_MEANBUF - 1); j > 0; j--)
275 				{
276 					isf_buf[j * M + i] = isf_buf[(j - 1) * M + i];
277 				}
278 				isf_buf[i] = isf_q[i];
279 			}
280 		}
281 	} else
282 	{                                      /* bad frame */
283 		for (i = 0; i < M; i++)
284 		{
285 			L_tmp = mean_isf[i] << 14;
286 			for (j = 0; j < L_MEANBUF; j++)
287 			{
288 				L_tmp += (isf_buf[j * M + i] << 14);
289 			}
290 			ref_isf[i] = vo_round(L_tmp);
291 		}
292 
293 		/* use the past ISFs slightly shifted towards their mean */
294 		for (i = 0; i < ORDER; i++)
295 		{
296 			isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i]));
297 		}
298 
299 		/* estimate past quantized residual to be used in next frame */
300 		for (i = 0; i < ORDER; i++)
301 		{
302 			tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU));      /* predicted ISF */
303 			past_isfq[i] = vo_sub(isf_q[i], tmp);
304 			past_isfq[i] = (past_isfq[i] >> 1);        /* past_isfq[i] *= 0.5 */
305 		}
306 	}
307 
308 	Reorder_isf(isf_q, ISF_GAP, ORDER);
309 	return;
310 }
311 
312 /*********************************************************************
313 * Function:   Disf_2s_36b()                                          *
314 *                                                                    *
315 * Description: Decoding of ISF parameters                            *
316 *********************************************************************/
317 
Dpisf_2s_36b(Word16 * indice,Word16 * isf_q,Word16 * past_isfq,Word16 * isfold,Word16 * isf_buf,Word16 bfi,Word16 enc_dec)318 void Dpisf_2s_36b(
319 		Word16 * indice,                      /* input:  quantization indices                       */
320 		Word16 * isf_q,                       /* output: quantized ISF in frequency domain (0..0.5) */
321 		Word16 * past_isfq,                   /* i/0   : past ISF quantizer                    */
322 		Word16 * isfold,                      /* input : past quantized ISF                    */
323 		Word16 * isf_buf,                     /* input : isf buffer                                                        */
324 		Word16 bfi,                           /* input : Bad frame indicator                   */
325 		Word16 enc_dec
326 		)
327 {
328 	Word16 ref_isf[M], tmp;
329 	Word32 i, j, L_tmp;
330 
331 	if (bfi == 0)                          /* Good frame */
332 	{
333 		for (i = 0; i < 9; i++)
334 		{
335 			isf_q[i] = dico1_isf[indice[0] * 9 + i];
336 		}
337 		for (i = 0; i < 7; i++)
338 		{
339 			isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];
340 		}
341 
342 		for (i = 0; i < 5; i++)
343 		{
344 			isf_q[i] = add1(isf_q[i], dico21_isf_36b[indice[2] * 5 + i]);
345 		}
346 		for (i = 0; i < 4; i++)
347 		{
348 			isf_q[i + 5] = add1(isf_q[i + 5], dico22_isf_36b[indice[3] * 4 + i]);
349 		}
350 		for (i = 0; i < 7; i++)
351 		{
352 			isf_q[i + 9] = add1(isf_q[i + 9], dico23_isf_36b[indice[4] * 7 + i]);
353 		}
354 
355 		for (i = 0; i < ORDER; i++)
356 		{
357 			tmp = isf_q[i];
358 			isf_q[i] = add1(tmp, mean_isf[i]);
359 			isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));
360 			past_isfq[i] = tmp;
361 		}
362 
363 
364 		if (enc_dec)
365 		{
366 			for (i = 0; i < M; i++)
367 			{
368 				for (j = (L_MEANBUF - 1); j > 0; j--)
369 				{
370 					isf_buf[j * M + i] = isf_buf[(j - 1) * M + i];
371 				}
372 				isf_buf[i] = isf_q[i];
373 			}
374 		}
375 	} else
376 	{                                      /* bad frame */
377 		for (i = 0; i < M; i++)
378 		{
379 			L_tmp = (mean_isf[i] << 14);
380 			for (j = 0; j < L_MEANBUF; j++)
381 			{
382 				L_tmp += (isf_buf[j * M + i] << 14);
383 			}
384 			ref_isf[i] = vo_round(L_tmp);
385 		}
386 
387 		/* use the past ISFs slightly shifted towards their mean */
388 		for (i = 0; i < ORDER; i++)
389 		{
390 			isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i]));
391 		}
392 
393 		/* estimate past quantized residual to be used in next frame */
394 		for (i = 0; i < ORDER; i++)
395 		{
396 			tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU));      /* predicted ISF */
397 			past_isfq[i] = vo_sub(isf_q[i], tmp);
398 			past_isfq[i] = past_isfq[i] >> 1;         /* past_isfq[i] *= 0.5 */
399 		}
400 	}
401 
402 	Reorder_isf(isf_q, ISF_GAP, ORDER);
403 
404 	return;
405 }
406 
407 
408 /***************************************************************************
409 * Function:  Reorder_isf()                                                 *
410 *                                                                          *
411 * Description: To make sure that the  isfs are properly order and to       *
412 *              keep a certain minimum distance between consecutive isfs.   *
413 *--------------------------------------------------------------------------*
414 *    Argument         description                     in/out               *
415 *                                                                          *
416 *     isf[]           vector of isfs                    i/o                *
417 *     min_dist        minimum required distance         i                  *
418 *     n               LPC order                         i                  *
419 ****************************************************************************/
420 
Reorder_isf(Word16 * isf,Word16 min_dist,Word16 n)421 void Reorder_isf(
422 		Word16 * isf,                         /* (i/o) Q15: ISF in the frequency domain (0..0.5) */
423 		Word16 min_dist,                      /* (i) Q15  : minimum distance to keep             */
424 		Word16 n                              /* (i)      : number of ISF                        */
425 		)
426 {
427 	Word32 i;
428 	Word16 isf_min;
429 
430 	isf_min = min_dist;
431 	for (i = 0; i < n - 1; i++)
432 	{
433 		if(isf[i] < isf_min)
434 		{
435 			isf[i] = isf_min;
436 		}
437 		isf_min = (isf[i] + min_dist);
438 	}
439 	return;
440 }
441 
442 
Sub_VQ(Word16 * x,Word16 * dico,Word16 dim,Word16 dico_size,Word32 * distance)443 Word16 Sub_VQ(                             /* output: return quantization index     */
444 		Word16 * x,                           /* input : ISF residual vector           */
445 		Word16 * dico,                        /* input : quantization codebook         */
446 		Word16 dim,                           /* input : dimention of vector           */
447 		Word16 dico_size,                     /* input : size of quantization codebook */
448 		Word32 * distance                     /* output: error of quantization         */
449 	     )
450 {
451 	Word16 temp, *p_dico;
452 	Word32 i, j, index;
453 	Word32 dist_min, dist;
454 
455 	dist_min = MAX_32;
456 	p_dico = dico;
457 
458 	index = 0;
459 	for (i = 0; i < dico_size; i++)
460 	{
461 		dist = 0;
462 
463 		for (j = 0; j < dim; j++)
464 		{
465 			temp = x[j] - (*p_dico++);
466 			dist += (temp * temp)<<1;
467 		}
468 
469 		if(dist < dist_min)
470 		{
471 			dist_min = dist;
472 			index = i;
473 		}
474 	}
475 
476 	*distance = dist_min;
477 
478 	/* Reading the selected vector */
479 	p_dico = &dico[index * dim];
480 	for (j = 0; j < dim; j++)
481 	{
482 		x[j] = *p_dico++;
483 	}
484 
485 	return index;
486 }
487 
488 
VQ_stage1(Word16 * x,Word16 * dico,Word16 dim,Word16 dico_size,Word16 * index,Word16 surv)489 static void VQ_stage1(
490 		Word16 * x,                           /* input : ISF residual vector           */
491 		Word16 * dico,                        /* input : quantization codebook         */
492 		Word16 dim,                           /* input : dimention of vector           */
493 		Word16 dico_size,                     /* input : size of quantization codebook */
494 		Word16 * index,                       /* output: indices of survivors          */
495 		Word16 surv                           /* input : number of survivor            */
496 		)
497 {
498 	Word16 temp, *p_dico;
499 	Word32 i, j, k, l;
500 	Word32 dist_min[N_SURV_MAX], dist;
501 
502 	dist_min[0] = MAX_32;
503 	dist_min[1] = MAX_32;
504 	dist_min[2] = MAX_32;
505 	dist_min[3] = MAX_32;
506 	index[0] = 0;
507 	index[1] = 1;
508 	index[2] = 2;
509 	index[3] = 3;
510 
511 	p_dico = dico;
512 
513 	for (i = 0; i < dico_size; i++)
514 	{
515 		dist = 0;
516 		for (j = 0; j < dim; j++)
517 		{
518 			temp = x[j] -  (*p_dico++);
519 			dist += (temp * temp)<<1;
520 		}
521 
522 		for (k = 0; k < surv; k++)
523 		{
524 			if(dist < dist_min[k])
525 			{
526 				for (l = surv - 1; l > k; l--)
527 				{
528 					dist_min[l] = dist_min[l - 1];
529 					index[l] = index[l - 1];
530 				}
531 				dist_min[k] = dist;
532 				index[k] = i;
533 				break;
534 			}
535 		}
536 	}
537 	return;
538 }
539 
540 
541 
542 
543