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

📄 acelp_ca.c

📁 g729a 语音编码,再linux c 环境下实现,有非常的好的移植性,通话质量好
💻 C
📖 第 1 页 / 共 2 页
字号:
   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 + -