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

语音压缩

开发平台:

C/C++

  1. /*
  2. **
  3. ** File:        "decod.c"
  4. **
  5. ** Description:     Top-level source code for G.723 dual-rate decoder
  6. **
  7. ** Functions:       Init_Decod()
  8. **                  Decod()
  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 "lbccodec.h"
  25. #include "decod.h"
  26. #include "util_lbc.h"
  27. #include "lpc.h"
  28. #include "lsp.h"
  29. #include "exc_lbc.h"
  30. #include "dec_cng.h"
  31. /*
  32.    The following structure contains all the static decoder
  33.       variables.
  34. */
  35. DECSTATDEF  DecStat  ;
  36. /*
  37. **
  38. ** Function:        Init_Decod()
  39. ** 
  40. ** Description:     Initializes non-zero state variables
  41. **          for the decoder.
  42. **
  43. ** Links to text:   Section 3.11
  44. ** 
  45. ** Arguments:       None
  46. ** 
  47. ** Outputs:     None
  48. ** 
  49. ** Return value:    None
  50. **
  51. */
  52. void  Init_Decod( )
  53. {
  54.     int   i  ;
  55.     /* Initialize encoder data structure with zeros */
  56.     memset(&DecStat, 0, sizeof(DECSTATDEF));
  57.     /* Initialize the previously decoded LSP vector to the DC vector */
  58.     for ( i = 0 ; i < LpcOrder ; i ++ )
  59.         DecStat.PrevLsp[i] = LspDcTable[i] ;
  60.     /* Initialize the gain scaling unit memory to a constant */
  61.     DecStat.Gain = (Word16) 0x1000 ;
  62.     return;
  63. }
  64. /*
  65. **
  66. ** Function:        Decod()
  67. **
  68. ** Description:     Implements G.723 dual-rate decoder for  a frame
  69. **          of speech
  70. **
  71. ** Links to text:   Section 3
  72. **
  73. ** Arguments:
  74. **
  75. **  Word16 *DataBuff    Empty buffer
  76. **  Word16 Vinp[]       Encoded frame (22/26 bytes)
  77. **
  78. ** Outputs:
  79. **
  80. **  Word16 DataBuff[]   Decoded frame (480 bytes)
  81. **
  82. ** Return value:
  83. **
  84. **  Flag            Always True
  85. **
  86. */
  87. Flag    Decod( Word16 *DataBuff, char *Vinp, Word16 Crc )
  88. {
  89.     int   i,j   ;
  90.     Word32   Senr ;
  91.     Word16   QntLpc[SubFrames*LpcOrder] ;
  92.     Word16   AcbkCont[SubFrLen] ;
  93.     Word16   LspVect[LpcOrder] ;
  94.     Word16   Temp[PitchMax+Frame] ;
  95.     Word16  *Dpnt ;
  96.     LINEDEF  Line ;
  97.     PFDEF    Pf[SubFrames] ;
  98.     Word16   Ftyp;
  99.     /*
  100.     * Decode the packed bitstream for the frame.  (Text: Section 4;
  101.     * pars of sections 2.17, 2.18)
  102.     */
  103.     Line = Line_Unpk( Vinp, &Ftyp, Crc ) ;
  104.     /*
  105.     * Update the frame erasure count (Text: Section 3.10)
  106.     */
  107.     if ( Line.Crc != (Word16) 0 ) {
  108.         if(DecCng.PastFtyp == 1) Ftyp = 1;  /* active */
  109.         else Ftyp = 0;  /* untransmitted */
  110.     }
  111.     if(Ftyp != 1) {
  112.         /* Silence frame : do noise generation */
  113.         Dec_Cng(Ftyp, &Line, DataBuff, QntLpc);
  114.     }
  115.     else {
  116.         /*
  117.         * Update the frame erasure count (Text: Section 3.10)
  118.         */
  119.         if ( Line.Crc != (Word16) 0 )
  120.             DecStat.Ecount = add( DecStat.Ecount, (Word16) 1 ) ;
  121.         else
  122.             DecStat.Ecount = (Word16) 0 ;
  123.         if ( DecStat.Ecount > (Word16) ErrMaxNum )
  124.             DecStat.Ecount = (Word16) ErrMaxNum ;
  125.         /*
  126.         * Decode the LSP vector for subframe 3.  (Text: Section 3.2)
  127.         */
  128.         Lsp_Inq( LspVect, DecStat.PrevLsp, Line.LspId, Line.Crc ) ;
  129.         /*
  130.         * Interpolate the LSP vectors for subframes 0--2.  Convert the
  131.         * LSP vectors to LPC coefficients.  (Text: Section 3.3)
  132.         */
  133.         Lsp_Int( QntLpc, LspVect, DecStat.PrevLsp ) ;
  134.         /* Copy the LSP vector for the next frame */
  135.         for ( i = 0 ; i < LpcOrder ; i ++ )
  136.             DecStat.PrevLsp[i] = LspVect[i] ;
  137.         /*
  138.         * In case of no erasure, update the interpolation gain memory.
  139.         * Otherwise compute the interpolation gain (Text: Section 3.10)
  140.         */
  141.         if ( DecStat.Ecount == (Word16) 0 ) {
  142.             DecStat.InterGain = add( Line.Sfs[SubFrames-2].Mamp,
  143.                                             Line.Sfs[SubFrames-1].Mamp ) ;
  144.             DecStat.InterGain = shr( DecStat.InterGain, (Word16) 1 ) ;
  145.             DecStat.InterGain = FcbkGainTable[DecStat.InterGain] ;
  146.         }
  147.         else
  148.             DecStat.InterGain = mult_r( DecStat.InterGain, (Word16) 0x6000 ) ;
  149.         /*
  150.         * Generate the excitation for the frame
  151.         */
  152.         for ( i = 0 ; i < PitchMax ; i ++ )
  153.             Temp[i] = DecStat.PrevExc[i] ;
  154.         Dpnt = &Temp[PitchMax] ;
  155.         if ( DecStat.Ecount == (Word16) 0 ) {
  156.             for ( i = 0 ; i < SubFrames ; i ++ ) {
  157.                 /* Generate the fixed codebook excitation for a
  158.                    subframe. (Text: Section 3.5) */
  159.                 Fcbk_Unpk( Dpnt, Line.Sfs[i], Line.Olp[i>>1], (Word16) i ) ;
  160.                 /* Generate the adaptive codebook excitation for a
  161.                    subframe. (Text: Section 3.4) */
  162.                 Decod_Acbk( AcbkCont, &Temp[SubFrLen*i], Line.Olp[i>>1],
  163.                                     Line.Sfs[i].AcLg, Line.Sfs[i].AcGn ) ;
  164.                 /* Add the adaptive and fixed codebook contributions to
  165.                    generate the total excitation. */
  166.                 for ( j = 0 ; j < SubFrLen ; j ++ ) {
  167.                     Dpnt[j] = shl( Dpnt[j], (Word16) 1 ) ;
  168.                     Dpnt[j] = add( Dpnt[j], AcbkCont[j] ) ;
  169.                 }
  170.                 Dpnt += SubFrLen ;
  171.             }
  172.             /* Save the excitation */
  173.             for ( j = 0 ; j < Frame ; j ++ )
  174.                 DataBuff[j] = Temp[PitchMax+j] ;
  175.             /* Compute interpolation index. (Text: Section 3.10) */
  176.             /* Use DecCng.SidGain and DecCng.CurGain to store    */
  177.             /* excitation energy estimation                      */
  178.             DecStat.InterIndx = Comp_Info( Temp, Line.Olp[SubFrames/2-1],
  179.                                        &DecCng.SidGain, &DecCng.CurGain ) ;
  180.             /* Compute pitch post filter coefficients.  (Text: Section 3.6) */
  181.             if ( UsePf )
  182.                 for ( i = 0 ; i < SubFrames ; i ++ )
  183.                     Pf[i] = Comp_Lpf( Temp, Line.Olp[i>>1], (Word16) i ) ;
  184.             /* Reload the original excitation */
  185.             for ( j = 0 ; j < PitchMax ; j ++ )
  186.                 Temp[j] = DecStat.PrevExc[j] ;
  187.             for ( j = 0 ; j < Frame ; j ++ )
  188.                 Temp[PitchMax+j] = DataBuff[j] ;
  189.             /* Perform pitch post filtering for the frame.  (Text: Section
  190.                3.6) */
  191.             if ( UsePf )
  192.                 for ( i = 0 ; i < SubFrames ; i ++ )
  193.                     Filt_Lpf( DataBuff, Temp, Pf[i], (Word16) i ) ;
  194.             /* Save Lsps --> LspSid */
  195.             for(i=0; i< LpcOrder; i++)
  196.                 DecCng.LspSid[i] = DecStat.PrevLsp[i];
  197.         }
  198.         else {
  199.             /* If a frame erasure has occurred, regenerate the
  200.                signal for the frame. (Text: Section 3.10) */
  201.             Regen( DataBuff, Temp, DecStat.InterIndx, DecStat.InterGain,
  202.                                         DecStat.Ecount, &DecStat.Rseed ) ;
  203.         }
  204.         /* Update the previous excitation for the next frame */
  205.         for ( j = 0 ; j < PitchMax ; j ++ )
  206.             DecStat.PrevExc[j] = Temp[Frame+j] ;
  207.         /* Resets random generator for CNG */
  208.         DecCng.RandSeed = 12345;
  209.     }
  210.     /* Save Ftyp information for next frame */
  211.     DecCng.PastFtyp = Ftyp;
  212.     /*
  213.     * Synthesize the speech for the frame
  214.     */
  215.     Dpnt = DataBuff ;
  216.     for ( i = 0 ; i < SubFrames ; i ++ ) {
  217.         /* Compute the synthesized speech signal for a subframe.
  218.          * (Text: Section 3.7)
  219.          */
  220.         Synt( Dpnt, &QntLpc[i*LpcOrder] ) ;
  221.         if ( UsePf ) {
  222.             /* Do the formant post filter. (Text: Section 3.8) */
  223.             Senr = Spf( Dpnt, &QntLpc[i*LpcOrder] ) ;
  224.             /* Do the gain scaling unit.  (Text: Section 3.9) */
  225.             Scale( Dpnt, Senr ) ;
  226.         }
  227.         Dpnt += SubFrLen ;
  228.     }
  229.     return (Flag) True ;
  230. }