📄 acelp_co.c
字号:
}
/*---------------------------------------------------------------------*
* Compute elements of: rri2i4[], rri1i3[], rri0i2[], rri1i4[], rri0i3 *
*---------------------------------------------------------------------*/
ptr_hd = h; move16();
ptr_hf = ptr_hd + 2; move16();
l_fin_sup = MSIZE-1; move16();
l_fin_inf = l_fin_sup-(Word16)1; move16();
for(k=0; k<NB_POS; k++) {
p4 = rri2i4 + l_fin_sup; move16();
p3 = rri1i3 + l_fin_sup; move16();
p2 = rri0i2 + l_fin_sup; move16();
p1 = rri1i4 + l_fin_inf; move16();
p0 = rri0i3 + l_fin_inf; move16();
cor = 0; move32();
ptr_h1 = ptr_hd; move16();
ptr_h2 = ptr_hf; move16();
for(i=k+(Word16)1; i<NB_POS; i++ ) {
cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
*p4 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
*p3 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
*p2 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
*p1 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
*p0 = extract_h(cor); move16();
p4 -= ldec; move16();
p3 -= ldec; move16();
p2 -= ldec; move16();
p1 -= ldec; move16();
p0 -= ldec; move16();
}
cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
*p4 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
*p3 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
*p2 = extract_h(cor); move16();
l_fin_sup -= NB_POS; move16();
l_fin_inf--; move16();
ptr_hf += STEP; move16();
}
/*----------------------------------------------------------------------*
* Compute elements of: rri1i4[], rri0i3[], rri2i4[], rri1i3[], rri0i2 *
*----------------------------------------------------------------------*/
ptr_hd = h; move16();
ptr_hf = ptr_hd + 3; move16();
l_fin_sup = MSIZE-1; move16();
l_fin_inf = l_fin_sup-(Word16)1; move16();
for(k=0; k<NB_POS; k++) {
p4 = rri1i4 + l_fin_sup; move16();
p3 = rri0i3 + l_fin_sup; move16();
p2 = rri2i4 + l_fin_inf; move16();
p1 = rri1i3 + l_fin_inf; move16();
p0 = rri0i2 + l_fin_inf; move16();
ptr_h1 = ptr_hd; move16();
ptr_h2 = ptr_hf; move16();
cor = 0; move32();
for(i=k+(Word16)1; i<NB_POS; i++ ) {
cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
*p4 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
*p3 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
*p2 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
*p1 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
*p0 = extract_h(cor); move16();
p4 -= ldec; move16();
p3 -= ldec; move16();
p2 -= ldec; move16();
p1 -= ldec; move16();
p0 -= ldec; move16();
}
cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
*p4 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
*p3 = extract_h(cor); move16();
l_fin_sup -= NB_POS; move16();
l_fin_inf--; move16();
ptr_hf += STEP; move16();
}
/*----------------------------------------------------------------------*
* Compute elements of: rri0i4[], rri2i3[], rri1i2[], rri0i1[] *
*----------------------------------------------------------------------*/
ptr_hd = h; move16();
ptr_hf = ptr_hd + 4; move16();
l_fin_sup = MSIZE-1; move16();
l_fin_inf = l_fin_sup-(Word16)1; move16();
for(k=0; k<NB_POS; k++) {
p3 = rri0i4 + l_fin_sup; move16();
p2 = rri2i3 + l_fin_inf; move16();
p1 = rri1i2 + l_fin_inf; move16();
p0 = rri0i1 + l_fin_inf; move16();
ptr_h1 = ptr_hd; move16();
ptr_h2 = ptr_hf; move16();
cor = 0; move32();
for(i=k+(Word16)1; i<NB_POS; i++ ) {
cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
*p3 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
*p2 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
*p1 = extract_h(cor); move16();
cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
*p0 = extract_h(cor); move16();
p3 -= ldec; move16();
p2 -= ldec; move16();
p1 -= ldec; move16();
p0 -= ldec; move16();
}
cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
*p3 = extract_h(cor); move16();
l_fin_sup -= NB_POS; move16();
l_fin_inf--; move16();
ptr_hf += STEP; move16();
}
return;
}
/*------------------------------------------------------------------------*
* Function D4i40_17 *
* ~~~~~~~~~ *
* Algebraic codebook for ITU 8kb/s. *
* -> 17 bits; 4 pulses in a frame of 40 samples *
* *
*------------------------------------------------------------------------*
* The code length is 40, containing 4 nonzero pulses i0, i1, i2, i3. *
* Each pulses can have 8 possible positions (positive or negative) *
* except i3 that have 16 possible positions. *
* *
* i0 (+-1) : 0, 5, 10, 15, 20, 25, 30, 35 *
* i1 (+-1) : 1, 6, 11, 16, 21, 26, 31, 36 *
* i2 (+-1) : 2, 7, 12, 17, 22, 27, 32, 37 *
* i3 (+-1) : 3, 8, 13, 18, 23, 28, 33, 38 *
* 4, 9, 14, 19, 24, 29, 34, 39 *
*------------------------------------------------------------------------*/
static Word16 extra;
static Word16 D4i40_17( /* (o) : Index of pulses positions. */
Word16 Dn[], /* (i) : Correlations between h[] and Xn[]. */
Word16 rr[], /* (i) : Correlations of impulse response h[]. */
Word16 h[], /* (i) Q12: Impulse response of filters. */
Word16 cod[], /* (o) Q13: Selected algebraic codeword. */
Word16 y[], /* (o) Q12: Filtered algebraic codeword. */
Word16 *sign, /* (o) : Signs of 4 pulses. */
Word16 i_subfr /* (i) : subframe flag */
)
{
Word16 i0, i1, i2, i3, ip0, ip1, ip2, ip3;
Word16 i, j, time;
Word16 ps0, ps1, ps2, ps3, alp, alp0;
Word32 alp1, alp2, alp3, L32;
Word16 ps3c, psc, alpha;
Word16 average, max0, max1, max2, thres;
Word32 L_temp;
Word16 *rri0i0, *rri1i1, *rri2i2, *rri3i3, *rri4i4;
Word16 *rri0i1, *rri0i2, *rri0i3, *rri0i4;
Word16 *rri1i2, *rri1i3, *rri1i4;
Word16 *rri2i3, *rri2i4;
Word16 *ptr_ri0i0, *ptr_ri1i1, *ptr_ri2i2, *ptr_ri3i3, *ptr_ri4i4;
Word16 *ptr_ri0i1, *ptr_ri0i2, *ptr_ri0i3, *ptr_ri0i4;
Word16 *ptr_ri1i2, *ptr_ri1i3, *ptr_ri1i4;
Word16 *ptr_ri2i3, *ptr_ri2i4;
Word16 p_sign[L_SUBFR];
/* Init pointers */
rri0i0 = rr; move16();
rri1i1 = rri0i0 + NB_POS; move16();
rri2i2 = rri1i1 + NB_POS; move16();
rri3i3 = rri2i2 + NB_POS; move16();
rri4i4 = rri3i3 + NB_POS; move16();
rri0i1 = rri4i4 + NB_POS; move16();
rri0i2 = rri0i1 + MSIZE; move16();
rri0i3 = rri0i2 + MSIZE; move16();
rri0i4 = rri0i3 + MSIZE; move16();
rri1i2 = rri0i4 + MSIZE; move16();
rri1i3 = rri1i2 + MSIZE; move16();
rri1i4 = rri1i3 + MSIZE; move16();
rri2i3 = rri1i4 + MSIZE; move16();
rri2i4 = rri2i3 + MSIZE; move16();
/*-----------------------------------------------------------------------*
* Reset max_time for 1st subframe. *
*-----------------------------------------------------------------------*/
test();
if (i_subfr == 0){ extra = 30; move16();}
/*-----------------------------------------------------------------------*
* Chose the sign of the impulse. *
*-----------------------------------------------------------------------*/
for (i=0; i<L_SUBFR; i++)
{
test();
if( Dn[i] >= 0)
{
p_sign[i] = 0x7fff; move16();
}
else
{
p_sign[i] = (Word16)0x8000; move16();
Dn[i] = negate(Dn[i]); move16();
}
}
/*-------------------------------------------------------------------*
* - Compute the search threshold after three pulses *
*-------------------------------------------------------------------*/
/* Find maximum of Dn[i0]+Dn[i1]+Dn[i2] */
max0 = Dn[0]; move16();
max1 = Dn[1]; move16();
max2 = Dn[2]; move16();
for (i = 5; i < L_SUBFR; i+=STEP)
{
if (sub(Dn[i] , max0) > 0){ max0 = Dn[i]; move16();}
if (sub(Dn[i+1], max1) > 0){ max1 = Dn[i+1]; move16();}
if (sub(Dn[i+2], max2) > 0){ max2 = Dn[i+2]; move16();}
test(); test(); test();
}
max0 = add(max0, max1);
max0 = add(max0, max2);
/* Find average of Dn[i0]+Dn[i1]+Dn[i2] */
L32 = 0; move32();
for (i = 0; i < L_SUBFR; i+=STEP)
{
L32 = L_mac(L32, Dn[i], 1);
L32 = L_mac(L32, Dn[i+1], 1);
L32 = L_mac(L32, Dn[i+2], 1);
}
average =extract_l( L_shr(L32, 4)); /* 1/8 of sum */
/* thres = average + (max0-average)*THRESHOLD; */
thres = sub(max0, average);
thres = mult(thres, THRESHOLDFCB);
thres = add(thres, average);
/*-------------------------------------------------------------------*
* Modification of rrixiy[] to take signs into account. *
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -