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: c2t64fx.c                                                  *
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                       *
205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen*      Description:Performs algebraic codebook search for 6.60kbits mode*
21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                       *
22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*************************************************************************/
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h"
25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h"
26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "math_op.h"
27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "acelp.h"
28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "cnst.h"
29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define NB_TRACK  2
31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define STEP      2
32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define NB_POS    32
33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define MSIZE     1024
34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*************************************************************************
36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Function:  ACELP_2t64_fx()                                             *
37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                        *
38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* 12 bits algebraic codebook.                                            *
39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* 2 tracks x 32 positions per track = 64 samples.                        *
40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                        *
41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* 12 bits --> 2 pulses in a frame of 64 samples.                         *
42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                        *
43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* All pulses can have two (2) possible amplitudes: +1 or -1.             *
44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Each pulse can have 32 possible positions.                             *
45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard**************************************************************************/
46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid ACELP_2t64_fx(
485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 dn[],                          /* (i) <12b : correlation between target x[] and H[]      */
495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 cn[],                          /* (i) <12b : residual after long term prediction         */
505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 H[],                           /* (i) Q12: impulse response of weighted synthesis filter */
515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 code[],                        /* (o) Q9 : algebraic (fixed) codebook excitation         */
525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 y[],                           /* (o) Q9 : filtered fixed codebook excitation            */
535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * index                        /* (o) : index (12): 5+1+5+1 = 11 bits.                   */
545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        )
55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 i, j, k, i0, i1, ix, iy, pos, pos2;
575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 ps, psk, ps1, ps2, alpk, alp1, alp2, sq;
585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 alp, val, exp, k_cn, k_dn;
595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 *p0, *p1, *p2, *psign;
605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf;
61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 sign[L_SUBFR], vec[L_SUBFR], dn2[L_SUBFR];
635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 h_buf[4 * L_SUBFR] = {0};
645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 rrixix[NB_TRACK][NB_POS];
655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 rrixiy[MSIZE];
665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 s, cor;
67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /*----------------------------------------------------------------*
695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * Find sign for each pulse position.                             *
705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     *----------------------------------------------------------------*/
715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    alp = 8192;                              /* alp = 2.0 (Q12) */
72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /* calculate energy for normalization of cn[] and dn[] */
745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /* set k_cn = 32..32767 (ener_cn = 2^30..256-0) */
75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT             /* asm optimization branch */
765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    s = Dot_product12_asm(cn, cn, L_SUBFR, &exp);
77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    s = Dot_product12(cn, cn, L_SUBFR, &exp);
79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Isqrt_n(&s, &exp);
825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    s = L_shl(s, add1(exp, 5));
835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    if (s > INT_MAX - 0x8000) {
845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        s = INT_MAX - 0x8000;
855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    k_cn = vo_round(s);
87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /* set k_dn = 32..512 (ener_dn = 2^30..2^22) */
89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT                  /* asm optimization branch */
905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    s = Dot_product12_asm(dn, dn, L_SUBFR, &exp);
91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    s = Dot_product12(dn, dn, L_SUBFR, &exp);
93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Isqrt_n(&s, &exp);
96a87228e3e3f42d3676ced0d38ad9913d7bef9de6Marco Nelissen    k_dn = voround(L_shl(s, (exp + 8)));    /* k_dn = 256..4096 */
975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    k_dn = vo_mult_r(alp, k_dn);              /* alp in Q12 */
98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /* mix normalized cn[] and dn[] */
1005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p0 = cn;
1015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p1 = dn;
1025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p2 = dn2;
103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < L_SUBFR/4; i++)
1055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
1065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        s = (k_cn* (*p0++))+(k_dn * (*p1++));
1075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p2++ = s >> 7;
1085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        s = (k_cn* (*p0++))+(k_dn * (*p1++));
1095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p2++ = s >> 7;
1105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        s = (k_cn* (*p0++))+(k_dn * (*p1++));
1115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p2++ = s >> 7;
1125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        s = (k_cn* (*p0++))+(k_dn * (*p1++));
1135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p2++ = s >> 7;
1145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /* set sign according to dn2[] = k_cn*cn[] + k_dn*dn[]    */
1175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < L_SUBFR; i ++)
1185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
1195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        val = dn[i];
1205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ps = dn2[i];
1215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        if (ps >= 0)
1225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
1235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            sign[i] = 32767;             /* sign = +1 (Q12) */
1245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            vec[i] = -32768;
1255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        } else
1265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
1275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            sign[i] = -32768;            /* sign = -1 (Q12) */
1285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            vec[i] = 32767;
1295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            dn[i] = -val;
1305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
1315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
1325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /*------------------------------------------------------------*
1335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * Compute h_inv[i].                                          *
1345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     *------------------------------------------------------------*/
1355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /* impulse response buffer for fast computation */
1365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    h = h_buf + L_SUBFR;
1375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    h_inv = h + (L_SUBFR<<1);
138e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < L_SUBFR; i++)
1405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
1415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        h[i] = H[i];
1425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        h_inv[i] = vo_negate(h[i]);
1435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /*------------------------------------------------------------*
1465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * Compute rrixix[][] needed for the codebook search.         *
1475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * Result is multiplied by 0.5                                *
1485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     *------------------------------------------------------------*/
1495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /* Init pointers to last position of rrixix[] */
1505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p0 = &rrixix[0][NB_POS - 1];
1515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p1 = &rrixix[1][NB_POS - 1];
152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    ptr_h1 = h;
1545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    cor = 0x00010000L;                          /* for rounding */
1555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < NB_POS; i++)
1565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
1575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        cor += ((*ptr_h1) * (*ptr_h1) << 1);
1585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h1++;
1595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p1-- = (extract_h(cor) >> 1);
1605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        cor += ((*ptr_h1) * (*ptr_h1) << 1);
1615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h1++;
1625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p0-- = (extract_h(cor) >> 1);
1635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /*------------------------------------------------------------*
1665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * Compute rrixiy[][] needed for the codebook search.         *
1675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     *------------------------------------------------------------*/
1685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    pos = MSIZE - 1;
1695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    pos2 = MSIZE - 2;
1705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    ptr_hf = h + 1;
171e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (k = 0; k < NB_POS; k++)
1735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
1745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p1 = &rrixiy[pos];
1755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p0 = &rrixiy[pos2];
1765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        cor = 0x00008000L;                        /* for rounding */
1775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h1 = h;
1785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h2 = ptr_hf;
179e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = (k + 1); i < NB_POS; i++)
1815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
1825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            cor += ((*ptr_h1) * (*ptr_h2))<<1;
1835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ptr_h1++;
1845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ptr_h2++;
1855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            *p1 = extract_h(cor);
1865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            cor += ((*ptr_h1) * (*ptr_h2))<<1;
1875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ptr_h1++;
1885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ptr_h2++;
1895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            *p0 = extract_h(cor);
190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            p1 -= (NB_POS + 1);
1925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            p0 -= (NB_POS + 1);
1935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
1945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        cor += ((*ptr_h1) * (*ptr_h2))<<1;
1955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h1++;
1965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h2++;
1975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p1 = extract_h(cor);
198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        pos -= NB_POS;
2005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        pos2--;
2015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_hf += STEP;
2025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
203e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
2045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /*------------------------------------------------------------*
2055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * Modification of rrixiy[][] to take signs into account.     *
2065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     *------------------------------------------------------------*/
2075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p0 = rrixiy;
2085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < L_SUBFR; i += STEP)
2095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
2105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        psign = sign;
2115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        if (psign[i] < 0)
2125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
2135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            psign = vec;
2145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
2155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (j = 1; j < L_SUBFR; j += STEP)
2165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
2175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            *p0 = vo_mult(*p0, psign[j]);
2185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            p0++;
2195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
2205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
2215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /*-------------------------------------------------------------------*
2225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * search 2 pulses:                                                  *
2235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * ~@~~~~~~~~~~~~~~                                                  *
2245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * 32 pos x 32 pos = 1024 tests (all combinaisons is tested)         *
2255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     *-------------------------------------------------------------------*/
2265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p0 = rrixix[0];
2275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p1 = rrixix[1];
2285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p2 = rrixiy;
229e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
2305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    psk = -1;
2315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    alpk = 1;
2325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    ix = 0;
2335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    iy = 1;
234e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
2355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i0 = 0; i0 < L_SUBFR; i0 += STEP)
2365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
2375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ps1 = dn[i0];
2385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        alp1 = (*p0++);
2395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        pos = -1;
2405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i1 = 1; i1 < L_SUBFR; i1 += STEP)
2415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
2425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ps2 = add1(ps1, dn[i1]);
2435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            alp2 = add1(alp1, add1(*p1++, *p2++));
2445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            sq = vo_mult(ps2, ps2);
2455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            s = vo_L_mult(alpk, sq) - ((psk * alp2)<<1);
2465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            if (s > 0)
2475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
2485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                psk = sq;
2495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                alpk = alp2;
2505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                pos = i1;
2515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
2525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
2535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p1 -= NB_POS;
2545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        if (pos >= 0)
2555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
2565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ix = i0;
2575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            iy = pos;
2585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
2595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
2605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /*-------------------------------------------------------------------*
2615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * Build the codeword, the filtered codeword and index of codevector.*
2625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     *-------------------------------------------------------------------*/
263e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
2645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < L_SUBFR; i++)
2655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
2665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        code[i] = 0;
2675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
268e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
2695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    i0 = (ix >> 1);                       /* pos of pulse 1 (0..31) */
2705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    i1 = (iy >> 1);                       /* pos of pulse 2 (0..31) */
2715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    if (sign[ix] > 0)
2725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
2735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        code[ix] = 512;                     /* codeword in Q9 format */
2745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p0 = h - ix;
2755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    } else
2765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
2775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        code[ix] = -512;
2785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        i0 += NB_POS;
2795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p0 = h_inv - ix;
2805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
2815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    if (sign[iy] > 0)
2825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
2835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        code[iy] = 512;
2845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p1 = h - iy;
2855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    } else
2865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
2875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        code[iy] = -512;
2885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        i1 += NB_POS;
2895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p1 = h_inv - iy;
2905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
2915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    *index = add1((i0 << 6), i1);
2925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < L_SUBFR; i++)
2935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
2945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        y[i] = vo_shr_r(add1((*p0++), (*p1++)), 3);
2955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
2965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    return;
297e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
298e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
299e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
300e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
301