polefilt.c
上传用户:tsjrly
上传日期:2021-02-19
资源大小:107k
文件大小:2k
源码类别:

语音压缩

开发平台:

C/C++

  1. /**************************************************************************
  2. *
  3. * ROUTINE
  4. * polefilt
  5. *
  6. * FUNCTION
  7. * Direct form all-pole filter
  8. *
  9. * SYNOPSIS
  10. * subroutine polefilt(a, n, z, xy, len)
  11. *
  12. *   formal 
  13. *
  14. *                       data    I/O
  15. *       name            type    type    function
  16. *       -------------------------------------------------------------------
  17. * a float i N+1 filter coefficients
  18. * n int i Filter order 
  19. * z float i/o N+1 filter delay elements
  20. * (maintained by the user)
  21. * (z[0] is a dummy delay)
  22. * xy float i/o Input/Output data array 
  23. * len int i Number of samples to filter
  24. *
  25. ***************************************************************************
  26. *       
  27. * DESCRIPTION
  28. *
  29. * Recursive all-pole in-place time-domain filter.
  30. * The transfer function 1/A(z) is implemented
  31. * in a direct form realisation.
  32. *
  33. *                   N       -i
  34. *       H(z) = 1 / SUM a(i)z         with a(0) = +1.0
  35. *                  i=0
  36. *
  37. * NOTE:  a(0) is not used for the actual computing,
  38. * as can easily be seen in the following flow graph.
  39. *
  40. *       x(t) ->---+------->--------(z0)-----> y(t)
  41. *                 |                  |
  42. *                 +-------< -a1 ----z1
  43. *                 |                  |
  44. *                 +-------< -a2 ----z2
  45. *                 |                  |
  46. *                 :                  :
  47. *                 |                  |
  48. *                 +-------< -aN ----zN
  49. *
  50. ***************************************************************************
  51. *
  52. * CALLED BY
  53. *
  54. * celp confg impulse   postfilt
  55. *
  56. * CALLS
  57. *
  58. *
  59. ***************************************************************************
  60. *
  61. * REFERENCES
  62. *
  63. * Oppenheim & Schafer, Digital Signal Processing, PH, 1975, p. 149.
  64. *
  65. **************************************************************************/
  66. polefilt(a, n, z, xy, len)
  67. int n, len;
  68. float a[], z[], xy[];
  69. {
  70.   int t, j;
  71.   if (a[0] != 1.0)
  72.   {
  73.     printf("polefilt:  bad coefficients");
  74.     exit(1);
  75.   }
  76.   for (t = 0; t < len; t++)
  77.   {
  78.     z[0] = xy[t];
  79.     for (j = n; j > 0; j--)
  80.     {
  81.       z[0] -= a[j] * z[j];
  82.       z[j]  = z[j-1];
  83.     }
  84.     xy[t] = z[0];
  85.   }
  86. }