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

语音压缩

开发平台:

C/C++

  1. /*
  2.    ITU-T G.729 Annex C - Reference C code for floating point
  3.                          implementation of G.729
  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.  File : LSPDEC.C
  17.  Used for the floating point version of both
  18.  G.729 main body and G.729A
  19. */
  20. #include <math.h>
  21. #include "typedef.h"
  22. #include "version.h"
  23. #ifdef VER_G729A
  24.  #include "ld8a.h"
  25.  #include "tab_ld8a.h"
  26. #else
  27.  #include "ld8k.h"
  28.  #include "tab_ld8k.h"
  29. #endif
  30. /* Prototype definitions of static functions */
  31. static void lsp_iqua_cs( int prm[], FLOAT lsp[], int erase);
  32. /* static memory */
  33. static FLOAT freq_prev[MA_NP][M];    /* previous LSP vector       */
  34. static FLOAT freq_prev_reset[M] = {  /* previous LSP vector(init) */
  35.  (F)0.285599,  (F)0.571199,  (F)0.856798,  (F)1.142397,  (F)1.427997,
  36.  (F)1.713596,  (F)1.999195,  (F)2.284795,  (F)2.570394,  (F)2.855993
  37. };     /* PI*(float)(j+1)/(float)(M+1) */
  38. /* static memory for frame erase operation */
  39. static int prev_ma;                  /* previous MA prediction coef.*/
  40. static FLOAT prev_lsp[M];            /* previous LSP vector         */
  41. /*----------------------------------------------------------------------------
  42.  * Lsp_decw_reset -   set the previous LSP vectors
  43.  *----------------------------------------------------------------------------
  44.  */
  45. void lsp_decw_reset(void)
  46. {
  47.    int  i;
  48.    for(i=0; i<MA_NP; i++)
  49.      copy (freq_prev_reset, &freq_prev[i][0], M );
  50.    prev_ma = 0;
  51.    copy (freq_prev_reset, prev_lsp, M );
  52.    return;
  53. }
  54. /*----------------------------------------------------------------------------
  55.  * lsp_iqua_cs -  LSP main quantization routine
  56.  *----------------------------------------------------------------------------
  57.  */
  58. static void lsp_iqua_cs(
  59.  int    prm[],          /* input : codes of the selected LSP */
  60.  FLOAT  lsp_q[],        /* output: Quantized LSP parameters  */
  61.  int    erase           /* input : frame erase information   */
  62. )
  63. {
  64.    int  mode_index;
  65.    int  code0;
  66.    int  code1;
  67.    int  code2;
  68.    FLOAT buf[M];
  69.    if(erase==0)                 /* Not frame erasure */
  70.      {
  71.         mode_index = (prm[0] >> NC0_B) & 1;
  72.         code0 = prm[0] & (INT16)(NC0 - 1);
  73.         code1 = (prm[1] >> NC1_B) & (INT16)(NC1 - 1);
  74.         code2 = prm[1] & (INT16)(NC1 - 1);
  75.         lsp_get_quant(lspcb1, lspcb2, code0, code1, code2, fg[mode_index],
  76.               freq_prev, lsp_q, fg_sum[mode_index]);
  77.         copy(lsp_q, prev_lsp, M );
  78.         prev_ma = mode_index;
  79.      }
  80.    else                         /* Frame erased */
  81.      {
  82.        copy(prev_lsp, lsp_q, M );
  83.         /* update freq_prev */
  84.        lsp_prev_extract(prev_lsp, buf,
  85.           fg[prev_ma], freq_prev, fg_sum_inv[prev_ma]);
  86.        lsp_prev_update(buf, freq_prev);
  87.      }
  88.      return;
  89. }
  90. /*----------------------------------------------------------------------------
  91.  * d_lsp - decode lsp parameters
  92.  *----------------------------------------------------------------------------
  93.  */
  94. void d_lsp(
  95.     int     index[],    /* input : indexes                 */
  96.     FLOAT   lsp_q[],    /* output: decoded lsp             */
  97.     int     bfi         /* input : frame erase information */
  98. )
  99. {
  100.    int i;
  101.    lsp_iqua_cs(index, lsp_q,bfi); /* decode quantized information */
  102.    /* Convert LSFs to LSPs */
  103.    for (i=0; i<M; i++ )
  104.      lsp_q[i] = (FLOAT)cos(lsp_q[i]);
  105.    return;
  106. }