lsptopc.c
上传用户:szhypcb168
上传日期:2007-01-06
资源大小:2187k
文件大小:3k
源码类别:

语音压缩

开发平台:

Unix_Linux

  1. /**************************************************************************
  2. *
  3. * NAME
  4. * lsptopc 
  5. *
  6. * FUNCTION
  7. *
  8. * convert lsp frequencies to predictor coefficients
  9. *
  10. * SYNOPSIS
  11. *
  12. * subroutine lsptopc(f, pc)
  13. *
  14. *   formal
  15. * data I/O
  16. * name type type function
  17. * -------------------------------------------------------------------
  18. * f real i lsp frequencies
  19. * pc real o LPC predictor coefficients
  20. *
  21. *   external
  22. *                       data    I/O
  23. *       name            type    type    function
  24. *       -------------------------------------------------------------------
  25. * no int i
  26. * frame int i
  27. *
  28. ***************************************************************************
  29. *
  30. * DESCRIPTION
  31. *
  32. * LSPTOPC converts line spectral frequencies to LPC predictor
  33. * coefficients.
  34. *
  35. * The analysis filter may be reconstructed:
  36. *
  37. * A(z) = 1/2 [ P(z) + Q(z) ]
  38. *
  39. * CELP's LPC predictor coefficient convention is:
  40. *              p+1         -(i-1)
  41. *       A(z) = SUM   a   z          where a  = +1.0
  42. *              i=1    i                    1
  43. *
  44. ***************************************************************************
  45. *
  46. * CALLED BY
  47. *
  48. * celp spectdist   intsynth
  49. *
  50. * CALLS
  51. *
  52. *
  53. *
  54. **************************************************************************/
  55. #define TRUE 1
  56. #define FALSE 0
  57. #include <math.h>
  58. #include <stdio.h>
  59. #include "ccsub.h"
  60. extern int no, frame;
  61. lsptopc(f, pc)
  62. float f[], pc[];
  63. {
  64.   int i, j, k, noh, lspflag;
  65.   float freq[MAXNO], p[MAXNO / 2], q[MAXNO / 2];
  66.   float a[MAXNO / 2 + 1], a1[MAXNO / 2 + 1], a2[MAXNO / 2 + 1];
  67.   float b[MAXNO / 2 + 1], b1[MAXNO / 2 + 1], b2[MAXNO / 2 + 1];
  68.   float pi, xx, xf;
  69.   /* *check input for ill-conditioned cases   */
  70.   if (f[0] <= 0.0 || f[0] >= 0.5)
  71.     printf("lsptopc: LSPs out of bounds; f(0) = %f at frame %dn",
  72.    f[0], frame);
  73.   lspflag = FALSE;
  74.   for (i = 1; i < no; i++)
  75.   {
  76.     if (f[i] <= f[i - 1])
  77.       lspflag = TRUE;
  78.     if (f[i] <= 0.0 || f[i] >= 0.5)
  79.       printf("lsptopc: LSPs out of bounds; f(%d) = %f at frame %dn",
  80.      i, f[i], frame);
  81.   }
  82.   if (lspflag)
  83.     printf("lsptopc: nonmonotonic LSPs at frame %dn", frame);
  84.   /* *initialization   */
  85.   pi = 3.1415926535897931032;
  86.   noh = no / 2;
  87.   for (j = 0; j < no; j++)
  88.     freq[j] = f[j];
  89.   for (i = 0; i < noh + 1; i++)
  90.   {
  91.     a[i] = 0.;
  92.     a1[i] = 0.;
  93.     a2[i] = 0.;
  94.     b[i] = 0.;
  95.     b1[i] = 0.;
  96.     b2[i] = 0.;
  97.   }
  98.   /* *lsp filter parameters   */
  99.   for (i = 0; i < noh; i++)
  100.   {
  101.     p[i] = -2. * cos(2. * pi * freq[2 * i]);
  102.     q[i] = -2. * cos(2. * pi * freq[2 * i + 1]);
  103.   }
  104.   /* *impulse response of analysis filter   */
  105.   xf = 0.0;
  106.   for (k = 0; k < no + 1; k++)
  107.   {
  108.     xx = 0.0;
  109.     if (k == 0)
  110.       xx = 1.0;
  111.     a[0] = xx + xf;
  112.     b[0] = xx - xf;
  113.     xf = xx;
  114.     for (i = 0; i < noh; i++)
  115.     {
  116.       a[i + 1] = a[i] + p[i] * a1[i] + a2[i];
  117.       b[i + 1] = b[i] + q[i] * b1[i] + b2[i];
  118.       a2[i] = a1[i];
  119.       a1[i] = a[i];
  120.       b2[i] = b1[i];
  121.       b1[i] = b[i];
  122.     }
  123.     if (k != 0)
  124.       pc[k - 1] = -.5 * (a[noh] + b[noh]);
  125.   }
  126.   /* *convert to CELP's predictor coefficient array configuration */
  127.   for (i = no - 1; i >= 0; i--)
  128.     pc[i + 1] = -pc[i];
  129.   pc[0] = 1.0;
  130. }