📄 acelp_cp.c
字号:
/* Find the codeword corresponding to the selected positions */
for(i=0; i<L_SUBFR; i++) {cod[i] = 0; }
cod[ip0] = shr(i0, 2); /* From Q15 to Q13 */
cod[ip1] = shr(i1, 2);
cod[ip2] = shr(i2, 2);
cod[ip3] = shr(i3, 2);
/* find the filtered codeword */
for (i = 0; i < L_SUBFR; i++) {y[i] = 0; }
if(i0 > 0)
for(i=ip0, j=0; i<L_SUBFR; i++, j++) {
y[i] = add(y[i], h[j]); }
else
for(i=ip0, j=0; i<L_SUBFR; i++, j++) {
y[i] = sub(y[i], h[j]); }
if(i1 > 0)
for(i=ip1, j=0; i<L_SUBFR; i++, j++) {
y[i] = add(y[i], h[j]); }
else
for(i=ip1, j=0; i<L_SUBFR; i++, j++) {
y[i] = sub(y[i], h[j]); }
if(i2 > 0)
for(i=ip2, j=0; i<L_SUBFR; i++, j++) {
y[i] = add(y[i], h[j]); }
else
for(i=ip2, j=0; i<L_SUBFR; i++, j++) {
y[i] = sub(y[i], h[j]); }
if(i3 > 0)
for(i=ip3, j=0; i<L_SUBFR; i++, j++) {
y[i] = add(y[i], h[j]); }
else
for(i=ip3, j=0; i<L_SUBFR; i++, j++) {
y[i] = sub(y[i], h[j]); }
/* find codebook index; 17-bit address */
i = 0;
if(i0 > 0) i = add(i, 1);
if(i1 > 0) i = add(i, 2);
if(i2 > 0) i = add(i, 4);
if(i3 > 0) i = add(i, 8);
*sign = i;
ip0 = mult(ip0, 6554); /* ip0/5 */
ip1 = mult(ip1, 6554); /* ip1/5 */
ip2 = mult(ip2, 6554); /* ip2/5 */
i = mult(ip3, 6554); /* ip3/5 */
j = add(i, shl(i, 2)); /* j = i*5 */
j = sub(ip3, add(j, 3)); /* j= ip3%5 -3 */
ip3 = add(shl(i, 1), j);
i = add(ip0, shl(ip1, 3));
i = add(i , shl(ip2, 6));
i = add(i , shl(ip3, 9));
return i;
}
/*------------------------------------------------------------------------*
* Function D2i40_11 *
* ~~~~~~~~~ *
* Algebraic codebook for ITU 6.4 kb/s. *
* -> 11 bits; 2 pulses in a frame of 40 samples *
* *
* The code length is 40, containing 2 nonzero pulses i0, i1. *
* i0 can have 16 possible positions (positive or negative) and i1 *
* can have 32 possible positions. Thus, the two tracks are overlapping. *
* *
* i0 (+-1) : 0, 5, 10, 15, 20, 25, 30, 35 (i0,sub0) *
* 1, 6, 11, 16, 21, 26, 31, 36 (i0,sub1) *
* 2, 7, 12, 17, 22, 27, 32, 37 (i0,sub2) *
* 4, 9, 14, 19, 24, 29, 34, 39 (i0,sub3) *
* *
* i1 (+-1) : 1, 6, 11, 16, 21, 26, 31, 36 (i1,sub0) *
* 3, 8, 13, 18, 23, 28, 33, 38 (i1,sub1) *
* *
* The correlations of impulse response stored in the input parameter *
* rr[] (see Cor_h_X()) holds nine cross correlations if running in the *
* G729 mode. In this case they were stored as: *
* *
* rri0i1[], *
* rri0i2[], rri1i2[], *
* rri0i3[], rri1i3[], rri2i3[], *
* rri0i4[], rri1i4[], rri2i4[], *
* *
* In case of G729 at 6.4 kbps mode, three of the above cross *
* correlations are unnecessary for the codebook search. Two of *
* these three 64-element positions are instead used by two cross *
* correlations (RRi1i1[] and RRi3i4[]) needed only by the 6.4 *
* kbps mode. Thus, eight cross correlations has to be calculated, *
* namely the following: *
* *
* rri0i1[], *
* RRi1i1[], rri1i2[], *
* rri0i3[], rri1i3[], rri2i3[], *
* RRi3i4[], rri1i4[], (not used), *
* *
* Note that RRi1i1[] is a 64-element cross correlation, and that *
* rri1i1[] is an 8-element. *
*------------------------------------------------------------------------*/
static Word16 D2i40_11( /* (o) : Index of pulses positions. */
Word16 Dn[], /* (i) : Correlations between h[] and Xn[]. */
Word16 rr[], /* (i) : Correlations of impulse response h[]. */
Word16 h[], /* (i) : Impulse response of filters. */
Word16 code[], /* (o) : Selected algebraic codeword. */
Word16 y[], /* (o) : Filtered algebraic codeword. */
Word16 *sign /* (o) : Signs of 4 pulses. */
)
{
Word16 i0, i1, ip0, ip1, p0, p1;
Word16 i, j, index, tmp, swap;
Word16 ps0, ps1, alp, alp0;
Word32 alp1;
Word16 ps1c, psc, alpha;
Word32 L_temp;
Word16 posIndex[2], signIndex[2];
Word16 m0_bestPos, m1_bestPos;
Word16 p_sign[L_SUBFR];
Word16 *rri0i0, *rri1i1, *rri2i2, *rri3i3, *rri4i4;
Word16 *rri0i1, *RRi1i1, *rri0i3, *RRi3i4;
Word16 *rri1i2, *rri1i3, *rri1i4;
Word16 *rri2i3;
Word16 *ptr_ri0i0, *ptr_ri1i1;
Word16 *ptr_ri0i1, *ptr_Ri0i2, *ptr_ri0i3, *ptr_Ri3i4;
Word16 *ptr_ri1i2, *ptr_ri1i3, *ptr_ri1i4;
Word16 *ptr_ri2i3;
Word16 *outPtr_ri1i1; /* Outside loop pointer */
/* Init pointers */
rri0i0 = rr;
rri1i1 = rri0i0 + NB_POS;
rri2i2 = rri1i1 + NB_POS;
rri3i3 = rri2i2 + NB_POS;
rri4i4 = rri3i3 + NB_POS;
rri0i1 = rri4i4 + NB_POS;
RRi1i1 = rri0i1 + MSIZE; /* Special for 6.4 kbps */
rri0i3 = RRi1i1 + MSIZE;
RRi3i4 = rri0i3 + MSIZE; /* Special for 6.4 kbps */
rri1i2 = RRi3i4 + MSIZE;
rri1i3 = rri1i2 + MSIZE;
rri1i4 = rri1i3 + MSIZE;
rri2i3 = rri1i4 + MSIZE;
/*-----------------------------------------------------------------------*
* Chose the sign of the impulse. *
*-----------------------------------------------------------------------*/
for (i=0; i<L_SUBFR; i++)
{
if( Dn[i] >= 0)
{
p_sign[i] = 0x7fff;
}
else
{
p_sign[i] = (Word16)0x8000;
Dn[i] = negate(Dn[i]);
}
}
/*-------------------------------------------------------------------*
* Modification of rrixiy[] to take signs into account. *
*-------------------------------------------------------------------*/
ptr_ri0i1 = rri0i1;
ptr_ri0i3 = rri0i3;
for(i0=0; i0<L_SUBFR; i0+=STEP) {
for(i1=1; i1<L_SUBFR; i1+=STEP) {
*ptr_ri0i1 = mult(*ptr_ri0i1, mult(p_sign[i0], p_sign[i1]));
ptr_ri0i1++;
*ptr_ri0i3 = mult(*ptr_ri0i3, mult(p_sign[i0], p_sign[i1+2]));
ptr_ri0i3++;
}
}
ptr_ri1i2 = rri1i2;
ptr_ri1i3 = rri1i3;
ptr_ri1i4 = rri1i4;
for(i0=1; i0<L_SUBFR; i0+=STEP) {
for(i1=2; i1<L_SUBFR; i1+=STEP) {
*ptr_ri1i2 = mult(*ptr_ri1i2, mult(p_sign[i0], p_sign[i1]));
ptr_ri1i2++;
*ptr_ri1i3 = mult(*ptr_ri1i3, mult(p_sign[i0], p_sign[i1+1]));
ptr_ri1i3++;
*ptr_ri1i4 = mult(*ptr_ri1i4, mult(p_sign[i0], p_sign[i1+2]));
ptr_ri1i4++;
}
}
ptr_ri2i3 = rri2i3;
ptr_Ri3i4 = RRi3i4;
for(i0=2; i0<L_SUBFR; i0+=STEP) {
for(i1=3; i1<L_SUBFR; i1+=STEP) {
*ptr_ri2i3 = mult(*ptr_ri2i3, mult(p_sign[i0], p_sign[i1]));
ptr_ri2i3++;
*ptr_Ri3i4 = mult(*ptr_Ri3i4, mult(p_sign[i0+1], p_sign[i1+1]));
ptr_Ri3i4++;
}
}
ptr_Ri0i2 = RRi1i1;
for(i0=1; i0<L_SUBFR; i0+=STEP) {
for(i1=1; i1<L_SUBFR; i1+=STEP) {
*ptr_Ri0i2 = mult(*ptr_Ri0i2, mult(p_sign[i0], p_sign[i1]));
ptr_Ri0i2++;
}
}
/*-------------------------------------------------------------------*
* The actual search. *
*-------------------------------------------------------------------*/
ip0 = 1; /* Set to any valid pulse position */
ip1 = 0; /* Set to any valid pulse position */
psc = 0;
alpha = MAX_16;
ptr_ri0i1 = rri0i1;
outPtr_ri1i1 = rri1i1; /* Initial values for tripple loop below */
p0=0; /* Search i0,sub0 vs. i1,sub0 */
p1=1;
ptr_ri0i0 = rri0i0;
for (i = 0; i<9; i++) {
if (i == 4) i++; /* To get right exchange sequence */
swap = i & (Word16)1;
if (i == 1) p0=1; /* Search i0,sub1 vs. i1,sub0 */
else if (i == 2) { /* Search i0,sub0 vs. i1,sub1 */
outPtr_ri1i1 = rri3i3;
p0=0;
p1=3;
ptr_ri0i0 = rri0i0;
}
else if (i == 3) { /* Search i0,sub3 vs. i1,sub1 */
outPtr_ri1i1 = rri4i4;
p0=3;
p1=4;
ptr_ri0i0 = rri3i3;
}
else if (i == 5) { /* Search i0,sub2 vs. i1,sub0 */
outPtr_ri1i1 = rri2i2;
p0=1;
p1=2;
ptr_ri0i0 = rri1i1;
}
else if (i == 6) { /* Search i0,sub1 vs. i1,sub1 */
outPtr_ri1i1 = rri3i3;
p1=3;
ptr_ri0i0 = rri1i1;
}
else if (i == 7) { /* Search i0,sub3 vs. i1,sub0 */
outPtr_ri1i1 = rri4i4;
p1=4;
ptr_ri0i0 = rri1i1;
}
else if (i == 8) { /* Search i0,sub2 vs. i1,sub1 */
outPtr_ri1i1 = rri3i3;
p0=2;
p1=3;
}
for (i0 = p0; i0<40; i0+=STEP) {
ptr_ri1i1 = outPtr_ri1i1;
ps0 = Dn[i0];
alp0 = *ptr_ri0i0++;
for (i1 = p1; i1<40; i1+=STEP) {
ps1 = add(ps0, Dn[i1]);
alp1 = L_mult(alp0, 1);
alp1 = L_mac(alp1, *ptr_ri1i1++, 1);
alp1 = L_mac(alp1, *ptr_ri0i1++, 2);
alp = extract_l(L_shr(alp1, 5));
ps1c = mult(ps1, ps1);
L_temp = L_mult(ps1c, alpha);
L_temp = L_msu(L_temp, psc, alp);
if (L_temp > 0L) {
psc = ps1c;
alpha = alp;
ip0 = i1;
ip1 = i0;
if ( swap ) {
ip0 = i0;
ip1 = i1;
}
}
}
}
}
/* convert from position to table entry index */
for (i0=0; i0<16; i0++)
if (ip0 == trackTable0[i0]) break;
ip0=i0;
for (i1=0; i1<32; i1++)
if (ip1 == trackTable1[i1]) break;
ip1=i1;
m0_bestPos = trackTable0[ip0];
m1_bestPos = trackTable1[ip1];
posIndex[0] = grayEncode[ip0];
posIndex[1] = grayEncode[ip1];
if (p_sign[m0_bestPos] > 0)
signIndex[0] = 1;
else
signIndex[0] = 0;
if (p_sign[m1_bestPos] > 0)
signIndex[1] = 1;
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -