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

📄 acelp_co.c

📁 这是G.723和G.729的音频编解码的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
   *-------------------------------------------------------------------*/

  ptr_ri0i1 = rri0i1;    move16();
  ptr_ri0i2 = rri0i2;    move16();
  ptr_ri0i3 = rri0i3;    move16();
  ptr_ri0i4 = rri0i4;    move16();

   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_ri0i2++ = mult(*ptr_ri0i2, mult(p_sign[i0], p_sign[i1+1]));
       *ptr_ri0i3++ = mult(*ptr_ri0i3, mult(p_sign[i0], p_sign[i1+2]));
       *ptr_ri0i4++ = mult(*ptr_ri0i4, mult(p_sign[i0], p_sign[i1+3]));
       move16();move16();move16();move16();
     }
   }

   ptr_ri1i2 = rri1i2;   move16();
   ptr_ri1i3 = rri1i3;   move16();
   ptr_ri1i4 = rri1i4;   move16();

   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_ri1i3++ = mult(*ptr_ri1i3, mult(p_sign[i1], p_sign[i2+1]));
        *ptr_ri1i4++ = mult(*ptr_ri1i4, mult(p_sign[i1], p_sign[i2+2]));
        move16();move16();move16();
      }
   }

   ptr_ri2i3 = rri2i3;   move16();
   ptr_ri2i4 = rri2i4;   move16();

   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_ri2i4++ = mult(*ptr_ri2i4, mult(p_sign[i2], p_sign[i3+1]));
        move16();move16();
      }
   }

 /*-------------------------------------------------------------------*
  * 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;            move16();
 ip1    = 1;            move16();
 ip2    = 2;            move16();
 ip3    = 3;            move16();
 psc    = 0;            move16();
 alpha  = MAX_16;       move16();
 time   = add(MAX_TIME, extra);


 /* Four loops to search innovation code. */

 ptr_ri0i0 = rri0i0;    /* Init. pointers that depend on first loop */
 ptr_ri0i1 = rri0i1;    move16(); move16();
 ptr_ri0i2 = rri0i2;    move16();
 ptr_ri0i3 = rri0i3;    move16();
 ptr_ri0i4 = rri0i4;    move16();

 for (i0 = 0; i0 < L_SUBFR; i0 += STEP)        /* first pulse loop  */
 {
   ps0  = Dn[i0];               move16();
   alp0 = *ptr_ri0i0++;         move16();

   ptr_ri1i1 = rri1i1;    /* Init. pointers that depend on second loop */
   ptr_ri1i2 = rri1i2;    move16(); move16();
   ptr_ri1i3 = rri1i3;    move16();
   ptr_ri1i4 = rri1i4;    move16();

   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;     move16(); move16();
     ptr_ri2i4 = rri2i4;     move16();

     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 */

       test();
       if ( sub(ps2, thres) > 0)
       {

         ptr_ri3i3 = rri3i3;    /* Init. pointers that depend on 4th loop */
         move16();

         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);
           test();
           if( L_temp > 0L )
           {
             psc = ps3c;        move16();
             alpha = alp;       move16();
             ip0 = i0;          move16();
             ip1 = i1;          move16();
             ip2 = i2;          move16();
             ip3 = i3;          move16();
           }
         }  /*  end of for i3 = */
         ptr_ri0i3 -= NB_POS;   move16();
         ptr_ri1i3 -= NB_POS;   move16();

         ptr_ri4i4 = rri4i4;    /* Init. pointers that depend on 4th loop */
         move16();

         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);
           test();
           if( L_temp > 0L )
           {
             psc = ps3c;        move16();
             alpha = alp;       move16();
             ip0 = i0;          move16();
             ip1 = i1;          move16();
             ip2 = i2;          move16();
             ip3 = i3;          move16();
           }
         }  /*  end of for i3 = */
         ptr_ri0i4 -= NB_POS;   move16();
         ptr_ri1i4 -= NB_POS;   move16();

         time = sub(time, 1);
         test();
         if(time <= 0 ) goto end_search;     /* Maximum time finish */

       }  /* end of if >thres */
       else
       {
         ptr_ri2i3 += NB_POS;   move16();
         ptr_ri2i4 += NB_POS;   move16();
       }

     } /* end of for i2 = */

     ptr_ri0i2 -= NB_POS;       move16();
     ptr_ri1i3 += NB_POS;       move16();
     ptr_ri1i4 += NB_POS;       move16();

   } /* end of for i1 = */

   ptr_ri0i2 += NB_POS;         move16();
   ptr_ri0i3 += NB_POS;         move16();
   ptr_ri0i4 += NB_POS;         move16();

 } /* end of for i0 = */

end_search:

 extra = time;                  move16();

 /* Set the sign of impulses */

 i0 = p_sign[ip0];              move16();
 i1 = p_sign[ip1];              move16();
 i2 = p_sign[ip2];              move16();
 i3 = p_sign[ip3];              move16();

 /* Find the codeword corresponding to the selected positions */

 for(i=0; i<L_SUBFR; i++) {cod[i] = 0; move16();}

 cod[ip0] = shr(i0, 2);         /* From Q15 to Q13 */
 cod[ip1] = shr(i1, 2);         move16(); move16();
 cod[ip2] = shr(i2, 2);         move16();
 cod[ip3] = shr(i3, 2);         move16();

 /* find the filtered codeword */

 for (i = 0; i < L_SUBFR; i++) {y[i] = 0; move16(); }

 test();
 if(i0 > 0)
   for(i=ip0, j=0; i<L_SUBFR; i++, j++) {
       y[i] = add(y[i], h[j]); move16();}
 else
   for(i=ip0, j=0; i<L_SUBFR; i++, j++) {
       y[i] = sub(y[i], h[j]); move16();}

 test();
 if(i1 > 0)
   for(i=ip1, j=0; i<L_SUBFR; i++, j++) {
       y[i] = add(y[i], h[j]); move16();}
 else
   for(i=ip1, j=0; i<L_SUBFR; i++, j++) {
       y[i] = sub(y[i], h[j]); move16();}

 test();
 if(i2 > 0)
   for(i=ip2, j=0; i<L_SUBFR; i++, j++) {
       y[i] = add(y[i], h[j]); move16();}
 else
   for(i=ip2, j=0; i<L_SUBFR; i++, j++) {
       y[i] = sub(y[i], h[j]); move16();}

 test();
 if(i3 > 0)
   for(i=ip3, j=0; i<L_SUBFR; i++, j++) {
       y[i] = add(y[i], h[j]); move16();}
 else
   for(i=ip3, j=0; i<L_SUBFR; i++, j++) {
       y[i] = sub(y[i], h[j]); move16();}

 /* find codebook index;  17-bit address */

 i = 0; move16();
 test();
 if(i0 > 0) i = add(i, 1);
 test();
 if(i1 > 0) i = add(i, 2);
 test();
 if(i2 > 0) i = add(i, 4);
 test();
 if(i3 > 0) i = add(i, 8);
 *sign = i; move16();

 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));

 move16();
 return i;
}

⌨️ 快捷键说明

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