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

📄 acelp_cp.c

📁 语音压缩编码中的g729p编码程序
💻 C
📖 第 1 页 / 共 5 页
字号:
            }
        }
        ptr1++;
    }
    
    /* m0 -> i1 m1 -> i1 (sub 0 vs sub 3) */
    m0 = 1;
    ptr1 = rri1i1;
    ptr3 = rri0i2;
    for (pulse0=0; pulse0<posSearched[0]; pulse0+=2, m0+=STEP) {
        m1 = 1;
        ptr2 = rri1i1;
        C0=dn[m0];
        for (pulse1=24; pulse1<posSearched[1]; pulse1++, m1+=STEP) {
            C = C0;
            E = *ptr1;
            C += dn[m1];
            Csq = C*C;
            E += *ptr2++;
            E += (F)2.0 * *ptr3++;
            if ( (Csq*E_best) > (E*Csq_best) ) {
                E_best = E;
                Csq_best = Csq;
                m0_bestIndex=pulse0;
                m1_bestIndex=pulse1;
            }
        }
        ptr1++;
    }
    
    /* m0 -> i3 m1 -> i0 (sub 1 vs sub 0) */
    m1 = 0;
    ptr1 = rri0i0;
    ptr3 = rri0i3;
    for (pulse1=0; pulse1<24; pulse1+=3, m1+=STEP) {
        m0 = 3;
        ptr2 = rri3i3;
        C0 = dn[m1];
        for (pulse0=1; pulse0<16; pulse0+=2, m0+=STEP) {
            C = C0;
            E = *ptr1;
            C += dn[m0];
            Csq = C*C;
            E += *ptr2++;
            E += (F)2.0 * *ptr3++;
            if ( (Csq*E_best) > (E*Csq_best) ) {
                E_best = E;
                Csq_best = Csq;
                m0_bestIndex=pulse0;
                m1_bestIndex=pulse1;
            }
        }
        ptr1++;
    }

    /* m0 -> i3 m1 -> i2 (sub 1 vs sub 1) */
    m1 = 2;
    ptr1 = rri2i2;
    ptr3 = rri2i3;
    for (pulse1=1; pulse1<24; pulse1+=3, m1+=STEP) {
        m0 = 3;
        ptr2 = rri3i3;
        C0 = dn[m1];
        for (pulse0=1; pulse0<16; pulse0+=2, m0+=STEP) {
            C = C0;
            E = *ptr1;
            C += dn[m0];
            Csq = C*C;
            E += *ptr2++;
            E += (F)2.0 * *ptr3++;
            if ( (Csq*E_best) > (E*Csq_best) ) {
                E_best = E;
                Csq_best = Csq;
                m0_bestIndex=pulse0;
                m1_bestIndex=pulse1;
            }
        }
        ptr1++;
    }
    
    /* m0 -> i3 m1 -> i4 (sub 1 vs sub 2) rri0i4 contains rri3i4 */
    m0 = 3;
    ptr1 = rri3i3;
    ptr3 = rri0i4;
    for (pulse0=1; pulse0<posSearched[0]; pulse0+=2, m0+=STEP) {
        m1 = 4;
        ptr2 = rri4i4;
        C0 = dn[m0];
        for (pulse1=2; pulse1<24; pulse1+=3, m1+=STEP) {
            C = C0;
            E = *ptr1;
            C += dn[m1];
            Csq = C*C;
            E += *ptr2++;
            E += (F)2.0 * *ptr3++;
            if ( (Csq*E_best) > (E*Csq_best) ) {
                E_best = E;
                Csq_best = Csq;
                m0_bestIndex=pulse0;
                m1_bestIndex=pulse1;
            }
        }
        ptr1++;
    }
    
    /* m0 -> i3 m1 -> i1 (sub 1 vs sub 3) */
    m1 = 1;
    ptr1 = rri1i1;
    ptr3 = rri1i3;
    for (pulse1=24; pulse1<32; pulse1++, m1+=STEP) {
        m0 = 3;
        ptr2 = rri3i3;
        C0 = dn[m1];
        for (pulse0=1; pulse0<16; pulse0+=2, m0+=STEP) {
            C = C0;
            E = *ptr1;
            C += dn[m0];
            Csq = C*C;
            E += *ptr2++;
            E += (F)2.0 * *ptr3++;
            if ( (Csq*E_best) > (E*Csq_best) ) {
                E_best = E;
                Csq_best = Csq;
                m0_bestIndex=pulse0;
                m1_bestIndex=pulse1;
            }
        }
        ptr1++;
    }
    
    m0_bestPos = trackTable0[m0_bestIndex];
    m1_bestPos = trackTable1[m1_bestIndex];
    
    posIndex[0] = grayEncode[m0_bestIndex];
    posIndex[1] = grayEncode[m1_bestIndex];

    signIndex[0] = ( p_sign[m0_bestPos] > 0);
    signIndex[1] = ( p_sign[m1_bestPos] > 0);

    /* build innovation vector */
    for (i = 0; i < L_SUBFR; i++) code[i] = (F)0.0;
    code[m0_bestPos] = (FLOAT)p_sign[m0_bestPos];
    code[m1_bestPos] += (FLOAT)p_sign[m1_bestPos];
    
    *sign = signIndex[0] + 2*signIndex[1];
    index = posIndex[0] + 16*posIndex[1];
    
    /* compute filtered cbInnovation */
    for (i = 0; i < L_SUBFR; i++) y[i] = (F)0.0;
    
    if(signIndex[0] == 1) {
        for(i=m0_bestPos, j=0; i<L_SUBFR; i++, j++) y[i] = h[j];
    }
    else {
        for(i=m0_bestPos, j=0; i<L_SUBFR; i++, j++) y[i] = -h[j];
    }           
    if(signIndex[1] == 1) {
        for(i=m1_bestPos, j=0; i<L_SUBFR; i++, j++) y[i] = y[i] + h[j];
    }
    else {
        for(i=m1_bestPos, j=0; i<L_SUBFR; i++, j++) y[i] = y[i] - h[j];
    }
                
    if(t0 < L_SUBFR) {
        for (i = t0; i < L_SUBFR; i++)
            code[i] += pitch_sharp * code[i-t0];
    }
    return index;
}

