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

语音压缩

开发平台:

Unix_Linux

  1. /**************************************************************************
  2. *
  3. * ROUTINE
  4. *               dist
  5. *
  6. * FUNCTION
  7. *                
  8. *               computes distance measures and the likelihood ratio
  9. *
  10. * SYNOPSIS
  11. *               subroutine dist(m,l,r,rp,dm,sumdm,iframedm)
  12. *
  13. *   formal 
  14. *
  15. *                       data    I/O
  16. *       name            type    type    function
  17. *       -------------------------------------------------------------------
  18. *       m int i filter order
  19. * l int i number of terms used in cepstral
  20. * distance measure
  21. * r float i ifile autocorrelation sequence
  22. * rp float i ofile autocorrelation sequence
  23. * dm float o distances array (subframe)
  24. * sumdm float o distances array (current sum)
  25. * iframedm int o number of subframes  
  26. *
  27. ***************************************************************************
  28. *
  29. * DESCRIPTION
  30. *
  31. * See references.
  32. *
  33. ***************************************************************************
  34. *
  35. * CALLED BY
  36. *
  37. * distortion spectdist
  38. *
  39. * CALLS
  40. *
  41. * find
  42. *
  43. ***************************************************************************
  44. * REFERENCES
  45. *
  46. * "Distance Measures for Speech Processing", A.H. Gray and J.D. Markel,
  47. * IEEE Trans. on ASSP, Vol. ASSP-24, no. 5, Oct. 1976
  48. *
  49. * "Quantization and Bit Allocation in Speech Processing",
  50. * A.H. Gray and J.D. Markel,IEEE Trans. on ASSP, Vol. ASSP-24
  51. * no. 6, Dec. 1976
  52. *
  53. * "A Note on Quantization and Bit Allocation in Speech Processing",
  54. * A.H. Gray and J.D. Markel,IEEE Trans. on ASSP, Vol. ASSP-25
  55. * no. 3, June 1977
  56. *
  57. **************************************************************************/
  58. #define TRUE 1
  59. #define FALSE 0
  60. #define DBFAC 4.342944819
  61. #define fin(z) DBFAC*log(1.+z+sqrt(z*(2.+z)))
  62. #include "ccsub.h"
  63. #include <math.h>
  64. dist(m,l,r,rp,dm,sumdm,iframedm)
  65. int m, l, *iframedm;
  66. float dm[], r[], rp[], sumdm[];
  67. {
  68.   float c[MAXL*6], cp[MAXL*6], ra[2*MAXNO + 1], rap[2*MAXNO + 1];
  69.   float a[2*MAXNO + 1], ap[2*MAXNO + 1], rc[2*MAXNO + 1], rcp[2*MAXNO + 1];
  70.   float alp, alpp, del, delp, q, q1, q2, sum;
  71.   int qflag = TRUE, i;
  72.   setr(2*MAXNO+1, 0.0, a);
  73.   setr(2*MAXNO+1, 0.0, ap);
  74.   find(m, l, r, c, ra, &alp, a, rc);
  75.   find(m, l, rp, cp, rap, &alpp, ap, rcp);
  76.   del = r[0] * rap[0];
  77.   delp = rp[0] * ra[0];
  78.   for (i = 1; i <= m; i++)
  79.   {
  80.     del += 2.0 * r[i] * rap[i];
  81.     delp += 2.0 * rp[i] * ra[i];
  82.   }
  83.   dm[0] = del / alp;
  84.   dm[1] = delp / alpp;
  85.   q = (dm[0] + dm[1]) / 2.0 - 1.0;
  86.   qflag = (q >= 0.0);
  87.   if (qflag) 
  88.     dm[2] = fin(q);
  89.   q1 = alpp * r[0] / (alp * rp[0]);
  90.   q = (dm[0] / q1 + dm[1] * q1) * 0.5 - 1.0;
  91.   qflag = (q >= 0.);
  92.   if (qflag)
  93.     dm[3] = fin(q);
  94.   q2 = alpp / alp;
  95.   q = (dm[0] / q2 + dm[1] * q2) * 0.5 - 1.0;
  96.   qflag = (q >= 0.);
  97.   if (qflag) 
  98.     dm[4] = fin(q);
  99.   q = sqrt(dm[0] * dm[1]) - 1.0;
  100.   qflag = (q >= 0.);
  101.   if (qflag)
  102.     dm[5] = fin(q);
  103.   sum = 0.0;
  104.   for (i = 0; i < l; i++)
  105.   {
  106.     q = c[i] - cp[i];
  107.     sum += q * q;
  108.   }
  109.   sum *= 2;
  110.   if (sum >= 0.)
  111.   {
  112.     dm[6] = DBFAC * sqrt(sum);
  113.     q = log(q1);
  114.     dm[7] = DBFAC * sqrt(sum + q * q);
  115.     q = log(q2);
  116.     dm[8] = DBFAC * sqrt(sum + q * q);
  117.   }
  118.   else 
  119.     qflag = FALSE;
  120.   if(qflag)
  121.   {
  122.     for (i = 0; i < 9; i++)
  123.       sumdm[i] += dm[i];
  124.     for (i = 2; i < 9; i++)
  125.       sumdm[9] += dm[i] / 7.0;
  126.     (*iframedm)++;
  127.   }
  128.   qflag = TRUE;
  129. }