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