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

📄 acelp_co.c

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

 /*---------------------------------------------------------------------*
  * Compute elements of: rri2i4[], rri1i3[], rri0i2[], rri1i4[], rri0i3 *
  *---------------------------------------------------------------------*/

  ptr_hd = h;                        move16();
  ptr_hf = ptr_hd + 2;               move16();
  l_fin_sup = MSIZE-1;               move16();
  l_fin_inf = l_fin_sup-(Word16)1;           move16();
  for(k=0; k<NB_POS; k++) {

          p4 = rri2i4 + l_fin_sup;   move16();
          p3 = rri1i3 + l_fin_sup;   move16();
          p2 = rri0i2 + l_fin_sup;   move16();
          p1 = rri1i4 + l_fin_inf;   move16();
          p0 = rri0i3 + l_fin_inf;   move16();

          cor = 0;                   move32();
          ptr_h1 = ptr_hd;           move16();
          ptr_h2 =  ptr_hf;          move16();
          for(i=k+(Word16)1; i<NB_POS; i++ ) {

                  cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
                  *p4 = extract_h(cor); move16();

                  cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
                  *p3 = extract_h(cor); move16();

                  cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
                  *p2 = extract_h(cor); move16();

                  cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
                  *p1 = extract_h(cor); move16();

                  cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
                  *p0 = extract_h(cor); move16();

                  p4 -= ldec;         move16();
                  p3 -= ldec;         move16();
                  p2 -= ldec;         move16();
                  p1 -= ldec;         move16();
                  p0 -= ldec;         move16();
          }
          cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
          *p4 = extract_h(cor); move16();

          cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
          *p3 = extract_h(cor); move16();

          cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
          *p2 = extract_h(cor); move16();


          l_fin_sup -= NB_POS;        move16();
          l_fin_inf--;                move16();
          ptr_hf += STEP;             move16();
  }

 /*----------------------------------------------------------------------*
  * Compute elements of: rri1i4[], rri0i3[], rri2i4[], rri1i3[], rri0i2  *
  *----------------------------------------------------------------------*/

  ptr_hd = h;                        move16();
  ptr_hf = ptr_hd + 3;               move16();
  l_fin_sup = MSIZE-1;               move16();
  l_fin_inf = l_fin_sup-(Word16)1;           move16();
  for(k=0; k<NB_POS; k++) {

          p4 = rri1i4 + l_fin_sup;   move16();
          p3 = rri0i3 + l_fin_sup;   move16();
          p2 = rri2i4 + l_fin_inf;   move16();
          p1 = rri1i3 + l_fin_inf;   move16();
          p0 = rri0i2 + l_fin_inf;   move16();

          ptr_h1 = ptr_hd;           move16();
          ptr_h2 =  ptr_hf;          move16();
          cor = 0;                   move32();
          for(i=k+(Word16)1; i<NB_POS; i++ ) {

                  cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
                  *p4 = extract_h(cor); move16();

                  cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
                  *p3 = extract_h(cor); move16();

                  cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
                  *p2 = extract_h(cor); move16();

                  cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
                  *p1 = extract_h(cor); move16();

                  cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
                  *p0 = extract_h(cor); move16();

                  p4 -= ldec;         move16();
                  p3 -= ldec;         move16();
                  p2 -= ldec;         move16();
                  p1 -= ldec;         move16();
                  p0 -= ldec;         move16();
          }
          cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
          *p4 = extract_h(cor); move16();

          cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
          *p3 = extract_h(cor); move16();

          l_fin_sup -= NB_POS;        move16();
          l_fin_inf--;                move16();
          ptr_hf += STEP;             move16();
  }

 /*----------------------------------------------------------------------*
  * Compute elements of: rri0i4[], rri2i3[], rri1i2[], rri0i1[]          *
  *----------------------------------------------------------------------*/

  ptr_hd = h;                        move16();
  ptr_hf = ptr_hd + 4;               move16();
  l_fin_sup = MSIZE-1;               move16();
  l_fin_inf = l_fin_sup-(Word16)1;           move16();
  for(k=0; k<NB_POS; k++) {

          p3 = rri0i4 + l_fin_sup;   move16();
          p2 = rri2i3 + l_fin_inf;   move16();
          p1 = rri1i2 + l_fin_inf;   move16();
          p0 = rri0i1 + l_fin_inf;   move16();

          ptr_h1 = ptr_hd;           move16();
          ptr_h2 =  ptr_hf;          move16();
          cor = 0;                   move32();
          for(i=k+(Word16)1; i<NB_POS; i++ ) {

                  cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
                  *p3 = extract_h(cor); move16();

                  cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
                  cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
                  *p2 = extract_h(cor); move16();

                  cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
                  *p1 = extract_h(cor); move16();

                  cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
                  *p0 = extract_h(cor); move16();

                  p3 -= ldec;         move16();
                  p2 -= ldec;         move16();
                  p1 -= ldec;         move16();
                  p0 -= ldec;         move16();
          }
          cor = L_mac(cor, *ptr_h1, *ptr_h2); ptr_h1++; ptr_h2++;
          *p3 = extract_h(cor); move16();

          l_fin_sup -= NB_POS;        move16();
          l_fin_inf--;                move16();
          ptr_hf += STEP;             move16();
  }
  return;
}


