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