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: c4t64fx.c                                                 *
19e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                      *
205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen*      Description:Performs algebraic codebook search for higher modes *
21e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                      *
22e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard************************************************************************/
23e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
24e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/************************************************************************
25e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Function: ACELP_4t64_fx()                                             *
26e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                       *
27e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* 20, 36, 44, 52, 64, 72, 88 bits algebraic codebook.                   *
28e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* 4 tracks x 16 positions per track = 64 samples.                       *
29e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                       *
30e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* 20 bits --> 4 pulses in a frame of 64 samples.                        *
31e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* 36 bits --> 8 pulses in a frame of 64 samples.                        *
32e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* 44 bits --> 10 pulses in a frame of 64 samples.                       *
33e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* 52 bits --> 12 pulses in a frame of 64 samples.                       *
34e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* 64 bits --> 16 pulses in a frame of 64 samples.                       *
35e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* 72 bits --> 18 pulses in a frame of 64 samples.                       *
36e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* 88 bits --> 24 pulses in a frame of 64 samples.                       *
37e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*                                                                       *
38e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* All pulses can have two (2) possible amplitudes: +1 or -1.            *
39e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* Each pulse can have sixteen (16) possible positions.                  *
40e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard*************************************************************************/
41e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
42e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "typedef.h"
43e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "basic_op.h"
44e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "math_op.h"
45e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "acelp.h"
46e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "cnst.h"
47e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#include "q_pulse.h"
49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardstatic Word16 tipos[36] = {
515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    0, 1, 2, 3,                            /* starting point &ipos[0], 1st iter */
525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    1, 2, 3, 0,                            /* starting point &ipos[4], 2nd iter */
535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    2, 3, 0, 1,                            /* starting point &ipos[8], 3rd iter */
545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    3, 0, 1, 2,                            /* starting point &ipos[12], 4th iter */
555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    0, 1, 2, 3,
565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    1, 2, 3, 0,
575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    2, 3, 0, 1,
585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    3, 0, 1, 2,
595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    0, 1, 2, 3};                           /* end point for 24 pulses &ipos[35], 4th iter */
60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define NB_PULSE_MAX  24
62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define L_SUBFR   64
64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define NB_TRACK  4
65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define STEP      4
66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define NB_POS    16
67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define MSIZE     256
68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define NB_MAX    8
69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#define NPMAXPT   ((NB_PULSE_MAX+NB_TRACK-1)/NB_TRACK)
70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/* Private functions */
72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid cor_h_vec_012(
735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 h[],                           /* (i) scaled impulse response                 */
745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 vec[],                         /* (i) scaled vector (/8) to correlate with h[] */
755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 track,                         /* (i) track to use                            */
765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 sign[],                        /* (i) sign vector                             */
775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 rrixix[][NB_POS],              /* (i) correlation of h[x] with h[x]      */
785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 cor_1[],                       /* (o) result of correlation (NB_POS elements) */
795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 cor_2[]                        /* (o) result of correlation (NB_POS elements) */
805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        );
81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
82e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid cor_h_vec_012_asm(
835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 h[],                           /* (i) scaled impulse response                 */
845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 vec[],                         /* (i) scaled vector (/8) to correlate with h[] */
855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 track,                         /* (i) track to use                            */
865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 sign[],                        /* (i) sign vector                             */
875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 rrixix[][NB_POS],              /* (i) correlation of h[x] with h[x]      */
885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 cor_1[],                       /* (o) result of correlation (NB_POS elements) */
895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 cor_2[]                        /* (o) result of correlation (NB_POS elements) */
905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        );
91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid cor_h_vec_30(
935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 h[],                           /* (i) scaled impulse response                 */
945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 vec[],                         /* (i) scaled vector (/8) to correlate with h[] */
955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 track,                         /* (i) track to use                            */
965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 sign[],                        /* (i) sign vector                             */
975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 rrixix[][NB_POS],              /* (i) correlation of h[x] with h[x]      */
985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 cor_1[],                       /* (o) result of correlation (NB_POS elements) */
995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 cor_2[]                        /* (o) result of correlation (NB_POS elements) */
1005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        );
101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid search_ixiy(
1035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 nb_pos_ix,                     /* (i) nb of pos for pulse 1 (1..8)       */
1045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 track_x,                       /* (i) track of pulse 1                   */
1055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 track_y,                       /* (i) track of pulse 2                   */
1065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * ps,                          /* (i/o) correlation of all fixed pulses  */
1075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * alp,                         /* (i/o) energy of all fixed pulses       */
1085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * ix,                          /* (o) position of pulse 1                */
1095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * iy,                          /* (o) position of pulse 2                */
1105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 dn[],                          /* (i) corr. between target and h[]       */
1115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 dn2[],                         /* (i) vector of selected positions       */
1125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 cor_x[],                       /* (i) corr. of pulse 1 with fixed pulses */
1135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 cor_y[],                       /* (i) corr. of pulse 2 with fixed pulses */
1145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 rrixiy[][MSIZE]                /* (i) corr. of pulse 1 with pulse 2   */
1155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        );
116e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
117e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid ACELP_4t64_fx(
1195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 dn[],                          /* (i) <12b : correlation between target x[] and H[]      */
1205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 cn[],                          /* (i) <12b : residual after long term prediction         */
1215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 H[],                           /* (i) Q12: impulse response of weighted synthesis filter */
1225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 code[],                        /* (o) Q9 : algebraic (fixed) codebook excitation         */
1235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 y[],                           /* (o) Q9 : filtered fixed codebook excitation            */
1245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 nbbits,                        /* (i) : 20, 36, 44, 52, 64, 72 or 88 bits                */
1255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 ser_size,                      /* (i) : bit rate                                         */
1265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 _index[]                       /* (o) : index (20): 5+5+5+5 = 20 bits.                   */
1275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        /* (o) : index (36): 9+9+9+9 = 36 bits.                   */
1285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        /* (o) : index (44): 13+9+13+9 = 44 bits.                 */
1295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        /* (o) : index (52): 13+13+13+13 = 52 bits.               */
1305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        /* (o) : index (64): 2+2+2+2+14+14+14+14 = 64 bits.       */
1315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        /* (o) : index (72): 10+2+10+2+10+14+10+14 = 72 bits.     */
1325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        /* (o) : index (88): 11+11+11+11+11+11+11+11 = 88 bits.   */
1335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        )
134e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
1355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 i, j, k;
1365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 st, ix, iy, pos, index, track, nb_pulse, nbiter, j_temp;
1375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 psk, ps, alpk, alp, val, k_cn, k_dn, exp;
1385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 *p0, *p1, *p2, *p3, *psign;
1395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf, h_shift;
1405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 s, cor, L_tmp, L_index;
1415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 dn2[L_SUBFR], sign[L_SUBFR], vec[L_SUBFR];
1425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 ind[NPMAXPT * NB_TRACK];
1435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 codvec[NB_PULSE_MAX], nbpos[10];
1445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 cor_x[NB_POS], cor_y[NB_POS], pos_max[NB_TRACK];
1455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 h_buf[4 * L_SUBFR];
1465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 rrixix[NB_TRACK][NB_POS], rrixiy[NB_TRACK][MSIZE];
1475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 ipos[NB_PULSE_MAX];
1485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
1495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    switch (nbbits)
1505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
1515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        case 20:                               /* 20 bits, 4 pulses, 4 tracks */
1525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbiter = 4;                          /* 4x16x16=1024 loop */
1535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            alp = 8192;                          /* alp = 2.0 (Q12) */
1545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nb_pulse = 4;
1555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[0] = 4;
1565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[1] = 8;
1575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            break;
1585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        case 36:                               /* 36 bits, 8 pulses, 4 tracks */
1595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbiter = 4;                          /* 4x20x16=1280 loop */
1605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            alp = 4096;                          /* alp = 1.0 (Q12) */
1615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nb_pulse = 8;
1625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[0] = 4;
1635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[1] = 8;
1645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[2] = 8;
1655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            break;
1665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        case 44:                               /* 44 bits, 10 pulses, 4 tracks */
1675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbiter = 4;                          /* 4x26x16=1664 loop */
1685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            alp = 4096;                          /* alp = 1.0 (Q12) */
1695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nb_pulse = 10;
1705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[0] = 4;
1715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[1] = 6;
1725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[2] = 8;
1735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[3] = 8;
1745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            break;
1755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        case 52:                               /* 52 bits, 12 pulses, 4 tracks */
1765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbiter = 4;                          /* 4x26x16=1664 loop */
1775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            alp = 4096;                          /* alp = 1.0 (Q12) */
1785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nb_pulse = 12;
1795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[0] = 4;
1805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[1] = 6;
1815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[2] = 8;
1825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[3] = 8;
1835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            break;
1845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        case 64:                               /* 64 bits, 16 pulses, 4 tracks */
1855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbiter = 3;                          /* 3x36x16=1728 loop */
1865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            alp = 3277;                          /* alp = 0.8 (Q12) */
1875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nb_pulse = 16;
1885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[0] = 4;
1895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[1] = 4;
1905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[2] = 6;
1915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[3] = 6;
1925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[4] = 8;
1935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[5] = 8;
1945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            break;
1955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        case 72:                               /* 72 bits, 18 pulses, 4 tracks */
1965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbiter = 3;                          /* 3x35x16=1680 loop */
1975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            alp = 3072;                          /* alp = 0.75 (Q12) */
1985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nb_pulse = 18;
1995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[0] = 2;
2005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[1] = 3;
2015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[2] = 4;
2025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[3] = 5;
2035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[4] = 6;
2045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[5] = 7;
2055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[6] = 8;
2065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            break;
2075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        case 88:                               /* 88 bits, 24 pulses, 4 tracks */
2085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            if(ser_size > 462)
2095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                nbiter = 1;
2105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            else
2115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                nbiter = 2;                    /* 2x53x16=1696 loop */
2125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
2135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            alp = 2048;                          /* alp = 0.5 (Q12) */
2145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nb_pulse = 24;
2155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[0] = 2;
2165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[1] = 2;
2175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[2] = 3;
2185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[3] = 4;
2195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[4] = 5;
2205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[5] = 6;
2215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[6] = 7;
2225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[7] = 8;
2235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[8] = 8;
2245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbpos[9] = 8;
2255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            break;
2265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        default:
2275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nbiter = 0;
2285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            alp = 0;
2295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            nb_pulse = 0;
2305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
2315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
2325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < nb_pulse; i++)
2335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
2345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        codvec[i] = i;
2355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
2365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
2375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /*----------------------------------------------------------------*
2385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * Find sign for each pulse position.                             *
2395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     *----------------------------------------------------------------*/
2405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /* calculate energy for normalization of cn[] and dn[] */
2415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /* set k_cn = 32..32767 (ener_cn = 2^30..256-0) */
242e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT                  /* asm optimization branch */
2435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    s = Dot_product12_asm(cn, cn, L_SUBFR, &exp);
244e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
2455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    s = Dot_product12(cn, cn, L_SUBFR, &exp);
246e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
247e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
2485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Isqrt_n(&s, &exp);
2495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    s = L_shl(s, (exp + 5));
2505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    k_cn = extract_h(L_add(s, 0x8000));
251e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
2525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /* set k_dn = 32..512 (ener_dn = 2^30..2^22) */
253e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT                      /* asm optimization branch */
2545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    s = Dot_product12_asm(dn, dn, L_SUBFR, &exp);
255e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
2565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    s = Dot_product12(dn, dn, L_SUBFR, &exp);
257e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
258e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
2595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Isqrt_n(&s, &exp);
260a87228e3e3f42d3676ced0d38ad9913d7bef9de6Marco Nelissen    k_dn = voround(L_shl(s, (exp + 5 + 3)));    /* k_dn = 256..4096 */
2615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    k_dn = vo_mult_r(alp, k_dn);              /* alp in Q12 */
2625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
2635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /* mix normalized cn[] and dn[] */
2645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p0 = cn;
2655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p1 = dn;
2665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p2 = dn2;
2675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
2685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < L_SUBFR/4; i++)
2695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
270a93d5b263f3f374c5d3081297f504504203000daWei Jia        s = L_add((k_cn* (*p0++)), (k_dn * (*p1++)));
2715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p2++ = s >> 7;
272a93d5b263f3f374c5d3081297f504504203000daWei Jia        s = L_add((k_cn* (*p0++)), (k_dn * (*p1++)));
2735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p2++ = s >> 7;
274a93d5b263f3f374c5d3081297f504504203000daWei Jia        s = L_add((k_cn* (*p0++)), (k_dn * (*p1++)));
2755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p2++ = s >> 7;
276a93d5b263f3f374c5d3081297f504504203000daWei Jia        s = L_add((k_cn* (*p0++)), (k_dn * (*p1++)));
2775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p2++ = s >> 7;
2785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
2795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
2805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /* set sign according to dn2[] = k_cn*cn[] + k_dn*dn[]    */
2815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for(i = 0; i < L_SUBFR; i++)
2825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
2835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        val = dn[i];
2845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ps = dn2[i];
2855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        if (ps >= 0)
2865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
2875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            sign[i] = 32767;             /* sign = +1 (Q12) */
2885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            vec[i] = -32768;
2895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        } else
2905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
2915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            sign[i] = -32768;            /* sign = -1 (Q12) */
2925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            vec[i] = 32767;
2935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            dn[i] = -val;
2945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            dn2[i] = -ps;
2955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
2965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
2975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /*----------------------------------------------------------------*
2985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * Select NB_MAX position per track according to max of dn2[].    *
2995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     *----------------------------------------------------------------*/
3005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    pos = 0;
3015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < NB_TRACK; i++)
3025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
3035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (k = 0; k < NB_MAX; k++)
3045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
3055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ps = -1;
3065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            for (j = i; j < L_SUBFR; j += STEP)
3075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
3085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                if(dn2[j] > ps)
3095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                {
3105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                    ps = dn2[j];
3115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                    pos = j;
3125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                }
3135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
3145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            dn2[pos] = (k - NB_MAX);     /* dn2 < 0 when position is selected */
3155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            if (k == 0)
3165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
3175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                pos_max[i] = pos;
3185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
3195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
3205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
3215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
3225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /*--------------------------------------------------------------*
3235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * Scale h[] to avoid overflow and to get maximum of precision  *
3245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * on correlation.                                              *
3255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     *                                                              *
3265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * Maximum of h[] (h[0]) is fixed to 2048 (MAX16 / 16).         *
3275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     *  ==> This allow addition of 16 pulses without saturation.    *
3285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     *                                                              *
3295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * Energy worst case (on resonant impulse response),            *
3305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * - energy of h[] is approximately MAX/16.                     *
3315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * - During search, the energy is divided by 8 to avoid         *
3325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     *   overflow on "alp". (energy of h[] = MAX/128).              *
3335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     *  ==> "alp" worst case detected is 22854 on sinusoidal wave.  *
3345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     *--------------------------------------------------------------*/
3355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
3365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /* impulse response buffer for fast computation */
3375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
3385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    h = h_buf;
3395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    h_inv = h_buf + (2 * L_SUBFR);
3405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    L_tmp = 0;
3415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < L_SUBFR; i++)
3425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
3435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *h++ = 0;
3445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *h_inv++ = 0;
345a93d5b263f3f374c5d3081297f504504203000daWei Jia        L_tmp = L_add(L_tmp, (H[i] * H[i]) << 1);
3465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
3475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /* scale h[] down (/2) when energy of h[] is high with many pulses used */
3485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    val = extract_h(L_tmp);
3495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    h_shift = 0;
3505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
3515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    if ((nb_pulse >= 12) && (val > 1024))
3525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
3535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        h_shift = 1;
3545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
3555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p0 = H;
3565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p1 = h;
3575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p2 = h_inv;
3585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
3595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < L_SUBFR/4; i++)
3605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
3615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p1 = *p0++ >> h_shift;
3625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p2++ = -(*p1++);
3635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p1 = *p0++ >> h_shift;
3645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p2++ = -(*p1++);
3655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p1 = *p0++ >> h_shift;
3665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p2++ = -(*p1++);
3675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p1 = *p0++ >> h_shift;
3685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p2++ = -(*p1++);
3695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
3705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
3715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /*------------------------------------------------------------*
3725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * Compute rrixix[][] needed for the codebook search.         *
3735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * This algorithm compute impulse response energy of all      *
3745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * positions (16) in each track (4).       Total = 4x16 = 64. *
3755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     *------------------------------------------------------------*/
3765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
3775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /* storage order --> i3i3, i2i2, i1i1, i0i0 */
3785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
3795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /* Init pointers to last position of rrixix[] */
3805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p0 = &rrixix[0][NB_POS - 1];
3815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p1 = &rrixix[1][NB_POS - 1];
3825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p2 = &rrixix[2][NB_POS - 1];
3835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p3 = &rrixix[3][NB_POS - 1];
3845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
3855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    ptr_h1 = h;
3865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    cor = 0x00008000L;                             /* for rounding */
3875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < NB_POS; i++)
3885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
389a93d5b263f3f374c5d3081297f504504203000daWei Jia        cor = L_add(cor, vo_L_mult((*ptr_h1), (*ptr_h1)));
3905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h1++;
3915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p3-- = extract_h(cor);
392a93d5b263f3f374c5d3081297f504504203000daWei Jia        cor = L_add(cor, vo_L_mult((*ptr_h1), (*ptr_h1)));
3935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h1++;
3945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p2-- = extract_h(cor);
395a93d5b263f3f374c5d3081297f504504203000daWei Jia        cor = L_add(cor, vo_L_mult((*ptr_h1), (*ptr_h1)));
3965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h1++;
3975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p1-- = extract_h(cor);
398a93d5b263f3f374c5d3081297f504504203000daWei Jia        cor = L_add(cor, vo_L_mult((*ptr_h1), (*ptr_h1)));
3995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h1++;
4005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p0-- = extract_h(cor);
4015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
4025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /*------------------------------------------------------------*
4045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * Compute rrixiy[][] needed for the codebook search.         *
4055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * This algorithm compute correlation between 2 pulses        *
4065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * (2 impulses responses) in 4 possible adjacents tracks.     *
4075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * (track 0-1, 1-2, 2-3 and 3-0).     Total = 4x16x16 = 1024. *
4085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     *------------------------------------------------------------*/
4095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /* storage order --> i2i3, i1i2, i0i1, i3i0 */
4115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    pos = MSIZE - 1;
4135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    ptr_hf = h + 1;
4145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (k = 0; k < NB_POS; k++)
4165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
4175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p3 = &rrixiy[2][pos];
4185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p2 = &rrixiy[1][pos];
4195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p1 = &rrixiy[0][pos];
4205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p0 = &rrixiy[3][pos - NB_POS];
4215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        cor = 0x00008000L;                   /* for rounding */
4235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h1 = h;
4245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h2 = ptr_hf;
4255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = k + 1; i < NB_POS; i++)
4275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
428a93d5b263f3f374c5d3081297f504504203000daWei Jia            cor = L_add(cor, vo_L_mult((*ptr_h1), (*ptr_h2)));
4295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ptr_h1++;
4305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ptr_h2++;
4315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            *p3 = extract_h(cor);
432a93d5b263f3f374c5d3081297f504504203000daWei Jia            cor = L_add(cor, vo_L_mult((*ptr_h1), (*ptr_h2)));
4335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ptr_h1++;
4345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ptr_h2++;
4355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            *p2 = extract_h(cor);
436a93d5b263f3f374c5d3081297f504504203000daWei Jia            cor = L_add(cor, vo_L_mult((*ptr_h1), (*ptr_h2)));
4375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ptr_h1++;
4385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ptr_h2++;
4395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            *p1 = extract_h(cor);
440a93d5b263f3f374c5d3081297f504504203000daWei Jia            cor = L_add(cor, vo_L_mult((*ptr_h1), (*ptr_h2)));
4415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ptr_h1++;
4425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ptr_h2++;
4435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            *p0 = extract_h(cor);
4445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            p3 -= (NB_POS + 1);
4465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            p2 -= (NB_POS + 1);
4475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            p1 -= (NB_POS + 1);
4485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            p0 -= (NB_POS + 1);
4495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
450a93d5b263f3f374c5d3081297f504504203000daWei Jia        cor = L_add(cor, vo_L_mult((*ptr_h1), (*ptr_h2)));
4515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h1++;
4525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h2++;
4535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p3 = extract_h(cor);
454a93d5b263f3f374c5d3081297f504504203000daWei Jia        cor = L_add(cor, vo_L_mult((*ptr_h1), (*ptr_h2)));
4555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h1++;
4565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h2++;
4575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p2 = extract_h(cor);
458a93d5b263f3f374c5d3081297f504504203000daWei Jia        cor = L_add(cor, vo_L_mult((*ptr_h1), (*ptr_h2)));
4595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h1++;
4605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h2++;
4615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p1 = extract_h(cor);
4625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        pos -= NB_POS;
4645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_hf += STEP;
4655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
4665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /* storage order --> i3i0, i2i3, i1i2, i0i1 */
4685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    pos = MSIZE - 1;
4705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    ptr_hf = h + 3;
4715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (k = 0; k < NB_POS; k++)
4735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
4745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p3 = &rrixiy[3][pos];
4755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p2 = &rrixiy[2][pos - 1];
4765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p1 = &rrixiy[1][pos - 1];
4775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p0 = &rrixiy[0][pos - 1];
4785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        cor = 0x00008000L;                              /* for rounding */
4805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h1 = h;
4815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h2 = ptr_hf;
4825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
4835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = k + 1; i < NB_POS; i++)
4845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
485a93d5b263f3f374c5d3081297f504504203000daWei Jia            cor = L_add(cor, vo_L_mult((*ptr_h1), (*ptr_h2)));
4865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ptr_h1++;
4875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ptr_h2++;
4885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            *p3 = extract_h(cor);
489a93d5b263f3f374c5d3081297f504504203000daWei Jia            cor = L_add(cor, vo_L_mult((*ptr_h1), (*ptr_h2)));
4905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ptr_h1++;
4915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ptr_h2++;
4925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            *p2 = extract_h(cor);
493a93d5b263f3f374c5d3081297f504504203000daWei Jia            cor = L_add(cor, vo_L_mult((*ptr_h1), (*ptr_h2)));
4945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ptr_h1++;
4955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ptr_h2++;
4965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            *p1 = extract_h(cor);
497a93d5b263f3f374c5d3081297f504504203000daWei Jia            cor = L_add(cor, vo_L_mult((*ptr_h1), (*ptr_h2)));
4985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ptr_h1++;
4995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ptr_h2++;
5005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            *p0 = extract_h(cor);
5015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
5025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            p3 -= (NB_POS + 1);
5035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            p2 -= (NB_POS + 1);
5045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            p1 -= (NB_POS + 1);
5055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            p0 -= (NB_POS + 1);
5065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
507a93d5b263f3f374c5d3081297f504504203000daWei Jia        cor = L_add(cor, vo_L_mult((*ptr_h1), (*ptr_h2)));
5085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h1++;
5095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_h2++;
5105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        *p3 = extract_h(cor);
5115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
5125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        pos--;
5135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ptr_hf += STEP;
5145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
5155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
5165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /*------------------------------------------------------------*
5175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * Modification of rrixiy[][] to take signs into account.     *
5185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     *------------------------------------------------------------*/
5195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
5205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p0 = &rrixiy[0][0];
5215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
5225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (k = 0; k < NB_TRACK; k++)
5235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
5245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        j_temp = (k + 1)&0x03;
5255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = k; i < L_SUBFR; i += STEP)
5265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
5275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            psign = sign;
5285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            if (psign[i] < 0)
5295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
5305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                psign = vec;
5315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
5325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            j = j_temp;
5335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            for (; j < L_SUBFR; j += STEP)
5345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
5355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                *p0 = vo_mult(*p0, psign[j]);
5365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                p0++;
5375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
5385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
5395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
5405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
5415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /*-------------------------------------------------------------------*
5425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     *                       Deep first search                           *
5435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     *-------------------------------------------------------------------*/
5445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
5455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    psk = -1;
5465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    alpk = 1;
5475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
5485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (k = 0; k < nbiter; k++)
5495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
5505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        j_temp = k<<2;
5515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (i = 0; i < nb_pulse; i++)
5525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ipos[i] = tipos[j_temp + i];
5535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
5545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        if(nbbits == 20)
5555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
5565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            pos = 0;
5575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ps = 0;
5585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            alp = 0;
5595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            for (i = 0; i < L_SUBFR; i++)
5605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
5615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                vec[i] = 0;
5625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
5635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        } else if ((nbbits == 36) || (nbbits == 44))
5645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
5655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            /* first stage: fix 2 pulses */
5665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            pos = 2;
5675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
5685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ix = ind[0] = pos_max[ipos[0]];
5695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            iy = ind[1] = pos_max[ipos[1]];
5705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ps = dn[ix] + dn[iy];
5715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            i = ix >> 2;                /* ix / STEP */
5725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            j = iy >> 2;                /* iy / STEP */
5735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            s = rrixix[ipos[0]][i] << 13;
5745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            s += rrixix[ipos[1]][j] << 13;
5755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            i = (i << 4) + j;         /* (ix/STEP)*NB_POS + (iy/STEP) */
5765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            s += rrixiy[ipos[0]][i] << 14;
5775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            alp = (s + 0x8000) >> 16;
5785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            if (sign[ix] < 0)
5795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                p0 = h_inv - ix;
5805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            else
5815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                p0 = h - ix;
5825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            if (sign[iy] < 0)
5835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                p1 = h_inv - iy;
5845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            else
5855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                p1 = h - iy;
5865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
5875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            for (i = 0; i < L_SUBFR; i++)
5885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
5895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                vec[i] = (*p0++) + (*p1++);
5905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
5915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
5925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            if(nbbits == 44)
5935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
5945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                ipos[8] = 0;
5955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                ipos[9] = 1;
5965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
5975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        } else
5985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
5995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            /* first stage: fix 4 pulses */
6005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            pos = 4;
6015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
6025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ix = ind[0] = pos_max[ipos[0]];
6035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            iy = ind[1] = pos_max[ipos[1]];
6045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            i = ind[2] = pos_max[ipos[2]];
6055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            j = ind[3] = pos_max[ipos[3]];
6065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ps = add1(add1(add1(dn[ix], dn[iy]), dn[i]), dn[j]);
6075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
6085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            if (sign[ix] < 0)
6095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                p0 = h_inv - ix;
6105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            else
6115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                p0 = h - ix;
6125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
6135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            if (sign[iy] < 0)
6145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                p1 = h_inv - iy;
6155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            else
6165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                p1 = h - iy;
6175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
6185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            if (sign[i] < 0)
6195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                p2 = h_inv - i;
6205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            else
6215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                p2 = h - i;
6225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
6235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            if (sign[j] < 0)
6245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                p3 = h_inv - j;
6255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            else
6265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                p3 = h - j;
6275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
6285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            L_tmp = 0L;
6295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            for(i = 0; i < L_SUBFR; i++)
6305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
6315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                Word32 vecSq2;
6325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                vec[i]  = add1(add1(add1(*p0++, *p1++), *p2++), *p3++);
6335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                vecSq2 = (vec[i] * vec[i]) << 1;
6345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                if (vecSq2 > 0 && L_tmp > INT_MAX - vecSq2) {
6355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                    L_tmp = INT_MAX;
6365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                } else if (vecSq2 < 0 && L_tmp < INT_MIN - vecSq2) {
6375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                    L_tmp = INT_MIN;
6385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                } else {
6395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                    L_tmp  += vecSq2;
6405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                }
6415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
6425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
6435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            alp = ((L_tmp >> 3) + 0x8000) >> 16;
6445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
6455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            if(nbbits == 72)
6465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
6475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                ipos[16] = 0;
6485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                ipos[17] = 1;
6495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
6505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
6515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
6525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        /* other stages of 2 pulses */
6535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
6545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (j = pos, st = 0; j < nb_pulse; j += 2, st++)
6555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
6565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            /*--------------------------------------------------*
6575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen             * Calculate correlation of all possible positions  *
6585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen             * of the next 2 pulses with previous fixed pulses. *
6595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen             * Each pulse can have 16 possible positions.       *
6605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen             *--------------------------------------------------*/
6615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            if(ipos[j] == 3)
6625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
6635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                cor_h_vec_30(h, vec, ipos[j], sign, rrixix, cor_x, cor_y);
6645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
6655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            else
6665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
667e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT                 /* asm optimization branch */
6685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                cor_h_vec_012_asm(h, vec, ipos[j], sign, rrixix, cor_x, cor_y);
669e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else
6705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                cor_h_vec_012(h, vec, ipos[j], sign, rrixix, cor_x, cor_y);
671e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif
6725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
6735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            /*--------------------------------------------------*
6745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen             * Find best positions of 2 pulses.                 *
6755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen             *--------------------------------------------------*/
6765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            search_ixiy(nbpos[st], ipos[j], ipos[j + 1], &ps, &alp,
6775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                    &ix, &iy, dn, dn2, cor_x, cor_y, rrixiy);
6785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
6795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ind[j] = ix;
6805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            ind[j + 1] = iy;
6815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
6825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            if (sign[ix] < 0)
6835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                p0 = h_inv - ix;
6845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            else
6855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                p0 = h - ix;
6865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            if (sign[iy] < 0)
6875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                p1 = h_inv - iy;
6885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            else
6895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                p1 = h - iy;
6905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
6915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            for (i = 0; i < L_SUBFR; i+=4)
6925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
6935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                vec[i]   += add1((*p0++), (*p1++));
6945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                vec[i+1] += add1((*p0++), (*p1++));
6955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                vec[i+2] += add1((*p0++), (*p1++));
6965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                vec[i+3] += add1((*p0++), (*p1++));
6975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
6985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
6995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        /* memorise the best codevector */
7005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ps = vo_mult(ps, ps);
701a93d5b263f3f374c5d3081297f504504203000daWei Jia        s = L_sub(vo_L_mult(alpk, ps), vo_L_mult(psk, alp));
7025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        if (s > 0)
7035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
7045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            psk = ps;
7055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            alpk = alp;
7065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            for (i = 0; i < nb_pulse; i++)
7075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
7085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                codvec[i] = ind[i];
7095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
7105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            for (i = 0; i < L_SUBFR; i++)
7115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
7125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                y[i] = vec[i];
7135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
7145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
7155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
7165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /*-------------------------------------------------------------------*
7175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     * Build the codeword, the filtered codeword and index of codevector.*
7185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen     *-------------------------------------------------------------------*/
7195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < NPMAXPT * NB_TRACK; i++)
7205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
7215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ind[i] = -1;
7225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
7235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < L_SUBFR; i++)
7245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
7255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        code[i] = 0;
7265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        y[i] = vo_shr_r(y[i], 3);               /* Q12 to Q9 */
7275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
7285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    val = (512 >> h_shift);               /* codeword in Q9 format */
7295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (k = 0; k < nb_pulse; k++)
7305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
7315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        i = codvec[k];                       /* read pulse position */
7325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        j = sign[i];                         /* read sign           */
7335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        index = i >> 2;                 /* index = pos of pulse (0..15) */
7345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        track = (Word16) (i & 0x03);         /* track = i % NB_TRACK (0..3)  */
7355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
7365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        if (j > 0)
7375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
7385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            code[i] += val;
7395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            codvec[k] += 128;
7405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        } else
7415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
7425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            code[i] -= val;
7435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            index += NB_POS;
7445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
7455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
7465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        i = (Word16)((vo_L_mult(track, NPMAXPT) >> 1));
7475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
7485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        while (ind[i] >= 0)
7495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
7505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            i += 1;
7515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
7525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ind[i] = index;
7535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
7545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
7555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    k = 0;
7565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    /* Build index of codevector */
7575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    if(nbbits == 20)
7585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
7595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (track = 0; track < NB_TRACK; track++)
7605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
7615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            _index[track] = (Word16)(quant_1p_N1(ind[k], 4));
7625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            k += NPMAXPT;
7635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
7645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    } else if(nbbits == 36)
7655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
7665d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (track = 0; track < NB_TRACK; track++)
7675d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
7685d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            _index[track] = (Word16)(quant_2p_2N1(ind[k], ind[k + 1], 4));
7695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            k += NPMAXPT;
7705d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
7715d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    } else if(nbbits == 44)
7725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
7735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (track = 0; track < NB_TRACK - 2; track++)
7745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
7755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            _index[track] = (Word16)(quant_3p_3N1(ind[k], ind[k + 1], ind[k + 2], 4));
7765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            k += NPMAXPT;
7775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
7785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (track = 2; track < NB_TRACK; track++)
7795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
7805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            _index[track] = (Word16)(quant_2p_2N1(ind[k], ind[k + 1], 4));
7815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            k += NPMAXPT;
7825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
7835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    } else if(nbbits == 52)
7845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
7855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (track = 0; track < NB_TRACK; track++)
7865d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
7875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            _index[track] = (Word16)(quant_3p_3N1(ind[k], ind[k + 1], ind[k + 2], 4));
7885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            k += NPMAXPT;
7895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
7905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    } else if(nbbits == 64)
7915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
7925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (track = 0; track < NB_TRACK; track++)
7935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
7945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            L_index = quant_4p_4N(&ind[k], 4);
7955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            _index[track] = (Word16)((L_index >> 14) & 3);
7965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            _index[track + NB_TRACK] = (Word16)(L_index & 0x3FFF);
7975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            k += NPMAXPT;
7985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
7995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    } else if(nbbits == 72)
8005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
8015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (track = 0; track < NB_TRACK - 2; track++)
8025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
8035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            L_index = quant_5p_5N(&ind[k], 4);
8045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            _index[track] = (Word16)((L_index >> 10) & 0x03FF);
8055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            _index[track + NB_TRACK] = (Word16)(L_index & 0x03FF);
8065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            k += NPMAXPT;
8075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
8085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (track = 2; track < NB_TRACK; track++)
8095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
8105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            L_index = quant_4p_4N(&ind[k], 4);
8115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            _index[track] = (Word16)((L_index >> 14) & 3);
8125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            _index[track + NB_TRACK] = (Word16)(L_index & 0x3FFF);
8135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            k += NPMAXPT;
8145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
8155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    } else if(nbbits == 88)
8165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
8175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (track = 0; track < NB_TRACK; track++)
8185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
8195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            L_index = quant_6p_6N_2(&ind[k], 4);
8205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            _index[track] = (Word16)((L_index >> 11) & 0x07FF);
8215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            _index[track + NB_TRACK] = (Word16)(L_index & 0x07FF);
8225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            k += NPMAXPT;
8235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
8245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
8255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    return;
826e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
827e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
828e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
829e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*-------------------------------------------------------------------*
830e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Function  cor_h_vec()                                             *
831e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * ~~~~~~~~~~~~~~~~~~~~~                                             *
832e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Compute correlations of h[] with vec[] for the specified track.   *
833e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *-------------------------------------------------------------------*/
834e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid cor_h_vec_30(
8355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 h[],                           /* (i) scaled impulse response                 */
8365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 vec[],                         /* (i) scaled vector (/8) to correlate with h[] */
8375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 track,                         /* (i) track to use                            */
8385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 sign[],                        /* (i) sign vector                             */
8395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 rrixix[][NB_POS],              /* (i) correlation of h[x] with h[x]      */
8405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 cor_1[],                       /* (o) result of correlation (NB_POS elements) */
8415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 cor_2[]                        /* (o) result of correlation (NB_POS elements) */
8425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        )
843e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
8445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 i, j, pos, corr;
8455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 *p0, *p1, *p2,*p3,*cor_x,*cor_y;
8465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 L_sum1,L_sum2;
8475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    cor_x = cor_1;
8485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    cor_y = cor_2;
8495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p0 = rrixix[track];
8505d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p3 = rrixix[0];
8515d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    pos = track;
8525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
8535d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < NB_POS; i+=2)
8545d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
8555d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        L_sum1 = L_sum2 = 0L;
8565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p1 = h;
8575d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p2 = &vec[pos];
8585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (j=pos;j < L_SUBFR; j++)
8595d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
860ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen            L_sum1 = L_add(L_sum1, *p1 * *p2);
8615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            p2-=3;
862ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen            L_sum2 = L_add(L_sum2, *p1++ * *p2);
8635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            p2+=4;
8645d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
8655d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p2-=3;
866ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        L_sum2 = L_add(L_sum2, *p1++ * *p2++);
867ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        L_sum2 = L_add(L_sum2, *p1++ * *p2++);
868ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        L_sum2 = L_add(L_sum2, *p1++ * *p2++);
8695d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
870ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        L_sum1 = L_shl(L_sum1, 2);
871ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        L_sum2 = L_shl(L_sum2, 2);
8725d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
873ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        corr = voround(L_sum1);
874ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        *cor_x++ = mult(corr, sign[pos]) + (*p0++);
875ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        corr = voround(L_sum2);
876ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        *cor_y++ = mult(corr, sign[pos-3]) + (*p3++);
8775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        pos += STEP;
8785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
8795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        L_sum1 = L_sum2 = 0L;
8805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p1 = h;
8815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p2 = &vec[pos];
8825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (j=pos;j < L_SUBFR; j++)
8835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
884ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen            L_sum1 = L_add(L_sum1, *p1 * *p2);
8855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            p2-=3;
886ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen            L_sum2 = L_add(L_sum2, *p1++ * *p2);
8875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            p2+=4;
8885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
8895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p2-=3;
890ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        L_sum2 = L_add(L_sum2, *p1++ * *p2++);
891ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        L_sum2 = L_add(L_sum2, *p1++ * *p2++);
892ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        L_sum2 = L_add(L_sum2, *p1++ * *p2++);
8935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
894ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        L_sum1 = L_shl(L_sum1, 2);
895ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        L_sum2 = L_shl(L_sum2, 2);
8965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
897ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        corr = voround(L_sum1);
898ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        *cor_x++ = mult(corr, sign[pos]) + (*p0++);
899ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        corr = voround(L_sum2);
900ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        *cor_y++ = mult(corr, sign[pos-3]) + (*p3++);
9015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        pos += STEP;
9025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
9035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    return;
904e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
905e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
906e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid cor_h_vec_012(
9075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 h[],                           /* (i) scaled impulse response                 */
9085d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 vec[],                         /* (i) scaled vector (/8) to correlate with h[] */
9095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 track,                         /* (i) track to use                            */
9105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 sign[],                        /* (i) sign vector                             */
9115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 rrixix[][NB_POS],              /* (i) correlation of h[x] with h[x]      */
9125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 cor_1[],                       /* (o) result of correlation (NB_POS elements) */
9135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 cor_2[]                        /* (o) result of correlation (NB_POS elements) */
9145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        )
915e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
9165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 i, j, pos, corr;
9175d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 *p0, *p1, *p2,*p3,*cor_x,*cor_y;
9185d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 L_sum1,L_sum2;
9195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    cor_x = cor_1;
9205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    cor_y = cor_2;
9215d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p0 = rrixix[track];
9225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p3 = rrixix[track+1];
9235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    pos = track;
9245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
9255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (i = 0; i < NB_POS; i+=2)
9265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
9275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        L_sum1 = L_sum2 = 0L;
9285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p1 = h;
9295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p2 = &vec[pos];
9305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (j=62-pos ;j >= 0; j--)
9315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
932ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen            L_sum1 = L_add(L_sum1, *p1 * *p2++);
933ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen            L_sum2 = L_add(L_sum2, *p1++ * *p2);
9345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
935ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        L_sum1 = L_add(L_sum1, *p1 * *p2);
936ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        L_sum1 = L_shl(L_sum1, 2);
937ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        L_sum2 = L_shl(L_sum2, 2);
9385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
939ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        corr = voround(L_sum1);
9405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        cor_x[i] = vo_mult(corr, sign[pos]) + (*p0++);
941ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        corr = voround(L_sum2);
9425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        cor_y[i] = vo_mult(corr, sign[pos + 1]) + (*p3++);
9435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        pos += STEP;
9445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
9455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        L_sum1 = L_sum2 = 0L;
9465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p1 = h;
9475d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        p2 = &vec[pos];
9485d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        for (j= 62-pos;j >= 0; j--)
9495d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
950ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen            L_sum1 = L_add(L_sum1, *p1 * *p2++);
951ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen            L_sum2 = L_add(L_sum2, *p1++ * *p2);
9525d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
953ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        L_sum1 = L_add(L_sum1, *p1 * *p2);
954ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        L_sum1 = L_shl(L_sum1, 2);
955ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        L_sum2 = L_shl(L_sum2, 2);
9565d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
957ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        corr = voround(L_sum1);
9585d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        cor_x[i+1] = vo_mult(corr, sign[pos]) + (*p0++);
959ef384d17fb870ba3c196b29b858a015c76864578Marco Nelissen        corr = voround(L_sum2);
9605d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        cor_y[i+1] = vo_mult(corr, sign[pos + 1]) + (*p3++);
9615d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        pos += STEP;
9625d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
9635d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    return;
964e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
965e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
966e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard/*-------------------------------------------------------------------*
967e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Function  search_ixiy()                                           *
968e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * ~~~~~~~~~~~~~~~~~~~~~~~                                           *
969e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Find the best positions of 2 pulses in a subframe.                *
970e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *-------------------------------------------------------------------*/
971e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
972e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgardvoid search_ixiy(
9735d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 nb_pos_ix,                     /* (i) nb of pos for pulse 1 (1..8)       */
9745d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 track_x,                       /* (i) track of pulse 1                   */
9755d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 track_y,                       /* (i) track of pulse 2                   */
9765d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * ps,                          /* (i/o) correlation of all fixed pulses  */
9775d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * alp,                         /* (i/o) energy of all fixed pulses       */
9785d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * ix,                          /* (o) position of pulse 1                */
9795d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 * iy,                          /* (o) position of pulse 2                */
9805d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 dn[],                          /* (i) corr. between target and h[]       */
9815d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 dn2[],                         /* (i) vector of selected positions       */
9825d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 cor_x[],                       /* (i) corr. of pulse 1 with fixed pulses */
9835d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 cor_y[],                       /* (i) corr. of pulse 2 with fixed pulses */
9845d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        Word16 rrixiy[][MSIZE]                /* (i) corr. of pulse 1 with pulse 2   */
9855d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        )
986e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{
9875d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 x, y, pos, thres_ix;
9885d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 ps1, ps2, sq, sqk;
9895d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 alp_16, alpk;
9905d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word16 *p0, *p1, *p2;
9915d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    Word32 s, alp0, alp1, alp2;
9925d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
9935d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p0 = cor_x;
9945d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p1 = cor_y;
9955d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    p2 = rrixiy[track_x];
9965d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
9975d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    thres_ix = nb_pos_ix - NB_MAX;
9985d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
9995d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    alp0 = L_deposit_h(*alp);
10005d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    alp0 = (alp0 + 0x00008000L);       /* for rounding */
10015d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
10025d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    sqk = -1;
10035d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    alpk = 1;
10045d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
10055d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    for (x = track_x; x < L_SUBFR; x += STEP)
10065d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    {
10075d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        ps1 = *ps + dn[x];
1008a87228e3e3f42d3676ced0d38ad9913d7bef9de6Marco Nelissen        alp1 = L_add(alp0, ((*p0++)<<13));
10095d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
10105d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        if (dn2[x] < thres_ix)
10115d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
10125d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            pos = -1;
10135d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            for (y = track_y; y < L_SUBFR; y += STEP)
10145d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
10155d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                ps2 = add1(ps1, dn[y]);
10165d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
101781f8b15dd98f2bc62ee3d77211ac09a71bbc7578Eric Laurent                alp2 = L_add(alp1, ((*p1++)<<13));
101881f8b15dd98f2bc62ee3d77211ac09a71bbc7578Eric Laurent                alp2 = L_add(alp2, ((*p2++)<<14));
10195d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                alp_16 = extract_h(alp2);
10205d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                sq = vo_mult(ps2, ps2);
1021a87228e3e3f42d3676ced0d38ad9913d7bef9de6Marco Nelissen                s = L_sub(vo_L_mult(alpk, sq), L_mult(sqk, alp_16));
10225d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
10235d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                if (s > 0)
10245d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                {
10255d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                    sqk = sq;
10265d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                    alpk = alp_16;
10275d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                    pos = y;
10285d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                }
10295d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
10305d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            p1 -= NB_POS;
10315d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
10325d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            if (pos >= 0)
10335d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            {
10345d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                *ix = x;
10355d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen                *iy = pos;
10365d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            }
10375d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        } else
10385d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        {
10395d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen            p2 += NB_POS;
10405d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen        }
10415d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    }
10425d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
10435d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    *ps = add1(*ps, add1(dn[*ix], dn[*iy]));
10445d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    *alp = alpk;
10455d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen
10465d5c3a132bb446ac78a37dfaac24a46cacf0dd73Marco Nelissen    return;
1047e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard}
1048e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1049e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1050e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1051e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard
1052