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

语音压缩

开发平台:

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. #include "typedef.h"
  9. #include "ld8a.h"
  10. #include "basic_op.h"
  11. #include "tab_ld8a.h"
  12. /* static memory */
  13. static Word16 freq_prev[MA_NP][M];   /* Q13 */
  14. static Word16 freq_prev_reset[M] = { /* Q13 */
  15.   2339, 4679, 7018, 9358, 11698, 14037, 16377, 18717, 21056, 23396
  16. };     /* PI*(float)(j+1)/(float)(M+1) */
  17. /* static memory for frame erase operation */
  18. static Word16 prev_ma;                  /* previous MA prediction coef.*/
  19. static Word16 prev_lsp[M];              /* previous LSP vector         */
  20. /*----------------------------------------------------------------------------
  21.  * Lsp_decw_reset -   set the previous LSP vectors
  22.  *----------------------------------------------------------------------------
  23.  */
  24. void Lsp_decw_reset(
  25.   void
  26. )
  27. {
  28.   Word16 i;
  29.   for(i=0; i<MA_NP; i++)
  30.     Copy( &freq_prev_reset[0], &freq_prev[i][0], M );
  31.   prev_ma = 0;
  32.   Copy( freq_prev_reset, prev_lsp, M);
  33. }
  34. /*----------------------------------------------------------------------------
  35.  * Lsp_iqua_cs -  LSP main quantization routine
  36.  *----------------------------------------------------------------------------
  37.  */
  38. void Lsp_iqua_cs(
  39.  Word16 prm[],          /* (i)     : indexes of the selected LSP */
  40.  Word16 lsp_q[],        /* (o) Q13 : Quantized LSP parameters    */
  41.  Word16 erase           /* (i)     : frame erase information     */
  42. )
  43. {
  44.   Word16 mode_index;
  45.   Word16 code0;
  46.   Word16 code1;
  47.   Word16 code2;
  48.   Word16 buf[M];     /* Q13 */
  49.   if( erase==0 ) {  /* Not frame erasure */
  50.     mode_index = shr(prm[0] ,NC0_B) & (Word16)1;
  51.     code0 = prm[0] & (Word16)(NC0 - 1);
  52.     code1 = shr(prm[1] ,NC1_B) & (Word16)(NC1 - 1);
  53.     code2 = prm[1] & (Word16)(NC1 - 1);
  54.     /* compose quantized LSP (lsp_q) from indexes */
  55.     Lsp_get_quant(lspcb1, lspcb2, code0, code1, code2,
  56.       fg[mode_index], freq_prev, lsp_q, fg_sum[mode_index]);
  57.     /* save parameters to use in case of the frame erased situation */
  58.     Copy(lsp_q, prev_lsp, M);
  59.     prev_ma = mode_index;
  60.   }
  61.   else {           /* Frame erased */
  62.     /* use revious LSP */
  63.     Copy(prev_lsp, lsp_q, M);
  64.     /* update freq_prev */
  65.     Lsp_prev_extract(prev_lsp, buf,
  66.       fg[prev_ma], freq_prev, fg_sum_inv[prev_ma]);
  67.     Lsp_prev_update(buf, freq_prev);
  68.   }
  69.   return;
  70. }
  71. /*-------------------------------------------------------------------*
  72.  * Function  D_lsp:                                                  *
  73.  *           ~~~~~~                                                  *
  74.  *-------------------------------------------------------------------*/
  75. void D_lsp(
  76.   Word16 prm[],          /* (i)     : indexes of the selected LSP */
  77.   Word16 lsp_q[],        /* (o) Q15 : Quantized LSP parameters    */
  78.   Word16 erase           /* (i)     : frame erase information     */
  79. )
  80. {
  81.   Word16 lsf_q[M];       /* domain 0.0<= lsf_q <PI in Q13 */
  82.   Lsp_iqua_cs(prm, lsf_q, erase);
  83.   /* Convert LSFs to LSPs */
  84.   Lsf_lsp2(lsf_q, lsp_q, M);
  85.   return;
  86. }