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

语音压缩

开发平台:

C/C++

  1. /*
  2. **
  3. ** File:        "coder.c"
  4. **
  5. ** Description:     Top-level source code for G.723 dual-rate coder
  6. **
  7. ** Functions:       Init_Coder()
  8. **                  Coder()
  9. **
  10. **
  11. */
  12. /*
  13.     ITU-T G.723 Speech Coder   ANSI-C Source Code     Version 5.00
  14.     copyright (c) 1995, AudioCodes, DSP Group, France Telecom,
  15.     Universite de Sherbrooke.  All rights reserved.
  16. */
  17. #include <stdlib.h>
  18. #include <stdio.h>
  19. #include <string.h>
  20. #include "typedef.h"
  21. #include "basop.h"
  22. #include "cst_lbc.h"
  23. #include "tab_lbc.h"
  24. #include "coder.h"
  25. #include "lpc.h"
  26. #include "lsp.h"
  27. #include "exc_lbc.h"
  28. #include "util_lbc.h"
  29. #include "vad.h"
  30. #include "cod_cng.h"
  31. #include "tame.h"
  32. /*
  33.    This file includes the coder main functions
  34. */
  35. CODSTATDEF  CodStat  ;
  36. /*
  37. **
  38. ** Function:        Init_Coder()
  39. **
  40. ** Description:     Initializes non-zero state variables
  41. **          for the coder.
  42. **
  43. ** Links to text:   Section 2.21
  44. ** 
  45. ** Arguments:       None
  46. **
  47. ** Outputs:     None
  48. ** 
  49. ** Return value:    None
  50. **
  51. */
  52. void  Init_Coder( void)
  53. {
  54.     int   i ;
  55.     /* Initialize encoder data structure with zeros */
  56.     memset(&CodStat, 0, sizeof(CODSTATDEF));
  57.     /* Initialize the previously decoded LSP vector to the DC vector */
  58.     for ( i = 0 ; i < LpcOrder ; i ++ )
  59.         CodStat.PrevLsp[i] = LspDcTable[i] ;
  60.     /* Initialize the taming procedure */
  61.     for(i=0; i<SizErr; i++) CodStat.Err[i] = Err0;
  62.     return;
  63. }
  64. /*
  65. **
  66. ** Function:        Coder()
  67. **
  68. ** Description:     Implements G.723 dual-rate coder for    a frame
  69. **          of speech
  70. **
  71. ** Links to text:   Section 2
  72. **
  73. ** Arguments:
  74. **
  75. **  Word16 DataBuff[]   frame (480 bytes)
  76. **
  77. ** Outputs:
  78. **
  79. **  Word16 Vout[]       Encoded frame (20/24 bytes)
  80. **
  81. ** Return value:
  82. **
  83. **  Flag            Always True
  84. **
  85. */
  86. Flag  Coder( Word16 *DataBuff, char *Vout )
  87. {
  88.     int     i,j   ;
  89.     /*
  90.       Local variables
  91.     */
  92.     Word16   UnqLpc[SubFrames*LpcOrder] ;
  93.     Word16   QntLpc[SubFrames*LpcOrder] ;
  94.     Word16   PerLpc[2*SubFrames*LpcOrder] ;
  95.     Word16   LspVect[LpcOrder] ;
  96.     LINEDEF  Line  ;
  97.     PWDEF    Pw[SubFrames]  ;
  98.     Word16   ImpResp[SubFrLen] ;
  99.     Word16  *Dpnt  ;
  100.     Word16  Ftyp = 1 ;
  101.     /*
  102.       Coder Start
  103.     */
  104.     Line.Crc = (Word16) 0 ;
  105.     Rem_Dc( DataBuff ) ;
  106.     /* Compute the Unquantized Lpc set for whole frame */
  107.     Comp_Lpc( UnqLpc, CodStat.PrevDat, DataBuff ) ;
  108.     /* Convert to Lsp */
  109.     AtoLsp( LspVect, &UnqLpc[LpcOrder*(SubFrames-1)], CodStat.PrevLsp ) ;
  110.     /* Compute the Vad */
  111.     Ftyp = (Word16) Comp_Vad( DataBuff ) ;
  112.     /* VQ Lsp vector */
  113.     Line.LspId = Lsp_Qnt( LspVect, CodStat.PrevLsp ) ;
  114.     Mem_Shift( CodStat.PrevDat, DataBuff ) ;
  115.     /* Compute Perceptual filter Lpc coefficients */
  116.     Wght_Lpc( PerLpc, UnqLpc ) ;
  117.     /* Apply the perceptual weighting filter */
  118.     Error_Wght( DataBuff, PerLpc ) ;
  119.     /*
  120.     // Compute Open loop pitch estimates
  121.     */
  122.     Dpnt = (Word16 *) malloc( sizeof(Word16)*(PitchMax+Frame) ) ;
  123.     /* Construct the buffer */
  124.     for ( i = 0 ; i < PitchMax ; i ++ )
  125.         Dpnt[i] = CodStat.PrevWgt[i] ;
  126.     for ( i = 0 ; i < Frame ; i ++ )
  127.         Dpnt[PitchMax+i] = DataBuff[i] ;
  128.     Vec_Norm( Dpnt, (Word16) (PitchMax+Frame) ) ;
  129.     j = PitchMax ;
  130.     for ( i = 0 ; i < SubFrames/2 ; i ++ ) {
  131.         Line.Olp[i] = Estim_Pitch( Dpnt, (Word16) j ) ;
  132.         VadStat.Polp[i+2] = Line.Olp[i] ;
  133.         j += 2*SubFrLen ;
  134.     }
  135.     if(Ftyp != 1) {
  136.         /*
  137.         // Case of inactive signal
  138.         */
  139.         free ( (char *) Dpnt ) ;
  140.         /* Save PrevWgt */
  141.         for ( i = 0 ; i < PitchMax ; i ++ )
  142.             CodStat.PrevWgt[i] = DataBuff[i+Frame-PitchMax] ;
  143.         /* CodCng => Ftyp = 0 (untransmitted) or 2 (SID) */
  144.         Cod_Cng(DataBuff, &Ftyp, &Line, QntLpc);
  145.         /* Update the ringing delays */
  146.         Dpnt = DataBuff;
  147.         for( i = 0 ; i < SubFrames; i++ ) {
  148.             /* Update exc_err */
  149.             Update_Err(Line.Olp[i>>1], Line.Sfs[i].AcLg, Line.Sfs[i].AcGn);
  150.             Upd_Ring( Dpnt, &QntLpc[i*LpcOrder], &PerLpc[i*2*LpcOrder],
  151.                                                         CodStat.PrevErr ) ;
  152.             Dpnt += SubFrLen;
  153.         }
  154.     }
  155.     else {
  156.         /*
  157.         // Case of Active signal  (Ftyp=1)
  158.         */
  159.         /* Compute the Hmw */
  160.         j = PitchMax ;
  161.         for ( i = 0 ; i < SubFrames ; i ++ ) {
  162.             Pw[i] = Comp_Pw( Dpnt, (Word16) j, Line.Olp[i>>1] ) ;
  163.             j += SubFrLen ;
  164.         }
  165.         /* Reload the buffer */
  166.         for ( i = 0 ; i < PitchMax ; i ++ )
  167.             Dpnt[i] = CodStat.PrevWgt[i] ;
  168.         for ( i = 0 ; i < Frame ; i ++ )
  169.             Dpnt[PitchMax+i] = DataBuff[i] ;
  170.         /* Save PrevWgt */
  171.         for ( i = 0 ; i < PitchMax ; i ++ )
  172.             CodStat.PrevWgt[i] = Dpnt[Frame+i] ;
  173.         /* Apply the Harmonic filter */
  174.         j = 0 ;
  175.         for ( i = 0 ; i < SubFrames ; i ++ ) {
  176.             Filt_Pw( DataBuff, Dpnt, (Word16) j , Pw[i] ) ;
  177.             j += SubFrLen ;
  178.         }
  179.         free ( (char *) Dpnt ) ;
  180.         /* Inverse quantization of the LSP */
  181.         Lsp_Inq( LspVect, CodStat.PrevLsp, Line.LspId, Line.Crc ) ;
  182.         /* Interpolate the Lsp vectors */
  183.         Lsp_Int( QntLpc, LspVect, CodStat.PrevLsp ) ;
  184.         /* Copy the LSP vector for the next frame */
  185.         for ( i = 0 ; i < LpcOrder ; i ++ )
  186.             CodStat.PrevLsp[i] = LspVect[i] ;
  187.         /*
  188.         // Start the sub frame processing loop
  189.         */
  190.         Dpnt = DataBuff ;
  191.         for ( i = 0 ; i < SubFrames ; i ++ ) {
  192.             /* Compute full impulse response */
  193.             Comp_Ir( ImpResp, &QntLpc[i*LpcOrder],
  194.                                             &PerLpc[i*2*LpcOrder], Pw[i] ) ;
  195.             /* Subtract the ringing of previous sub-frame */
  196.             Sub_Ring( Dpnt, &QntLpc[i*LpcOrder], &PerLpc[i*2*LpcOrder],
  197.                                                    CodStat.PrevErr, Pw[i] ) ;
  198.             /* Compute adaptive code book contribution */
  199.             Find_Acbk( Dpnt, ImpResp, CodStat.PrevExc, &Line, (Word16) i ) ;
  200.             /* Compute fixed code book contribution */
  201.             Find_Fcbk( Dpnt, ImpResp, &Line, (Word16) i ) ;
  202.             /* Reconstruct the excitation */
  203.             Decod_Acbk( ImpResp, CodStat.PrevExc, Line.Olp[i>>1],
  204.                                     Line.Sfs[i].AcLg, Line.Sfs[i].AcGn ) ;
  205.             for ( j = SubFrLen ; j < PitchMax ; j ++ )
  206.                 CodStat.PrevExc[j-SubFrLen] = CodStat.PrevExc[j] ;
  207.             for ( j = 0 ; j < SubFrLen ; j ++ ) {
  208.                 Dpnt[j] = shl( Dpnt[j], (Word16) 1 ) ;
  209.                 Dpnt[j] = add( Dpnt[j], ImpResp[j] ) ;
  210.                 CodStat.PrevExc[PitchMax-SubFrLen+j] = Dpnt[j] ;
  211.             }
  212.             /* Update exc_err */
  213.             Update_Err(Line.Olp[i>>1], Line.Sfs[i].AcLg, Line.Sfs[i].AcGn);
  214.             /* Update the ringing delays */
  215.             Upd_Ring( Dpnt, &QntLpc[i*LpcOrder], &PerLpc[i*2*LpcOrder],
  216.                                                        CodStat.PrevErr ) ;
  217.             Dpnt += SubFrLen ;
  218.         }  /* end of subframes loop */
  219.         /*
  220.         // Save Vad information and reset CNG random generator
  221.         */
  222.         CodCng.PastFtyp = 1;
  223.         CodCng.RandSeed = 12345;
  224.     } /* End of active frame case */
  225.     /* Pack the Line structure */
  226.     Line_Pack( &Line, Vout, Ftyp ) ;
  227.     return (Flag) True ;
  228. }