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(
395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * x,                           /* input : ISF residual vector           */
405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * dico,                        /* input : quantization codebook         */
415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 dim,                           /* input : dimention of vector           */
425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 dico_size,                     /* input : size of quantization codebook */
435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * index,                       /* output: indices of survivors          */
445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 surv                           /* input : number of survivor            */
455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        );
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(
575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * isf1,                        /* (i) Q15 : ISF in the frequency domain (0..0.5) */
585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * isf_q,                       /* (o) Q15 : quantized ISF               (0..0.5) */
595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * past_isfq,                   /* (io)Q15 : past ISF quantizer                   */
605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * indice,                      /* (o)     : quantization indices                 */
615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 nb_surv                        /* (i)     : number of survivor (1, 2, 3 or 4)    */
625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        )
63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 tmp_ind[5];
655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 surv1[N_SURV_MAX];              /* indices of survivors from 1st stage */
665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 i, k, temp, min_err, distance;
675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 isf[ORDER];
685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 isf_stage2[ORDER];
695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < ORDER; i++)
715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        isf[i] = vo_sub(isf1[i], mean_isf[i]);
735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i]));
745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    distance = MAX_32;
795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (k = 0; k < nb_surv; k++)
815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < 9; i++)
835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]);
855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf, 3, SIZE_BK21, &min_err);
875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        temp = min_err;
885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico22_isf, 3, SIZE_BK22, &min_err);
895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        temp = vo_L_add(temp, min_err);
905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        tmp_ind[2] = Sub_VQ(&isf_stage2[6], dico23_isf, 3, SIZE_BK23, &min_err);
915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        temp = vo_L_add(temp, min_err);
925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        if(temp < distance)
945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            distance = temp;
965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            indice[0] = surv1[k];
975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            for (i = 0; i < 3; i++)
985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                indice[i + 2] = tmp_ind[i];
1005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
1015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
1025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
1035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
1045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
1055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
1065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
1075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    distance = MAX_32;
1085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
1095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (k = 0; k < nb_surv; k++)
1105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
1115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < 7; i++)
1125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
1135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);
1145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
1155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
1165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico24_isf, 3, SIZE_BK24, &min_err);
1175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        temp = min_err;
1185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico25_isf, 4, SIZE_BK25, &min_err);
1195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        temp = vo_L_add(temp, min_err);
1205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
1215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        if(temp < distance)
1225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
1235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            distance = temp;
1245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            indice[1] = surv1[k];
1255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            for (i = 0; i < 2; i++)
1265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
1275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                indice[i + 5] = tmp_ind[i];
1285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
1295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
1305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
1315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
1325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Dpisf_2s_46b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);
1335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
1345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    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(
1475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * isf1,                        /* (i) Q15 : ISF in the frequency domain (0..0.5) */
1485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * isf_q,                       /* (o) Q15 : quantized ISF               (0..0.5) */
1495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * past_isfq,                   /* (io)Q15 : past ISF quantizer                   */
1505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * indice,                      /* (o)     : quantization indices                 */
1515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 nb_surv                        /* (i)     : number of survivor (1, 2, 3 or 4)    */
1525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        )
153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 i, k, tmp_ind[5];
1555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 surv1[N_SURV_MAX];              /* indices of survivors from 1st stage */
1565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 temp, min_err, distance;
1575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 isf[ORDER];
1585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 isf_stage2[ORDER];
1595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
1605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < ORDER; i++)
1615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
1625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        isf[i] = vo_sub(isf1[i], mean_isf[i]);
1635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i]));
1645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
1655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
1665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
1675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
1685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    distance = MAX_32;
1695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
1705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (k = 0; k < nb_surv; k++)
1715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
1725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < 9; i++)
1735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
1745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]);
1755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
1765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
1775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf_36b, 5, SIZE_BK21_36b, &min_err);
1785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        temp = min_err;
1795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        tmp_ind[1] = Sub_VQ(&isf_stage2[5], dico22_isf_36b, 4, SIZE_BK22_36b, &min_err);
1805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        temp = vo_L_add(temp, min_err);
1815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
1825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        if(temp < distance)
1835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
1845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            distance = temp;
1855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            indice[0] = surv1[k];
1865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            for (i = 0; i < 2; i++)
1875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
1885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                indice[i + 2] = tmp_ind[i];
1895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
1905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
1915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
1925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
1935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
1945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    distance = MAX_32;
1955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
1965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (k = 0; k < nb_surv; k++)
1975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
1985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < 7; i++)
1995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
2005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);
2015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
2025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
2035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico23_isf_36b, 7, SIZE_BK23_36b, &min_err);
2045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        temp = min_err;
2055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
2065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        if(temp < distance)
2075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
2085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            distance = temp;
2095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            indice[1] = surv1[k];
2105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            indice[4] = tmp_ind[0];
2115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
2125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
2135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
2145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Dpisf_2s_36b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);
2155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
2165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    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(
2265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * indice,                      /* input:  quantization indices                       */
2275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * isf_q,                       /* output: quantized ISF in frequency domain (0..0.5) */
2285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * past_isfq,                   /* i/0   : past ISF quantizer                    */
2295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * isfold,                      /* input : past quantized ISF                    */
2305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * isf_buf,                     /* input : isf buffer                                                        */
2315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 bfi,                           /* input : Bad frame indicator                   */
2325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 enc_dec
2335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        )
234e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
2355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 ref_isf[M], tmp;
2365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 i, j, L_tmp;
2375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
2385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    if (bfi == 0)                          /* Good frame */
2395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
2405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < 9; i++)
2415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
2425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_q[i] = dico1_isf[indice[0] * 9 + i];
2435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
2445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < 7; i++)
2455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
2465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];
2475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
2485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
2495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < 3; i++)
2505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
2515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_q[i] = add1(isf_q[i], dico21_isf[indice[2] * 3 + i]);
2525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_q[i + 3] = add1(isf_q[i + 3], dico22_isf[indice[3] * 3 + i]);
2535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_q[i + 6] = add1(isf_q[i + 6], dico23_isf[indice[4] * 3 + i]);
2545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_q[i + 9] = add1(isf_q[i + 9], dico24_isf[indice[5] * 3 + i]);
2555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
2565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
2575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < 4; i++)
2585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
2595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_q[i + 12] = add1(isf_q[i + 12], dico25_isf[indice[6] * 4 + i]);
2605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
2615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
2625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < ORDER; i++)
2635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
2645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            tmp = isf_q[i];
2655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_q[i] = add1(tmp, mean_isf[i]);
2665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));
2675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            past_isfq[i] = tmp;
2685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
2695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
2705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        if (enc_dec)
2715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
2725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            for (i = 0; i < M; i++)
2735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
2745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                for (j = (L_MEANBUF - 1); j > 0; j--)
2755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                {
2765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                    isf_buf[j * M + i] = isf_buf[(j - 1) * M + i];
2775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                }
2785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                isf_buf[i] = isf_q[i];
2795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
2805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
2815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    } else
2825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {                                      /* bad frame */
2835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < M; i++)
2845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
2855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            L_tmp = mean_isf[i] << 14;
2865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            for (j = 0; j < L_MEANBUF; j++)
2875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
2885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                L_tmp += (isf_buf[j * M + i] << 14);
2895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
2905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ref_isf[i] = vo_round(L_tmp);
2915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
2925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
2935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        /* use the past ISFs slightly shifted towards their mean */
2945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < ORDER; i++)
2955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
2965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i]));
2975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
2985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
2995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        /* estimate past quantized residual to be used in next frame */
3005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < ORDER; i++)
3015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
3025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU));      /* predicted ISF */
3035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            past_isfq[i] = vo_sub(isf_q[i], tmp);
3045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            past_isfq[i] = (past_isfq[i] >> 1);        /* past_isfq[i] *= 0.5 */
3055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
3065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
3075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
3085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Reorder_isf(isf_q, ISF_GAP, ORDER);
3095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    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(
3195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * indice,                      /* input:  quantization indices                       */
3205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * isf_q,                       /* output: quantized ISF in frequency domain (0..0.5) */
3215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * past_isfq,                   /* i/0   : past ISF quantizer                    */
3225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * isfold,                      /* input : past quantized ISF                    */
3235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * isf_buf,                     /* input : isf buffer                                                        */
3245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 bfi,                           /* input : Bad frame indicator                   */
3255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 enc_dec
3265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        )
327e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
3285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 ref_isf[M], tmp;
3295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 i, j, L_tmp;
3305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
3315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    if (bfi == 0)                          /* Good frame */
3325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
3335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < 9; i++)
3345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
3355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_q[i] = dico1_isf[indice[0] * 9 + i];
3365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
3375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < 7; i++)
3385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
3395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];
3405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
3415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
3425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < 5; i++)
3435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
3445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_q[i] = add1(isf_q[i], dico21_isf_36b[indice[2] * 5 + i]);
3455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
3465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < 4; i++)
3475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
3485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_q[i + 5] = add1(isf_q[i + 5], dico22_isf_36b[indice[3] * 4 + i]);
3495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
3505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < 7; i++)
3515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
3525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_q[i + 9] = add1(isf_q[i + 9], dico23_isf_36b[indice[4] * 7 + i]);
3535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
3545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
3555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < ORDER; i++)
3565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
3575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            tmp = isf_q[i];
3585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_q[i] = add1(tmp, mean_isf[i]);
3595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));
3605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            past_isfq[i] = tmp;
3615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
3625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
3635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
3645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        if (enc_dec)
3655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
3665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            for (i = 0; i < M; i++)
3675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
3685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                for (j = (L_MEANBUF - 1); j > 0; j--)
3695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                {
3705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                    isf_buf[j * M + i] = isf_buf[(j - 1) * M + i];
3715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                }
3725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                isf_buf[i] = isf_q[i];
3735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
3745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
3755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    } else
3765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {                                      /* bad frame */
3775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < M; i++)
3785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
3795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            L_tmp = (mean_isf[i] << 14);
3805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            for (j = 0; j < L_MEANBUF; j++)
3815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
3825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                L_tmp += (isf_buf[j * M + i] << 14);
3835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
3845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ref_isf[i] = vo_round(L_tmp);
3855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
3865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
3875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        /* use the past ISFs slightly shifted towards their mean */
3885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < ORDER; i++)
3895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
3905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i]));
3915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
3925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
3935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        /* estimate past quantized residual to be used in next frame */
3945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < ORDER; i++)
3955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
3965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU));      /* predicted ISF */
3975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            past_isfq[i] = vo_sub(isf_q[i], tmp);
3985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            past_isfq[i] = past_isfq[i] >> 1;         /* past_isfq[i] *= 0.5 */
3995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
4005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
4015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Reorder_isf(isf_q, ISF_GAP, ORDER);
4035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    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(
4225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * isf,                         /* (i/o) Q15: ISF in the frequency domain (0..0.5) */
4235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 min_dist,                      /* (i) Q15  : minimum distance to keep             */
4245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 n                              /* (i)      : number of ISF                        */
4255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        )
426e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
4275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 i;
4285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 isf_min;
4295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    isf_min = min_dist;
4315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < n - 1; i++)
4325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
4335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        if(isf[i] < isf_min)
4345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
4355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            isf[i] = isf_min;
4365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
4375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        isf_min = (isf[i] + min_dist);
4385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
4395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    return;
440e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
441e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
442e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
443e2e838afcf03e603a41a0455846eaf9614537c16Mans RullgardWord16 Sub_VQ(                             /* output: return quantization index     */
4445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * x,                           /* input : ISF residual vector           */
4455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * dico,                        /* input : quantization codebook         */
4465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 dim,                           /* input : dimention of vector           */
4475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 dico_size,                     /* input : size of quantization codebook */
4485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word32 * distance                     /* output: error of quantization         */
4495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen         )
450e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
4515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 temp, *p_dico;
4525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 i, j, index;
4535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 dist_min, dist;
4545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    dist_min = MAX_32;
4565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p_dico = dico;
4575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    index = 0;
4595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < dico_size; i++)
4605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
4615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        dist = 0;
4625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (j = 0; j < dim; j++)
4645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
4655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            temp = x[j] - (*p_dico++);
4665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            dist += (temp * temp)<<1;
4675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
4685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        if(dist < dist_min)
4705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
4715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            dist_min = dist;
4725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            index = i;
4735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
4745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
4755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    *distance = dist_min;
4775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /* Reading the selected vector */
4795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p_dico = &dico[index * dim];
4805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (j = 0; j < dim; j++)
4815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
4825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        x[j] = *p_dico++;
4835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
4845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    return index;
486e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
487e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
488e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
489e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic void VQ_stage1(
4905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * x,                           /* input : ISF residual vector           */
4915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * dico,                        /* input : quantization codebook         */
4925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 dim,                           /* input : dimention of vector           */
4935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 dico_size,                     /* input : size of quantization codebook */
4945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * index,                       /* output: indices of survivors          */
4955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 surv                           /* input : number of survivor            */
4965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        )
497e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
4985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 temp, *p_dico;
4995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 i, j, k, l;
5005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 dist_min[N_SURV_MAX], dist;
5015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
5025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    dist_min[0] = MAX_32;
5035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    dist_min[1] = MAX_32;
5045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    dist_min[2] = MAX_32;
5055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    dist_min[3] = MAX_32;
5065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    index[0] = 0;
5075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    index[1] = 1;
5085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    index[2] = 2;
5095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    index[3] = 3;
5105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
5115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p_dico = dico;
5125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
5135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < dico_size; i++)
5145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
5155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        dist = 0;
5165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (j = 0; j < dim; j++)
5175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
5185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            temp = x[j] -  (*p_dico++);
5195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            dist += (temp * temp)<<1;
5205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
5215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
5225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (k = 0; k < surv; k++)
5235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
5245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            if(dist < dist_min[k])
5255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
5265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                for (l = surv - 1; l > k; l--)
5275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                {
5285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                    dist_min[l] = dist_min[l - 1];
5295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                    index[l] = index[l - 1];
5305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                }
5315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                dist_min[k] = dist;
5325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                index[k] = i;
5335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                break;
5345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
5355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
5365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
5375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    return;
538e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
539e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
540e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
541e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
542e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
543