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

流媒体/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_XITS.C                                      */
  30. /*      PACKAGE:        WDBxx                                           */
  31. /*      COMPONENT:      Subroutines for Excitation Modules              */
  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 "phi_excq.h"
  44. #include "phi_xits.h"
  45. #include "bitstream.h"
  46. /*======================================================================*/
  47. /* Function Definition:  perceptual_weighting                           */
  48. /*======================================================================*/
  49. void 
  50. PHI_perceptual_weighting
  51. (
  52. long  nos,              /* In:     Number of samples to be processed    */
  53. float *vi,              /* In:     Array of input samps to be processe  */
  54. float *vo,              /* Out:    Perceptually Weighted Output Speech  */ 
  55. long  order,            /* In:     LPC-Order of the weighting filter    */ 
  56. float *a_gamma,         /* In:     Array of the Weighting filter coeffs */
  57. float *vp1              /* In/Out: The delay line states                */
  58. )
  59. {
  60.     int i, j;           /* Local: Loop indices                          */
  61.     for (i = 0; i < (int)nos; i ++)
  62.     {
  63.         register float temp_vo = vi[i];
  64.         
  65.         for (j = 0; j < (int)order; j ++)
  66.         {
  67.             temp_vo += (vp1[j] * a_gamma[j]);
  68.         }
  69.         vo[i] = temp_vo;
  70.         for (j = (int)order - 1; j > 0; j --)
  71.         {
  72.             vp1[j] = vp1[j - 1];
  73.         }
  74.         vp1[0] = vo[i];
  75.     }
  76.     return;
  77. }
  78. /*
  79. ------------------------------------------------------------------------
  80.   zero input response 
  81. ------------------------------------------------------------------------
  82. */
  83. void 
  84. PHI_calc_zero_input_response
  85. (
  86. long  nos,               /* In:     Number of samples to be processed   */
  87. float *vo,               /* Out:    The zero-input response             */ 
  88. long  order,             /* In:     Order of the Weighting filter       */
  89. float *a_gamma,          /* In:     Coefficients of the weighting filter*/
  90. float *vp                /* In:     Filter states                       */
  91. )
  92. {
  93.     float *vpp;         /* Local: To copy the filter states             */
  94.     int i, j;           /* Local: Loop indices                          */
  95.     /*==================================================================*/
  96.     /* Allocate temp states                                             */
  97.     /*==================================================================*/
  98.     if ((vpp = (float *)malloc((unsigned int)order * sizeof(float))) == NULL )
  99.     {
  100.        fprintf(stderr, "n Malloc Failure in Block: Excitation Analysis n");
  101.        exit(1);
  102.     }
  103.   
  104.     /*==================================================================*/
  105.     /* Initiallise temp states                                          */
  106.     /*==================================================================*/
  107.     for (i = 0; i < (int)order; i ++)
  108.     {
  109.         vpp[i] = vp[i];
  110.     }
  111.         
  112.     /*==================================================================*/
  113.     /* Compute zero-input response                                      */
  114.     /*==================================================================*/
  115.     for (i = 0; i < (int)nos; i ++)
  116.     {
  117.         register float temp_vo = (float)0.0;
  118.         
  119.         for (j = 0; j < (int)order; j ++)
  120.         {
  121.             temp_vo += a_gamma[j] * vpp[j];
  122.         }
  123.         vo[i] = temp_vo;
  124.         for (j =(int)order  - 1; j > 0; j --)
  125.         {
  126.             vpp[j] = vpp[j - 1];
  127.         }
  128.         vpp[0] = vo[i];
  129.     }
  130.     
  131.     /*==================================================================*/
  132.     /* Free temp states                                                 */
  133.     /*==================================================================*/
  134.    FREE(vpp);
  135.     
  136.     return;
  137. }
  138. /*
  139. ----------------------------------------------------------------------------
  140.   weighted target signal
  141. ----------------------------------------------------------------------------
  142. */
  143. void 
  144. PHI_calc_weighted_target
  145. (
  146. long nos,               /* In:     Number of samples to be processed    */
  147. float *v1,              /* In:     Array of Perceptually weighted speech*/ 
  148. float *v2,              /* In:     The zero-input response              */ 
  149. float *vd               /* Out:    Real Target signal for current frame */
  150. )
  151. {
  152.     int i;              /* Local:  Loop index                           */
  153.     for (i = 0; i < (int)nos; i ++)
  154.         vd[i] = v1[i] - v2[i];
  155.     return;
  156. }
  157. /*
  158. ----------------------------------------------------------------------------
  159.   impulse response
  160. ----------------------------------------------------------------------------
  161. */
  162. void 
  163. PHI_calc_impulse_response
  164. (
  165. long  nos,              /* In:     Number of samples to be processed    */
  166. float *h,               /* Out:    Impulse response of the filter       */
  167. long  order,            /* In:     Order of the filter                  */ 
  168. float *a_gamma          /* In:     Array of the filter coefficients     */
  169. )
  170. {
  171.     float *vpp;         /* Local: Local filter states                   */
  172.     int i, j;           /* Local: Loop indices                          */
  173.     /*==================================================================*/
  174.     /* Allocate temp states                                             */
  175.     /*==================================================================*/
  176.     if ((vpp = (float *)malloc((unsigned int)order * sizeof(float)))== NULL )
  177.     {
  178.        fprintf(stderr, "n Malloc Failure in Block:Excitation Anlaysis n");
  179.        exit(1);
  180.     }
  181.   
  182.     /*==================================================================*/
  183.     /* Initiallise temp states                                          */
  184.     /*==================================================================*/
  185.     for (i = 0; i < (int)order; i ++)
  186.     {
  187.         vpp[i] = (float)0.0;
  188.     }
  189.     h[0] = (float)1.0;
  190.     for (i = 1; i < (int)nos; i ++)
  191.         h[i] = (float)0.0;
  192.     /*==================================================================*/
  193.     /* Compute Impulse response                                         */
  194.     /*==================================================================*/
  195.     for (i = 0; i < (int)nos; i ++)
  196.     {
  197.         register float temp_h = h[i];
  198.         
  199.         for (j = 0; j < (int)order; j ++)
  200.         {
  201.             temp_h += a_gamma[j] * vpp[j];
  202.         }
  203.         h[i] = temp_h;
  204.         for (j = (int)order - 1; j > 0; j --)
  205.         {
  206.             vpp[j] = vpp[j - 1];
  207.         }
  208.         vpp[0] = h[i];
  209.     }
  210.     
  211.     /*==================================================================*/
  212.     /*FREE temp states                                                 */
  213.     /*==================================================================*/
  214.    FREE(vpp);
  215.     
  216.     return;
  217. }
  218. /*
  219. ------------------------------------------------------------------------
  220.   backward filtering 
  221. ------------------------------------------------------------------------
  222. */
  223. void 
  224. PHI_backward_filtering
  225. (
  226. long  nos,              /* In:     Number of samples to be processed    */
  227. float *vi,              /* In:     Array of samples to be filtered      */ 
  228. float *vo,              /* Out:    Array of filtered samples            */ 
  229. float *h                /* In:     The filter coefficients              */
  230. )
  231. {
  232.     int i, j;           /* Local:  Loop indices                         */
  233.     for (i = 0; i < (int)nos; i ++)
  234.     {
  235.         register float temp_vo = (float)0.0;
  236.         
  237.         for (j = 0; j <= i; j ++)
  238.         {
  239.             temp_vo += h[i - j] * vi[(int)nos - 1 - j];
  240.         }
  241.         vo[(int)nos - 1 - i] = temp_vo;
  242.     }
  243.     return;
  244. }
  245. /*
  246. ----------------------------------------------------------------------------
  247.   adaptive codebook search
  248. ----------------------------------------------------------------------------
  249. */
  250. void 
  251. PHI_cba_search
  252. (
  253. long   nos,             /* In:     Number of samples to be processed    */
  254. long   max_lag,         /* In:     Maximum Permitted Adapt cbk Lag      */
  255. long   min_lag,         /* In:     Minimum Permitted Adapt cbk Lag      */
  256. float  *cb,             /* In:     Segment of Adaptive Codebook         */
  257. long   *pi,             /* In:     Array of preselected-lag indices     */
  258. long   n_lags,          /* In:     Number of lag candidates to be tried */
  259. float  *h,              /* In:     Impulse response of synthesis filter */ 
  260. float  *t,              /* In:     The real target signal               */ 
  261. float  *g,              /* Out:    Adapt-cbk gain(Quantised but uncoded)*/
  262. long   *vid,            /* Out:    The final adaptive cbk lag index     */ 
  263. long   *gid             /* Out:    The gain index                       */
  264. )
  265. {
  266.     float *y, *yp;         
  267.     float num, den;             
  268.     float rs, r;
  269.     int   ks;
  270.     int   i, j, k;
  271.     int   m = 0;
  272.     int   prevm;
  273.     /*==================================================================*/
  274.     /* Allocate temp states                                             */
  275.     /*==================================================================*/
  276.     if ( ((y = (float *)malloc((unsigned int)nos * sizeof(float))) == NULL )||
  277.          ((yp = (float *)malloc((unsigned int)nos * sizeof(float))) == NULL ))
  278.     {
  279.        fprintf(stderr, "n Malloc Failure in Block: Excitation Anlaysis n");
  280.        exit(1);
  281.     }
  282.     rs = -FLT_MAX;
  283.     /*==================================================================*/
  284.     /* Codebook Vector Search                                           */
  285.     /*==================================================================*/
  286.     for (k = 0; k < (int)n_lags; k ++)
  287.     {
  288.         int end_correction;
  289.         
  290.         /* =============================================================*/
  291.         /* Compute Lag index                                            */
  292.         /* =============================================================*/
  293.         prevm = m;
  294.         m = (int)(max_lag - min_lag - pi[k]);
  295.         
  296.         /* =============================================================*/
  297.         /* Check if we can use end_correction                           */
  298.         /* =============================================================*/
  299.         if ( (k > 0) && (( prevm - m ) == 1))
  300.         {
  301.             end_correction = 1;
  302.         }
  303.         else
  304.         {
  305.             end_correction = 0;
  306.         }
  307.         /* =============================================================*/
  308.         /* If end_correction can be used, use complexity reduced method */
  309.         /* =============================================================*/
  310.         if (end_correction)
  311.         {
  312.             y[0] = h[0] * cb[m];
  313.             for (i = 1; i < (int)nos; i ++)
  314.             {
  315.                 y[i] = yp[i - 1] + h[i] * cb[m];
  316.             }
  317.         }
  318.         else
  319.         {
  320.             for (i = 0; i < (int)nos; i ++)
  321.             {
  322.                 register float temp_y = (float)0.0;
  323.                 for (j = 0; j <= i; j ++)
  324.                 {
  325.                     temp_y += h[i - j] * cb[m + j];
  326.                 }    
  327.                 y[i] = temp_y;
  328.             }
  329.         }
  330.         
  331.         /* =============================================================*/
  332.         /* Copy the current to y to previous y (for the next iteration) */
  333.         /* =============================================================*/
  334.         for (i = 0; i < (int)nos; i ++)
  335.         {
  336.             yp[i] = y[i];
  337.         }
  338.         /* =============================================================*/
  339.         /* Compute normalised cross correlation coefficient             */
  340.         /* =============================================================*/
  341.         num = (float)0.0;
  342.         den = FLT_MIN;
  343.         for (i = 0; i < (int)nos; i ++)
  344.         {
  345.             num += t[i] * y[i];
  346.             den += y[i] * y[i];
  347.         }
  348.         r = num * num / den;
  349.         /* =============================================================*/
  350.         /* Check if the curent lag is the best candidate                */
  351.         /* =============================================================*/
  352.         if (r > rs)
  353.         {
  354.             ks = k;
  355.             rs = r;
  356.             *g = num / den;
  357.         }
  358.     }
  359.     *vid = pi[ks];
  360.     /*==================================================================*/
  361.     /* Gain Quantisation                                                */
  362.     /*==================================================================*/
  363.     i = *g < (float)0.0 ? -1 : 1;
  364.     *g = (float)fabs((double)*g);
  365.     for (j = 0; *g > (float)tbl_cba_dir[j].dec && j < QLa - 1; j ++);
  366.     *g = (float) i * (float)tbl_cba_dir[j].rep;
  367.     *gid = i == 1 ? (long)j : (((long)(-j - 1)) & 63);
  368.     /*==================================================================*/
  369.     /*FREE temp states                                                 */
  370.     /*==================================================================*/
  371.    FREE(y);
  372.    FREE(yp);
  373.     return;
  374. }
  375. /*
  376. ----------------------------------------------------------------------------
  377.   computes residual signal after adaptive codebook
  378. ----------------------------------------------------------------------------
  379. */
  380.     
  381. void 
  382. PHI_calc_cba_residual
  383. (
  384. long  nos,             /* In:     Number of samples to be processed    */
  385. float *vi,             /* In:     Succesful excitation candidate       */ 
  386. float gain,            /* In:     Gain of the adaptive codebook        */ 
  387. float *h,              /* In:     Impulse response of synthesis filt   */
  388. float *t,              /* In:     The real target signal               */
  389. float *e               /* Out:    Adapt-cbk residual: Target for f-cbk */
  390. )
  391. {
  392.     float v;                                
  393.     int i, j;
  394.     
  395.     for (i = 0; i < (int)nos; i ++)
  396.     {
  397.         v = (float)0.0;
  398.         for (j = 0; j <= i; j ++)
  399.         {
  400.             v += h[i - j] * vi[j];
  401.         }
  402.         e[i] = t[i] - gain * v;
  403.     }
  404.     return;
  405. }
  406. /*
  407. ----------------------------------------------------------------------------
  408.   determines phase of the local rpe codebook vectors
  409. ----------------------------------------------------------------------------
  410. */
  411. void 
  412. PHI_calc_cbf_phase
  413. (
  414. long  pulse_spacing,    /* In:    Regular Spacing Between Pulses        */
  415. long  nos,              /* In:    Number of samples to be processed     */
  416. float *tf,              /* In:    Backward filtered target signal       */ 
  417. long  *p                /* Out:   Phase of the local RPE codebook vector*/
  418. )
  419. {
  420.     float vs, v;
  421.     int i, j;
  422.     vs = -FLT_MAX;
  423.     *p = 0;
  424.     
  425.     for (i = 0; i < (int)pulse_spacing; i ++)
  426.     {
  427.         for (j = i, v = (float)0.0; j < (int)nos; j += (int)pulse_spacing)
  428.         {
  429.             v += (float)fabs((double)tf[j]);
  430.         }
  431.         if (v > vs)
  432.         {
  433.             vs = v;
  434.             *p = (long)i;
  435.         }
  436.     }
  437.     return;
  438. }
  439. /*
  440. ----------------------------------------------------------------------------
  441.   computes rpe pulse amplitude (Version 2:only computes amplitude)
  442. ----------------------------------------------------------------------------
  443. */
  444. void 
  445. PHI_CompAmpArray
  446. (
  447. long  num_of_pulses,    /* In:    Number of pulses in the sequence      */
  448. long  pulse_spacing,    /* In:    Regular Spacing Between Pulses        */
  449. float *tf,              /* In:    Backward filtered target signal       */ 
  450. long  p,                /* In:    Phase of the RPE codebook             */
  451. long  *amp              /* Out:   Pulse amplitudes  +/- 1               */ 
  452. )
  453. {
  454.     int i, k;
  455.     float v;
  456.     
  457.     for (k = (int)p, i = 0; i < (int)num_of_pulses; k += (int)pulse_spacing, i ++)
  458.     {
  459.         v = tf[k];
  460.         
  461.         if (v == (float)0.0)
  462.         {
  463.             amp[i] = 0; /* THIS SHOULD BE ZERO!!! */
  464.         }
  465.         else
  466.         {
  467.             amp[i] = v > (float)0.0 ? (long)1 : (long)-1;
  468.         }
  469.     }
  470.     return;
  471. }
  472. /*
  473. ----------------------------------------------------------------------------
  474.   computes pos array {extension to Vienna code which only fixed 1 amp
  475. ----------------------------------------------------------------------------
  476. */
  477. void 
  478. PHI_CompPosArray
  479. (
  480. long  num_of_pulses,    /* In:    Number of pulses in the sequence      */
  481. long  pulse_spacing,    /* In:    Regular Spacing Between Pulses        */
  482. long  num_fxd_amps,     /* IN:    Number of fixed amplitudes            */
  483. float *tf,              /* In:    Backward filtered target signal       */ 
  484. long  p,                /* In:    Phase of the RPE codebook             */
  485. long  *pos              /* Out:   Pulse amplitudes  +/- 1               */ 
  486. )
  487. {
  488.     float *d_tmp;
  489.     int i, nr_nonzero_samples;
  490.     
  491.     /*==================================================================*/
  492.     /* Allocate d_tmp                                             */
  493.     /*==================================================================*/
  494.     if ((d_tmp = (float *)malloc((unsigned int)num_of_pulses * sizeof(float)))== NULL )
  495.     {
  496.        fprintf(stderr, "n Malloc Failure in CompPosArray:Excitation Anlaysis n");
  497.        exit(1);
  498.     }
  499.     for (i = nr_nonzero_samples = 0; i < (int)num_of_pulses; i ++)
  500.     {
  501.         pos[i] = 0;
  502.         d_tmp[i] = (float)fabs((double)tf[(int)p + i * (int)pulse_spacing]);
  503. if (d_tmp[i] > 0)
  504.     nr_nonzero_samples++;
  505.     }
  506.     if (nr_nonzero_samples >= (int)num_fxd_amps)
  507.     {
  508.         for (i = 0; i < (int)num_fxd_amps; i ++)
  509.         {
  510.            float tmp   = (float)0.0;
  511.            int   p_tmp = 0;
  512.            int   l;
  513.            for(l = 0; l < (int)num_of_pulses; l++)
  514.            {
  515.                    if (d_tmp[l] > tmp)
  516.                    {
  517.                    tmp = d_tmp[l];
  518.                    p_tmp = l;
  519.                    }
  520.            }
  521.            pos[p_tmp] = 1;
  522.            d_tmp[p_tmp] = (float)0;
  523.         }
  524.     }
  525.     else
  526.     {
  527.         int   l;
  528. for(i = 0; i < (int)num_of_pulses; i++)
  529. {
  530.     if (d_tmp[i] > 0)
  531.     {
  532.                 pos[i] = 1;
  533.     }
  534. }
  535. for(i = 0, l = nr_nonzero_samples; l < num_fxd_amps; i++)
  536. {
  537.     if (d_tmp[i] == 0)
  538.     {
  539.                 pos[i] = 1;
  540. l++;
  541.     }
  542. }
  543.     }
  544.    FREE(d_tmp);
  545.     return;
  546. }
  547. /*
  548. ----------------------------------------------------------------------------
  549.   generates local fixed codebook
  550. ----------------------------------------------------------------------------
  551. */
  552. void 
  553. PHI_generate_cbf
  554. (
  555. long  num_of_pulses,    /* In:    Number of pulses in the sequence      */
  556. long  pulse_spacing,    /* In:    Regular Spacing Between Pulses        */
  557. long  num_fcbk_vecs,    /* In:    #Vectors in the fixed code book       */
  558. long  nos,              /* In:    Number of samples to be processed     */
  559. long  **cb,             /* Out:   Generated Local Fixed Codebook        */ 
  560. long  p,                /* In:    Phase of the codebook vector          */
  561. long  *amp,             /* In:    Pulse Amplitudes                      */ 
  562. long  *pos              /* In:    Array saying which are fixed amps     */
  563. )
  564. {
  565.     int i, j, k, m, n, index;
  566.     for (i = 0; i < (int)num_fcbk_vecs; i ++)
  567.         for (j = 0; j < (int)nos; j ++)
  568.             cb[i][j] = 0;
  569.     for (index = (int)p, i = 0; i < (int)num_of_pulses; index += (int)pulse_spacing, i ++)
  570.     {
  571.         cb[0][index] = amp[i];
  572.     }
  573.     
  574.     for (index = (int)p,i = 0, m = 1; i < (int)num_of_pulses; index += (int)pulse_spacing, i ++)
  575.     {
  576.         if (!pos[i])
  577.         {
  578.             for (j = 0, k = m; j < k; j ++)
  579.             {
  580.                 for (n = (int)p; n < (int)nos; n += (int)pulse_spacing)
  581.                 {
  582.                     cb[m][n] = cb[j][n];
  583.                 }
  584.                 cb[m ++][index] = 0;
  585.             }
  586.         }
  587.     }
  588.     /* -----------------------------------------------------------------*/
  589.     /* To test the codebook content                                     */
  590.     /* -----------------------------------------------------------------*/
  591.     /*
  592.     for (i = 0; i < (int)num_fcbk_vecs; i ++)
  593.     {
  594.         for (j = (int)p; j < (int)nos; j += (int)pulse_spacing)
  595.             printf("%3d  ", cb[i][j]);
  596.             
  597.         printf("n");
  598.     }
  599.     printf("n");
  600.     */
  601.     /* -----------------------------------------------------------------*/
  602.     return;
  603. }
  604. /*
  605. ----------------------------------------------------------------------------
  606.   preselection of fixed codebook indices (Reduction from 16 to 5 WDBxx)
  607. ----------------------------------------------------------------------------
  608. */
  609. void 
  610. PHI_cbf_preselection
  611. (
  612. long  pulse_spacing,    /* In:   Regular Spacing Between Pulses         */
  613. long  num_fcbk_cands,   /* In:   #Preselected candidates for fixed cbk  */
  614. long  num_fcbk_vecs,    /* In:   #Vectors in the fixed code book        */
  615. long  nos,              /* In:    Number of samples to be processed     */
  616. long  **cb,             /* In:    Local fixed codebook,(Nf-1) by (nos-1)*/  
  617. long  p,                /* In:    Phase  of the RPE codebook            */
  618. float *tf,              /* In:    Backward-filtered target signal       */ 
  619. float a,                /* In:    LPC coeffs of the preselection filter */
  620. long  *pi               /* Out:   Result: Preselected Codebook Indices  */
  621. )
  622. {
  623.     float t1, t2, e;                           
  624.     float *rfp;                           
  625.     long is;
  626.     int i, j;
  627.     /*==================================================================*/
  628.     /* Allocate memory for rfp                                          */
  629.     /*==================================================================*/
  630.     if ((rfp = (float *)malloc((unsigned int)num_fcbk_vecs * sizeof(float)))== NULL )
  631.     {
  632.        fprintf(stderr, "n Malloc Failure in Block:Excitation Anlaysis n");
  633.        exit(1);
  634.     }
  635.   
  636.     /*==================================================================*/
  637.     /* computes rfp ratios                                              */
  638.     /*==================================================================*/
  639.     for (i = 0; i < (int)num_fcbk_vecs; i ++)
  640.     {
  641.         t1 = t2 = (float)0.0;
  642.         e = FLT_MIN;
  643.         for (j = 0; j < (int)nos; j ++)
  644.         {
  645.             t1  = t1 * a + (float) cb[i][j];
  646.             e  += t1 * t1;
  647.         }
  648.         for (j = (int)p; j < (int)nos; j += (int)pulse_spacing)
  649.         {
  650.             t2 += (float) cb[i][j] * tf[j];
  651.         }
  652.         rfp[i] = (t2 * t2) / e;
  653.     }
  654.     /*==================================================================*/
  655.     /* select Pf indices with largest rfp's                             */
  656.     /*==================================================================*/
  657.     for (j = 0; j < (int)num_fcbk_cands; j ++)
  658.     {
  659.         e = -FLT_MAX;
  660.         for (i = 0; i < (int)num_fcbk_vecs; i ++)
  661.             if (rfp[i] > e)
  662.             {
  663.                 e = rfp[i];
  664.                 is = (long)i;
  665.             }
  666.         assert(is < num_fcbk_vecs);
  667.         pi[j] = is;
  668.         rfp[is] = -FLT_MAX;
  669.     }
  670.     
  671.     /*==================================================================*/
  672.     /*FREE rfp                                                         */
  673.     /*==================================================================*/
  674.    FREE(rfp);
  675.     return;
  676. }
  677. /*
  678. ------------------------------------------------------------------------
  679.   fixed codebook search
  680. ------------------------------------------------------------------------
  681. */
  682. void 
  683. PHI_cbf_search(
  684. long  num_of_pulses,    /* In:  Number of pulses in the sequence        */
  685. long  pulse_spacing,    /* In:  Regular Spacing Between Pulses          */
  686. long  num_fcbk_cands,   /* In:  #Preselected candidates for fixed cbk   */
  687. long  nos,              /* In:  Number of samples to be processed       */
  688. long  **cb,             /* In:  Local fixed codebook                    */
  689. long  p,                /* In:  Phase of the fixed codebook, 0 to D-1   */
  690. long  *pi,              /* In:  Preselected codebook indices, p[0..Pf-1]*/
  691. float *h,               /* In:  Synthesis filter impulse response,      */
  692. float *e,               /* In:  Target residual signal, e[0..nos-1]     */
  693. float *gain,            /* Out: Selected Fixed Codebook gain (Uncoded)  */ 
  694. long  *gid,             /* Out: Selected Fixed Codebook gain index      */
  695. long  *amp,             /* Out: S rpe pulse amplitudes, amp[0..Np-1]    */
  696. long  n                 /* In:  Subframe index, 0 to n_subframes-1      */
  697. )
  698. {
  699.     static float gp ;                            
  700.     float *y;                            
  701.     float num, den;
  702.     float g, r, rs;
  703.     int ks;
  704.     int i, j, k, m;
  705.         
  706.     rs = -FLT_MAX;
  707.     /*==================================================================*/
  708.     /* Allocate temp states                                             */
  709.     /*==================================================================*/
  710.     if ((y = (float *)malloc((unsigned int)nos * sizeof(float))) == NULL )
  711.     {
  712.        fprintf(stderr, "n Malloc Failure in Block: Excitation Anlaysis n");
  713.        exit(1);
  714.     }
  715.     for (k = 0; k < (int)num_fcbk_cands; k ++)
  716.     {
  717.         for (i = 0; i < (int)nos; i ++)
  718.         {
  719.             register float temp_y = (float)0.0;
  720.             for (j = (int)p; j <= i; j += (int)pulse_spacing)
  721.             {
  722.                 temp_y += h[i - j] * (float) cb[pi[k]][j];
  723.             }
  724.             y[i] = temp_y;
  725.         }
  726.         num = (float)0.0;
  727.         den = FLT_MIN;
  728.         for (i = 0; i < (int)nos; i ++)
  729.         {
  730.             num += e[i] * y[i];
  731.             den += y[i] * y[i];
  732.         }
  733.         g = num / den;
  734.         
  735.         if (!n)
  736.         {
  737.             for (m = 0; g > (float)tbl_cbf_dir[m].dec && m < QLf - 1; m ++);
  738.             g = (float)tbl_cbf_dir[m].rep;
  739.         }
  740.         else
  741.         {
  742.             g /= gp;
  743.             for (m = 0; g > (float)tbl_cbf_dif[m].dec && m < QLfd - 1; m ++);
  744.             g = gp * (float)tbl_cbf_dif[m].rep;
  745.         }
  746.         r = (float)2.0 * g * num - g * g * den;
  747.         if (r > rs)
  748.         {
  749.             rs = r;
  750.             ks = k;
  751.             *gid = (long)m;
  752.             *gain = g;
  753.         }
  754.     }
  755.     
  756.     for (k = (int)p, i = 0; i < (int)num_of_pulses; k += (int)pulse_spacing, i ++)
  757.     {
  758.         amp[i] = cb[pi[ks]][k];
  759.     }
  760.     gp = *gain;
  761.     /*==================================================================*/
  762.     /*FREE temp states                                                 */
  763.     /*==================================================================*/
  764.    FREE(y);
  765.     return;
  766. }
  767. /*
  768. ----------------------------------------------------------------------------
  769.   encodes rpe pulse amplitudes and phase into one index  
  770. ----------------------------------------------------------------------------
  771. */
  772. void 
  773. PHI_code_cbf_amplitude_phase
  774. (
  775. long num_of_pulses,      /* In:     Number of pulses in the sequence     */
  776. long pulse_spacing,      /* In:     Regular Spacing Between Pulses       */
  777. long *amp,               /* In:   Array of Pulse Amplitudes, amp[0..Np-1]*/
  778. long phase,              /* In:   The Phase of the RPE sequence          */
  779. long *index              /* Out:  Coded Index: Fixed Codebook index      */
  780. )
  781. {
  782.     int i;
  783.     long ac = 0;
  784.     for (i = 0; i < (int)num_of_pulses; i ++)
  785.     {
  786.         ac = (ac * 3) + (amp[i] == -1 ? (long)0 : (amp[i] ==  1 ? (long)1 : (long)2));
  787.     }
  788.     ac *= pulse_spacing;
  789.     
  790.     *index = ac + phase;
  791.     return;
  792. }
  793. /*
  794. ----------------------------------------------------------------------------
  795.   Decodes the RPE amplitudes and phase from the cbk-index
  796. ----------------------------------------------------------------------------
  797. */
  798. void
  799. PHI_decode_cbf_amplitude_phase
  800. (
  801. const long    num_of_pulses,  /* In:     Number of pulses in the sequence     */
  802. const long    pulse_spacing,  /* In:     Regular Spacing Between Pulses       */
  803. long  * const amp,            /* Out:  The Array of pulse amplitudes          */
  804. long  * const phase,          /* Out:  The phase of the RPE sequence          */ 
  805. const long    index           /* In:   Coded Fixed codebook index             */
  806. )
  807. {
  808.     int  i;
  809.     long ac;
  810.     /* =================================================================*/
  811.     /* Extract the phase First                                          */
  812.     /* =================================================================*/
  813.     *phase = (index % pulse_spacing);
  814.     ac = index - *phase;
  815.     ac /= pulse_spacing;
  816.     /* =================================================================*/
  817.     /* The remainder is used to extract the amplitude values            */
  818.     /* =================================================================*/
  819.     for (i = (int)num_of_pulses - 1; i >= 0; i--)
  820.     {
  821.         amp[i]  =  (ac % 3);
  822.         ac     /= 3;
  823.         
  824.         /*==============================================================*/
  825.         /* Only 3 amplitude values are permitted                        */
  826.         /*==============================================================*/
  827.         if (amp[i] == 0)
  828.             amp[i] = -1;
  829.         else if (amp[i] == 2)
  830.             amp[i] = 0;
  831.         else if (amp[i] == 1)
  832.             amp[i] = 1;
  833.         else        
  834.         {
  835.             fprintf(stderr, "FATAL ERROR: Unpermitted Amplitude Value n");
  836.             exit(1);
  837.         }
  838.     }
  839.     return;
  840. }
  841. /*
  842. ----------------------------------------------------------------------------
  843.   Decodes the Adaptive-Codebook Gain
  844. ----------------------------------------------------------------------------
  845. */
  846. void
  847. PHI_DecodeAcbkGain
  848. (
  849. long  acbk_gain_index,
  850. float *gain
  851. )
  852. {
  853.     int i, j;
  854.     if (acbk_gain_index > 31)
  855.     {
  856.         acbk_gain_index = -(64 - acbk_gain_index);
  857.     }
  858.     
  859.     if (acbk_gain_index < 0)
  860.     {
  861.         i = -1; 
  862.         j = (-1 * (int)acbk_gain_index) - 1;
  863.     }
  864.     else
  865.     {
  866.         i = 1;
  867.         j = (int)acbk_gain_index;
  868.     }
  869.     *gain = (float)i * (float)tbl_cba_dir[j].rep;
  870. }
  871. /*
  872. ----------------------------------------------------------------------------
  873.   Decodes the Fixed-Codebook Gain
  874. ----------------------------------------------------------------------------
  875. */
  876. void
  877. PHI_DecodeFcbkGain
  878. (
  879. long  fcbk_gain_index,
  880. long  ctr,
  881. float prev_gain, 
  882. float *gain
  883. )
  884. {
  885.     if (ctr == 0)
  886.     {
  887.         *gain = (float)tbl_cbf_dir[fcbk_gain_index].rep;
  888.     }
  889.     else
  890.     {
  891.         *gain = (float)tbl_cbf_dif[fcbk_gain_index].rep * prev_gain;
  892.     }
  893. }
  894. /*
  895. ------------------------------------------------------------------------
  896.   computes excitation of the adaptive codebook
  897. ------------------------------------------------------------------------
  898. */
  899. void 
  900. PHI_calc_cba_excitation
  901. (
  902. long   nos,             /* In:     Number of samples to be updated      */
  903. long   max_lag,         /* In:     Maximum Permitted Adapt cbk Lag      */
  904. long   min_lag,         /* In:     Minimum Permitted Adapt cbk Lag      */
  905. float  *cb,             /* In:     The current Adaptive codebook content*/ 
  906. long   idx,             /* In:     The chosen lag candidate             */
  907. float  *v               /* Out:    The Adaptive Codebook contribution   */
  908. )
  909. {
  910.     int i, j;
  911.     i = (int)(max_lag - min_lag - idx);
  912.     for (j = 0; j < (int)nos; j ++)
  913.         v[j] = cb[i + j];
  914.     return;
  915. }
  916. /*
  917. ----------------------------------------------------------------------------
  918.   computes excitation of the fixed codebook
  919. ----------------------------------------------------------------------------
  920. */
  921. void 
  922. PHI_calc_cbf_excitation
  923. (
  924. long   nos,             /* In:     Number of samples to be updated      */
  925. long   num_of_pulses,   /* In:     Number of pulses in the sequence     */
  926. long   pulse_spacing,   /* In:     Regular Spacing Between Pulses       */
  927. long   *amp,            /* In:     Aray of RPE pulse amplitudes         */
  928. long   p,               /* In:     Phase of the RPE sequence            */
  929. float  *v               /* Out:    The fixed codebook contribution      */
  930. )
  931. {
  932.     int i,k;
  933.     for (i = 0; i < (int)nos; i ++)
  934.         v[i] = (float)0;
  935.     for (k = 0, i = (int)p; k < (int)num_of_pulses; i += (int)pulse_spacing, k++)
  936.         v[i] = (float)amp[k];
  937.     return;
  938. }
  939. /*
  940. ----------------------------------------------------------------------------
  941.   compute the sum of the excitations
  942. ----------------------------------------------------------------------------
  943. */
  944. void 
  945. PHI_sum_excitations 
  946. long  nos,             /* In:     Number of samples to be updated      */
  947. float again,           /* In:     Adaptive Codebook gain               */ 
  948. float *asig,           /* In:     Adaptive Codebook Contribution       */ 
  949. float fgain,           /* In:     Fixed Codebook gain                  */  
  950. float *fsig,           /* In:     Fixed Codebook Contribution          */ 
  951. float *sum_sig         /* Out:    The Excitation sequence              */
  952. )
  953. {
  954.   int k;
  955.   for(k = 0; k < (int)nos; k++)
  956.   {
  957.      sum_sig[k] = again * asig[k] + fgain * fsig[k];
  958.   }
  959.   return;
  960. }
  961. /*
  962. ----------------------------------------------------------------------------
  963.   update adaptive codebook with the total excitation computed
  964. ----------------------------------------------------------------------------
  965. */
  966. void 
  967. PHI_update_cba_memory
  968. (
  969. long   nos,             /* In:     Number of samples to be updated      */
  970. long   max_lag,         /* In:     Maximum Adaptive Codebook Lag        */
  971. float *cb,              /* In/Out: Adaptive Codebook                    */ 
  972. float *vi               /* In:     Sum of adaptive and fixed excitaion  */
  973. )
  974. {
  975.     int i;                        
  976.     for (i = (int)nos; i < (int)max_lag; i ++)
  977.         cb[i - (int)nos] = cb[i];
  978.     for (i = 0; i < (int)nos; i ++)
  979.         cb[(int)max_lag - 1 - i] = vi[(int)nos - 1 - i];
  980.     return;
  981. }
  982. /*
  983. ---------------------------------------------------------------------------
  984.   update synthesis filter states
  985. ----------------------------------------------------------------------------
  986. */
  987. void 
  988. PHI_update_filter_states
  989. (
  990. long   nos,             /* In:     Number of samples                    */
  991. long   order,           /* In:     Order of the LPC                     */ 
  992. float *vi,              /* In:     Total Codebook contribution          */
  993. float *vp,              /* In/Out: Filter States, vp[0..order-1]        */ 
  994. float *a                /* In:     Lpc Coefficients, a[0..order-1]      */
  995. )
  996. {
  997.     float v;                       
  998.     int i, j;
  999.     for (i = 0; i < (int)nos; i ++)
  1000.     {
  1001.         v = vi[i];
  1002.         for (j = 0; j < (int)order; j ++)
  1003.             v += a[j] * vp[j];
  1004.         for (j = (int)order - 1; j > 0; j --)
  1005.             vp[j] = vp[j - 1];
  1006.         vp[0] = v;
  1007.     }
  1008.     return;
  1009. }
  1010. /*======================================================================*/
  1011. /*      H I S T O R Y                                                   */
  1012. /*======================================================================*/
  1013. /* 17-04-96 R. Taori  Initial Version                                   */
  1014. /* 13-08-96 R. Taori  Added 2 subroutines CompAmpArray CompPosArray     */
  1015. /*                    Modified generate_cbf to reflect the above        */