DEC_LD8A.C
上传用户:meifeng08
上传日期:2013-06-18
资源大小:5304k
文件大小:9k
源码类别:

语音压缩

开发平台:

C/C++

  1. /*
  2.    ITU-T G.729A Speech Coder    ANSI-C Source Code
  3.    Version 1.1    Last modified: September 1996
  4.    Copyright (c) 1996,
  5.    AT&T, France Telecom, NTT, Universite de Sherbrooke
  6.    All rights reserved.
  7. */
  8. /*-----------------------------------------------------------------*
  9.  *   Functions Init_Decod_ld8a  and Decod_ld8a                     *
  10.  *-----------------------------------------------------------------*/
  11. #include "typedef.h"
  12. #include "basic_op.h"
  13. #include "ld8a.h"
  14. /*---------------------------------------------------------------*
  15.  *   Decoder constant parameters (defined in "ld8a.h")           *
  16.  *---------------------------------------------------------------*
  17.  *   L_FRAME     : Frame size.                                   *
  18.  *   L_SUBFR     : Sub-frame size.                               *
  19.  *   M           : LPC order.                                    *
  20.  *   MP1         : LPC order+1                                   *
  21.  *   PIT_MIN     : Minimum pitch lag.                            *
  22.  *   PIT_MAX     : Maximum pitch lag.                            *
  23.  *   L_INTERPOL  : Length of filter for interpolation            *
  24.  *   PRM_SIZE    : Size of vector containing analysis parameters *
  25.  *---------------------------------------------------------------*/
  26. /*--------------------------------------------------------*
  27.  *         Static memory allocation.                      *
  28.  *--------------------------------------------------------*/
  29.         /* Excitation vector */
  30.  static Word16 old_exc[L_FRAME+PIT_MAX+L_INTERPOL];
  31.  static Word16 *exc;
  32.         /* Lsp (Line spectral pairs) */
  33.  static Word16 lsp_old[M]={
  34.              30000, 26000, 21000, 15000, 8000, 0, -8000,-15000,-21000,-26000};
  35.         /* Filter's memory */
  36.  static Word16 mem_syn[M];
  37.  static Word16 sharp;           /* pitch sharpening of previous frame */
  38.  static Word16 old_T0;          /* integer delay of previous frame    */
  39.  static Word16 gain_code;       /* Code gain                          */
  40.  static Word16 gain_pitch;      /* Pitch gain                         */
  41. /*-----------------------------------------------------------------*
  42.  *   Function Init_Decod_ld8a                                      *
  43.  *            ~~~~~~~~~~~~~~~                                      *
  44.  *                                                                 *
  45.  *   ->Initialization of variables for the decoder section.        *
  46.  *                                                                 *
  47.  *-----------------------------------------------------------------*/
  48. void Init_Decod_ld8a(void)
  49. {
  50.   /* Initialize static pointer */
  51.   exc = old_exc + PIT_MAX + L_INTERPOL;
  52.   /* Static vectors to zero */
  53.   Set_zero(old_exc, PIT_MAX+L_INTERPOL);
  54.   Set_zero(mem_syn, M);
  55.   sharp  = SHARPMIN;
  56.   old_T0 = 60;
  57.   gain_code = 0;
  58.   gain_pitch = 0;
  59.   Lsp_decw_reset();
  60.  return;
  61. }
  62. /*-----------------------------------------------------------------*
  63.  *   Function Decod_ld8a                                           *
  64.  *           ~~~~~~~~~~                                            *
  65.  *   ->Main decoder routine.                                       *
  66.  *                                                                 *
  67.  *-----------------------------------------------------------------*/
  68. void Decod_ld8a(
  69.   Word16  parm[],      /* (i)   : vector of synthesis parameters
  70.                                   parm[0] = bad frame indicator (bfi)  */
  71.   Word16  synth[],     /* (o)   : synthesis speech                     */
  72.   Word16  A_t[],       /* (o)   : decoded LP filter in 2 subframes     */
  73.   Word16  *T2          /* (o)   : decoded pitch lag in 2 subframes     */
  74. )
  75. {
  76.   Word16  *Az;                  /* Pointer on A_t   */
  77.   Word16  lsp_new[M];           /* LSPs             */
  78.   Word16  code[L_SUBFR];        /* ACELP codevector */
  79.   /* Scalars */
  80.   Word16  i, j, i_subfr;
  81.   Word16  T0, T0_frac, index;
  82.   Word16  bfi;
  83.   Word32  L_temp;
  84.   Word16 bad_pitch;             /* bad pitch indicator */
  85.   extern Word16 bad_lsf;        /* bad LSF indicator   */
  86.   /* Test bad frame indicator (bfi) */
  87.   bfi = *parm++;
  88.   /* Decode the LSPs */
  89.   D_lsp(parm, lsp_new, add(bfi, bad_lsf));
  90.   parm += 2;
  91.   /*
  92.   Note: "bad_lsf" is introduce in case the standard is used with
  93.          channel protection.
  94.   */
  95.   /* Interpolation of LPC for the 2 subframes */
  96.   Int_qlpc(lsp_old, lsp_new, A_t);
  97.   /* update the LSFs for the next frame */
  98.   Copy(lsp_new, lsp_old, M);
  99. /*------------------------------------------------------------------------*
  100.  *          Loop for every subframe in the analysis frame                 *
  101.  *------------------------------------------------------------------------*
  102.  * The subframe size is L_SUBFR and the loop is repeated L_FRAME/L_SUBFR  *
  103.  *  times                                                                 *
  104.  *     - decode the pitch delay                                           *
  105.  *     - decode algebraic code                                            *
  106.  *     - decode pitch and codebook gains                                  *
  107.  *     - find the excitation and compute synthesis speech                 *
  108.  *------------------------------------------------------------------------*/
  109.   Az = A_t;            /* pointer to interpolated LPC parameters */
  110.   for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
  111.   {
  112.     index = *parm++;            /* pitch index */
  113.     if(i_subfr == 0)
  114.     {
  115.       i = *parm++;              /* get parity check result */
  116.       bad_pitch = add(bfi, i);
  117.       if( bad_pitch == 0)
  118.       {
  119.         Dec_lag3(index, PIT_MIN, PIT_MAX, i_subfr, &T0, &T0_frac);
  120.         old_T0 = T0;
  121.       }
  122.       else        /* Bad frame, or parity error */
  123.       {
  124.         T0  =  old_T0;
  125.         T0_frac = 0;
  126.         old_T0 = add( old_T0, 1);
  127.         if( sub(old_T0, PIT_MAX) > 0) {
  128.             old_T0 = PIT_MAX;
  129.         }
  130.       }
  131.     }
  132.     else                  /* second subframe */
  133.     {
  134.       if( bfi == 0)
  135.       {
  136.         Dec_lag3(index, PIT_MIN, PIT_MAX, i_subfr, &T0, &T0_frac);
  137.         old_T0 = T0;
  138.       }
  139.       else
  140.       {
  141.         T0  =  old_T0;
  142.         T0_frac = 0;
  143.         old_T0 = add( old_T0, 1);
  144.         if( sub(old_T0, PIT_MAX) > 0) {
  145.             old_T0 = PIT_MAX;
  146.         }
  147.       }
  148.     }
  149.     *T2++ = T0;
  150.    /*-------------------------------------------------*
  151.     * - Find the adaptive codebook vector.            *
  152.     *-------------------------------------------------*/
  153.     Pred_lt_3(&exc[i_subfr], T0, T0_frac, L_SUBFR);
  154.    /*-------------------------------------------------------*
  155.     * - Decode innovative codebook.                         *
  156.     * - Add the fixed-gain pitch contribution to code[].    *
  157.     *-------------------------------------------------------*/
  158.     if(bfi != 0)        /* Bad frame */
  159.     {
  160.       parm[0] = Random() & (Word16)0x1fff;     /* 13 bits random */
  161.       parm[1] = Random() & (Word16)0x000f;     /*  4 bits random */
  162.     }
  163.     Decod_ACELP(parm[1], parm[0], code);
  164.     parm +=2;
  165.     j = shl(sharp, 1);          /* From Q14 to Q15 */
  166.     if(sub(T0, L_SUBFR) <0 ) {
  167.         for (i = T0; i < L_SUBFR; i++) {
  168.           code[i] = add(code[i], mult(code[i-T0], j));
  169.         }
  170.     }
  171.    /*-------------------------------------------------*
  172.     * - Decode pitch and codebook gains.              *
  173.     *-------------------------------------------------*/
  174.     index = *parm++;      /* index of energy VQ */
  175.     Dec_gain(index, code, L_SUBFR, bfi, &gain_pitch, &gain_code);
  176.    /*-------------------------------------------------------------*
  177.     * - Update pitch sharpening "sharp" with quantized gain_pitch *
  178.     *-------------------------------------------------------------*/
  179.     sharp = gain_pitch;
  180.     if (sub(sharp, SHARPMAX) > 0) { sharp = SHARPMAX;  }
  181.     if (sub(sharp, SHARPMIN) < 0) { sharp = SHARPMIN;  }
  182.    /*-------------------------------------------------------*
  183.     * - Find the total excitation.                          *
  184.     * - Find synthesis speech corresponding to exc[].       *
  185.     *-------------------------------------------------------*/
  186.     for (i = 0; i < L_SUBFR;  i++)
  187.     {
  188.        /* exc[i] = gain_pitch*exc[i] + gain_code*code[i]; */
  189.        /* exc[i]  in Q0   gain_pitch in Q14               */
  190.        /* code[i] in Q13  gain_codeode in Q1              */
  191.        L_temp = L_mult(exc[i+i_subfr], gain_pitch);
  192.        L_temp = L_mac(L_temp, code[i], gain_code);
  193.        L_temp = L_shl(L_temp, 1);
  194.        exc[i+i_subfr] = round(L_temp);
  195.     }
  196.     Overflow = 0;
  197.     Syn_filt(Az, &exc[i_subfr], &synth[i_subfr], L_SUBFR, mem_syn, 0);
  198.     if(Overflow != 0)
  199.     {
  200.       /* In case of overflow in the synthesis          */
  201.       /* -> Scale down vector exc[] and redo synthesis */
  202.       for(i=0; i<PIT_MAX+L_INTERPOL+L_FRAME; i++)
  203.         old_exc[i] = shr(old_exc[i], 2);
  204.       Syn_filt(Az, &exc[i_subfr], &synth[i_subfr], L_SUBFR, mem_syn, 1);
  205.     }
  206.     else
  207.       Copy(&synth[i_subfr+L_SUBFR-M], mem_syn, M);
  208.     Az += MP1;    /* interpolated LPC parameters for next subframe */
  209.   }
  210.  /*--------------------------------------------------*
  211.   * Update signal for next frame.                    *
  212.   * -> shift to the left by L_FRAME  exc[]           *
  213.   *--------------------------------------------------*/
  214.   Copy(&old_exc[L_FRAME], &old_exc[0], PIT_MAX+L_INTERPOL);
  215.   return;
  216. }