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

语音压缩

开发平台:

C/C++

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