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

语音压缩

开发平台:

C/C++

  1. /*
  2. **
  3. ** File:            "dec_cng.c"
  4. **
  5. ** Description:     Comfort noise generation
  6. **                  performed at the decoder part
  7. **
  8. ** Functions:       Init_Dec_Cng()
  9. **                  Dec_Cng()
  10. **
  11. **
  12. */
  13. /*
  14.     ITU-T G.723 Speech Coder   ANSI-C Source Code     Version 5.00
  15.     copyright (c) 1995, AudioCodes, DSP Group, France Telecom,
  16.     Universite de Sherbrooke.  All rights reserved.
  17. */
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20. #include "typedef.h"
  21. #include "cst_lbc.h"
  22. #include "tab_lbc.h"
  23. #include "util_lbc.h"
  24. #include "lsp.h"
  25. #include "exc_lbc.h"
  26. #include "basop.h"
  27. #include "util_cng.h"
  28. #include "dec_cng.h"
  29. #include "decod.h"
  30. /* Global Variable */
  31. DECCNGDEF DecCng;
  32. /*
  33. **
  34. ** Function:        Init_Dec_Cng()
  35. **
  36. ** Description:     Initialize Dec_Cng static variables
  37. **
  38. ** Links to text:
  39. **
  40. ** Arguments:       None
  41. **
  42. ** Outputs:         None
  43. **
  44. ** Return value:    None
  45. **
  46. */
  47. void Init_Dec_Cng(void)
  48. {
  49.     int i;
  50.     DecCng.PastFtyp = 1;
  51.     DecCng.SidGain = 0;
  52.     for(i=0; i<LpcOrder; i++) DecCng.LspSid[i] = LspDcTable[i] ;
  53.     DecCng.RandSeed = 12345;
  54.     return;
  55. }
  56. /*
  57. **
  58. ** Function:           Dec_Cng()
  59. **
  60. ** Description:        Receives Ftyp
  61. **                     0  :  for untransmitted frames
  62. **                     2  :  for SID frames
  63. **                     Decodes SID frames
  64. **                     Computes current frame excitation
  65. **                     Computes current frame LSPs
  66. **
  67. ** Links to text:
  68. **
  69. ** Arguments:
  70. **
  71. **  Word16 Ftyp        Type of silence frame
  72. **  LINEDEF *Line      Coded parameters
  73. **  Word16 *DataExc    Current frame excitation
  74. **  Word16 *QntLpc     Interpolated frame LPC coefficients
  75. **
  76. ** Outputs:
  77. **
  78. **  Word16 *DataExc
  79. **  Word16 *QntLpc
  80. **
  81. ** Return value:       None
  82. **
  83. */
  84. void Dec_Cng(Word16 Ftyp, LINEDEF *Line, Word16 *DataExc, Word16 *QntLpc)
  85. {
  86.     Word16 temp;
  87.     int i;
  88.     if(Ftyp == 2) {
  89.  /*
  90.   * SID Frame decoding
  91.   */
  92.         DecCng.SidGain = Dec_SidGain(Line->Sfs[0].Mamp);
  93.         /* Inverse quantization of the LSP */
  94.         Lsp_Inq( DecCng.LspSid, DecStat.PrevLsp, Line->LspId, 0) ;
  95.     }
  96.     else {
  97. /*
  98.  * non SID Frame
  99.  */
  100.         if(DecCng.PastFtyp == 1) {
  101.  /*
  102.   * Case of 1st SID frame erased : quantize-decode
  103.   * energy estimate stored in DecCng.SidGain
  104.   * scaling factor in DecCng.CurGain
  105.   */
  106.             temp = Qua_SidGain(&DecCng.SidGain, &DecCng.CurGain, 0);
  107.             DecCng.SidGain = Dec_SidGain(temp);
  108.         }
  109.     }
  110.     if(DecCng.PastFtyp == 1) {
  111.         DecCng.CurGain = DecCng.SidGain;
  112.     }
  113.     else {
  114.         DecCng.CurGain = extract_h(L_add( L_mult(DecCng.CurGain,0x7000),
  115.                     L_mult(DecCng.SidGain,0x1000) ) ) ;
  116.     }
  117.     Calc_Exc_Rand(DecCng.CurGain, DecStat.PrevExc, DataExc,
  118.                     &DecCng.RandSeed, Line);
  119.     /* Interpolate the Lsp vectors */
  120.     Lsp_Int( QntLpc, DecCng.LspSid, DecStat.PrevLsp ) ;
  121.     /* Copy the LSP vector for the next frame */
  122.     for ( i = 0 ; i < LpcOrder ; i ++ )
  123.         DecStat.PrevLsp[i] = DecCng.LspSid[i] ;
  124.     return;
  125. }