phi_gxit.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:12k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*====================================================================*/
  2. /*         MPEG-4 Audio (ISO/IEC 14496-3) Copyright Header            */
  3. /*====================================================================*/
  4. /*
  5. This software module was originally developed by Rakesh Taori and Andy
  6. Gerrits (Philips Research Laboratories, Eindhoven, The Netherlands) in
  7. the course of development of the MPEG-4 Audio (ISO/IEC 14496-3). This
  8. software module is an implementation of a part of one or more MPEG-4
  9. Audio (ISO/IEC 14496-3) tools as specified by the MPEG-4 Audio
  10. (ISO/IEC 14496-3). ISO/IEC gives users of the MPEG-4 Audio (ISO/IEC
  11. 14496-3) free license to this software module or modifications thereof
  12. for use in hardware or software products claiming conformance to the
  13. MPEG-4 Audio (ISO/IEC 14496-3). Those intending to use this software
  14. module in hardware or software products are advised that its use may
  15. infringe existing patents. The original developer of this software
  16. module and his/her company, the subsequent editors and their
  17. companies, and ISO/IEC have no liability for use of this software
  18. module or modifications thereof in an implementation. Copyright is not
  19. released for non MPEG-4 Audio (ISO/IEC 14496-3) conforming products.
  20. CN1 retains full right to use the code for his/her own purpose, assign
  21. or donate the code to a third party and to inhibit third parties from
  22. using the code for non MPEG-4 Audio (ISO/IEC 14496-3) conforming
  23. products.  This copyright notice must be included in all copies or
  24. derivative works. Copyright 1996.
  25. */
  26. /*====================================================================*/
  27. /*======================================================================*/
  28. /*                                                                      */
  29. /*      SOURCE_FILE:    PHI_GXIT.C                                      */
  30. /*      PACKAGE:        WDBxx                                           */
  31. /*      COMPONENT:      Excitation Generation Module                    */
  32. /*                                                                      */
  33. /*======================================================================*/
  34. /*======================================================================*/
  35. /*      I N C L U D E S                                                 */
  36. /*======================================================================*/
  37. #include <stdio.h>
  38. #include <stdlib.h>
  39. #include <math.h>
  40. #include <malloc.h> 
  41. #include <float.h>
  42. #include <assert.h>  
  43. #include "buffersHandle.h"       /* handler, defines, enums */
  44. #include "phi_cons.h"
  45. #include "bitstream.h"
  46. #include "lpc_common.h"
  47. #include "phi_gxit.h"
  48. #include "phi_xits.h"
  49. /*======================================================================*/
  50. /*       L O C A L    D A T A   D E C L A R A T I O N                   */
  51. /*======================================================================*/
  52. /*======================================================================*/
  53. /* Function Definition:  PHI_init_excitation_generation                 */
  54. /*======================================================================*/
  55. void 
  56. PHI_init_excitation_generation
  57. (
  58. const long max_lag,     /* In:Maximum permitted lag in the adaptive cbk */
  59. const long sbfrm_size,  /* In:Size of subframe in samples               */
  60. const long RPE_configuration, /* In:Confguration                        */
  61. PHI_PRIV_TYPE * PHI_Priv /* In/Out: private data (instance context)    */
  62. )
  63. {
  64.     int i;
  65.     
  66.     /* -----------------------------------------------------------------*/
  67.     /* Allocate memory for the adaptive Codebook                        */
  68.     /* -----------------------------------------------------------------*/
  69.     if(( PHI_Priv->PHI_adaptive_cbk = (float *)malloc((unsigned int)max_lag * sizeof(float))) == NULL )
  70.     {
  71. printf("MALLOC FAILURE in init_abs_excitation_analysis n");
  72. exit(1);
  73.     }
  74.     
  75.     /* -----------------------------------------------------------------*/
  76.     /* Initialise the adaptive codebook                                 */
  77.     /* -----------------------------------------------------------------*/
  78.     for (i = 0; i < (int)max_lag; i ++)
  79.     {
  80.          PHI_Priv->PHI_adaptive_cbk[i] = (float)0.0;
  81.     }
  82.     
  83.     /* -----------------------------------------------------------------*/
  84.     /* Set the excitation Parameters                                    */
  85.     /* -----------------------------------------------------------------*/
  86.         
  87.     PHI_Priv->PHI_D = 1;
  88.     
  89.     if ((RPE_configuration == 0) || (RPE_configuration == 1))
  90.     {
  91.          PHI_Priv->PHI_D = 8;
  92.     }
  93.     if (RPE_configuration == 2)
  94.     {
  95.          PHI_Priv->PHI_D = 5;
  96.     }
  97.     if (RPE_configuration == 3)
  98.     {
  99.          PHI_Priv->PHI_D = 4;
  100.     }
  101.     
  102.     PHI_Priv->PHI_Np = sbfrm_size/PHI_Priv->PHI_D;
  103. }
  104. /*======================================================================*/
  105. /* Function Definition: celp_excitation_generation                      */
  106. /*======================================================================*/
  107. void
  108. celp_excitation_generation
  109. (
  110.                                 /* -------------------------------------*/
  111.                                 /* INPUT PARAMETERS                     */
  112.                                 /* -------------------------------------*/
  113. unsigned long  shape_indices[], /* Lag indices for Adaptive & Fixed cbks*/
  114. unsigned long  gain_indices[],  /* Gains for Adaptive & Fixed cbks      */
  115. long  num_shape_cbks,           /* Number of shape codebooks            */
  116. long  num_gain_cbks,            /* Number of gain codebooks             */
  117. unsigned long  rms_index,       /* NOT USED HERE: RMS value subframe ?? */
  118. float int_Qlpc_coefficients[],  /* Interpolated LPC coeffs of subframe  */
  119. long  lpc_order,                /* Order of LPC                         */
  120. long  sbfrm_size,               /* In: Number of samples in the subframe*/
  121. long  n_subframes,              /* In: Number of subframes              */
  122. unsigned long  signal_mode,     /* In: Configuration Input              */
  123. long  frame_bit_allocation[],   /* In: Configuration Input              */
  124.                                 /* -------------------------------------*/
  125.                                 /* OUTPUT PARAMETERS                    */
  126.                                 /* -------------------------------------*/
  127. float excitation[],             /* Out: Excitation Signal               */
  128. long  *acb_delay,               /* NOT USED HERE: Pitch for post filter?*/
  129. float *adaptive_gain,            /* NOT USED HERE: ????                  */
  130. PHI_PRIV_TYPE * PHI_Priv        /* In/Out: private data (instance context)*/
  131. )
  132. {
  133.     float *acbk_contrib;
  134.     float *fcbk_contrib;
  135.     long  *amp;
  136.     float acbk_gain;
  137.     float fcbk_gain;
  138.     long  phase;
  139.     
  140.     /*==================================================================*/
  141.     /* Memory allocation for temporary arrays                           */
  142.     /*==================================================================*/
  143.     if
  144.     (  
  145.     (( fcbk_contrib = (float *)malloc((unsigned int)sbfrm_size * sizeof(float)))== NULL ) || 
  146.     (( acbk_contrib = (float *)malloc((unsigned int)sbfrm_size * sizeof(float)))== NULL ) ||
  147.     (( amp          = (long *) malloc((unsigned int)PHI_Priv->PHI_Np         * sizeof(long )))== NULL )
  148.    ) 
  149.     {
  150.        printf("ERROR: Malloc Failure in Block: Excitation Generation n");
  151.        exit(1);
  152.     }
  153.     /*==================================================================*/
  154.     /* Make sure the number of shape and gain codebooks is correct      */
  155.     /*==================================================================*/
  156.     if (num_shape_cbks != 2)
  157.     { 
  158.         fprintf(stderr, "Wrong number of shape codebooks in Block: Excitation Generationn");
  159.         exit(1);
  160.     }    
  161.     if (num_gain_cbks != 2)
  162.     { 
  163.         fprintf(stderr, "Wrong number of gain codebooks in Block: Excitation Generationn");
  164.         exit(1);
  165.     }    
  166.     /*==================================================================*/
  167.     /* We need to know which subframe we are in                         */
  168.     /*==================================================================*/
  169.     if (PHI_Priv->PHI_sfrm_ctr % n_subframes == 0)
  170.     {
  171.         PHI_Priv->PHI_sfrm_ctr = 0;
  172.     }
  173.    
  174.     /*==================================================================*/
  175.     /* Adptive-Codebook-Gain Decoding                                   */
  176.     /*==================================================================*/
  177.     PHI_DecodeAcbkGain((long)gain_indices[0], &acbk_gain);
  178.     /*==================================================================*/
  179.     /* Fixed-Codebook-Gain Decoding (This is dependent on the subframe) */
  180.     /*==================================================================*/
  181.     PHI_DecodeFcbkGain((long)gain_indices[1],  PHI_Priv->PHI_sfrm_ctr, PHI_Priv->PHI_prev_fcbk_gain, &fcbk_gain);
  182.     PHI_Priv->PHI_prev_fcbk_gain = fcbk_gain;
  183.    
  184.     /*==================================================================*/
  185.     /* Decode the phase and amplitudes of the RPE sequence              */
  186.     /*==================================================================*/
  187.     PHI_decode_cbf_amplitude_phase(PHI_Priv->PHI_Np, PHI_Priv->PHI_D, amp, &phase, (long)shape_indices[1]);
  188.     /*==================================================================*/
  189.     /* Compute the contribution of the Adaptive Codebook                */
  190.     /*==================================================================*/
  191.     PHI_calc_cba_excitation(sbfrm_size, Lmax, Lmin, PHI_Priv->PHI_adaptive_cbk, (long)shape_indices[0], acbk_contrib);
  192.     
  193.     /*==================================================================*/
  194.     /* Compute the contribution of the Fixed Codebook                   */
  195.     /*==================================================================*/
  196.     PHI_calc_cbf_excitation(sbfrm_size, PHI_Priv->PHI_Np, PHI_Priv->PHI_D, amp, phase, fcbk_contrib);
  197.    
  198.     /*==================================================================*/
  199.     /* Sum up the contributions of the codebooks to get the excitation  */
  200.     /*==================================================================*/
  201.     PHI_sum_excitations(sbfrm_size, acbk_gain, acbk_contrib, fcbk_gain, fcbk_contrib, excitation);
  202.     /*==================================================================*/
  203.     /* Update Adaptive Codebook                                         */
  204.     /*==================================================================*/
  205.     PHI_update_cba_memory(sbfrm_size, Lmax, PHI_Priv->PHI_adaptive_cbk, excitation);
  206.     /*==================================================================*/
  207.     /*   Update the subframe counter                                    */
  208.     /*==================================================================*/
  209.     PHI_Priv->PHI_sfrm_ctr++;
  210.     /*==================================================================*/
  211.     /*FREE temp states                                                 */
  212.     /*==================================================================*/
  213.    FREE(amp);
  214.    FREE(acbk_contrib);
  215.    FREE(fcbk_contrib);
  216.     
  217.     /*==================================================================*/
  218.     /* Return to main                                                   */
  219.     /*==================================================================*/
  220.     return;
  221. }
  222. /*======================================================================*/
  223. /* Function Definition: PHI_close_excitation_generation                 */
  224. /*======================================================================*/
  225. void PHI_close_excitation_generation(
  226.      PHI_PRIV_TYPE * PHI_Priv        /* In: private data (instance context)*/
  227. )
  228. {
  229.    FREE (PHI_Priv->PHI_adaptive_cbk);
  230. }
  231. /*======================================================================*/
  232. /*      H I S T O R Y                                                   */
  233. /*======================================================================*/
  234. /* 17-04-96 R. Taori  Initial Version                                   */
  235. /* 30-08-96 R. Taori  Modified interface to meet Tampere requirements   */