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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

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