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

📄 acelp_cp.c

📁 ITU-T在1996年3月公布了G.729建议的8Kbit/s共轭结构代数码激励线性预测(CS-ACELP)语音编码方案
💻 C
📖 第 1 页 / 共 5 页
字号:
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;
    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;
    
    /*-----------------------------------------------------------------------*
    * Reset max_time for 1st subframe.                                      *
    *-----------------------------------------------------------------------*/
    
    if (i_subfr == 0){ extra = 30; }
    
    /*-----------------------------------------------------------------------*
    * 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]);
        }
    }
    
    /*-------------------------------------------------------------------*
    * - Compute the search threshold after three pulses                 *
    *-------------------------------------------------------------------*/
    
    /* Find maximum of Dn[i0]+Dn[i1]+Dn[i2] */
    
    max0 = Dn[0];
    max1 = Dn[1];
    max2 = Dn[2];
    
    for (i = 5; i < L_SUBFR; i+=STEP)
    {
        if (sub(Dn[i]  , max0) > 0){ max0 = Dn[i];   }
        if (sub(Dn[i+1], max1) > 0){ max1 = Dn[i+1]; }
        if (sub(Dn[i+2], max2) > 0){ max2 = Dn[i+2]; }
    }
    max0 = add(max0, max1);
    max0 = add(max0, max2);
    
    /* Find average of Dn[i0]+Dn[i1]+Dn[i2] */
    
    L32 = 0;
    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)*THRESHFCB; */
    
    thres = sub(max0, average);
    thres = mult(thres, THRESHFCB);
    thres = add(thres, average);
    
    /*-------------------------------------------------------------------*
    * Modification of rrixiy[] to take signs into account.              *
    *-------------------------------------------------------------------*/
    
    ptr_ri0i1 = rri0i1;
    ptr_ri0i2 = rri0i2;
    ptr_ri0i3 = rri0i3;
    ptr_ri0i4 = rri0i4;
    
    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_ri0i2 = mult(*ptr_ri0i2, mult(p_sign[i0], p_sign[i1+1]));
            ptr_ri0i2++;
            *ptr_ri0i3 = mult(*ptr_ri0i3, mult(p_sign[i0], p_sign[i1+2]));
            ptr_ri0i3++;
            *ptr_ri0i4 = mult(*ptr_ri0i4, mult(p_sign[i0], p_sign[i1+3]));
            ptr_ri0i4++;
            
        }
    }
    
    ptr_ri1i2 = rri1i2;
    ptr_ri1i3 = rri1i3;
    ptr_ri1i4 = rri1i4;
    
    for(i1=1; i1<L_SUBFR; i1+=STEP)
    {
        for(i2=2; i2<L_SUBFR; i2+=STEP)
        {
            *ptr_ri1i2 = mult(*ptr_ri1i2, mult(p_sign[i1], p_sign[i2]));
            ptr_ri1i2++;
            *ptr_ri1i3 = mult(*ptr_ri1i3, mult(p_sign[i1], p_sign[i2+1]));
            ptr_ri1i3++;
            *ptr_ri1i4 = mult(*ptr_ri1i4, mult(p_sign[i1], p_sign[i2+2]));
            ptr_ri1i4++;
            
        }
    }
    
    ptr_ri2i3 = rri2i3;
    ptr_ri2i4 = rri2i4;
    
    for(i2=2; i2<L_SUBFR; i2+=STEP)
    {
        for(i3=3; i3<L_SUBFR; i3+=STEP)
        {
            *ptr_ri2i3 = mult(*ptr_ri2i3, mult(p_sign[i2], p_sign[i3]));
            ptr_ri2i3++;
            *ptr_ri2i4 = mult(*ptr_ri2i4, mult(p_sign[i2], p_sign[i3+1]));
            ptr_ri2i4++;
            
        }
    }
    
    /*-------------------------------------------------------------------*
    * Search the optimum positions of the four  pulses which maximize   *
    *     square(correlation) / energy                                  *
    * The search is performed in four  nested loops. At each loop, one  *
    * pulse contribution is added to the correlation and energy.        *
    *                                                                   *
    * The fourth loop is entered only if the correlation due to the     *
    *  contribution of the first three pulses exceeds the preset        *
    *  threshold.                                                       *
    *-------------------------------------------------------------------*/
    
    /* Default values */
    
    ip0    = 0;
    ip1    = 1;
    ip2    = 2;
    ip3    = 3;
    psc    = 0;
    alpha  = MAX_16;
    time   = add(MAX_TIME, extra);
    
    
    /* Four loops to search innovation code. */
    
    ptr_ri0i0 = rri0i0;    /* Init. pointers that depend on first loop */
    ptr_ri0i1 = rri0i1;
    ptr_ri0i2 = rri0i2;
    ptr_ri0i3 = rri0i3;
    ptr_ri0i4 = rri0i4;
    
    for (i0 = 0; i0 < L_SUBFR; i0 += STEP)        /* first pulse loop  */
    {
        ps0  = Dn[i0];
        alp0 = *ptr_ri0i0++;
        
        ptr_ri1i1 = rri1i1;    /* Init. pointers that depend on second loop */
        ptr_ri1i2 = rri1i2;
        ptr_ri1i3 = rri1i3;
        ptr_ri1i4 = rri1i4;
        
        for (i1 = 1; i1 < L_SUBFR; i1 += STEP)      /* second pulse loop */
        {
            ps1  = add(ps0, Dn[i1]);
            
            /* alp1 = alp0 + *ptr_ri1i1++ + 2.0 * ( *ptr_ri0i1++); */
            
            alp1 = L_mult(alp0, 1);
            alp1 = L_mac(alp1, *ptr_ri1i1++, 1);
            alp1 = L_mac(alp1, *ptr_ri0i1++, 2);
            
            ptr_ri2i2 = rri2i2;     /* Init. pointers that depend on third loop */
            ptr_ri2i3 = rri2i3;
            ptr_ri2i4 = rri2i4;
            
            for (i2 = 2; i2 < L_SUBFR; i2 += STEP)    /* third pulse loop */
            {
                ps2  = add(ps1, Dn[i2]);
                
                /* alp2 = alp1 + *ptr_ri2i2++ + 2.0 * (*ptr_ri0i2++ + *ptr_ri1i2++); */
                
                alp2 = L_mac(alp1, *ptr_ri2i2++, 1);
                alp2 = L_mac(alp2, *ptr_ri0i2++, 2);
                alp2 = L_mac(alp2, *ptr_ri1i2++, 2);
                
                /* Test threshold */
                
                if ( sub(ps2, thres) > 0)
                {
                    
                    ptr_ri3i3 = rri3i3;    /* Init. pointers that depend on 4th loop */
                    
                    
                    for (i3 = 3; i3 < L_SUBFR; i3 += STEP)      /* 4th pulse loop */
                    {
                        ps3 = add(ps2, Dn[i3]);
                        
                        /* alp3 = alp2 + *ptr_ri3i3++                                */
                        /*       + 2.0*( *ptr_ri0i3++ + *ptr_ri1i3++ + *ptr_ri2i3++); */
                        
                        alp3 = L_mac(alp2, *ptr_ri3i3++, 1);
                        alp3 = L_mac(alp3, *ptr_ri0i3++, 2);
                        alp3 = L_mac(alp3, *ptr_ri1i3++, 2);
                        alp3 = L_mac(alp3, *ptr_ri2i3++, 2);
                        alp  = extract_l(L_shr(alp3, 5));
                        
                        ps3c = mult(ps3, ps3);
                        L_temp = L_mult(ps3c, alpha);
                        L_temp = L_msu(L_temp, psc, alp);
                        if( L_temp > 0L )
                        {
                            psc = ps3c;
                            alpha = alp;
                            ip0 = i0;
                            ip1 = i1;
                            ip2 = i2;
                            ip3 = i3;
                        }
                    }  /*  end of for i3 = */
                    ptr_ri0i3 -= NB_POS;
                    ptr_ri1i3 -= NB_POS;
                    
                    ptr_ri4i4 = rri4i4;    /* Init. pointers that depend on 4th loop */
                    
                    
                    for (i3 = 4; i3 < L_SUBFR; i3 += STEP)      /* 4th pulse loop */
                    {
                        ps3 = add(ps2, Dn[i3]);
                        
                        /* alp3 = alp2 + *ptr_ri4i4++                                */
                        /*       + 2.0*( *ptr_ri0i4++ + *ptr_ri1i4++ + *ptr_ri2i4++); */
                        
                        alp3 = L_mac(alp2, *ptr_ri4i4++, 1);
                        alp3 = L_mac(alp3, *ptr_ri0i4++, 2);
                        alp3 = L_mac(alp3, *ptr_ri1i4++, 2);
                        alp3 = L_mac(alp3, *ptr_ri2i4++, 2);
                        alp  = extract_l(L_shr(alp3, 5));
                        
                        ps3c = mult(ps3, ps3);
                        L_temp = L_mult(ps3c, alpha);
                        L_temp = L_msu(L_temp, psc, alp);
                        if( L_temp > 0L )
                        {
                            psc = ps3c;
                            alpha = alp;
                            ip0 = i0;
                            ip1 = i1;
                            ip2 = i2;
                            ip3 = i3;
                        }
                    }  /*  end of for i3 = */
                    ptr_ri0i4 -= NB_POS;
                    ptr_ri1i4 -= NB_POS;
                    
                    time = sub(time, 1);
                    if(time <= 0 ) goto end_search;     /* Maximum time finish */
                    
                }  /* end of if >thres */
                else
                {
                    ptr_ri2i3 += NB_POS;
                    ptr_ri2i4 += NB_POS;
                }
                
            } /* end of for i2 = */
            
            ptr_ri0i2 -= NB_POS;
            ptr_ri1i3 += NB_POS;
            ptr_ri1i4 += NB_POS;
            
        } /* end of for i1 = */
        
        ptr_ri0i2 += NB_POS;
        ptr_ri0i3 += NB_POS;
        ptr_ri0i4 += NB_POS;
        
    } /* end of for i0 = */
 
end_search:
 
    extra = time;
    
    /* Set the sign of impulses */
    
    i0 = p_sign[ip0];
    i1 = p_sign[ip1];
    i2 = p_sign[ip2];
    i3 = p_sign[ip3];

⌨️ 快捷键说明

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