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

流媒体/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_LPC.C                                       */
  30. /*      PACKAGE:        WDBxx                                           */
  31. /*      COMPONENT:      Linear Prediction Subroutines                   */
  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 "bitstream.h"
  45. #include "phi_cons.h"  
  46. #include "phi_priv.h"
  47. #include "phi_lpc.h"
  48. #include "phi_lpcq.h"
  49. #include "phi_lsfr.h"
  50. #include "nec_abs_proto.h"
  51. #include "pan_celp_const.h"
  52. #include "pan_celp_proto.h"
  53. #include "att_proto.h"
  54. #include "nec_abs_const.h"
  55. #include "nec_lspnw20.tbl"
  56. #define NEC_PAI 3.141592
  57. #define NEC_LSPPRDCT_ORDER 4
  58. #define NEC_NUM_LSPSPLIT1 2
  59. #define NEC_NUM_LSPSPLIT2 4
  60. #define NEC_QLSP_CAND 2
  61. #define NEC_LSP_MINWIDTH_FRQ16 0.028
  62. #define NEC_MAX_LSPVQ_ORDER 20
  63. #define DEBUG_YM        /* flag for halting LPC analysis : '98/11/27 */
  64. /*======================================================================*/
  65. /*     L O C A L    F U N C T I O N S     P R O T O T Y P E S           */ 
  66. /*======================================================================*/
  67. /*======================================================================*/
  68. /*   Modified Panasonic/NEC functions                                   */
  69. /*======================================================================*/
  70. static void mod_nec_lsp_sort( float x[], long order , PHI_PRIV_TYPE *PHI_Priv);
  71. /*======================================================================*/
  72. static void mod_nec_psvq( float *, float *, float *,
  73.      long, long, float *, long *, long );
  74. /*======================================================================*/
  75. static void mod_nb_abs_lsp_quantizer (
  76.     float current_lsp[],      /* in: current LSP to be quantized */
  77.     float previous_Qlsp[],          /* In: previous Quantised LSP */
  78.     float current_Qlsp[],         /* out: quantized LSP */ 
  79.     long lpc_indices[],      /* out: LPC code indices */
  80.     long lpc_order,         /* in: order of LPC */
  81.     long num_lpc_indices,           /* in: number of LPC indices */
  82.     long n_lpc_analysis             /* in: number of LP analysis per frame */
  83. );
  84. /*======================================================================*/
  85. static void mod_nec_bws_lsp_quantizer(
  86.        float lsp[], /* input  */
  87.        float qlsp8[], /* input  */
  88.        float qlsp[], /* output  */
  89.        long indices[], /* output  */
  90.        long lpc_order, /* configuration input */
  91.        long lpc_order_8, /* configuration input */
  92.        long num_lpc_indices,  /* configuration input */
  93.        float blsp[NEC_LSPPRDCT_ORDER][NEC_MAX_LSPVQ_ORDER],
  94.        PHI_PRIV_TYPE *PHI_Priv       /* In/Out: PHI private data (instance context) */
  95. );
  96. /*======================================================================*/
  97. static void mod_nb_abs_lsp_decode(
  98.     unsigned long lpc_indices[],      /* in: LPC code indices */
  99.     float prev_Qlsp[],         /* in: previous LSP vector */
  100.     float current_Qlsp[],         /* out: quantized LSP vector */ 
  101.     long lpc_order,         /* in: order of LPC */
  102.     long num_lpc_indices            /* in: number of LPC indices */
  103. );        
  104. /*======================================================================*/
  105. static void mod_nec_bws_lsp_decoder(
  106.      unsigned long indices[], /* input  */
  107.      float qlsp8[], /* input  */
  108.      float qlsp[], /* output  */
  109.      long lpc_order, /* configuration input */
  110.      long lpc_order_8, /* configuration input */
  111.      long num_lpc_indices,   /* configuration input */
  112.      float blsp[NEC_LSPPRDCT_ORDER][NEC_MAX_LSPVQ_ORDER],
  113.      PHI_PRIV_TYPE *PHI_Priv /* In/Out: PHI private data (instance context) */
  114. );
  115. /*======================================================================*/
  116. static void mod_wb_celp_lsp_quantizer (
  117.     float current_lsp[],      /* in: current LSP to be quantized */
  118.     float previous_Qlsp[],          /* In: previous Quantised LSP */
  119.     float current_Qlsp[],         /* out: quantized LSP */ 
  120.     long lpc_indices[],      /* out: LPC code indices */
  121.     long lpc_order,         /* in: order of LPC */
  122.     long num_lpc_indices,           /* in: number of LPC indices */
  123.     long n_lpc_analysis             /* in: number of LP analysis per frame */
  124. );
  125. /*======================================================================*/
  126. static void mod_wb_celp_lsp_decode(
  127.     unsigned long lpc_indices[],      /* in: LPC code indices */
  128.     float prev_Qlsp[],         /* in: previous LSP vector */
  129.     float current_Qlsp[],         /* out: quantized LSP vector */ 
  130.     long lpc_order,         /* in: order of LPC */
  131.     long num_lpc_indices            /* in: number of LPC indices */
  132. );
  133. /*======================================================================*/
  134. /*   Function Prototype: PHI_Apar2Rfc                                   */
  135. /*======================================================================*/
  136. static void PHI_Apar2Rfc
  137. (
  138. int    P,               /* In:  LPC Order                               */
  139. float ap[],             /* In:  Polynomial coefficients [0..P-1]        */
  140. float rfc[]             /* Out: Reflection coefficients [0..P-1]        */
  141. );
  142. /*======================================================================*/
  143. /*   Function Prototype: PHI_Rfc2Apar                                   */
  144. /*======================================================================*/
  145. static void PHI_Rfc2Apar
  146. (
  147. int   P,                /* In:  LPC Order                               */
  148. float rq[],             /* In:  Reflection coefficients [0..P-1]        */
  149. float aq[]              /* Out: a-parameters [0..P-1]                   */   
  150. );
  151. /*======================================================================*/
  152. /*   Function Prototype: PHI_CalcAcf                                    */
  153. /*======================================================================*/
  154. static void PHI_CalcAcf
  155. (
  156. double sp_in[],         /* In:  Input segment [0..N-1]                  */
  157. double acf[],           /* Out: Autocorrelation coeffs [0..P]           */
  158. int N,                  /* In:  Number of samples in the segment        */ 
  159. int P                   /* In:  LPC Order                               */
  160. );
  161. /*======================================================================*/
  162. /*   Function Prototype: PHI_LevinsonDurbin                             */
  163. /*======================================================================*/
  164. static int PHI_LevinsonDurbin    /* Retun Value: 1 if unstable filter   */ 
  165. double acf[],           /* In:  Autocorrelation coeffs [0..P]           */         
  166. double apar[],          /* Out: Polynomial coeffciients  [0..P-1]       */           
  167. double rfc[],           /* Out: Reflection coefficients [0..P-1]        */
  168. int P,                  /* In:  LPC Order                               */
  169. double * E              /* Out: Residual energy at the last stage       */
  170. );
  171. /*======================================================================*/
  172. /*   Function Prototype: PHI_Rfc2Lar                                    */
  173. /*======================================================================*/
  174. static void PHI_Rfc2Lar
  175. (
  176. int   P,                /* In:  LPC Order                               */
  177. float rfc[],            /* In:  Array of reflection coeffs[0..P-1]      */
  178. float lar[]             /* Out: Array of log area ratios[0..P-1]        */
  179. );
  180. /*======================================================================*/
  181. /*   Function Prototype: PHI_Lar2Rfc                                    */
  182. /*======================================================================*/
  183. static int PHI_Lar2Rfc
  184. (
  185. int   P,                /* In:  LPC Order                               */
  186. float lar[],            /* In:  Array of log area ratios[0..P-1]        */
  187. float rfc[]             /* Out: Array of reflection coeffs[0..P-1]      */
  188. );
  189. /*======================================================================*/
  190. /*   Function Prototype: PHI_PackLpcCodes                               */
  191. /*======================================================================*/
  192. static void PHI_PackLpcCodes
  193. (
  194. const long  lpc_order,        /*In:  Order of LPC                       */
  195. const long  rfc_code[],       /*In:  Array of Refl. Coeffs[0..order-1]  */
  196. const long  pack_array_size,  /*In:  Array size after packing           */
  197.       long  packed_code[]     /*Out: Packed Array[0..pack_array-size-1] */
  198. );
  199. /*======================================================================*/
  200. /*   Function Prototype: PHI_UnpackLpcCodes                             */
  201. /*======================================================================*/
  202. static void PHI_UnpackLpcCodes
  203. (
  204. const long  lpc_order,        /*In:  Order of LPC                       */      
  205.       long  rfc_code[],       /*Out: Array of Refl. Coeffs[0..order-1]  */
  206. const long  pack_array_size,  /*In:  Array size after packing           */
  207. const long  packed_code[]     /*In:  Packed Array[0..pack_array-size-1] */
  208. );
  209. /*======================================================================*/
  210. /*   Function Prototype: PHI_lpc_analysis                               */
  211. /*======================================================================*/
  212. void PHI_lpc_analysis
  213. (
  214. float PP_InputSignal[],         /* In:  Input Signal                    */
  215. float lpc_coefficients[],       /* Out: LPC Coefficients[0..lpc_order-1]*/
  216. float *first_order_lpc_par,     /* Out: a_parameter for 1st-order fit   */
  217. long  frame_size,               /* In:  Number of samples in frame      */
  218. float  HamWin[],                /* In:  Hamming Window                  */
  219. long  window_offset,            /* In:  offset for window w.r.t curr. fr*/
  220. long  window_size,              /* In:  LPC Analysis-Window Size        */
  221. float gamma_be[],               /* In:  Bandwidth expansion coeffs.     */
  222. long  lpc_order                 /* In:  Order of LPC                    */
  223. );
  224. /*======================================================================*/
  225. /*   Function Definition:PHI_InitLpcAnalysisEncoder                     */
  226. /*======================================================================*/
  227. void PHI_InitLpcAnalysisEncoder
  228. (
  229. long  win_size[],               /* In:  LPC Analysis-Window Size        */
  230. long  n_lpc_analysis,           /* In:  Numberof LPC Analysis Frame     */
  231. long  order,                    /* In:  Order of LPC                    */
  232. long  order_8,                  /* In:  Order of LPC                    */
  233. float gamma_be,                 /* In:  Bandwidth Expansion Coefficient */
  234. long  bit_rate,                 /* In:  Bit Rate                        */
  235. long  sampling_frequency,       /* In:  Sampling Frequency              */
  236. long  SampleRateMode,           /* In:  SampleRateMode                  */ 
  237. long  frame_size,               /* In:  Frame Size                      */
  238. long  num_lpc_indices,          /* In:  Number of LPC indices           */  
  239. long  n_subframes,              /* In:  Number of subframes             */
  240. long  num_shape_cbks,           /* In:  Number of Shape Codebooks       */
  241. long  num_gain_cbks,            /* In:  Number of Gain Codebooks        */
  242. long  frame_bit_allocation[],   /* In:  Frame bit allocation            */
  243. long num_indices,
  244. long QuantizationMode,
  245. PHI_PRIV_TYPE *PHI_Priv /* In/Out: PHI private data (instance context) */
  246. )
  247. {
  248.     int     x;
  249.     int i,j;
  250.     /* -----------------------------------------------------------------*/
  251.     /* Create Arrays for Hamming Window and gamma array                 */
  252.     /* -----------------------------------------------------------------*/
  253.     if
  254.     (
  255.     (( PHI_Priv->PHI_mem_i = (float *)malloc((unsigned int)order * sizeof(float))) == NULL ) ||
  256.     (( PHI_Priv->PHI_current_lar = (float *)malloc((unsigned int)order * sizeof(float))) == NULL )||
  257.     (( PHI_Priv->PHI_prev_lar = (float *)malloc((unsigned int)order * sizeof(float))) == NULL )||
  258.     (( PHI_Priv->PHI_prev_indices = (long *)malloc((unsigned int)order * sizeof(long))) == NULL )
  259.    )
  260.     {
  261. printf("MALLOC FAILURE in Routine InitLpcAnalysis n");
  262. exit(1);
  263.     }
  264.     
  265.     /* -----------------------------------------------------------------*/
  266.     /* Create Array for Quantiser BLSP                                  */
  267.     /* -----------------------------------------------------------------*/
  268.     for ( i = 0; i < NEC_LSPPRDCT_ORDER; i++ ) 
  269.     {
  270.        for ( j = 0; j < (int)order; j++ ) 
  271.        {
  272.        if ( j >= (int)(order/2) )
  273.            PHI_Priv->blsp_previous[i][j]=(float)NEC_PAI/(float)(order+1)*(j+1);
  274.       else
  275.            PHI_Priv->blsp_previous[i][j]=(float)0.0;
  276.         }
  277.     }
  278.     
  279.     
  280.     /* -----------------------------------------------------------------*/
  281.     /* Create Array for Quantiser (narrowband)                          */
  282.     /* -----------------------------------------------------------------*/
  283.     if((PHI_Priv->previous_q_lsf_8=(float *)calloc(order_8, sizeof(float)))==NULL) {
  284.        printf("n memory allocation error in initialization_encodern");
  285.        exit(1);
  286.     }
  287.     for(i=0;i<order_8;i++) 
  288.        *(PHI_Priv->previous_q_lsf_8+i) = ((i+1)/(float)((order_8)+1))*PAN_PI;
  289.     if((PHI_Priv->current_q_lsf_8=(float *)calloc(order_8, sizeof(float)))==NULL) {
  290.       printf("n memory allocation error in initialization_encodern");
  291.        exit(1);
  292.     }
  293.     for(i=0;i<order_8;i++) 
  294.          *(PHI_Priv->current_q_lsf_8+i) = ((i+1)/(float)((order_8)+1))*PAN_PI;
  295.     if((PHI_Priv->next_q_lsf_8=(float *)calloc(order_8, sizeof(float)))==NULL) {
  296.      printf("n memory allocation error in initialization_encodern");
  297.        exit(1);
  298.     }
  299.     for(i=0;i<order_8;i++) 
  300.         *(PHI_Priv->next_q_lsf_8+i) = ((i+1)/(float)((order_8)+1))*PAN_PI;
  301.     if((PHI_Priv->previous_uq_lsf_8=(float *)calloc(order_8, sizeof(float)))==NULL) {
  302.       printf("n memory allocation error in initialization_encodern");
  303.        exit(1);
  304.     }
  305.     for(i=0;i<order_8;i++) 
  306.         *(PHI_Priv->previous_uq_lsf_8+i) = ((i+1)/(float)((order_8)+1))*PAN_PI;
  307.     if((PHI_Priv->current_uq_lsf_8=(float *)calloc(order_8, sizeof(float)))==NULL) {
  308.       printf("n memory allocation error in initialization_encodern");
  309.        exit(1);
  310.     }
  311.     for(i=0;i<order_8;i++) 
  312.         *(PHI_Priv->current_uq_lsf_8+i) = ((i+1)/(float)((order_8)+1))*PAN_PI;
  313.     if((PHI_Priv->next_uq_lsf_8=(float *)calloc(order_8, sizeof(float)))==NULL) {
  314.       printf("n memory allocation error in initialization_encodern");
  315.        exit(1);
  316.     }
  317.     for(i=0;i<order_8;i++) 
  318.      *(PHI_Priv->next_uq_lsf_8+i) = ((i+1)/(float)((order_8)+1))*PAN_PI;
  319.     if((PHI_Priv->previous_q_lsf_int_8=(float *)calloc(order_8, sizeof(float)))==NULL) {
  320.       printf("n memory allocation error in initialization_encodern");
  321.        exit(1);
  322.     }
  323.     for(i=0;i<order_8;i++) 
  324.         *(PHI_Priv->previous_q_lsf_int_8+i) = ((i+1)/(float)((order_8)+1)) * PAN_PI;
  325.     /* -----------------------------------------------------------------*/
  326.     /* Create Array for Quantiser (wideband)                            */
  327.     /* -----------------------------------------------------------------*/
  328.      if((PHI_Priv->previous_q_lsf_int_16=(float *)calloc(order, sizeof(float)))==NULL) {
  329.        printf("n memory allocation error in initialization_encodern");
  330.        exit(1);
  331.     }
  332.     for(i=0;i<order;i++) 
  333.        *(PHI_Priv->previous_q_lsf_int_16+i) = ((i+1)/(float)((order)+1)) * PAN_PI;
  334.      if((PHI_Priv->previous_q_lsf_16=(float *)calloc(order, sizeof(float)))==NULL) {
  335.        printf("n memory allocation error in initialization_encodern");
  336.        exit(1);
  337.     }
  338.     for(i=0;i<order;i++) 
  339.          *(PHI_Priv->previous_q_lsf_16+i) = ((i+1)/(float)((order)+1)) * PAN_PI;
  340.      if((PHI_Priv->current_q_lsf_16=(float *)calloc(order, sizeof(float)))==NULL) {
  341.        printf("n memory allocation error in initialization_encodern");
  342.        exit(1);
  343.     }
  344.     for(i=0;i<order;i++) 
  345.         *(PHI_Priv->current_q_lsf_16+i) = ((i+1)/(float)((order)+1)) * PAN_PI;
  346.     if((PHI_Priv->next_q_lsf_16=(float *)calloc(order, sizeof(float)))==NULL) {
  347.        printf("n memory allocation error in initialization_encodern");
  348.        exit(1);
  349.     }
  350.     for(i=0;i<order;i++) 
  351.         *(PHI_Priv->next_q_lsf_16+i) = ((i+1)/(float)((order)+1)) * PAN_PI;
  352.     if((PHI_Priv->previous_uq_lsf_16=(float *)calloc(order, sizeof(float)))==NULL) {
  353.        printf("n memory allocation error in initialization_encodern");
  354.        exit(1);
  355.     }
  356.     for(i=0;i<order;i++) 
  357.         *(PHI_Priv->previous_uq_lsf_16+i) = ((i+1)/(float)((order)+1)) * PAN_PI;
  358.     if((PHI_Priv->current_uq_lsf_16=(float *)calloc(order, sizeof(float)))==NULL) {
  359.        printf("n memory allocation error in initialization_encodern");
  360.        exit(1);
  361.     }
  362.     for(i=0;i<order;i++) 
  363.       *(PHI_Priv->current_uq_lsf_16+i) = ((i+1)/(float)((order)+1)) * PAN_PI;
  364.     if((PHI_Priv->next_uq_lsf_16=(float *)calloc(order, sizeof(float)))==NULL) {
  365.        printf("n memory allocation error in initialization_encodern");
  366.        exit(1);
  367.     }
  368.     for(i=0;i<order;i++) 
  369.         *(PHI_Priv->next_uq_lsf_16+i) = ((i+1)/(float)((order)+1)) * PAN_PI;
  370.     
  371.     /* -----------------------------------------------------------------*/       
  372.     /* Initialise arrays                                                */
  373.     /* -----------------------------------------------------------------*/
  374.     for(x=0; x < (int)order; x++)
  375.     {
  376. PHI_Priv->PHI_mem_i[x] = PHI_Priv->PHI_prev_lar[x] = PHI_Priv->PHI_current_lar[x] = (float)0.0;
  377. PHI_Priv->PHI_prev_indices[x] = (long)(21 - PHI_tbl_rfc_range[0][x]);
  378.     }
  379.     /* -----------------------------------------------------------------*/       
  380.     /* Initialise variables for dynamic threshold                       */
  381.     /* -----------------------------------------------------------------*/
  382.     {         
  383. long bits_frame;
  384. float per_lpc;
  385. long k;
  386. /* ------------------------------------------------------------*/
  387. /* Determine length of LPC frames and no LPC frames            */
  388. /* ------------------------------------------------------------*/
  389. PHI_Priv->PHI_MAX_BITS = 0;
  390. for (k = 0; k < (2 + num_lpc_indices + n_subframes*(num_shape_cbks+num_gain_cbks)); k++)
  391. {
  392. PHI_Priv->PHI_MAX_BITS += frame_bit_allocation[k];
  393. }
  394. PHI_Priv->PHI_MIN_BITS = PHI_Priv->PHI_MAX_BITS;
  395. for (k = 0; k < num_lpc_indices; k++)
  396. {
  397. PHI_Priv->PHI_MIN_BITS -= frame_bit_allocation[k+2];
  398. }
  399. PHI_Priv->PHI_FR = ((float)frame_size / (float)sampling_frequency);
  400. /*-------------------------------------------------------------*/
  401.         /* How many bits per frame are needed to achieve fixed bit rate*/
  402.         /* equal to what user has input                                */
  403.         /*-------------------------------------------------------------*/
  404.         
  405. bits_frame = (long)((float)bit_rate * PHI_Priv->PHI_FR + 0.5F);
  406. /* ------------------------------------------------------------*/       
  407. /*   Store desired bit rate                                    */
  408. /* ------------------------------------------------------------*/       
  409. PHI_Priv->PHI_desired_bit_rate = (long) ((float) bits_frame / PHI_Priv->PHI_FR + 0.5F);
  410. PHI_Priv->PHI_actual_bits = 0;
  411.       
  412.          /*-------------------------------------------------------------*/
  413.          /* Needed %-lpc to get the desired bit rate                    */
  414.          /*-------------------------------------------------------------*/
  415.          per_lpc = ((float)(bits_frame-PHI_Priv->PHI_MIN_BITS))/((float)(PHI_Priv->PHI_MAX_BITS-PHI_Priv->PHI_MIN_BITS));
  416.          /*-------------------------------------------------------------*/
  417.          /*  Choose initial value for distance threshold                */
  418.          /*-------------------------------------------------------------*/
  419.          if (per_lpc < 0.51F)
  420.          {
  421.               PHI_Priv->PHI_dyn_lpc_thresh = 1.0F;
  422.          }
  423.          else
  424.          if (per_lpc < 0.6F)
  425.          {
  426.               PHI_Priv->PHI_dyn_lpc_thresh = 0.25F;   
  427.          }
  428.          else
  429.          if (per_lpc < 0.75F)
  430.          {
  431.                PHI_Priv->PHI_dyn_lpc_thresh = 0.15F;   
  432.          }
  433.          else
  434.          if (per_lpc < 0.85F)
  435.          {
  436.               PHI_Priv->PHI_dyn_lpc_thresh = 0.1F;   
  437.          }
  438.          else
  439.          if (per_lpc < 0.97F)
  440.          {
  441.              PHI_Priv->PHI_dyn_lpc_thresh = 0.05F;   
  442.          }
  443.          else
  444.          {
  445.               PHI_Priv->PHI_dyn_lpc_thresh = 0.0F;   
  446.          }
  447.          
  448.          
  449.          /*-------------------------------------------------------------*/
  450.          /*  Compute number of frames per second                        */
  451.          /*-------------------------------------------------------------*/
  452.          PHI_Priv->PHI_FRAMES = (long)((float)sampling_frequency/(float)frame_size + 0.5F);
  453.          /*-------------------------------------------------------------*/
  454.          /*  Determine the stop threshold                               */
  455.          /*-------------------------------------------------------------*/
  456.         
  457.          PHI_Priv->PHI_stop_threshold = (float)0.35;
  458.         
  459.     }
  460. }
  461. /*======================================================================*/
  462. /*   Function Definition:PAN_InitLpcAnalysisEncoder                     */
  463. /*     Nov. 07 96  - Added for narrowband coder                         */
  464. /*======================================================================*/
  465. void PAN_InitLpcAnalysisEncoder
  466. (
  467. long  win_size[],               /* In:  LPC Analysis-Window Size        */
  468. long  n_lpc_analysis,           /* In:  Numberof LPC Analysis Frame     */
  469. long  order,                    /* In:  Order of LPC                    */
  470. float gamma_be,                 /* In:  Bandwidth Expansion Coefficient */
  471. long  bit_rate,                 /* In:  Bit Rate                        */
  472. PHI_PRIV_TYPE *PHI_Priv /* In/Out: PHI private data (instance context) */
  473. )
  474. {
  475.     
  476.     /* -----------------------------------------------------------------*/
  477.     /* Create Arrays for Hamming Window and gamma array                 */
  478.     /* -----------------------------------------------------------------*/
  479.     if
  480.     (
  481.     (( PHI_Priv->PHI_mem_i = (float *)malloc((unsigned int)order * sizeof(float))) == NULL)
  482.     )
  483.     {
  484. printf("MALLOC FAILURE in Routine InitLpcAnalysis n");
  485. exit(1);
  486.     }
  487. }
  488. /*======================================================================*/
  489. /*   Function Definition:PHI_InitLpcAnalysisDecoder                     */
  490. /*======================================================================*/
  491. void PHI_InitLpcAnalysisDecoder
  492. (
  493. long  order,                   /* In:  Order of LPC                    */
  494. long  order_8,                  /* In:  Order of LPC                    */
  495. PHI_PRIV_TYPE *PHI_Priv /* In/Out: PHI private data (instance context) */
  496. )
  497. {
  498.     int     x;
  499.     int     i,j ;
  500.        
  501.     /* -----------------------------------------------------------------*/
  502.     /* Create Arrays for lars in the decoder                            */
  503.     /* -----------------------------------------------------------------*/
  504.     if
  505.     (
  506.     (( PHI_Priv->PHI_mem_s = (float *)malloc((unsigned int)order * sizeof(float))) == NULL ) ||
  507.     (( PHI_Priv->PHI_dec_current_lar = (float *)malloc((unsigned int)order * sizeof(float))) == NULL )||
  508.     (( PHI_Priv->PHI_dec_prev_lar = (float *)malloc((unsigned int)order * sizeof(float))) == NULL )
  509.     )
  510.     {
  511. printf("MALLOC FAILURE in Routine InitLpcAnalysis n");
  512. exit(1);
  513.     }
  514.     /* -----------------------------------------------------------------*/
  515.     /* Create Array for Quantiser BLSP                                  */
  516.     /* -----------------------------------------------------------------*/
  517.     for ( i = 0; i < NEC_LSPPRDCT_ORDER; i++ ) 
  518.     {
  519.        for ( j = 0; j < (int)order; j++ ) 
  520.        {
  521.        if ( j >= (int)(order/2) )
  522.            PHI_Priv->blsp_dec[i][j]=(float)NEC_PAI/(float)(order+1)*(j+1);
  523.       else
  524.            PHI_Priv->blsp_dec[i][j]=(float)0.0;
  525.        }
  526.     }
  527.     
  528.     /* -----------------------------------------------------------------*/
  529.     /* Create Array for Quantiser (narrowband)                          */
  530.     /* -----------------------------------------------------------------*/
  531.     if((PHI_Priv->previous_q_lsf_8_dec=(float *)calloc(order_8, sizeof(float)))==NULL) {
  532.        printf("n memory allocation error in initialization_encodern");
  533.        exit(1);
  534.     }
  535.     
  536.     for(i=0;i<order_8;i++) 
  537.        *(PHI_Priv->previous_q_lsf_8_dec+i) = ((i+1)/(float)((order_8)+1))*PAN_PI;
  538.     if((PHI_Priv->current_q_lsf_8_dec=(float *)calloc(order_8, sizeof(float)))==NULL) {
  539.        printf("n memory allocation error in initialization_encodern");
  540.        exit(1);
  541.     }
  542.     for(i=0;i<order_8;i++) 
  543.        *(PHI_Priv->current_q_lsf_8_dec+i) = ((i+1)/(float)((order_8)+1))*PAN_PI;
  544.     if((PHI_Priv->next_q_lsf_8_dec=(float *)calloc(order_8, sizeof(float)))==NULL) {
  545.        printf("n memory allocation error in initialization_encodern");
  546.        exit(1);
  547.     }
  548.     for(i=0;i<order_8;i++) 
  549.        *(PHI_Priv->next_q_lsf_8_dec+i) = ((i+1)/(float)((order_8)+1))*PAN_PI;
  550.     
  551.    
  552.     /* -----------------------------------------------------------------*/
  553.     /* Create Array for Quantiser (wideband)                            */
  554.     /* -----------------------------------------------------------------*/
  555.   
  556.     if((PHI_Priv->previous_q_lsf_16_dec=(float *)calloc(order, sizeof(float)))==NULL) {
  557.        printf("n memory allocation error in initialization_encodern");
  558.        exit(1);
  559.     }
  560.     for(i=0;i<order;i++) 
  561.        *(PHI_Priv->previous_q_lsf_16_dec+i) = ((i+1)/(float)((order)+1)) * PAN_PI;
  562.     if((PHI_Priv->current_q_lsf_16_dec=(float *)calloc(order, sizeof(float)))==NULL) {
  563.        printf("n memory allocation error in initialization_encodern");
  564.        exit(1);
  565.     }
  566.     for(i=0;i<order;i++) 
  567.        *(PHI_Priv->current_q_lsf_16_dec+i) = ((i+1)/(float)((order)+1)) * PAN_PI;
  568.     if((PHI_Priv->next_q_lsf_16_dec=(float *)calloc(order, sizeof(float)))==NULL) {
  569.        printf("n memory allocation error in initialization_encodern");
  570.        exit(1);
  571.     }
  572.     for(i=0;i<order;i++) 
  573.        *(PHI_Priv->next_q_lsf_16_dec+i) = ((i+1)/(float)((order)+1)) * PAN_PI;
  574.    
  575.        
  576.     /* -----------------------------------------------------------------*/       
  577.     /* Initialise arrays                                                */
  578.     /* -----------------------------------------------------------------*/
  579.     for(x=0; x < (int)order; x++)
  580.     {
  581.         PHI_Priv->PHI_mem_s[x] = PHI_Priv->PHI_dec_prev_lar[x] = PHI_Priv->PHI_dec_current_lar[x] = (float)0.0;
  582.     }    
  583. }
  584. /*======================================================================*/
  585. /* Function Definition: PHI_FreeLpcAnalysisEncoder                      */
  586. /*======================================================================*/
  587. void PHI_FreeLpcAnalysisEncoder
  588. (
  589. long n_lpc_analysis,
  590. PHI_PRIV_TYPE *PHI_Priv /* In/Out: PHI private data (instance context) */
  591. )
  592. {
  593.     /* -----------------------------------------------------------------*/
  594.     /*FREE the arrays that were malloc'd                               */
  595.     /* -----------------------------------------------------------------*/
  596.     
  597.   FREE(PHI_Priv->next_uq_lsf_16);
  598.   FREE(PHI_Priv->current_uq_lsf_16);
  599.   FREE(PHI_Priv->previous_uq_lsf_16);
  600.   FREE(PHI_Priv->next_q_lsf_16);
  601.   FREE(PHI_Priv->current_q_lsf_16);
  602.   FREE(PHI_Priv->previous_q_lsf_16);
  603.   FREE(PHI_Priv->previous_q_lsf_int_16);
  604.   FREE(PHI_Priv->previous_q_lsf_int_8);
  605.   FREE(PHI_Priv->next_uq_lsf_8);
  606.   FREE(PHI_Priv->current_uq_lsf_8);
  607.   FREE(PHI_Priv->previous_uq_lsf_8);
  608.   FREE(PHI_Priv->next_q_lsf_8);
  609.   FREE(PHI_Priv->current_q_lsf_8);
  610.   FREE(PHI_Priv->previous_q_lsf_8);
  611.   FREE(PHI_Priv->PHI_mem_i);
  612.   FREE(PHI_Priv->PHI_prev_lar);
  613.   FREE(PHI_Priv->PHI_prev_indices);
  614.   FREE(PHI_Priv->PHI_current_lar);
  615. }
  616. /*======================================================================*/
  617. /* Function Definition: PAN_FreeLpcAnalysisEncoder                      */
  618. /*     Nov. 07 96  - Added for narrowband coder                         */
  619. /*======================================================================*/
  620. void PAN_FreeLpcAnalysisEncoder
  621. (
  622. long n_lpc_analysis,
  623. PHI_PRIV_TYPE *PHI_Priv /* In/Out: PHI private data (instance context) */
  624. )
  625. {
  626.     /* -----------------------------------------------------------------*/
  627.     /*FREE the arrays that were malloc'd                               */
  628.     /* -----------------------------------------------------------------*/
  629.   FREE(PHI_Priv->PHI_mem_i);
  630. }
  631. /*======================================================================*/
  632. /* Function Definition: PHI_FreeLpcAnalysisDecoder                      */
  633. /*======================================================================*/
  634. void PHI_FreeLpcAnalysisDecoder
  635. (
  636. PHI_PRIV_TYPE *PHI_Priv /* In/Out: PHI private data (instance context) */
  637. )
  638. {
  639.     /* -----------------------------------------------------------------*/
  640.     /*FREE the arrays that were malloc'd                               */
  641.     /* -----------------------------------------------------------------*/
  642.      
  643.   FREE(PHI_Priv->next_q_lsf_16_dec);
  644.   FREE(PHI_Priv->current_q_lsf_16_dec);
  645.   FREE(PHI_Priv->previous_q_lsf_16_dec);
  646.   FREE(PHI_Priv->next_q_lsf_8_dec);
  647.   FREE(PHI_Priv->current_q_lsf_8_dec);
  648.   FREE(PHI_Priv->previous_q_lsf_8_dec);
  649.   FREE(PHI_Priv->PHI_mem_s);
  650.   FREE(PHI_Priv->PHI_dec_prev_lar);
  651.   FREE(PHI_Priv->PHI_dec_current_lar);
  652. }
  653.  
  654. /*======================================================================*/
  655. /*   Function Definition:celp_lpc_analysis                              */
  656. /*======================================================================*/
  657. void celp_lpc_analysis
  658. (
  659. float PP_InputSignal[],         /* In:  Input Signal                    */
  660. float lpc_coefficients[],       /* Out: LPC Coefficients[0..lpc_order-1]*/
  661. float *first_order_lpc_par,     /* Out: a_parameter for 1st-order fit   */
  662. long  frame_size,               /* In:  Number of samples in frame      */
  663. long  window_offsets[],         /* In:  offset for window w.r.t curr. fr*/
  664. long  window_sizes[],           /* In:  LPC Analysis-Window Size        */
  665. float *windows[],               /* In:  Array of LPC Analysis windows   */
  666. float gamma_be[],               /* In:  Bandwidth expansion coefficients*/
  667. long  lpc_order,                /* In:  Order of LPC                    */
  668. long  n_lpc_analysis            /* In:  Number of LP analysis/frame     */
  669. )
  670. {
  671.     int i;
  672.     
  673.     
  674.     for(i = 0; i < (int)n_lpc_analysis; i++)
  675.     {
  676.          PHI_lpc_analysis(PP_InputSignal,lpc_coefficients+lpc_order*(long)i, 
  677.              first_order_lpc_par,
  678.              frame_size, windows[i], window_offsets[i], window_sizes[i],
  679.              gamma_be,
  680.              lpc_order); 
  681.     }
  682. }
  683. /*======================================================================*/
  684. /*   Function Definition:PHI_lpc_analysis                               */
  685. /*======================================================================*/
  686. void PHI_lpc_analysis
  687. (
  688. float PP_InputSignal[],         /* In:  Input Signal                    */
  689. float lpc_coefficients[],       /* Out: LPC Coefficients[0..lpc_order-1]*/
  690. float *first_order_lpc_par,     /* Out: a_parameter for 1st-order fit   */
  691. long  frame_size,               /* In:  Number of samples in frame      */
  692. float HamWin[],                 /* In:  Hamming Window                  */
  693. long  window_offset,            /* In:  offset for window w.r.t curr. fr*/
  694. long  window_size,              /* In:  LPC Analysis-Window Size        */
  695. float gamma_be[],               /* In:  Bandwidth expansion coeffs.     */
  696. long  lpc_order                 /* In:  Order of LPC                    */
  697. )
  698. {
  699.     /*------------------------------------------------------------------*/
  700.     /*    Volatile Variables                                            */
  701.     /* -----------------------------------------------------------------*/
  702.     double *acf;                 /* For Autocorrelation Function        */
  703.     double *reflection_coeffs;   /* For Reflection Coefficients         */
  704.     double *LpcAnalysisBlock;    /* For Windowed Input Signal           */
  705.     double *apars;               /* a-parameters of double precision    */
  706.     int k;
  707.  
  708.     /*------------------------------------------------------------------*/
  709.     /* Allocate space for lpc, acf, a-parameters and rcf                */
  710.     /*------------------------------------------------------------------*/
  711.     if 
  712.     (
  713.     (( reflection_coeffs = (double *)malloc((unsigned int)lpc_order * sizeof(double))) == NULL ) ||
  714.     (( acf = (double *)malloc((unsigned int)(lpc_order + 1) * sizeof(double))) == NULL ) ||
  715.     (( apars = (double *)malloc((unsigned int)(lpc_order) * sizeof(double))) == NULL )  ||
  716.     (( LpcAnalysisBlock = (double *)malloc((unsigned int)window_size * sizeof(double))) == NULL )
  717.     )
  718.     {
  719. printf("MALLOC FAILURE in Routine abs_lpc_analysis n");
  720. exit(1);
  721.     }
  722.     
  723.     /*------------------------------------------------------------------*/
  724.     /* Windowing of the input signal                                    */
  725.     /*------------------------------------------------------------------*/
  726.     for(k = 0; k < (int)window_size; k++)
  727.     {
  728.         LpcAnalysisBlock[k] = (double)PP_InputSignal[k + (int)window_offset] * (double)HamWin[k];
  729.     }    
  730.     /*------------------------------------------------------------------*/
  731.     /* Compute Autocorrelation                                          */
  732.     /*------------------------------------------------------------------*/
  733.     PHI_CalcAcf(LpcAnalysisBlock, acf, (int)window_size, (int)lpc_order);
  734.     /*------------------------------------------------------------------*/
  735.     /* Levinson Recursion                                               */
  736.     /*------------------------------------------------------------------*/
  737.     {
  738.          double Energy = 0.0;
  739.      
  740.          PHI_LevinsonDurbin(acf, apars, reflection_coeffs,(int)lpc_order,&Energy);  
  741.     }  
  742.     
  743.     /*------------------------------------------------------------------*/
  744.     /* First-Order LPC Fit                                              */
  745.     /*------------------------------------------------------------------*/
  746.     *first_order_lpc_par = (float)reflection_coeffs[0];
  747.     /*------------------------------------------------------------------*/
  748.     /* Bandwidth Expansion                                              */
  749.     /*------------------------------------------------------------------*/    
  750.     for(k = 0; k < (int)lpc_order; k++)
  751.     {
  752.         lpc_coefficients[k] = (float)apars[k] * gamma_be[k];
  753.     }    
  754.     /*------------------------------------------------------------------*/
  755.     /*FREE the arrays that were malloced                               */
  756.     /*------------------------------------------------------------------*/
  757.   FREE(LpcAnalysisBlock);
  758.   FREE(reflection_coeffs);
  759.   FREE(acf);
  760.   FREE(apars);
  761. }
  762. /*======================================================================*/
  763. /*   Function Definition:VQ_celp_lpc_decode                             */
  764. /*======================================================================*/
  765. void VQ_celp_lpc_decode
  766. (
  767. unsigned long  lpc_indices[],  /* In: Received Packed LPC Codes         */
  768. float int_Qlpc_coefficients[], /* Out: Qaunt/interpolated a-pars        */
  769. long  lpc_order,               /* In:  Order of LPC                     */
  770. long  num_lpc_indices,         /* In:  Number of packes LPC codes       */
  771. long  n_subframes,             /* In:  Number of subframes              */
  772. unsigned long interpolation_flag, /* In:  Was interpolation done?          */
  773. long  Wideband_VQ,             /* In:  Wideband VQ switch               */
  774. PHI_PRIV_TYPE *PHI_Priv /* In/Out: PHI private data (instance context) */
  775. )
  776. {
  777.     if (lpc_order == ORDER_LPC_8)
  778.     {   /*   8 khz  */
  779.      float *int_lsf;
  780.      int   s,k;
  781.      float *tmp_lpc_coefficients;
  782.      /*------------------------------------------------------------------*/
  783.      /* Allocate space for current_rfc and current lar                   */
  784.      /*------------------------------------------------------------------*/
  785.      if 
  786.      (
  787.      (( int_lsf = (float *)malloc((unsigned int)lpc_order * sizeof(float))) == NULL )
  788.      )
  789.      {
  790. printf("MALLOC FAILURE in Routine abs_lpc_quantizer n");
  791. exit(1);
  792.      }
  793.      if((tmp_lpc_coefficients=(float *)calloc(lpc_order+1, sizeof(float)))==NULL) {
  794. printf("n Memory allocation error in abs_lpc_quantizern");
  795. exit(4);
  796. }
  797.      if (interpolation_flag)
  798.      {
  799.      /*----------------------------------------------------------*/
  800.      /* Compute LSP coeffs of the next frame                     */
  801.      /*----------------------------------------------------------*/
  802.    mod_nb_abs_lsp_decode(lpc_indices, PHI_Priv->previous_q_lsf_8_dec,
  803.                     PHI_Priv->next_q_lsf_8_dec, lpc_order, 5);
  804.      /*------------------------------------------------------------------*/
  805.      /* Interpolate LSP coeffs to obtain coeficients of cuurent frame    */
  806.      /*------------------------------------------------------------------*/
  807.          for(k = 0; k < (int)lpc_order; k++)
  808.          {
  809.          PHI_Priv->current_q_lsf_8_dec[k] = 
  810.               (float)0.5 * (PHI_Priv->previous_q_lsf_8_dec[k] + PHI_Priv->next_q_lsf_8_dec[k]);
  811.          } 
  812.      }
  813.      else
  814.      {
  815.           if (PHI_Priv->PHI_dec_prev_interpolation_flag == 0)
  816.          {
  817.      /*--------------------------------------------------------------*/
  818.      /* Compute LSP coeffs of the current frame                      */
  819.      /*--------------------------------------------------------------*/
  820.       mod_nb_abs_lsp_decode(lpc_indices, PHI_Priv->previous_q_lsf_8_dec,
  821.                     PHI_Priv->current_q_lsf_8_dec,
  822.        lpc_order, 5);
  823.          }
  824.                 else
  825.          {
  826.              /* LSPs received in the previous frame: do nothing */
  827.              ;
  828.          }
  829.      }
  830.      /*------------------------------------------------------------------*/
  831.      /* Interpolation Procedure on LSPs                                  */
  832.      /*------------------------------------------------------------------*/
  833.      for(s = 0; s < (int)n_subframes; s++)
  834.      {
  835.          for(k = 0; k < (int)lpc_order; k++)
  836.          {
  837.              register float tmp;
  838.               tmp = (((float)((int)n_subframes - s - 1) * PHI_Priv->previous_q_lsf_8_dec[k]) 
  839.                 + ((float)(1 + s) * PHI_Priv->current_q_lsf_8_dec[k]))/(float)n_subframes;
  840.             int_lsf[k] = tmp;
  841.          }
  842.      /*--------------------------------------------------------------*/
  843.      /*Compute corresponding a-parameters                            */
  844.      /*--------------------------------------------------------------*/
  845.      lsf2pc(tmp_lpc_coefficients, int_lsf, lpc_order);
  846.      for( k = 0; k < lpc_order; k++)
  847.      {
  848.        int_Qlpc_coefficients[s*(int)lpc_order + k] = -tmp_lpc_coefficients[k+1];
  849.          }
  850.      }
  851.      /* -----------------------------------------------------------------*/
  852.      /* Save memory                                                      */
  853.      /* -----------------------------------------------------------------*/
  854.      for(k=0; k < (int)lpc_order; k++)
  855.      {
  856.           PHI_Priv->previous_q_lsf_8_dec[k] = PHI_Priv->current_q_lsf_8_dec[k];
  857.          PHI_Priv->current_q_lsf_8_dec[k] = PHI_Priv->next_q_lsf_8_dec[k];
  858.      }
  859.      PHI_Priv->PHI_dec_prev_interpolation_flag = interpolation_flag;
  860.      /* -----------------------------------------------------------------*/
  861.      /*FREE the malloc'd arrays                                         */
  862.      /* -----------------------------------------------------------------*/
  863.      free(int_lsf);
  864.      free(tmp_lpc_coefficients);
  865.     
  866.     }
  867.     else
  868.     {   /*  16 khz  */
  869.     
  870.      float *int_lsf;
  871.      int   s,k;
  872.      float *tmp_lpc_coefficients;
  873. if (Wideband_VQ == Scalable_VQ)
  874. {   
  875.     /*   16 khz Scalable VQ  */
  876.     
  877.     /*------------------------------------------------------------------*/
  878.     /* Allocate space for current_rfc and current lar                   */
  879.     /*------------------------------------------------------------------*/
  880.     if 
  881.     (
  882.     (( int_lsf = (float *)malloc((unsigned int)lpc_order * sizeof(float))) == NULL )
  883.     )
  884.     {
  885.     printf("MALLOC FAILURE in Routine abs_lpc_quantizer n");
  886.     exit(1);
  887.     }
  888.     
  889.     if((tmp_lpc_coefficients=(float *)calloc(lpc_order+1, sizeof(float)))==NULL) {
  890.     printf("n Memory allocation error in abs_lpc_quantizern");
  891.     exit(4);
  892.     }
  893.     
  894.     if (interpolation_flag)
  895.     {
  896.     /*----------------------------------------------------------*/
  897.     /* Compute LSP coeffs of the next frame                     */
  898.     /*----------------------------------------------------------*/
  899.     mod_nb_abs_lsp_decode(lpc_indices, PHI_Priv->previous_q_lsf_8_dec,
  900.       PHI_Priv->next_q_lsf_8_dec,
  901.       lpc_order/2, 5);
  902.     
  903.     mod_nec_bws_lsp_decoder( lpc_indices + 5, PHI_Priv->next_q_lsf_8_dec,
  904.     PHI_Priv->next_q_lsf_16_dec,
  905.     lpc_order, lpc_order/2, 6, PHI_Priv->blsp_dec, PHI_Priv);
  906.     
  907.     /*------------------------------------------------------------------*/
  908.     /* Interpolate LSP coeffs to obtain coeficients of cuurent frame    */
  909.     /*------------------------------------------------------------------*/
  910.     for(k = 0; k < (int)lpc_order; k++)
  911.     {
  912.     PHI_Priv->current_q_lsf_16_dec[k] = 
  913.     (float)0.5 * (PHI_Priv->previous_q_lsf_16_dec[k] + PHI_Priv->next_q_lsf_16_dec[k]);
  914.     } 
  915.     }
  916.     else
  917.     {
  918.     if (PHI_Priv->PHI_dec_prev_interpolation_flag == 0)
  919.     {
  920.     /*--------------------------------------------------------------*/
  921.     /* Compute LSP coeffs of the current frame                      */
  922.     /*--------------------------------------------------------------*/
  923.     mod_nb_abs_lsp_decode(lpc_indices, PHI_Priv->previous_q_lsf_8_dec,
  924.       PHI_Priv->current_q_lsf_8_dec,
  925.       lpc_order/2, 5);
  926.     
  927.     mod_nec_bws_lsp_decoder( lpc_indices + 5, PHI_Priv->current_q_lsf_8_dec,
  928.     PHI_Priv->current_q_lsf_16_dec,
  929.     lpc_order, lpc_order/2, 6, PHI_Priv->blsp_dec, PHI_Priv);
  930.     }
  931.     else
  932.     {
  933.     /* LSPs received in the previous frame: do nothing */
  934.     ;
  935.     }
  936.     }
  937.     
  938.     /*------------------------------------------------------------------*/
  939.     /* Interpolation Procedure on LSPs                                  */
  940.     /*------------------------------------------------------------------*/
  941.     for(s = 0; s < (int)n_subframes; s++)
  942.     {
  943.     for(k = 0; k < (int)lpc_order; k++)
  944.     {
  945.     register float tmp;
  946.     
  947.     tmp = (((float)((int)n_subframes - s - 1) * PHI_Priv->previous_q_lsf_16_dec[k]) 
  948.        + ((float)(1 + s) * PHI_Priv->current_q_lsf_16_dec[k]))/(float)n_subframes;
  949.     int_lsf[k] = tmp;
  950.     }
  951.     
  952.     /*--------------------------------------------------------------*/
  953.     /*Compute corresponding a-parameters                            */
  954.     /*--------------------------------------------------------------*/
  955.     lsf2pc(tmp_lpc_coefficients, int_lsf, lpc_order);
  956.     for( k = 0; k < lpc_order; k++)
  957.     {
  958.       int_Qlpc_coefficients[s*(int)lpc_order + k] = -tmp_lpc_coefficients[k+1];
  959.     }
  960.     }
  961.     
  962.     /* -----------------------------------------------------------------*/
  963.     /* Save memory                                                      */
  964.     /* -----------------------------------------------------------------*/
  965.     for(k=0; k < (int)lpc_order/2; k++)
  966.     {
  967.     PHI_Priv->previous_q_lsf_8_dec[k] = PHI_Priv->current_q_lsf_8_dec[k];
  968.     PHI_Priv->current_q_lsf_8_dec[k] = PHI_Priv->next_q_lsf_8_dec[k];
  969.     }
  970.     
  971.     for(k=0; k < (int)lpc_order; k++)
  972.     {
  973.     PHI_Priv->previous_q_lsf_16_dec[k] = PHI_Priv->current_q_lsf_16_dec[k];
  974.     PHI_Priv->current_q_lsf_16_dec[k] = PHI_Priv->next_q_lsf_16_dec[k];
  975.     }
  976.     PHI_Priv->PHI_dec_prev_interpolation_flag = interpolation_flag;
  977.     
  978.     /* -----------------------------------------------------------------*/
  979.     /*FREE the malloc'd arrays                                         */
  980.     /* -----------------------------------------------------------------*/
  981.   FREE(int_lsf);
  982.   FREE(tmp_lpc_coefficients);
  983. }
  984. else
  985. {    /*    16 khz Optimized VQ   */
  986.     float *int_lsf;
  987.     int   s,k;
  988.     float *tmp_lpc_coefficients;
  989.     
  990.     /*------------------------------------------------------------------*/
  991.     /* Allocate space for current_rfc and current lar                   */
  992.     /*------------------------------------------------------------------*/
  993.     if 
  994.     (
  995.     (( int_lsf = (float *)malloc((unsigned int)lpc_order * sizeof(float))) == NULL )
  996.     )
  997.     {
  998.     printf("MALLOC FAILURE in Routine abs_lpc_quantizer n");
  999.     exit(1);
  1000.     }
  1001.     
  1002.     if((tmp_lpc_coefficients=(float *)calloc(lpc_order+1, sizeof(float)))==NULL) {
  1003.     printf("n Memory allocation error in abs_lpc_quantizern");
  1004.     exit(4);
  1005.     }
  1006.     
  1007.     if (interpolation_flag)
  1008.     {
  1009.     /*----------------------------------------------------------*/
  1010.     /* Compute LSP coeffs of the next frame                     */
  1011.     /*----------------------------------------------------------*/
  1012.     mod_wb_celp_lsp_decode(lpc_indices, PHI_Priv->previous_q_lsf_16_dec,
  1013.                            PHI_Priv->next_q_lsf_16_dec, lpc_order, 
  1014.                            num_lpc_indices);
  1015.     
  1016.     /*------------------------------------------------------------------*/
  1017.     /* Interpolate LSP coeffs to obtain coeficients of cuurent frame    */
  1018.     /*------------------------------------------------------------------*/
  1019.     for(k = 0; k < (int)lpc_order; k++)
  1020.     {
  1021.     PHI_Priv->current_q_lsf_16_dec[k] = 
  1022.     (float)0.5 * (PHI_Priv->previous_q_lsf_16_dec[k] + PHI_Priv->next_q_lsf_16_dec[k]);
  1023.     } 
  1024.     }
  1025.     else
  1026.     {
  1027.     if (PHI_Priv->PHI_dec_prev_interpolation_flag == 0)
  1028.     {
  1029.     /*--------------------------------------------------------------*/
  1030.     /* Compute LSP coeffs of the current frame                      */
  1031.     /*--------------------------------------------------------------*/
  1032.     mod_wb_celp_lsp_decode(lpc_indices, 
  1033.     PHI_Priv->previous_q_lsf_16_dec,
  1034.     PHI_Priv->current_q_lsf_16_dec,
  1035.       lpc_order, num_lpc_indices);
  1036.     }
  1037.     else
  1038.     {
  1039.     /* LSPs received in the previous frame: do nothing */
  1040.     ;
  1041.     }
  1042.     }
  1043.     
  1044.     /*------------------------------------------------------------------*/
  1045.     /* Interpolation Procedure on LSPs                                  */
  1046.     /*------------------------------------------------------------------*/
  1047.     for(s = 0; s < (int)n_subframes; s++)
  1048.     {
  1049.     for(k = 0; k < (int)lpc_order; k++)
  1050.     {
  1051.     register float tmp;
  1052.     
  1053.     tmp = (((float)((int)n_subframes - s - 1) * PHI_Priv->previous_q_lsf_16_dec[k]) 
  1054.        + ((float)(1 + s) * PHI_Priv->current_q_lsf_16_dec[k]))/(float)n_subframes;
  1055.     int_lsf[k] = tmp;
  1056.     }
  1057.     
  1058.     /*--------------------------------------------------------------*/
  1059.     /*Compute corresponding a-parameters                            */
  1060.     /*--------------------------------------------------------------*/
  1061.     lsf2pc(tmp_lpc_coefficients, int_lsf, lpc_order);
  1062.     for( k = 0; k < lpc_order; k++)
  1063.     {
  1064.       int_Qlpc_coefficients[s*(int)lpc_order + k] = -tmp_lpc_coefficients[k+1];
  1065.     }
  1066.     }
  1067.     
  1068.     /* -----------------------------------------------------------------*/
  1069.     /* Save memory                                                      */
  1070.     /* -----------------------------------------------------------------*/
  1071.     for(k=0; k < (int)lpc_order; k++)
  1072.     {
  1073.     PHI_Priv->previous_q_lsf_16_dec[k] = PHI_Priv->current_q_lsf_16_dec[k];
  1074.     PHI_Priv->current_q_lsf_16_dec[k] = PHI_Priv->next_q_lsf_16_dec[k];
  1075.     }
  1076.     PHI_Priv->PHI_dec_prev_interpolation_flag = interpolation_flag;
  1077.     
  1078.     /* -----------------------------------------------------------------*/
  1079.     /*FREE the malloc'd arrays                                         */
  1080.     /* -----------------------------------------------------------------*/
  1081.   FREE (int_lsf);
  1082.   FREE (tmp_lpc_coefficients);
  1083. }
  1084.     
  1085.     }
  1086. }
  1087. /*======================================================================*/
  1088. /*   Function Definition:celp_lpc_quantizer using VQ                    */
  1089. /*======================================================================*/
  1090. void VQ_celp_lpc_quantizer
  1091. (
  1092. float lpc_coefficients[],      /* In:  Current unquantised a-pars       */
  1093. float lpc_coefficients_8[],    /* In:  Current unquantised a-pars(8 kHz)*/
  1094. float int_Qlpc_coefficients[], /* Out: Qaunt/interpolated a-pars        */
  1095. long  lpc_indices[],           /* Out: Codes thar are transmitted       */
  1096. long  lpc_order,               /* In:  Order of LPC                     */
  1097. long  num_lpc_indices,         /* In:  Number of packes LPC codes       */
  1098. long  n_lpc_analysis,          /* In:  Number of LPC/frame              */
  1099. long  n_subframes,             /* In:  Number of subframes              */
  1100. long  *interpolation_flag,     /* Out: Interpolation Flag               */
  1101. long  *send_lpc_flag,          /* Out: Send LPC flag                    */
  1102. long  Wideband_VQ,
  1103. PHI_PRIV_TYPE *PHI_Priv       /* In/Out: PHI private data (instance context) */
  1104. )
  1105. {
  1106.     if (lpc_order == ORDER_LPC_8)
  1107.     {    /*   fs = 8 khz  */
  1108.     float *int_lsf;
  1109.     long  *next_codes;
  1110.     long  *current_codes;
  1111.     float *tmp_lpc_coefficients;
  1112.     int   i,s,k;
  1113.     /*------------------------------------------------------------------*/
  1114.     /* Allocate space for current_rfc and current lar                   */
  1115.     /*------------------------------------------------------------------*/
  1116.     if 
  1117.     (
  1118.     (( int_lsf = (float *)malloc((unsigned int)lpc_order * sizeof(float))) == NULL ) ||
  1119.     (( next_codes = (long *)malloc((unsigned int)num_lpc_indices * sizeof(long))) == NULL ) ||
  1120.     (( current_codes = (long *)malloc((unsigned int)num_lpc_indices * sizeof(long))) == NULL )
  1121.     )
  1122.     {
  1123.     printf("MALLOC FAILURE in Routine abs_lpc_quantizer n");
  1124.     exit(1);
  1125.     }
  1126.     
  1127.     if((tmp_lpc_coefficients=(float *)calloc(lpc_order+1, sizeof(float)))==NULL) {
  1128.     printf("n Memory allocation error in abs_lpc_quantizern");
  1129.     exit(4);
  1130.     }
  1131.     
  1132.     /*------------------------------------------------------------------*/
  1133.     /* Calculate Narrowband LSPs                                        */
  1134.     /*------------------------------------------------------------------*/
  1135.     tmp_lpc_coefficients[0] = 1.;
  1136.     for(i=0;i<lpc_order;i++) 
  1137.     tmp_lpc_coefficients[i+1] = 
  1138.     -lpc_coefficients[i];
  1139.     
  1140.     pc2lsf(PHI_Priv->next_uq_lsf_8, tmp_lpc_coefficients, lpc_order);
  1141.     /*------------------------------------------------------------------*/
  1142.     /* Narrowband Quantization Procedure                                */
  1143.     /*------------------------------------------------------------------*/
  1144.     mod_nb_abs_lsp_quantizer(PHI_Priv->next_uq_lsf_8, PHI_Priv->previous_q_lsf_8, PHI_Priv->next_q_lsf_8,
  1145.      next_codes, lpc_order, 5,
  1146.      n_lpc_analysis);
  1147.     /*------------------------------------------------------------------*/
  1148.     /* Narrowband Quantization Procedure                                */
  1149.     /*------------------------------------------------------------------*/
  1150.     mod_nb_abs_lsp_quantizer(PHI_Priv->current_uq_lsf_8, PHI_Priv->previous_q_lsf_8, PHI_Priv->current_q_lsf_8,
  1151.      current_codes, lpc_order, 5,
  1152.      n_lpc_analysis);
  1153.     
  1154.     /*------------------------------------------------------------------*/
  1155.     /* Determine dynamic threshold                                      */
  1156.     /*------------------------------------------------------------------*/
  1157.     if (PHI_Priv->PHI_frames_sent == PHI_Priv->PHI_FRAMES)
  1158.     {
  1159.     long actual_bit_rate = (long)(((float)PHI_Priv->PHI_actual_bits)/(((float)PHI_Priv->PHI_frames_sent)*PHI_Priv->PHI_FR));
  1160.     
  1161.     float diff = (float)fabs((double)(PHI_Priv->PHI_desired_bit_rate - actual_bit_rate));   
  1162.     float per_diff = diff/(float)PHI_Priv->PHI_desired_bit_rate;
  1163.     
  1164.     if (per_diff > (float)0.005)
  1165.     {
  1166.     
  1167.     long coeff = (long)(per_diff * (float)10.0+(float)0.5) + 1;
  1168.     
  1169.     if (actual_bit_rate > PHI_Priv->PHI_desired_bit_rate)
  1170.     PHI_Priv->PHI_dyn_lpc_thresh += (float)0.01 * (float)coeff;
  1171.     if (actual_bit_rate < PHI_Priv->PHI_desired_bit_rate)
  1172.     PHI_Priv->PHI_dyn_lpc_thresh -= (float)0.01 * (float)coeff;
  1173.     
  1174.     if (PHI_Priv->PHI_dyn_lpc_thresh < (float)0.0)
  1175.     PHI_Priv->PHI_dyn_lpc_thresh = (float)0.0;
  1176.     
  1177.     if (PHI_Priv->PHI_dyn_lpc_thresh > PHI_Priv->PHI_stop_threshold)
  1178.     PHI_Priv->PHI_dyn_lpc_thresh = PHI_Priv->PHI_stop_threshold;
  1179.     }
  1180.     
  1181.     PHI_Priv->PHI_frames_sent = 0;
  1182.     PHI_Priv->PHI_actual_bits = 0;                
  1183.     }
  1184.     
  1185.     
  1186.     /*------------------------------------------------------------------*/
  1187.     /* Check if you really need to transmit an LPC set                  */
  1188.     /*------------------------------------------------------------------*/
  1189.     if (PHI_Priv->PHI_prev_int_flag)
  1190.     {
  1191.     *interpolation_flag = 0;
  1192.     if (!PHI_Priv->PHI_prev_lpc_flag)
  1193.     {
  1194. *send_lpc_flag = 1;
  1195.     }
  1196.     else
  1197.     {
  1198. *send_lpc_flag = 0;
  1199.     }
  1200.     }
  1201.     else
  1202.     {
  1203.     float d;
  1204.     float lpc_thresh = PHI_Priv->PHI_dyn_lpc_thresh;
  1205.     
  1206.     
  1207.     for(d = (float)0.0, k = 0; k < (int)lpc_order; k++)
  1208.     {
  1209.     double temp;
  1210.     
  1211.     temp  = (double)(((float)0.5 * (PHI_Priv->previous_q_lsf_8[k] + PHI_Priv->next_q_lsf_8[k])) - PHI_Priv->current_q_lsf_8[k]);
  1212.     d    += (float)fabs(temp);
  1213.     }
  1214.     d /= 2.0F;
  1215.     
  1216.     if (d  < lpc_thresh) 
  1217.     {
  1218.     *interpolation_flag = 1;
  1219.     *send_lpc_flag  = 1;
  1220.     
  1221.     /*--------------------------------------------------------------*/
  1222.     /* Perform Interpolation                                        */
  1223.     /*--------------------------------------------------------------*/
  1224.     for(k = 0; k < (int)lpc_order; k++)
  1225.     {
  1226.     PHI_Priv->current_q_lsf_8[k] = (float)0.5 * (PHI_Priv->previous_q_lsf_8[k] + PHI_Priv->next_q_lsf_8[k]);
  1227.     } 
  1228.     }
  1229.     else
  1230.     {
  1231.     *interpolation_flag = 0;
  1232.     *send_lpc_flag  = 1;
  1233.     }
  1234.     
  1235.     }
  1236.     
  1237.     /*------------------------------------------------------------------*/
  1238.     /* Make sure to copy the right indices for the bit stream           */
  1239.     /*------------------------------------------------------------------*/
  1240.     if (*send_lpc_flag)
  1241.     {
  1242.     if (*interpolation_flag)
  1243.     {
  1244.     /* INTERPOLATION: use next indices (= indices of next frame) */
  1245.     for (k=0; k < (int)num_lpc_indices; k++)    
  1246.     {
  1247.     lpc_indices[k] = next_codes[k];
  1248.     }
  1249.     }
  1250.     else
  1251.     {
  1252.     /* NO INTERPOLATION: use current indices (= indices of current frame) */
  1253.     for (k=0; k < (int)num_lpc_indices; k++)    
  1254.     {
  1255.     lpc_indices[k] = current_codes[k];
  1256.     }
  1257.     }
  1258.     }
  1259.     else
  1260.     {
  1261.     int k;
  1262.     
  1263.     for (k=0; k < (int)num_lpc_indices; k++)    
  1264.     {
  1265.     lpc_indices[k] = 0;
  1266.     }
  1267.     
  1268.     }
  1269.     PHI_Priv->PHI_prev_lpc_flag = *send_lpc_flag;
  1270.     PHI_Priv->PHI_prev_int_flag = *interpolation_flag;
  1271.     
  1272.     /*------------------------------------------------------------------*/
  1273.     /* Update the number of frames and bits that are output             */
  1274.     /*------------------------------------------------------------------*/
  1275.     PHI_Priv->PHI_frames_sent += 1;
  1276.     if (*send_lpc_flag)
  1277.     {
  1278. PHI_Priv->PHI_actual_bits += PHI_Priv->PHI_MAX_BITS;
  1279.     }
  1280.     else
  1281.     {
  1282. PHI_Priv->PHI_actual_bits += PHI_Priv->PHI_MIN_BITS;
  1283.     }
  1284.        
  1285.     /*------------------------------------------------------------------*/
  1286.     /* Interpolation Procedure on LSPs                                  */
  1287.     /*------------------------------------------------------------------*/
  1288.     
  1289.     for(s = 0; s < (int)n_subframes; s++)
  1290.     {
  1291.     for(k = 0; k < (int)lpc_order; k++)
  1292.     {
  1293.     register float tmp;
  1294.     
  1295.     tmp = (((float)((int)n_subframes - s - 1) * PHI_Priv->previous_q_lsf_int_8[k]) 
  1296.        + ((float)(1 + s) * PHI_Priv->current_q_lsf_8[k]))/(float)n_subframes;
  1297.     int_lsf[k] = tmp;
  1298.     }
  1299.     
  1300.     /*--------------------------------------------------------------*/
  1301.     /*Compute corresponding a-parameters                            */
  1302.     /*--------------------------------------------------------------*/
  1303.     lsf2pc(tmp_lpc_coefficients, int_lsf, lpc_order);
  1304.     for( k = 0; k < lpc_order; k++)
  1305.     {
  1306.       int_Qlpc_coefficients[s*(int)lpc_order + k] = -tmp_lpc_coefficients[k+1];
  1307.     }
  1308.     }
  1309.     
  1310.     /* -----------------------------------------------------------------*/
  1311.     /* Save memory                                                      */
  1312.     /* -----------------------------------------------------------------*/
  1313.     for(k=0; k < (int)lpc_order; k++)
  1314.     {
  1315.        PHI_Priv->previous_uq_lsf_8[k] = PHI_Priv->current_uq_lsf_8[k];
  1316.        PHI_Priv->current_uq_lsf_8[k] = PHI_Priv->next_uq_lsf_8[k];
  1317.        PHI_Priv->previous_q_lsf_int_8[k] = PHI_Priv->current_q_lsf_8[k];
  1318.     }
  1319.     
  1320.     if (*interpolation_flag)
  1321.     {
  1322.     ;    
  1323.     }
  1324.     else
  1325.     {
  1326.     for(k=0; k < (int)lpc_order; k++)
  1327.     {
  1328.     PHI_Priv->previous_q_lsf_8[k] = PHI_Priv->current_q_lsf_8[k];
  1329.     PHI_Priv->current_q_lsf_8[k] = PHI_Priv->next_q_lsf_8[k];
  1330.     }
  1331.     }
  1332.     /* -----------------------------------------------------------------*/
  1333.     /*FREE the malloc'd arrays                                         */
  1334.     /* -----------------------------------------------------------------*/
  1335.   FREE(int_lsf);
  1336.   FREE(next_codes);
  1337.   FREE(current_codes);
  1338.   FREE(tmp_lpc_coefficients);
  1339.     }
  1340.     else
  1341.     {
  1342.     if (Wideband_VQ==Scalable_VQ)
  1343.     {    /*   16 khz Scalable VQ  */
  1344. float *int_lsf;
  1345. long  *next_codes;
  1346. long  *current_codes;
  1347. float *tmp_lpc_coefficients;
  1348. int   i, j, s,k;
  1349. float blsp_next[NEC_LSPPRDCT_ORDER][NEC_MAX_LSPVQ_ORDER];
  1350. float blsp_current[NEC_LSPPRDCT_ORDER][NEC_MAX_LSPVQ_ORDER];
  1351. /*------------------------------------------------------------------*/
  1352. /* Allocate space for current_rfc and current lar                   */
  1353. /*------------------------------------------------------------------*/
  1354. if 
  1355. (
  1356. (( int_lsf = (float *)malloc((unsigned int)lpc_order * sizeof(float))) == NULL ) ||
  1357. (( next_codes = (long *)malloc((unsigned int)num_lpc_indices * sizeof(long))) == NULL ) ||
  1358. (( current_codes = (long *)malloc((unsigned int)num_lpc_indices * sizeof(long))) == NULL )
  1359. )
  1360. {
  1361. printf("MALLOC FAILURE in Routine abs_lpc_quantizer n");
  1362. exit(1);
  1363. }
  1364. if((tmp_lpc_coefficients=(float *)calloc(lpc_order+1, sizeof(float)))==NULL) {
  1365. printf("n Memory allocation error in abs_lpc_quantizern");
  1366. exit(4);
  1367. }
  1368. /*------------------------------------------------------------------*/
  1369. /* Copy memory for Wideband Quantizer                               */
  1370. /*------------------------------------------------------------------*/
  1371. for (i=0; i < NEC_LSPPRDCT_ORDER; i++)
  1372. {
  1373. for(j=0; j < NEC_MAX_LSPVQ_ORDER; j++)
  1374. {
  1375. blsp_next[i][j] = PHI_Priv->blsp_previous[i][j];
  1376. blsp_current[i][j] = PHI_Priv->blsp_previous[i][j];
  1377. }
  1378. }
  1379. /*------------------------------------------------------------------*/
  1380. /* Calculate Narrowband LSPs                                        */
  1381. /*------------------------------------------------------------------*/
  1382. tmp_lpc_coefficients[0] = 1.;
  1383. for(i=0;i<lpc_order/2;i++) 
  1384. tmp_lpc_coefficients[i+1] = 
  1385. -lpc_coefficients_8[i];
  1386. pc2lsf(PHI_Priv->next_uq_lsf_8, tmp_lpc_coefficients, lpc_order/2);
  1387. /*------------------------------------------------------------------*/
  1388. /* Narrowband Quantization Procedure                                */
  1389. /*------------------------------------------------------------------*/
  1390. mod_nb_abs_lsp_quantizer(PHI_Priv->next_uq_lsf_8, PHI_Priv->previous_q_lsf_8, PHI_Priv->next_q_lsf_8,
  1391.  next_codes, lpc_order/2, 5,
  1392.  n_lpc_analysis);
  1393. /*------------------------------------------------------------------*/
  1394. /* Calculate Wideband LSPs                                          */
  1395. /*------------------------------------------------------------------*/
  1396. tmp_lpc_coefficients[0] = 1.;
  1397. for(i=0;i<lpc_order;i++) 
  1398. tmp_lpc_coefficients[i+1] = 
  1399. -lpc_coefficients[i];
  1400. pc2lsf(PHI_Priv->next_uq_lsf_16, tmp_lpc_coefficients, lpc_order);
  1401. /*------------------------------------------------------------------*/
  1402. /* Wideband Quantization Procedure                                  */
  1403. /*------------------------------------------------------------------*/
  1404. mod_nec_bws_lsp_quantizer(PHI_Priv->next_uq_lsf_16, PHI_Priv->next_q_lsf_8,
  1405.   PHI_Priv->next_q_lsf_16, next_codes + 5,
  1406.   lpc_order, lpc_order/2, num_lpc_indices, blsp_next, PHI_Priv);
  1407. /*------------------------------------------------------------------*/
  1408. /* Narrowband Quantization Procedure                                */
  1409. /*------------------------------------------------------------------*/
  1410. mod_nb_abs_lsp_quantizer(PHI_Priv->current_uq_lsf_8, PHI_Priv->previous_q_lsf_8, PHI_Priv->current_q_lsf_8,
  1411.  current_codes, lpc_order/2, 5,
  1412.  n_lpc_analysis);
  1413.  
  1414. /*------------------------------------------------------------------*/
  1415. /* Wideband Quantization Procedure                                  */
  1416. /*------------------------------------------------------------------*/
  1417. mod_nec_bws_lsp_quantizer(PHI_Priv->current_uq_lsf_16, PHI_Priv->current_q_lsf_8,
  1418.   PHI_Priv->current_q_lsf_16, current_codes + 5,
  1419.   lpc_order, lpc_order/2, num_lpc_indices, blsp_current, PHI_Priv);
  1420. /*------------------------------------------------------------------*/
  1421. /* Determine dynamic threshold                                      */
  1422. /*------------------------------------------------------------------*/
  1423. if (PHI_Priv->PHI_frames_sent == PHI_Priv->PHI_FRAMES)
  1424. {
  1425. long actual_bit_rate = (long)(((float)PHI_Priv->PHI_actual_bits)/(((float)PHI_Priv->PHI_frames_sent)*PHI_Priv->PHI_FR));
  1426. float diff = (float)fabs((double)(PHI_Priv->PHI_desired_bit_rate - actual_bit_rate));   
  1427. float per_diff = diff/(float)PHI_Priv->PHI_desired_bit_rate;
  1428. if (per_diff > (float)0.005)
  1429. {
  1430. long coeff = (long)(per_diff * (float)10.0+(float)0.5) + 1;
  1431. if (actual_bit_rate > PHI_Priv->PHI_desired_bit_rate)
  1432. PHI_Priv->PHI_dyn_lpc_thresh += (float)0.01 * (float)coeff;
  1433. if (actual_bit_rate < PHI_Priv->PHI_desired_bit_rate)
  1434. PHI_Priv->PHI_dyn_lpc_thresh -= (float)0.01 * (float)coeff;
  1435. if (PHI_Priv->PHI_dyn_lpc_thresh < (float)0.0)
  1436. PHI_Priv->PHI_dyn_lpc_thresh = (float)0.0;
  1437. if (PHI_Priv->PHI_dyn_lpc_thresh > PHI_Priv->PHI_stop_threshold)
  1438. PHI_Priv->PHI_dyn_lpc_thresh = PHI_Priv->PHI_stop_threshold;
  1439. }
  1440. PHI_Priv->PHI_frames_sent = 0;
  1441. PHI_Priv->PHI_actual_bits = 0;                
  1442. }
  1443. /*------------------------------------------------------------------*/
  1444. /* Check if you really need to transmit an LPC set                  */
  1445. /*------------------------------------------------------------------*/
  1446. if (PHI_Priv->PHI_prev_int_flag)
  1447. {
  1448. *interpolation_flag = 0;
  1449. if (!PHI_Priv->PHI_prev_lpc_flag)
  1450. {
  1451. *send_lpc_flag = 1;
  1452. }
  1453. else
  1454. {
  1455. *send_lpc_flag = 0;
  1456. }
  1457. }
  1458. else
  1459. {
  1460. float d;
  1461. float lpc_thresh = PHI_Priv->PHI_dyn_lpc_thresh;
  1462. for(d = (float)0.0, k = 0; k < (int)lpc_order; k++)
  1463. {
  1464. double temp;
  1465. temp  = (double)(((float)0.5 * (PHI_Priv->previous_q_lsf_16[k] + PHI_Priv->next_q_lsf_16[k])) - PHI_Priv->current_q_lsf_16[k]);
  1466. d    += (float)fabs(temp);
  1467. }
  1468. d /= 2.0F;
  1469. if (d  < lpc_thresh) 
  1470. {
  1471. *interpolation_flag = 1;
  1472. *send_lpc_flag  = 1;
  1473. /*--------------------------------------------------------------*/
  1474. /* Perform Interpolation                                        */
  1475. /*--------------------------------------------------------------*/
  1476. for(k = 0; k < (int)lpc_order; k++)
  1477. {
  1478. PHI_Priv->current_q_lsf_16[k] = (float)0.5 * (PHI_Priv->previous_q_lsf_16[k] + PHI_Priv->next_q_lsf_16[k]);
  1479. }
  1480. else
  1481. {
  1482.     *interpolation_flag = 0;
  1483.     *send_lpc_flag  = 1;
  1484. }
  1485. }
  1486. /*------------------------------------------------------------------*/
  1487. /* Make sure to copy the right indices for the bit stream           */
  1488. /*------------------------------------------------------------------*/
  1489. if (*send_lpc_flag)
  1490. {
  1491. if (*interpolation_flag)
  1492. {
  1493. /* INTERPOLATION: use next indices (= indices of next frame) */
  1494. for (k=0; k < (int)num_lpc_indices; k++)    
  1495. {
  1496. lpc_indices[k] = next_codes[k];
  1497. }
  1498. }
  1499. else
  1500. {
  1501. /* NO INTERPOLATION: use current indices (= indices of current frame) */
  1502. for (k=0; k < (int)num_lpc_indices; k++)    
  1503. {
  1504. lpc_indices[k] = current_codes[k];
  1505. }
  1506. }
  1507. }
  1508. else
  1509. {
  1510. int k;
  1511. for (k=0; k < (int)num_lpc_indices; k++)    
  1512. {
  1513. lpc_indices[k] = 0;
  1514. }
  1515. }
  1516. PHI_Priv->PHI_prev_lpc_flag = *send_lpc_flag;
  1517. PHI_Priv->PHI_prev_int_flag = *interpolation_flag;
  1518. /*------------------------------------------------------------------*/
  1519. /* Update the number of frames and bits that are output             */
  1520. /*------------------------------------------------------------------*/
  1521. PHI_Priv->PHI_frames_sent += 1;
  1522. if (*send_lpc_flag)
  1523. {
  1524.     PHI_Priv->PHI_actual_bits += PHI_Priv->PHI_MAX_BITS;
  1525. }
  1526. else
  1527. {
  1528.     PHI_Priv->PHI_actual_bits += PHI_Priv->PHI_MIN_BITS;
  1529. }
  1530. /*------------------------------------------------------------------*/
  1531. /* Interpolation Procedure on LSPs                                  */
  1532. /*------------------------------------------------------------------*/
  1533. for(s = 0; s < (int)n_subframes; s++)
  1534. {
  1535. for(k = 0; k < (int)lpc_order; k++)
  1536. {
  1537.     register float tmp;
  1538.     
  1539.     tmp = (((float)((int)n_subframes - s - 1) * PHI_Priv->previous_q_lsf_int_16[k]) 
  1540.        + ((float)(1 + s) * PHI_Priv->current_q_lsf_16[k]))/(float)n_subframes;
  1541.     int_lsf[k] = tmp;
  1542. }
  1543. /*--------------------------------------------------------------*/
  1544. /*Compute corresponding a-parameters                            */
  1545. /*--------------------------------------------------------------*/
  1546. lsf2pc(tmp_lpc_coefficients, int_lsf, lpc_order);
  1547. for( k = 0; k < lpc_order; k++)
  1548. {
  1549.   int_Qlpc_coefficients[s*(int)lpc_order + k] = -tmp_lpc_coefficients[k+1];
  1550. }
  1551. }
  1552. /* -----------------------------------------------------------------*/
  1553. /* Save memory                                                      */
  1554. /* -----------------------------------------------------------------*/
  1555. for(k=0; k < (int)lpc_order/2; k++)
  1556. {
  1557. PHI_Priv->previous_uq_lsf_8[k] = PHI_Priv->current_uq_lsf_8[k];
  1558. PHI_Priv->current_uq_lsf_8[k] = PHI_Priv->next_uq_lsf_8[k];
  1559. }
  1560. for(k=0; k < (int)lpc_order; k++)
  1561. {
  1562. PHI_Priv->previous_uq_lsf_16[k] = PHI_Priv->current_uq_lsf_16[k];
  1563. PHI_Priv->current_uq_lsf_16[k] = PHI_Priv->next_uq_lsf_16[k];
  1564. }
  1565. for(k=0; k < (int)lpc_order; k++)
  1566. {
  1567. PHI_Priv->previous_q_lsf_int_16[k] = PHI_Priv->current_q_lsf_16[k];
  1568. }
  1569. if (*interpolation_flag)
  1570. {
  1571. ;    
  1572. }
  1573. else
  1574. {
  1575. for(k=0; k < (int)lpc_order/2; k++)
  1576. {
  1577. PHI_Priv->previous_q_lsf_8[k] = PHI_Priv->current_q_lsf_8[k];
  1578. PHI_Priv->current_q_lsf_8[k] = PHI_Priv->next_q_lsf_8[k];
  1579. }
  1580. for(k=0; k < (int)lpc_order; k++)
  1581. {
  1582. PHI_Priv->previous_q_lsf_16[k] = PHI_Priv->current_q_lsf_16[k];
  1583. PHI_Priv->current_q_lsf_16[k] = PHI_Priv->next_q_lsf_16[k];
  1584. }
  1585. for (i=0; i < NEC_LSPPRDCT_ORDER; i++)
  1586. {
  1587.     for(j=0; j < NEC_MAX_LSPVQ_ORDER; j++)
  1588.     {
  1589.     PHI_Priv->blsp_previous[i][j] = blsp_current[i][j];
  1590.     }
  1591. }
  1592. }
  1593. /* -----------------------------------------------------------------*/
  1594. /*FREE the malloc'd arrays                                         */
  1595. /* -----------------------------------------------------------------*/
  1596. free(int_lsf);
  1597. free(next_codes);
  1598. free(current_codes);
  1599. free(tmp_lpc_coefficients);
  1600.     }
  1601.     else
  1602.     {   /*   16 khz Optimized VQ  */
  1603. float *int_lsf;
  1604. long  *next_codes;
  1605. long  *current_codes;
  1606. float *tmp_lpc_coefficients;
  1607. int   i, s,k;
  1608. /*------------------------------------------------------------------*/
  1609. /* Allocate space for current_rfc and current lar                   */
  1610. /*------------------------------------------------------------------*/
  1611. if 
  1612. (
  1613. (( int_lsf = (float *)malloc((unsigned int)lpc_order * sizeof(float))) == NULL ) ||
  1614. (( next_codes = (long *)malloc((unsigned int)num_lpc_indices * sizeof(long))) == NULL ) ||
  1615. (( current_codes = (long *)malloc((unsigned int)num_lpc_indices * sizeof(long))) == NULL )
  1616. )
  1617. {
  1618. printf("MALLOC FAILURE in Routine abs_lpc_quantizer n");
  1619. exit(1);
  1620. }
  1621. if((tmp_lpc_coefficients=(float *)calloc(lpc_order+1, sizeof(float)))==NULL) {
  1622. printf("n Memory allocation error in abs_lpc_quantizern");
  1623. exit(4);
  1624. }