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

语音压缩

开发平台:

Unix_Linux

  1. c==========================================================================
  2. c
  3. c ROUTINE
  4. c               postfilt
  5. c
  6. c FUNCTION
  7. c                
  8. c               reduce coder noise (sample wise AGC version)
  9. c
  10. c SYNOPSIS
  11. c               subroutine postfilt(s, l, alpha, beta, oldpowerin
  12. c oldpowerout, dp1, dp2, dp3, dp4)
  13. c
  14. c   formal 
  15. c
  16. c                       data    I/O
  17. c       name            type    type    function
  18. c       -------------------------------------------------------------------
  19. c       s real i/o speech input/postfiltered output
  20. c l int i subframe size
  21. c alpha real i filter parameter
  22. c beta real i filter parameter
  23. c oldpowerin real i/o input power estimate
  24. c oldpowerout real i/o output power estimate
  25. c dp1 real i/o filter memory
  26. c dp2 real i/o filter memory
  27. c dp3 real i/o filter memory
  28. c dp4 real i/o filter memory
  29. c
  30. c==========================================================================
  31. c
  32. c DESCRIPTION
  33. c
  34. c Adaptive postfilter routine to reduce perceptual coder noise.
  35. c The postfilter emphasizes the spectral regions predicted by the
  36. c short-term LPC analysis.  This tends to mask coder noise by
  37. c concentrating it under the formant peaks.  Unfortunately, acoustic
  38. c background noise may also be enhanced because LPC analysis often
  39. c models acoustic noise instead of speech formants.  In addition,
  40. c postfiltering can be detrimental to tandem coding if not taken
  41. c into consideration.  (To overcome these problems, we hope to
  42. c eventually incorporate the postfilter's enhancement properties
  43. c into the analysis process.)
  44. c
  45. c Adaptive spectral tilt compensation is applied to flatten the
  46. c overall tilt of the postfilter.  [[Slight high frequency boost is
  47. c applied for output shaping.  A pitch postfilter is used to reduce
  48. c pitch buzz.]]  Finally, AGC compensates for the filter gains using
  49. c a time constant set by parameter tc that should be dependent on
  50. c frame length.
  51. c
  52. c==========================================================================
  53. c
  54. c REFERENCES
  55. c
  56. c Chen & Gersho, "Real-Time Vector APC Speech Coding at 4800 bps
  57. c with Adaptive Postfiltering," ICASSP '87, pp. 2185-2188.
  58. c
  59. c Juin-Hwey (Raymond) Chen, "Low-Bit-Rate Predictive Coding of
  60. c Speech Waveforms Based on Vector Quantization," PhD Dissertation,
  61. c UCSB ECE Dept., March 1987.
  62. c
  63. c Ramamoorthy, Jayant, Cox, & Sondhi, "Enhancement of ADPCM Speech
  64. c Coding with Backward-Adaptive Algorithms for Postfiltering and
  65. c Noise Feedback," IEEE JOSAIC, Feb. 1988, pp. 364-382.
  66. c
  67. c**************************************************************************
  68. c
  69. subroutine postfilt(s, l, alpha, beta, oldpowerin,
  70.      &                       oldpowerout, dp1, dp2, dp3, dp4)
  71. implicit undefined(a-z)
  72. integer l
  73. real s(l), alpha, beta, oldpowerin, oldpowerout
  74. include 'ccsub.com'
  75. convex #include "ccsub.com"
  76. real dp1(maxno), dp2(maxno), dp3(2), dp4(2) 
  77. integer n
  78. real powerin(0:maxl), powerout(0:maxl)
  79. real pcexp1(maxno+1), pcexp2(maxno+1), rcexp2(maxno)
  80. real ast(2), shape, tc
  81. parameter (shape = 0.3)
  82. parameter (tc = 0.01)
  83. c
  84. c
  85. c *estimate input power
  86. powerin(0) = oldpowerin
  87. do 10 n = 1, l
  88.    powerin(n) = (1.-tc)*powerin(n-1) + tc*s(n)**2
  89. 10 continue
  90. oldpowerin = powerin(l)
  91. c
  92. c
  93. c *BW expansion
  94. call bwexp(beta, fci, pcexp1, no)
  95. call bwexp(alpha, fci, pcexp2, no)
  96. c
  97. c *pole-zero postfilter
  98. call zerofilt(pcexp1, no, dp1, s, l)
  99. call polefilt(pcexp2, no, dp2, s, l)
  100. c
  101. c *find spectral tilt (1st order fit) of postfilter
  102. c *(denominator dominates the tilt)
  103. call pctorc(pcexp2, rcexp2, no)
  104. c
  105. c *tilt compensation by a scaled zero
  106. c *(don't allow HF roll-off)
  107. ast(1) = 1.0
  108. ast(2) = min(-0.5*rcexp2(1), 0.)
  109. call zerofilt(ast, 1, dp3, s, l)
  110. c
  111. c
  112. c *estimate output power
  113. powerout(0) = oldpowerout
  114. do 20 n = 1, l
  115.    powerout(n) = (1.-tc)*powerout(n-1) + tc*s(n)**2
  116. 20 continue
  117. oldpowerout = powerout(l)
  118. c
  119. c *sample wise automatic gain control
  120. do 30 n = 1, l
  121.    if (powerout(n) .gt. 0.0) then
  122.       s(n) = sqrt(powerin(n)/powerout(n))*s(n)
  123.    end if
  124. 30 continue
  125. return
  126. end