dec_ld8a.c
上传用户:zhouyunkk
上传日期:2013-01-10
资源大小:59k
文件大小:9k
源码类别:

语音压缩

开发平台:

C/C++

  1. /*
  2.    ITU-T G.729 Annex C - Reference C code for floating point
  3.                          implementation of G.729 Annex A
  4.                          Version 1.01 of 15.September.98
  5. */
  6. /*
  7. ----------------------------------------------------------------------
  8.                     COPYRIGHT NOTICE
  9. ----------------------------------------------------------------------
  10.    ITU-T G.729 Annex C ANSI C source code
  11.    Copyright (C) 1998, AT&T, France Telecom, NTT, University of
  12.    Sherbrooke.  All rights reserved.
  13. ----------------------------------------------------------------------
  14. */
  15. /*-----------------------------------------------------------------*
  16.  *   Functions init_decod_ld8a  and decod_ld8a                     *
  17.  *-----------------------------------------------------------------*/
  18. #include "typedef.h"
  19. #include "ld8a.h"
  20. /*---------------------------------------------------------------*
  21.  *   Decoder constant parameters (defined in "ld8a.h")           *
  22.  *---------------------------------------------------------------*
  23.  *   L_FRAME     : Frame size.                                   *
  24.  *   L_SUBFR     : Sub-frame size.                               *
  25.  *   M           : LPC order.                                    *
  26.  *   MP1         : LPC order+1                                   *
  27.  *   PIT_MIN     : Minimum pitch lag.                            *
  28.  *   PIT_MAX     : Maximum pitch lag.                            *
  29.  *   L_INTERPOL  : Length of filter for interpolation            *
  30.  *   PRM_SIZE    : Size of vector containing analysis parameters *
  31.  *---------------------------------------------------------------*/
  32. /*--------------------------------------------------------*
  33.  *         Static memory allocation.                      *
  34.  *--------------------------------------------------------*/
  35.         /* Excitation vector */
  36.  static FLOAT old_exc[L_FRAME+PIT_MAX+L_INTERPOL];
  37.  static FLOAT *exc;
  38.         /* Lsp (Line spectral pairs) */
  39.  static FLOAT lsp_old[M]={
  40.        (F)0.9595,  (F)0.8413,  (F)0.6549,  (F)0.4154,  (F)0.1423,
  41.       (F)-0.1423, (F)-0.4154, (F)-0.6549, (F)-0.8413, (F)-0.9595};
  42.  static FLOAT mem_syn[M];       /* Synthesis filter's memory          */
  43.  static FLOAT sharp;            /* pitch sharpening of previous frame */
  44.  static int old_T0;             /* integer delay of previous frame    */
  45.  static FLOAT gain_code;        /* Code gain                          */
  46.  static FLOAT gain_pitch;       /* Pitch gain                         */
  47. /*-----------------------------------------------------------------*
  48.  *   Function init_decod_ld8a                                      *
  49.  *            ~~~~~~~~~~~~~~~                                      *
  50.  *                                                                 *
  51.  *   ->Initialization of variables for the decoder section.        *
  52.  *                                                                 *
  53.  *-----------------------------------------------------------------*/
  54. void init_decod_ld8a(void)
  55. {
  56.   /* Initialize static pointer */
  57.   exc = old_exc + PIT_MAX + L_INTERPOL;
  58.   /* Static vectors to zero */
  59.   set_zero(old_exc, PIT_MAX+L_INTERPOL);
  60.   set_zero(mem_syn, M);
  61.   sharp  = SHARPMIN;
  62.   old_T0 = 60;
  63.   gain_code = (F)0.0;
  64.   gain_pitch = (F)0.0;
  65.   lsp_decw_reset() ;
  66.   return;
  67. }
  68. /*-----------------------------------------------------------------*
  69.  *   Function decod_ld8a                                           *
  70.  *           ~~~~~~~~~~                                            *
  71.  *   ->Main decoder routine.                                       *
  72.  *                                                                 *
  73.  *-----------------------------------------------------------------*/
  74. void decod_ld8a(
  75.   int      parm[],      /* (i)   : vector of synthesis parameters      */
  76.   FLOAT   synth[],     /* (o)   : synthesis speech                     */
  77.   FLOAT   A_t[],       /* (o)   : decoded LP filter in 2 subframes     */
  78.   int     *T2,          /* (o)   : decoded pitch lag in 2 subframes     */
  79.   int     bfi           /* (i)   :bad frame indicator (bfi)      */
  80. )
  81. {
  82.   FLOAT   *Az;                  /* Pointer on A_t   */
  83.   FLOAT   lsp_new[M];           /* Decoded LSP's    */
  84.   FLOAT   code[L_SUBFR];        /* ACELP codevector */
  85.    /* Scalars */
  86.    int i, i_subfr;
  87.    int T0, T0_frac, index;
  88.    int  bad_pitch; //bfi, 
  89.    extern int bad_lsf;        /* bad LSF indicator   */
  90.    /* Decode the LSPs */
  91.    d_lsp(parm, lsp_new, bfi+bad_lsf );
  92.    parm += 2;                        /* Advance synthesis parameters pointer */
  93.   /*
  94.   Note: "bad_lsf" is introduce in case the standard is used with
  95.          channel protection.
  96.   */
  97.    /* Interpolation of LPC for the 2 subframes */
  98.    int_qlpc(lsp_old, lsp_new, A_t);
  99.    /* update the LSFs for the next frame */
  100.    copy(lsp_new, lsp_old, M);
  101.    /*------------------------------------------------------------------------*
  102.     *          Loop for every subframe in the analysis frame                 *
  103.     *------------------------------------------------------------------------*
  104.     * The subframe size is L_SUBFR and the loop is repeated L_FRAME/L_SUBFR  *
  105.     *  times                                                                 *
  106.     *     - decode the pitch delay                                           *
  107.     *     - decode algebraic code                                            *
  108.     *     - decode pitch and codebook gains                                  *
  109.     *     - find the excitation and compute synthesis speech                 *
  110.     *------------------------------------------------------------------------*/
  111.    Az = A_t;                     /* pointer to interpolated LPC parameters */
  112.    for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR) {
  113.       /*-------------------------------------------------*
  114.        *  - Find the adaptive codebook vector.            *
  115.        *--------------------------------------------------*/
  116.       index = *parm++;            /* pitch index */
  117.       if(i_subfr == 0)
  118.       {
  119.         i = *parm++; /* get parity check result */
  120.         bad_pitch = bfi + i;
  121.         if( bad_pitch == 0)
  122.         {
  123.             dec_lag3(index, PIT_MIN, PIT_MAX, i_subfr, &T0, &T0_frac);
  124.             old_T0 = T0;
  125.         }
  126.         else        /* Bad frame, or parity error */
  127.         {
  128.           T0  =  old_T0;
  129.           T0_frac = 0;
  130.           old_T0++;
  131.           if( (old_T0 - PIT_MAX) > 0)
  132.             old_T0 = PIT_MAX;
  133.         }
  134.       }
  135.       else                  /* second subframe */
  136.       {
  137.         if( bfi == 0)
  138.         {
  139.           dec_lag3(index, PIT_MIN, PIT_MAX, i_subfr, &T0, &T0_frac);
  140.           old_T0 = T0;
  141.         }
  142.         else
  143.         {
  144.           T0  =  old_T0;
  145.           T0_frac = 0;
  146.           old_T0++;
  147.           if( (old_T0 - PIT_MAX) > 0)
  148.             old_T0 = PIT_MAX;
  149.         }
  150.       }
  151.       *T2++ = T0;
  152.      /*-------------------------------------------------*
  153.       * - Find the adaptive codebook vector.            *
  154.       *-------------------------------------------------*/
  155.       pred_lt_3(&exc[i_subfr], T0, T0_frac, L_SUBFR);
  156.       /*-------------------------------------------------------*
  157.        * - Decode innovative codebook.                         *
  158.        * - Add the fixed-gain pitch contribution to code[].    *
  159.        *-------------------------------------------------------*/
  160.       if(bfi != 0)        /* Bad frame */
  161.       {
  162.         parm[0] = random_g729() & (INT16)0x1fff;     /* 13 bits random */
  163.         parm[1] = random_g729() & (INT16)0x000f;     /*  4 bits random */
  164.       }
  165.       decod_ACELP(parm[1], parm[0], code);
  166.       parm +=2;
  167.       for (i = T0; i < L_SUBFR; i++)   code[i] += sharp * code[i-T0];
  168.       /*-------------------------------------------------*
  169.        * - Decode pitch and codebook gains.              *
  170.        *-------------------------------------------------*/
  171.       index = *parm++;          /* index of energy VQ */
  172.       dec_gain(index, code, L_SUBFR, bfi, &gain_pitch, &gain_code);
  173.       /*-------------------------------------------------------------*
  174.        * - Update pitch sharpening "sharp" with quantized gain_pitch *
  175.        *-------------------------------------------------------------*/
  176.       sharp = gain_pitch;
  177.       if (sharp > SHARPMAX) sharp = SHARPMAX;
  178.       if (sharp < SHARPMIN) sharp = SHARPMIN;
  179.       /*-------------------------------------------------------*
  180.        * - Find the total excitation.                          *
  181.        * - Find synthesis speech corresponding to exc[].       *
  182.        *-------------------------------------------------------*/
  183.       for (i = 0; i < L_SUBFR;  i++)
  184.          exc[i+i_subfr] = gain_pitch*exc[i+i_subfr] + gain_code*code[i];
  185.       syn_filt(Az, &exc[i_subfr], &synth[i_subfr], L_SUBFR, mem_syn, 1);
  186.       Az  += MP1;        /* interpolated LPC parameters for next subframe */
  187.    }
  188.   /*--------------------------------------------------*
  189.    * Update signal for next frame.                    *
  190.    * -> shift to the left by L_FRAME  exc[]           *
  191.    *--------------------------------------------------*/
  192.    copy(&old_exc[L_FRAME], &old_exc[0], PIT_MAX+L_INTERPOL);
  193.    return;
  194. }