/*------------------------------------------------------------------------*
 * Function  D4i40_17                                                     *
 *           ~~~~~~~~~                                                    *
 * Algebraic codebook for ITU 8kb/s.                                      *
 *  -> 17 bits; 4 pulses in a frame of 40 samples                         *
 *                                                                        *
 *------------------------------------------------------------------------*
 * The code length is 40, containing 4 nonzero pulses i0, i1, i2, i3.     *
 * Each pulses can have 8 possible positions (positive or negative)       *
 * except i3 that have 16 possible positions.                             *
 *                                                                        *
 * i0 (+-1) : 0, 5, 10, 15, 20, 25, 30, 35                                *
 * i1 (+-1) : 1, 6, 11, 16, 21, 26, 31, 36                                *
 * i2 (+-1) : 2, 7, 12, 17, 22, 27, 32, 37                                *
 * i3 (+-1) : 3, 8, 13, 18, 23, 28, 33, 38                                *
 *            4, 9, 14, 19, 24, 29, 34, 39                                *
 *------------------------------------------------------------------------*/

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;                      move16();
   rri1i1 = rri0i0 + NB_POS;         move16();
   rri2i2 = rri1i1 + NB_POS;         move16();
   rri3i3 = rri2i2 + NB_POS;         move16();
   rri4i4 = rri3i3 + NB_POS;         move16();

   rri0i1 = rri4i4 + NB_POS;         move16();
   rri0i2 = rri0i1 + MSIZE;          move16();
   rri0i3 = rri0i2 + MSIZE;          move16();
   rri0i4 = rri0i3 + MSIZE;          move16();
   rri1i2 = rri0i4 + MSIZE;          move16();
   rri1i3 = rri1i2 + MSIZE;          move16();
   rri1i4 = rri1i3 + MSIZE;          move16();
   rri2i3 = rri1i4 + MSIZE;          move16();
   rri2i4 = rri2i3 + MSIZE;          move16();

 /*-----------------------------------------------------------------------*
  * Reset max_time for 1st subframe.                                      *
  *-----------------------------------------------------------------------*/

   test();
   if (i_subfr == 0){ extra = 30; move16();}

 /*-----------------------------------------------------------------------*
  * Chose the sign of the impulse.                                        *
  *-----------------------------------------------------------------------*/

   for (i=0; i<L_SUBFR; i++)
   {
     test();
     if( Dn[i] >= 0)
     {
       p_sign[i] = 0x7fff;      move16();
     }
     else
     {
       p_sign[i] = (Word16)0x8000;      move16();
       Dn[i] = negate(Dn[i]);   move16();
     }
   }

 /*-------------------------------------------------------------------*
  * - Compute the search threshold after three pulses                 *
  *-------------------------------------------------------------------*/

   /* Find maximum of Dn[i0]+Dn[i1]+Dn[i2] */

   max0 = Dn[0];        move16();
   max1 = Dn[1];        move16();
   max2 = Dn[2];        move16();

   for (i = 5; i < L_SUBFR; i+=STEP)
   {
     if (sub(Dn[i]  , max0) > 0){ max0 = Dn[i];   move16();}
     if (sub(Dn[i+1], max1) > 0){ max1 = Dn[i+1]; move16();}
     if (sub(Dn[i+2], max2) > 0){ max2 = Dn[i+2]; move16();}
     test(); test(); test();
   }
   max0 = add(max0, max1);
   max0 = add(max0, max2);

   /* Find average of Dn[i0]+Dn[i1]+Dn[i2] */

   L32 = 0;     move32();
   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)*THRESHOLD; */

   thres = sub(max0, average);
   thres = mult(thres, THRESHOLDFCB);
   thres = add(thres, average);

  /*-------------------------------------------------------------------*
   * Modification of rrixiy[] to take signs into account.              *

⌨️ 快捷键说明

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