1219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/*
2219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** Copyright 2003-2010, VisualOn, Inc.
3219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard **
4219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** Licensed under the Apache License, Version 2.0 (the "License");
5219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** you may not use this file except in compliance with the License.
6219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** You may obtain a copy of the License at
7219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard **
8219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard **     http://www.apache.org/licenses/LICENSE-2.0
9219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard **
10219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** Unless required by applicable law or agreed to in writing, software
11219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** distributed under the License is distributed on an "AS IS" BASIS,
12219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** See the License for the specific language governing permissions and
14219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard ** limitations under the License.
15219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard */
16219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
17219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/***********************************************************************
18219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*       File: apisf_2s.c                                               *
19219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*                                                                      *
20219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*       Description: Coding/Decodeing of ISF parameters with predication
21219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*       The ISF vector is quantized using two-stage VQ with split-by-2 *
22219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*       in 1st stage and split-by-5(or 3) in the second stage          *
23219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*                                                                      *
24219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard************************************************************************/
25219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
26219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#include "typedef.h"
27219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#include "basic_op.h"
28219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#include "cnst.h"
29219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#include "acelp.h"
30219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#include "qpisf_2s.tab"                    /* Codebooks of isfs */
31219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
32219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#define MU         10923                   /* Prediction factor   (1.0/3.0) in Q15 */
33219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#define N_SURV_MAX 4                       /* 4 survivors max */
34219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#define ALPHA      29491                   /* 0. 9 in Q15     */
35219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard#define ONE_ALPHA (32768-ALPHA)            /* (1.0 - ALPHA) in Q15 */
36219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
37219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/* private functions */
38219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgardstatic void VQ_stage1(
39219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * x,                           /* input : ISF residual vector           */
40219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * dico,                        /* input : quantization codebook         */
41219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 dim,                           /* input : dimention of vector           */
42219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 dico_size,                     /* input : size of quantization codebook */
43219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * index,                       /* output: indices of survivors          */
44219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 surv                           /* input : number of survivor            */
45219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		);
46219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
47219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/**************************************************************************
48219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Function:   Qpisf_2s_46B()                                              *
49219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*                                                                         *
50219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Description: Quantization of isf parameters with prediction. (46 bits)  *
51219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*                                                                         *
52219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* The isf vector is quantized using two-stage VQ with split-by-2 in       *
53219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*  1st stage and split-by-5 in the second stage.                          *
54219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard***************************************************************************/
55219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
56219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgardvoid Qpisf_2s_46b(
57219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * isf1,                        /* (i) Q15 : ISF in the frequency domain (0..0.5) */
58219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * isf_q,                       /* (o) Q15 : quantized ISF               (0..0.5) */
59219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * past_isfq,                   /* (io)Q15 : past ISF quantizer                   */
60219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * indice,                      /* (o)     : quantization indices                 */
61219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 nb_surv                        /* (i)     : number of survivor (1, 2, 3 or 4)    */
62219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		)
63219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard{
64219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word16 tmp_ind[5];
65219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word16 surv1[N_SURV_MAX];              /* indices of survivors from 1st stage */
66219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word32 i, k, temp, min_err, distance;
67219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word16 isf[ORDER];
68219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word16 isf_stage2[ORDER];
69219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
70219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	for (i = 0; i < ORDER; i++)
71219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	{
72219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		isf[i] = vo_sub(isf1[i], mean_isf[i]);
73219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i]));
74219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	}
75219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
76219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
77219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
78219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	distance = MAX_32;
79219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
80219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	for (k = 0; k < nb_surv; k++)
81219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	{
82219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (i = 0; i < 9; i++)
83219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
84219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]);
85219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
86219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf, 3, SIZE_BK21, &min_err);
87219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		temp = min_err;
88219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico22_isf, 3, SIZE_BK22, &min_err);
89219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		temp = vo_L_add(temp, min_err);
90219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		tmp_ind[2] = Sub_VQ(&isf_stage2[6], dico23_isf, 3, SIZE_BK23, &min_err);
91219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		temp = vo_L_add(temp, min_err);
92219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
93219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		if(temp < distance)
94219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
95219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			distance = temp;
96219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			indice[0] = surv1[k];
97219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			for (i = 0; i < 3; i++)
98219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			{
99219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard				indice[i + 2] = tmp_ind[i];
100219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			}
101219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
102219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	}
103219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
104219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
105219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
106219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
107219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	distance = MAX_32;
108219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
109219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	for (k = 0; k < nb_surv; k++)
110219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	{
111219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (i = 0; i < 7; i++)
112219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
113219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);
114219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
115219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
116219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico24_isf, 3, SIZE_BK24, &min_err);
117219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		temp = min_err;
118219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico25_isf, 4, SIZE_BK25, &min_err);
119219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		temp = vo_L_add(temp, min_err);
120219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
121219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		if(temp < distance)
122219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
123219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			distance = temp;
124219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			indice[1] = surv1[k];
125219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			for (i = 0; i < 2; i++)
126219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			{
127219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard				indice[i + 5] = tmp_ind[i];
128219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			}
129219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
130219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	}
131219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
132219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Dpisf_2s_46b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);
133219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
134219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	return;
135219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard}
136219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
137219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/*****************************************************************************
138219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Function:   Qpisf_2s_36B()                                                 *
139219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*                                                                            *
140219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Description: Quantization of isf parameters with prediction. (36 bits)     *
141219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*                                                                            *
142219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* The isf vector is quantized using two-stage VQ with split-by-2 in          *
143219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*  1st stage and split-by-3 in the second stage.                             *
144219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard******************************************************************************/
145219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
146219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgardvoid Qpisf_2s_36b(
147219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * isf1,                        /* (i) Q15 : ISF in the frequency domain (0..0.5) */
148219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * isf_q,                       /* (o) Q15 : quantized ISF               (0..0.5) */
149219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * past_isfq,                   /* (io)Q15 : past ISF quantizer                   */
150219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * indice,                      /* (o)     : quantization indices                 */
151219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 nb_surv                        /* (i)     : number of survivor (1, 2, 3 or 4)    */
152219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		)
153219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard{
154219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word16 i, k, tmp_ind[5];
155219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word16 surv1[N_SURV_MAX];              /* indices of survivors from 1st stage */
156219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word32 temp, min_err, distance;
157219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word16 isf[ORDER];
158219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word16 isf_stage2[ORDER];
159219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
160219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	for (i = 0; i < ORDER; i++)
161219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	{
162219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		isf[i] = vo_sub(isf1[i], mean_isf[i]);
163219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i]));
164219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	}
165219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
166219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
167219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
168219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	distance = MAX_32;
169219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
170219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	for (k = 0; k < nb_surv; k++)
171219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	{
172219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (i = 0; i < 9; i++)
173219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
174219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]);
175219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
176219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
177219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf_36b, 5, SIZE_BK21_36b, &min_err);
178219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		temp = min_err;
179219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		tmp_ind[1] = Sub_VQ(&isf_stage2[5], dico22_isf_36b, 4, SIZE_BK22_36b, &min_err);
180219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		temp = vo_L_add(temp, min_err);
181219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
182219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		if(temp < distance)
183219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
184219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			distance = temp;
185219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			indice[0] = surv1[k];
186219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			for (i = 0; i < 2; i++)
187219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			{
188219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard				indice[i + 2] = tmp_ind[i];
189219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			}
190219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
191219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	}
192219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
193219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
194219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	distance = MAX_32;
195219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
196219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	for (k = 0; k < nb_surv; k++)
197219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	{
198219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (i = 0; i < 7; i++)
199219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
200219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);
201219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
202219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
203219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico23_isf_36b, 7, SIZE_BK23_36b, &min_err);
204219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		temp = min_err;
205219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
206219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		if(temp < distance)
207219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
208219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			distance = temp;
209219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			indice[1] = surv1[k];
210219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			indice[4] = tmp_ind[0];
211219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
212219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	}
213219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
214219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Dpisf_2s_36b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);
215219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
216219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	return;
217219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard}
218219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
219219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/*********************************************************************
220219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Function: Dpisf_2s_46b()                                           *
221219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*                                                                    *
222219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Description: Decoding of ISF parameters                            *
223219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard**********************************************************************/
224219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
225219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgardvoid Dpisf_2s_46b(
226219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * indice,                      /* input:  quantization indices                       */
227219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * isf_q,                       /* output: quantized ISF in frequency domain (0..0.5) */
228219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * past_isfq,                   /* i/0   : past ISF quantizer                    */
229219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * isfold,                      /* input : past quantized ISF                    */
230219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * isf_buf,                     /* input : isf buffer                                                        */
231219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 bfi,                           /* input : Bad frame indicator                   */
232219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 enc_dec
233219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		)
234219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard{
235219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word16 ref_isf[M], tmp;
236219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word32 i, j, L_tmp;
237219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
238219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	if (bfi == 0)                          /* Good frame */
239219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	{
240219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (i = 0; i < 9; i++)
241219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
242219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_q[i] = dico1_isf[indice[0] * 9 + i];
243219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
244219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (i = 0; i < 7; i++)
245219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
246219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];
247219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
248219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
249219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (i = 0; i < 3; i++)
250219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
251219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_q[i] = add1(isf_q[i], dico21_isf[indice[2] * 3 + i]);
252219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_q[i + 3] = add1(isf_q[i + 3], dico22_isf[indice[3] * 3 + i]);
253219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_q[i + 6] = add1(isf_q[i + 6], dico23_isf[indice[4] * 3 + i]);
254219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_q[i + 9] = add1(isf_q[i + 9], dico24_isf[indice[5] * 3 + i]);
255219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
256219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
257219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (i = 0; i < 4; i++)
258219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
259219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_q[i + 12] = add1(isf_q[i + 12], dico25_isf[indice[6] * 4 + i]);
260219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
261219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
262219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (i = 0; i < ORDER; i++)
263219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
264219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			tmp = isf_q[i];
265219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_q[i] = add1(tmp, mean_isf[i]);
266219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));
267219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			past_isfq[i] = tmp;
268219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
269219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
270219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		if (enc_dec)
271219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
272219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			for (i = 0; i < M; i++)
273219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			{
274219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard				for (j = (L_MEANBUF - 1); j > 0; j--)
275219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard				{
276219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard					isf_buf[j * M + i] = isf_buf[(j - 1) * M + i];
277219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard				}
278219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard				isf_buf[i] = isf_q[i];
279219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			}
280219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
281219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	} else
282219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	{                                      /* bad frame */
283219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (i = 0; i < M; i++)
284219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
285219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			L_tmp = mean_isf[i] << 14;
286219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			for (j = 0; j < L_MEANBUF; j++)
287219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			{
288219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard				L_tmp += (isf_buf[j * M + i] << 14);
289219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			}
290219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			ref_isf[i] = vo_round(L_tmp);
291219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
292219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
293219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		/* use the past ISFs slightly shifted towards their mean */
294219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (i = 0; i < ORDER; i++)
295219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
296219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i]));
297219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
298219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
299219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		/* estimate past quantized residual to be used in next frame */
300219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (i = 0; i < ORDER; i++)
301219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
302219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU));      /* predicted ISF */
303219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			past_isfq[i] = vo_sub(isf_q[i], tmp);
304219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			past_isfq[i] = (past_isfq[i] >> 1);        /* past_isfq[i] *= 0.5 */
305219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
306219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	}
307219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
308219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Reorder_isf(isf_q, ISF_GAP, ORDER);
309219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	return;
310219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard}
311219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
312219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/*********************************************************************
313219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Function:   Disf_2s_36b()                                          *
314219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*                                                                    *
315219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Description: Decoding of ISF parameters                            *
316219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*********************************************************************/
317219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
318219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgardvoid Dpisf_2s_36b(
319219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * indice,                      /* input:  quantization indices                       */
320219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * isf_q,                       /* output: quantized ISF in frequency domain (0..0.5) */
321219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * past_isfq,                   /* i/0   : past ISF quantizer                    */
322219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * isfold,                      /* input : past quantized ISF                    */
323219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * isf_buf,                     /* input : isf buffer                                                        */
324219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 bfi,                           /* input : Bad frame indicator                   */
325219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 enc_dec
326219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		)
327219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard{
328219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word16 ref_isf[M], tmp;
329219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word32 i, j, L_tmp;
330219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
331219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	if (bfi == 0)                          /* Good frame */
332219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	{
333219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (i = 0; i < 9; i++)
334219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
335219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_q[i] = dico1_isf[indice[0] * 9 + i];
336219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
337219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (i = 0; i < 7; i++)
338219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
339219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];
340219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
341219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
342219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (i = 0; i < 5; i++)
343219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
344219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_q[i] = add1(isf_q[i], dico21_isf_36b[indice[2] * 5 + i]);
345219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
346219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (i = 0; i < 4; i++)
347219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
348219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_q[i + 5] = add1(isf_q[i + 5], dico22_isf_36b[indice[3] * 4 + i]);
349219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
350219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (i = 0; i < 7; i++)
351219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
352219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_q[i + 9] = add1(isf_q[i + 9], dico23_isf_36b[indice[4] * 7 + i]);
353219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
354219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
355219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (i = 0; i < ORDER; i++)
356219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
357219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			tmp = isf_q[i];
358219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_q[i] = add1(tmp, mean_isf[i]);
359219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));
360219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			past_isfq[i] = tmp;
361219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
362219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
363219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
364219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		if (enc_dec)
365219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
366219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			for (i = 0; i < M; i++)
367219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			{
368219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard				for (j = (L_MEANBUF - 1); j > 0; j--)
369219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard				{
370219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard					isf_buf[j * M + i] = isf_buf[(j - 1) * M + i];
371219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard				}
372219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard				isf_buf[i] = isf_q[i];
373219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			}
374219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
375219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	} else
376219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	{                                      /* bad frame */
377219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (i = 0; i < M; i++)
378219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
379219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			L_tmp = (mean_isf[i] << 14);
380219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			for (j = 0; j < L_MEANBUF; j++)
381219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			{
382219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard				L_tmp += (isf_buf[j * M + i] << 14);
383219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			}
384219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			ref_isf[i] = vo_round(L_tmp);
385219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
386219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
387219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		/* use the past ISFs slightly shifted towards their mean */
388219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (i = 0; i < ORDER; i++)
389219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
390219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i]));
391219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
392219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
393219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		/* estimate past quantized residual to be used in next frame */
394219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (i = 0; i < ORDER; i++)
395219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
396219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU));      /* predicted ISF */
397219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			past_isfq[i] = vo_sub(isf_q[i], tmp);
398219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			past_isfq[i] = past_isfq[i] >> 1;         /* past_isfq[i] *= 0.5 */
399219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
400219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	}
401219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
402219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Reorder_isf(isf_q, ISF_GAP, ORDER);
403219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
404219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	return;
405219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard}
406219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
407219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
408219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard/***************************************************************************
409219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Function:  Reorder_isf()                                                 *
410219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*                                                                          *
411219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard* Description: To make sure that the  isfs are properly order and to       *
412219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*              keep a certain minimum distance between consecutive isfs.   *
413219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*--------------------------------------------------------------------------*
414219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*    Argument         description                     in/out               *
415219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*                                                                          *
416219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*     isf[]           vector of isfs                    i/o                *
417219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*     min_dist        minimum required distance         i                  *
418219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard*     n               LPC order                         i                  *
419219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard****************************************************************************/
420219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
421219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgardvoid Reorder_isf(
422219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * isf,                         /* (i/o) Q15: ISF in the frequency domain (0..0.5) */
423219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 min_dist,                      /* (i) Q15  : minimum distance to keep             */
424219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 n                              /* (i)      : number of ISF                        */
425219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		)
426219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard{
427219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word32 i;
428219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word16 isf_min;
429219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
430219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	isf_min = min_dist;
431219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	for (i = 0; i < n - 1; i++)
432219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	{
433219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		if(isf[i] < isf_min)
434219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
435219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			isf[i] = isf_min;
436219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
437219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		isf_min = (isf[i] + min_dist);
438219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	}
439219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	return;
440219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard}
441219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
442219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
443219e2627f1e062c10645664b0d2470d4dfaf5083Mans RullgardWord16 Sub_VQ(                             /* output: return quantization index     */
444219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * x,                           /* input : ISF residual vector           */
445219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * dico,                        /* input : quantization codebook         */
446219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 dim,                           /* input : dimention of vector           */
447219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 dico_size,                     /* input : size of quantization codebook */
448219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word32 * distance                     /* output: error of quantization         */
449219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	     )
450219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard{
451219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word16 temp, *p_dico;
452219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word32 i, j, index;
453219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word32 dist_min, dist;
454219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
455219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	dist_min = MAX_32;
456219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	p_dico = dico;
457219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
458219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	index = 0;
459219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	for (i = 0; i < dico_size; i++)
460219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	{
461219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		dist = 0;
462219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
463219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (j = 0; j < dim; j++)
464219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
465219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			temp = x[j] - (*p_dico++);
466219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			dist += (temp * temp)<<1;
467219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
468219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
469219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		if(dist < dist_min)
470219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
471219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			dist_min = dist;
472219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			index = i;
473219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
474219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	}
475219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
476219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	*distance = dist_min;
477219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
478219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	/* Reading the selected vector */
479219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	p_dico = &dico[index * dim];
480219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	for (j = 0; j < dim; j++)
481219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	{
482219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		x[j] = *p_dico++;
483219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	}
484219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
485219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	return index;
486219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard}
487219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
488219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
489219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgardstatic void VQ_stage1(
490219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * x,                           /* input : ISF residual vector           */
491219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * dico,                        /* input : quantization codebook         */
492219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 dim,                           /* input : dimention of vector           */
493219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 dico_size,                     /* input : size of quantization codebook */
494219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 * index,                       /* output: indices of survivors          */
495219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		Word16 surv                           /* input : number of survivor            */
496219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		)
497219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard{
498219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word16 temp, *p_dico;
499219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word32 i, j, k, l;
500219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	Word32 dist_min[N_SURV_MAX], dist;
501219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
502219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	dist_min[0] = MAX_32;
503219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	dist_min[1] = MAX_32;
504219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	dist_min[2] = MAX_32;
505219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	dist_min[3] = MAX_32;
506219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	index[0] = 0;
507219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	index[1] = 1;
508219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	index[2] = 2;
509219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	index[3] = 3;
510219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
511219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	p_dico = dico;
512219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
513219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	for (i = 0; i < dico_size; i++)
514219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	{
515219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		dist = 0;
516219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (j = 0; j < dim; j++)
517219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
518219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			temp = x[j] -  (*p_dico++);
519219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			dist += (temp * temp)<<1;
520219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
521219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
522219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		for (k = 0; k < surv; k++)
523219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		{
524219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			if(dist < dist_min[k])
525219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			{
526219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard				for (l = surv - 1; l > k; l--)
527219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard				{
528219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard					dist_min[l] = dist_min[l - 1];
529219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard					index[l] = index[l - 1];
530219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard				}
531219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard				dist_min[k] = dist;
532219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard				index[k] = i;
533219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard				break;
534219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard			}
535219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard		}
536219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	}
537219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard	return;
538219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard}
539219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
540219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
541219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
542219e2627f1e062c10645664b0d2470d4dfaf5083Mans Rullgard
543