⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 acelp_cp.c

📁 ITU-T在1996年3月公布了G.729建议的8Kbit/s共轭结构代数码激励线性预测(CS-ACELP)语音编码方案
💻 C
📖 第 1 页 / 共 5 页
字号:
    
    /* 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 + -