/*--------------------------------------------------------------------------*
*  Function  cor_h()                                                       *
*  ~~~~~~~~~~~~~~~~~                                                       *
* Compute  correlations of h[]  needed for the codebook search.            *
*--------------------------------------------------------------------------*/

static void cor_h_cp(
                     FLOAT *h,      /* (i) :Impulse response of filters */
                     FLOAT *rr,     /* (o) :Correlations of H[]         */
                     int   rate
                     )
{
    FLOAT *rri0i0, *rri1i1, *rri2i2, *rri3i3, *rri4i4;
    FLOAT *rri0i1, *rri0i2, *rri0i3, *rri0i4;
    FLOAT *rri1i2, *rri1i3, *rri1i4;
    FLOAT *rri2i3, *rri2i4;
    
    FLOAT *p0, *p1, *p2, *p3, *p4;
    
    FLOAT *ptr_hd, *ptr_hf, *ptr_h1, *ptr_h2;
    FLOAT cor;
    int i, k, ldec, l_fin_sup, l_fin_inf;
    int lsym;
    
    /* Init pointers */
    rri0i0 = rr;
    rri1i1 = rri0i0 + NB_POS;
    rri2i2 = rri1i1 + NB_POS;
    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;
    
    /*------------------------------------------------------------*
    * Compute rri0i0[], rri1i1[], rri2i2[], rri3i3 and rri4i4[]  *
    *------------------------------------------------------------*/
    
    p0 = rri0i0 + NB_POS-1;   /* Init pointers to last position of rrixix[] */
    p1 = rri1i1 + NB_POS-1;
    p2 = rri2i2 + NB_POS-1;
    p3 = rri3i3 + NB_POS-1;
    p4 = rri4i4 + NB_POS-1;
    
    ptr_h1 = h;
    cor    = (F)0.0;
    for(i=0;  i<NB_POS; i++)
    {
        cor += *ptr_h1 * *ptr_h1; ptr_h1++;
        *p4-- = cor;
        
        cor += *ptr_h1 * *ptr_h1; ptr_h1++;
        *p3-- = cor;
        
        cor += *ptr_h1 * *ptr_h1; ptr_h1++;
        *p2-- = cor;
        
        cor += *ptr_h1 * *ptr_h1; ptr_h1++;
        *p1-- = cor;
        
        cor += *ptr_h1 * *ptr_h1; ptr_h1++;
        *p0-- = cor;
    }
    
    /*-----------------------------------------------------------------*
    * Compute elements of: rri2i3[], rri1i2[], rri0i1[] and rri0i4[]  *
    *-----------------------------------------------------------------*/
    
    l_fin_sup = MSIZE-1;
    l_fin_inf = l_fin_sup-1;
    ldec = NB_POS+1;
    
    ptr_hd = h;
    ptr_hf = ptr_hd + 1;
    
    for(k=0; k<NB_POS; k++) {
        
        p4=rri0i4+l_fin_sup;
        p3 = rri2i3 + l_fin_sup;
        p2 = rri1i2 + l_fin_sup;
        p1 = rri0i1 + l_fin_sup;
        p0 = rri0i4 + l_fin_inf;
        cor = (F)0.0;
        ptr_h1 = ptr_hd;
        ptr_h2 =  ptr_hf;
        
        for(i=k+1; i<NB_POS; i++ ) {
            
            cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++;
            if (rate == G729D) *p4=cor;           
            cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++;
            *p3 = cor;
            
            cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++;
            *p2 = cor;
            
            cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++;
            *p1 = cor;
            
            cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++;
            if (rate == G729) *p0 = cor;
            
            p4-=ldec;                                  
            p3 -= ldec;
            p2 -= ldec;
            p1 -= ldec;
            p0 -= ldec;
        }
        cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++;
        if (rate == G729D) *p4=cor;
        cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++;
        *p3 = cor;
        
        cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++;
        *p2 = cor;
        
        cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++;
        *p1 = cor;
        
        l_fin_sup -= NB_POS;
        l_fin_inf--;
        ptr_hf += STEP;
    }
    
    /*---------------------------------------------------------------------*
    * Compute elements of: rri2i4[], rri1i3[], rri0i2[], rri1i4[], rri0i3 *
    *---------------------------------------------------------------------*/
    
    ptr_hd = h;
    ptr_hf = ptr_hd + 2;
    l_fin_sup = MSIZE-1;
    l_fin_inf = l_fin_sup-1;
    for(k=0; k<NB_POS; k++) {
        
        p4 = rri2i4 + l_fin_sup;
        p3 = rri1i3 + l_fin_sup;
        p2 = rri0i2 + l_fin_sup;
        p1 = rri1i4 + l_fin_inf;
        p0 = rri0i3 + l_fin_inf;
        
        cor = (F)0.0;
        ptr_h1 = ptr_hd;
        ptr_h2 =  ptr_hf;
        for(i=k+1; i<NB_POS; i++ ) {
            
            cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++;
            *p4 = cor;
            
            cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++;
            *p3 = cor;
            
            cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++;
            *p2 = cor;
            
            cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++;
            *p1 = cor;
            
            cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++;
            *p0 = cor;
            
            p4 -= ldec;
            p3 -= ldec;
            p2 -= ldec;
            p1 -= ldec;
            p0 -= ldec;
        }
        cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++;
        *p4 = cor;
        
        cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++;
        *p3 = cor;
        
        cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++;
        *p2 = cor;
        
        l_fin_sup -= NB_POS;
        l_fin_inf--;
        ptr_hf += STEP;
    }
    
    /*----------------------------------------------------------------------*
    * Compute elements of: rri1i4[], rri0i3[], rri2i4[], rri1i3[], rri0i2  *
    *----------------------------------------------------------------------*/
    
    ptr_hd = h;
    ptr_hf = ptr_hd + 3;
    l_fin_sup = MSIZE-1;
    l_fin_inf = l_fin_sup-1;
    for(k=0; k<NB_POS; k++) {
        
        p4 = rri1i4 + l_fin_sup;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -