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

📄 acelp_ca.c

📁 g729a 语音编码,再linux c 环境下实现,有非常的好的移植性,通话质量好
💻 C
📖 第 1 页 / 共 2 页
字号:
/*

   ITU-T G.729 Annex C - Reference C code for floating point

                         implementation of G.729 Annex A

                         Version 1.01 of 15.September.98

*/



/*

----------------------------------------------------------------------

                    COPYRIGHT NOTICE

----------------------------------------------------------------------

   ITU-T G.729 Annex C ANSI C source code

   Copyright (C) 1998, AT&T, France Telecom, NTT, University of

   Sherbrooke.  All rights reserved.



----------------------------------------------------------------------

*/



/*

 File : ACELP_CA.C

 Used for the floating point version of G.729A only

 (not for G.729 main body)

*/



/*---------------------------------------------------------------------------*

 *  Function  ACELP_code_A()                                                 *

 *  ~~~~~~~~~~~~~~~~~~~~~~~~                                                 *

 *   Find Algebraic codebook for G.729A                                      *

 *--------------------------------------------------------------------------*/



/*  L_SUBFR   -> Lenght of subframe.                                        */

/*  NB_POS    -> Number of positios for each pulse.                         */

/*  STEP      -> Step betweem position of the same pulse.                   */

/*  MSIZE     -> Size of vectors for cross-correlation between two pulses.  */



#include "typedef.h"

#include "ld8a.h"



/* local routines definition */



static void cor_h(

     FLOAT *H,          /* (i) :Impulse response of filters */

     FLOAT *rr          /* (o) :Correlations of H[]         */

);

static int d4i40_17_fast(/*(o) : Index of pulses positions.               */

  FLOAT dn[],           /* (i) : Correlations between h[] and Xn[].       */

  FLOAT *rr,            /* (i) : Correlations of impulse response h[].    */

  FLOAT h[],            /* (i) : Impulse response of filters.             */

  FLOAT cod[],          /* (o) : Selected algebraic codeword.             */

  FLOAT y[],            /* (o) : Filtered algebraic codeword.             */

  int  *sign            /* (o) : Signs of 4 pulses.                       */

);



 /*-----------------------------------------------------------------*

  * Main ACELP function.                                            *

  *-----------------------------------------------------------------*/



int ACELP_code_A(       /* (o) :index of pulses positions    */

  FLOAT x[],            /* (i) :Target vector                */

  FLOAT h[],            /* (i) :Inpulse response of filters  */

  int T0,               /* (i) :Pitch lag                    */

  FLOAT pitch_sharp,    /* (i) :Last quantized pitch gain    */

  FLOAT code[],         /* (o) :Innovative codebook          */

  FLOAT y[],            /* (o) :Filtered innovative codebook */

  int *sign             /* (o) :Signs of 4 pulses            */

)

{

  int i, index;

  static FLOAT Dn[L_SUBFR]; /* "static" to avoid stack overflow on PC */

  static FLOAT rr[DIM_RR];  /* "static" to avoid stack overflow on PC */



 /*-----------------------------------------------------------------*

  * Include fixed-gain pitch contribution into impulse resp. h[]    *

  * Find correlations of h[] needed for the codebook search.        *

  *-----------------------------------------------------------------*/



  if (T0 < L_SUBFR)

     for (i = T0; i < L_SUBFR; i++)

        h[i] += pitch_sharp * h[i-T0];



  cor_h(h, rr);



 /*-----------------------------------------------------------------*

  * Compute correlation of target vector with impulse response.     *

  *-----------------------------------------------------------------*/



  cor_h_x(h, x, Dn);



 /*-----------------------------------------------------------------*

  * Find innovative codebook.                                       *

  *-----------------------------------------------------------------*/

  index = d4i40_17_fast(Dn, rr, h, code, y, sign);



 /*-----------------------------------------------------------------*

  * Compute innovation vector gain.                                 *

  * Include fixed-gain pitch contribution into code[].              *

  *-----------------------------------------------------------------*/



  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(

  FLOAT *h,         /* (i) :Impulse response of filters */

  FLOAT *rr         /* (o) :Correlations of H[]         */

)

{

  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;



 /*------------------------------------------------------------*

  * Compute rri0i0[], rri1i1[], rri2i2[], rri3i3 and rri4i4[]  *

  *------------------------------------------------------------*/

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



  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++) {



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

                  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;



                  p3 -= ldec;

                  p2 -= ldec;

                  p1 -= ldec;

                  p0 -= ldec;

          }

          cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++;

          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;

          p3 = rri0i3 + l_fin_sup;

          p2 = rri2i4 + l_fin_inf;

          p1 = rri1i3 + l_fin_inf;

          p0 = rri0i2 + l_fin_inf;



          ptr_h1 = ptr_hd;

          ptr_h2 =  ptr_hf;

          cor = (F)0.0;

          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;



          l_fin_sup -= NB_POS;

          l_fin_inf--;

          ptr_hf += STEP;

  }



 /*----------------------------------------------------------------------*

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

  *----------------------------------------------------------------------*/



  ptr_hd = h;

  ptr_hf = ptr_hd + 4;

  l_fin_sup = MSIZE-1;

  l_fin_inf = l_fin_sup-1;

  for(k=0; k<NB_POS; k++) {



          p3 = rri0i4 + l_fin_sup;

          p2 = rri2i3 + l_fin_inf;

          p1 = rri1i2 + l_fin_inf;

          p0 = rri0i1 + l_fin_inf;



          ptr_h1 = ptr_hd;

          ptr_h2 =  ptr_hf;

          cor = 0;

          for(i=k+1; i<NB_POS; i++ ) {



                  cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++;

                  *p3 = cor;



                  cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++;

                  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;



                  p3 -= ldec;

                  p2 -= ldec;

                  p1 -= ldec;

                  p0 -= ldec;

          }

          cor += *ptr_h1 * *ptr_h2; ptr_h1++; ptr_h2++;

          *p3 = cor;



          l_fin_sup -= NB_POS;

          l_fin_inf--;

          ptr_hf += STEP;

  }

  return;

}





/*------------------------------------------------------------------------*

 * Function  d4i40_17_fast                                                *

 *           ~~~~~~~~~                                                    *

 * Algebraic codebook for G.729A.                                         *

 *  -> 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 int d4i40_17_fast(/*(o) : Index of pulses positions.               */

  FLOAT dn[],           /* (i) : Correlations between h[] and Xn[].       */

  FLOAT rr[],           /* (i) : Correlations of impulse response h[].    */

  FLOAT h[],            /* (i) : Impulse response of filters.             */

  FLOAT cod[],          /* (o) : Selected algebraic codeword.             */

  FLOAT y[],            /* (o) : Filtered algebraic codeword.             */

  int *sign             /* (o) : Signs of 4 pulses.                       */

)

{





  int i0, i1, i2, i3, ip0, ip1, ip2, ip3;

  int i, j, ix, iy, track, trk;

  int prev_i0, i1_offset;

  FLOAT psk, ps, ps0, ps1, ps2, sq, sq2;

  FLOAT alpk, alp, max;

  FLOAT s, alp0, alp1, alp2;

  FLOAT *p0, *p1, *p2, *p3, *p4;



  FLOAT sign_dn[L_SUBFR], sign_dn_inv[L_SUBFR], *psign;

  FLOAT tmp_vect[NB_POS];



  FLOAT *rri0i0, *rri1i1, *rri2i2, *rri3i3, *rri4i4;

  FLOAT *rri0i1, *rri0i2, *rri0i3, *rri0i4;

  FLOAT *rri1i2, *rri1i3, *rri1i4;

  FLOAT *rri2i3, *rri2i4;



  FLOAT  *ptr_rri0i3_i4;

  FLOAT  *ptr_rri1i3_i4;

  FLOAT  *ptr_rri2i3_i4;

  FLOAT  *ptr_rri3i3_i4;



     /* Init pointers */

   rri0i0 = rr;

   rri1i1 = rri0i0 + NB_POS;

   rri2i2 = rri1i1 + NB_POS;

⌨️ 快捷键说明

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