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