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* * 20e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard* 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( 48e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 dn[], /* (i) <12b : correlation between target x[] and H[] */ 49e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 cn[], /* (i) <12b : residual after long term prediction */ 50e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 H[], /* (i) Q12: impulse response of weighted synthesis filter */ 51e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 code[], /* (o) Q9 : algebraic (fixed) codebook excitation */ 52e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 y[], /* (o) Q9 : filtered fixed codebook excitation */ 53e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 * index /* (o) : index (12): 5+1+5+1 = 11 bits. */ 54e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ) 55e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard{ 56e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 i, j, k, i0, i1, ix, iy, pos, pos2; 57e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 ps, psk, ps1, ps2, alpk, alp1, alp2, sq; 58e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 alp, val, exp, k_cn, k_dn; 59e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 *p0, *p1, *p2, *psign; 60e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf; 61e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 62e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 sign[L_SUBFR], vec[L_SUBFR], dn2[L_SUBFR]; 63e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 h_buf[4 * L_SUBFR] = {0}; 64e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 rrixix[NB_TRACK][NB_POS]; 65e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word16 rrixiy[MSIZE]; 66e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Word32 s, cor; 67e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 68e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /*----------------------------------------------------------------* 69e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Find sign for each pulse position. * 70e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *----------------------------------------------------------------*/ 71e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard alp = 8192; /* alp = 2.0 (Q12) */ 72e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 73e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* calculate energy for normalization of cn[] and dn[] */ 74e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* set k_cn = 32..32767 (ener_cn = 2^30..256-0) */ 75e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT /* asm optimization branch */ 76e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard s = Dot_product12_asm(cn, cn, L_SUBFR, &exp); 77e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else 78e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard s = Dot_product12(cn, cn, L_SUBFR, &exp); 79e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 80e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 81e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Isqrt_n(&s, &exp); 82b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard s = L_shl(s, add1(exp, 5)); 83e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard k_cn = vo_round(s); 84e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 85e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* set k_dn = 32..512 (ener_dn = 2^30..2^22) */ 86e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#ifdef ASM_OPT /* asm optimization branch */ 87e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard s = Dot_product12_asm(dn, dn, L_SUBFR, &exp); 88e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#else 89e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard s = Dot_product12(dn, dn, L_SUBFR, &exp); 90e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard#endif 91e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 92e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard Isqrt_n(&s, &exp); 93e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard k_dn = vo_round(L_shl(s, (exp + 8))); /* k_dn = 256..4096 */ 94e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard k_dn = vo_mult_r(alp, k_dn); /* alp in Q12 */ 95e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 96e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* mix normalized cn[] and dn[] */ 97e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard p0 = cn; 98e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard p1 = dn; 99e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard p2 = dn2; 100e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 101e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < L_SUBFR/4; i++) 102e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 103e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard s = (k_cn* (*p0++))+(k_dn * (*p1++)); 104e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *p2++ = s >> 7; 105e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard s = (k_cn* (*p0++))+(k_dn * (*p1++)); 106e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *p2++ = s >> 7; 107e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard s = (k_cn* (*p0++))+(k_dn * (*p1++)); 108e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *p2++ = s >> 7; 109e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard s = (k_cn* (*p0++))+(k_dn * (*p1++)); 110b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard *p2++ = s >> 7; 111e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 112e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 113e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* set sign according to dn2[] = k_cn*cn[] + k_dn*dn[] */ 114e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < L_SUBFR; i ++) 115e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 116b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard val = dn[i]; 117b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard ps = dn2[i]; 118e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (ps >= 0) 119e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 120e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard sign[i] = 32767; /* sign = +1 (Q12) */ 121b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard vec[i] = -32768; 122e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } else 123e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 124e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard sign[i] = -32768; /* sign = -1 (Q12) */ 125b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard vec[i] = 32767; 126e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard dn[i] = -val; 127e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 128e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 129e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /*------------------------------------------------------------* 130e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Compute h_inv[i]. * 131e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *------------------------------------------------------------*/ 132e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* impulse response buffer for fast computation */ 133b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard h = h_buf + L_SUBFR; 134b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard h_inv = h + (L_SUBFR<<1); 135e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 136e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < L_SUBFR; i++) 137e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 138b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard h[i] = H[i]; 139b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard h_inv[i] = vo_negate(h[i]); 140e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 141e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 142e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /*------------------------------------------------------------* 143e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Compute rrixix[][] needed for the codebook search. * 144e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Result is multiplied by 0.5 * 145e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *------------------------------------------------------------*/ 146e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /* Init pointers to last position of rrixix[] */ 147b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard p0 = &rrixix[0][NB_POS - 1]; 148b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard p1 = &rrixix[1][NB_POS - 1]; 149e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 150b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard ptr_h1 = h; 151e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard cor = 0x00010000L; /* for rounding */ 152e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < NB_POS; i++) 153e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 154e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard cor += ((*ptr_h1) * (*ptr_h1) << 1); 155e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ptr_h1++; 156b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard *p1-- = (extract_h(cor) >> 1); 157e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard cor += ((*ptr_h1) * (*ptr_h1) << 1); 158e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ptr_h1++; 159b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard *p0-- = (extract_h(cor) >> 1); 160e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 161e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 162e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /*------------------------------------------------------------* 163e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Compute rrixiy[][] needed for the codebook search. * 164e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *------------------------------------------------------------*/ 165b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard pos = MSIZE - 1; 166b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard pos2 = MSIZE - 2; 167b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard ptr_hf = h + 1; 168e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 169e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (k = 0; k < NB_POS; k++) 170e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 171b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard p1 = &rrixiy[pos]; 172b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard p0 = &rrixiy[pos2]; 173e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard cor = 0x00008000L; /* for rounding */ 174b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard ptr_h1 = h; 175b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard ptr_h2 = ptr_hf; 176e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 177e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = (k + 1); i < NB_POS; i++) 178e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 179e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard cor += ((*ptr_h1) * (*ptr_h2))<<1; 180e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ptr_h1++; 181e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ptr_h2++; 182b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard *p1 = extract_h(cor); 183e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard cor += ((*ptr_h1) * (*ptr_h2))<<1; 184e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ptr_h1++; 185e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ptr_h2++; 186b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard *p0 = extract_h(cor); 187e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 188e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard p1 -= (NB_POS + 1); 189e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard p0 -= (NB_POS + 1); 190e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 191e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard cor += ((*ptr_h1) * (*ptr_h2))<<1; 192e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ptr_h1++; 193e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ptr_h2++; 194b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard *p1 = extract_h(cor); 195e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 196e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pos -= NB_POS; 197e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard pos2--; 198e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ptr_hf += STEP; 199e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 200e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 201e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /*------------------------------------------------------------* 202e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Modification of rrixiy[][] to take signs into account. * 203e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *------------------------------------------------------------*/ 204b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard p0 = rrixiy; 205e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < L_SUBFR; i += STEP) 206e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 207b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard psign = sign; 208e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (psign[i] < 0) 209e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 210b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard psign = vec; 211e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 212e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (j = 1; j < L_SUBFR; j += STEP) 213e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 214b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard *p0 = vo_mult(*p0, psign[j]); 215e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard p0++; 216e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 217e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 218e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /*-------------------------------------------------------------------* 219e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * search 2 pulses: * 220e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * ~@~~~~~~~~~~~~~~ * 221e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * 32 pos x 32 pos = 1024 tests (all combinaisons is tested) * 222e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *-------------------------------------------------------------------*/ 223b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard p0 = rrixix[0]; 224b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard p1 = rrixix[1]; 225b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard p2 = rrixiy; 226e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 227b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard psk = -1; 228b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard alpk = 1; 229b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard ix = 0; 230b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard iy = 1; 231e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 232e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i0 = 0; i0 < L_SUBFR; i0 += STEP) 233e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 234b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard ps1 = dn[i0]; 235b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard alp1 = (*p0++); 236b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard pos = -1; 237e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i1 = 1; i1 < L_SUBFR; i1 += STEP) 238e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 239e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard ps2 = add1(ps1, dn[i1]); 240e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard alp2 = add1(alp1, add1(*p1++, *p2++)); 241e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard sq = vo_mult(ps2, ps2); 242e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard s = vo_L_mult(alpk, sq) - ((psk * alp2)<<1); 243e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (s > 0) 244e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 245b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard psk = sq; 246b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard alpk = alp2; 247b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard pos = i1; 248e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 249e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 250e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard p1 -= NB_POS; 251e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (pos >= 0) 252e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 253b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard ix = i0; 254b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard iy = pos; 255e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 256e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 257e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard /*-------------------------------------------------------------------* 258e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard * Build the codeword, the filtered codeword and index of codevector.* 259e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard *-------------------------------------------------------------------*/ 260e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 261e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < L_SUBFR; i++) 262e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 263b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard code[i] = 0; 264e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 265e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 266e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard i0 = (ix >> 1); /* pos of pulse 1 (0..31) */ 267e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard i1 = (iy >> 1); /* pos of pulse 2 (0..31) */ 268e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (sign[ix] > 0) 269e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 270e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard code[ix] = 512; /* codeword in Q9 format */ 271b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard p0 = h - ix; 272e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } else 273e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 274b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard code[ix] = -512; 275b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard i0 += NB_POS; 276b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard p0 = h_inv - ix; 277e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 278e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard if (sign[iy] > 0) 279e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 280b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard code[iy] = 512; 281b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard p1 = h - iy; 282e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } else 283e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 284b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard code[iy] = -512; 285b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard i1 += NB_POS; 286b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard p1 = h_inv - iy; 287e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 288b676a05348e4c516fa8b57e33b10548e6142c3f8Mans Rullgard *index = add1((i0 << 6), i1); 289e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard for (i = 0; i < L_SUBFR; i++) 290e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard { 291e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard y[i] = vo_shr_r(add1((*p0++), (*p1++)), 3); 292e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard } 293e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard return; 294e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard} 295e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 296e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 297e2e838afcf03e603a41a0455846eaf9614537c16Mans Rullgard 298