📄 acelp_ca.c
字号:
rri3i3 = rri2i2 + NB_POS;
rri4i4 = rri3i3 + NB_POS;
rri0i1 = rri4i4 + NB_POS;
rri0i2 = rri0i1 + MSIZE;
rri0i3 = rri0i2 + MSIZE;
rri0i4 = rri0i3 + MSIZE;
rri1i2 = rri0i4 + MSIZE;
rri1i3 = rri1i2 + MSIZE;
rri1i4 = rri1i3 + MSIZE;
rri2i3 = rri1i4 + MSIZE;
rri2i4 = rri2i3 + MSIZE;
/*-----------------------------------------------------------------------*
* Chose the sign of the impulse. *
*-----------------------------------------------------------------------*/
for (i=0; i<L_SUBFR; i++)
{
if (dn[i] >= (F)0.0)
{
sign_dn[i] = (F)1.0;
sign_dn_inv[i] = (F)-1.0;
}
else
{
sign_dn[i] = (F)-1.0;
sign_dn_inv[i] = (F)1.0;
dn[i] = -dn[i];
}
}
/*-------------------------------------------------------------------*
* Modification of rrixiy[] to take signs into account. *
*-------------------------------------------------------------------*/
p0 = rri0i1;
p1 = rri0i2;
p2 = rri0i3;
p3 = rri0i4;
for(i0=0; i0<L_SUBFR; i0+=STEP)
{
psign = sign_dn;
if (psign[i0] < 0.0) psign = sign_dn_inv;
for(i1=1; i1<L_SUBFR; i1+=STEP)
{
*p0 *= psign[i1]; p0++;
*p1 *= psign[i1+1]; p1++;
*p2 *= psign[i1+2]; p2++;
*p3 *= psign[i1+3]; p3++;
}
}
p0 = rri1i2;
p1 = rri1i3;
p2 = rri1i4;
for(i1=1; i1<L_SUBFR; i1+=STEP)
{
psign = sign_dn;
if (psign[i1] < 0.0) psign = sign_dn_inv;
for(i2=2; i2<L_SUBFR; i2+=STEP)
{
*p0 *= psign[i2]; p0++;
*p1 *= psign[i2+1]; p1++;
*p2 *= psign[i2+2]; p2++;
}
}
p0 = rri2i3;
p1 = rri2i4;
for(i2=2; i2<L_SUBFR; i2+=STEP)
{
psign = sign_dn;
if (psign[i2] < 0.0) psign = sign_dn_inv;
for(i3=3; i3<L_SUBFR; i3+=STEP)
{
*p0 *= psign[i3]; p0++;
*p1 *= psign[i3+1]; p1++;
}
}
/*-------------------------------------------------------------------*
* Search the optimum positions of the four pulses which maximize *
* square(correlation) / energy *
*-------------------------------------------------------------------*/
psk = (F)-1.0;
alpk = (F)1.0;
ptr_rri0i3_i4 = rri0i3;
ptr_rri1i3_i4 = rri1i3;
ptr_rri2i3_i4 = rri2i3;
ptr_rri3i3_i4 = rri3i3;
/* search 2 times: track 3 and 4 */
for (track=3, trk=0; track<5; track++, trk++)
{
/*------------------------------------------------------------------*
* depth first search 3, phase A: track 2 and 3/4. *
*------------------------------------------------------------------*/
sq = (F)-1.0;
alp = (F)1.0;
/* i0 loop: 2 positions in track 2 */
prev_i0 = -1;
for (i=0; i<2; i++)
{
max = (F)-1.0;
/* search "dn[]" maximum position in track 2 */
for (j=2; j<L_SUBFR; j+=STEP)
{
if( ((dn[j] - max) > (F)0.0) && ((prev_i0-j) != 0) )
{
max = dn[j];
i0 = j;
}
}
prev_i0 = i0;
j = i0 / 5; /* j = i0/5 */
p0 = rri2i2 + j;
ps1 = dn[i0];
alp1 = 0.5 * *p0;
/* i1 loop: 8 positions in track 2 */
p0 = ptr_rri2i3_i4 + (j<<3);
p1 = ptr_rri3i3_i4;
for (i1=track; i1<L_SUBFR; i1+=STEP)
{
ps2 = ps1 + dn[i1];
alp2 = alp1 + *p0++ + *p1++ * (F)0.5;
sq2 = ps2 * ps2;
s = alp*sq2 - sq * alp2;
if (s > (F)0.0)
{
sq = sq2;
ps = ps2;
alp = alp2;
ix = i0;
iy = i1;
}
}
}
i0 = ix;
i1 = iy;
i1_offset = (i1/5) <<3; /* j = 8*(i1/5) */
/*------------------------------------------------------------------*
* depth first search 3, phase B: track 0 and 1. *
*------------------------------------------------------------------*/
ps0 = ps;
alp0 = alp;
sq = (F)-1.0;
alp = (F)1.0;
/* build vector for next loop to decrease complexity */
p0 = rri1i2 + i0/5;
p1 = ptr_rri1i3_i4 + i1/5;
p2 = rri1i1;
p3 = tmp_vect;
for (i3=1; i3<L_SUBFR; i3+=STEP)
{
*p3++ = *p0 + *p1 + *p2 * (F)0.5;
p0 += NB_POS; p1 += NB_POS; p2++;
}
/* i2 loop: 8 positions in track 0 */
p0 = rri0i2 + i0/5;
p1 = ptr_rri0i3_i4 + i1/5;
p2 = rri0i0;
p3 = rri0i1;
for (i2=0; i2<L_SUBFR; i2+=STEP)
{
ps1 = ps0 + dn[i2];
alp1 = alp0 + *p0 + *p1 + *p2 * (F)0.5;
p0 += NB_POS; p1 += NB_POS; p2++;
/* i3 loop: 8 positions in track 1 */
p4 = tmp_vect;
for (i3=1; i3<L_SUBFR; i3+=STEP)
{
ps2 = ps1 + dn[i3];
alp2 = alp1 + *p3++ + *p4++;
sq2 = ps2 * ps2;
s = alp*sq2 - sq * alp2;
if (s > 0.0)
{
sq = sq2;
alp = alp2;
ix = i2;
iy = i3;
}
}
}
/*----------------------------------------------------------------*
* depth first search 3: compare codevector with the best case. *
*----------------------------------------------------------------*/
s = alpk*sq - psk * alp;
if (s > (F)0.0)
{
psk = sq;
alpk = alp;
ip2 = i0;
ip3 = i1;
ip0 = ix;
ip1 = iy;
}
/*------------------------------------------------------------------*
* depth first search 4, phase A: track 3 and 0. *
*------------------------------------------------------------------*/
sq = (F)-1.0;
alp = (F)1.0;
/* i0 loop: 2 positions in track 3/4 */
prev_i0 = -1;
for (i=0; i<2; i++)
{
max = (F)-1.0;
/* search "dn[]" maximum position in track 3/4 */
for (j=track; j<L_SUBFR; j+=STEP)
{
if( ((dn[j] - max) > 0) && ((prev_i0 -j) != 0) )
{
max = dn[j];
i0 = j;
}
}
prev_i0 = i0;
j = i0/5;
p0 = ptr_rri3i3_i4 + j;
ps1 = dn[i0];
alp1 = 0.5 * *p0;
/* i1 loop: 8 positions in track 0 */
p0 = ptr_rri0i3_i4 + j;
p1 = rri0i0;
for (i1=0; i1<L_SUBFR; i1+=STEP)
{
ps2 = ps1 + dn[i1];
alp2 = alp1 + *p0 + *p1 * (F)0.5;
p0 += NB_POS;
p1++;
sq2 = ps2 * ps2;
s = alp*sq2 - sq * alp2;
if (s > (F)0.0)
{
sq = sq2;
ps = ps2;
alp = alp2;
ix = i0;
iy = i1;
}
}
}
i0 = ix;
i1 = iy;
i1_offset = (i1/5) <<3; /* j = 8*(i1/5) */
/*------------------------------------------------------------------*
* depth first search 4, phase B: track 1 and 2. *
*------------------------------------------------------------------*/
ps0 = ps;
alp0 = alp;
sq = (F)-1.0;
alp = (F)1.0;
/* build vector for next loop to decrease complexity */
p0 = ptr_rri2i3_i4 + i0/5;
p1 = rri0i2 + i1_offset;
p2 = rri2i2;
p3 = tmp_vect;
for (i3=2; i3<L_SUBFR; i3+=STEP)
{
*p3++ = *p0 + *p1 + *p2 * (F)0.5;
p0 += NB_POS; p1++; p2++;
}
/* i2 loop: 8 positions in track 1 */
p0 = ptr_rri1i3_i4 + i0/5;
p1 = rri0i1 + i1_offset;
p2 = rri1i1;
p3 = rri1i2;
for (i2=1; i2<L_SUBFR; i2+=STEP)
{
ps1 = ps0 + dn[i2];
alp1 = alp0 + *p0 + *p1 + *p2 * (F)0.5;
p0 += NB_POS; p1++; p2++;
/* i3 loop: 8 positions in track 2 */
p4 = tmp_vect;
for (i3=2; i3<L_SUBFR; i3+=STEP)
{
ps2 = ps1 + dn[i3];
alp2 = alp1 + *p3++ + *p4++;
sq2 = ps2 * ps2;
s = alp*sq2 - sq * alp2;
if (s > (F)0.0)
{
sq = sq2;
alp = alp2;
ix = i2;
iy = i3;
}
}
}
/*----------------------------------------------------------------*
* depth first search 1: compare codevector with the best case. *
*----------------------------------------------------------------*/
s = alpk*sq - psk*alp;
if (s > (F)0.0)
{
psk = sq;
alpk = alp;
ip3 = i0;
ip0 = i1;
ip1 = ix;
ip2 = iy;
}
ptr_rri0i3_i4 = rri0i4;
ptr_rri1i3_i4 = rri1i4;
ptr_rri2i3_i4 = rri2i4;
ptr_rri3i3_i4 = rri4i4;
}
/* Set the sign of impulses */
i0 = (int)sign_dn[ip0];
i1 = (int)sign_dn[ip1];
i2 = (int)sign_dn[ip2];
i3 = (int)sign_dn[ip3];
/* Find the codeword corresponding to the selected positions */
for(i=0; i<L_SUBFR; i++) {
cod[i] = (F)0.0;
}
cod[ip0] = (F)i0;
cod[ip1] = (F)i1;
cod[ip2] = (F)i2;
cod[ip3] = (F)i3;
/* find the filtered codeword */
for (i = 0; i < ip0; i++) y[i] = (F)0.0;
if(i0 > 0)
for(i=ip0, j=0; i<L_SUBFR; i++, j++) y[i] = h[j];
else
for(i=ip0, j=0; i<L_SUBFR; i++, j++) y[i] = -h[j];
if(i1 > 0)
for(i=ip1, j=0; i<L_SUBFR; i++, j++) y[i] = y[i] + h[j];
else
for(i=ip1, j=0; i<L_SUBFR; i++, j++) y[i] = y[i] - h[j];
if(i2 > 0)
for(i=ip2, j=0; i<L_SUBFR; i++, j++) y[i] = y[i] + h[j];
else
for(i=ip2, j=0; i<L_SUBFR; i++, j++) y[i] = y[i] - h[j];
if(i3 > 0)
for(i=ip3, j=0; i<L_SUBFR; i++, j++) y[i] = y[i] + h[j];
else
for(i=ip3, j=0; i<L_SUBFR; i++, j++) y[i] = y[i] - h[j];
/* find codebook index; 17-bit address */
i = 0;
if(i0 > 0) i += 1;
if(i1 > 0) i += 2;
if(i2 > 0) i += 4;
if(i3 > 0) i += 8;
*sign = i;
ip0 = ip0/5;
ip1 = ip1/5;
ip2 = ip2/5;
i = ip3/5;
j = i*5;
j = ip3 -j -3;
ip3 = i*2+j;
i = ip0 + (ip1<<3)+ (ip2<<6)+ (ip3<<9);
return i;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -