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

语音压缩

开发平台:

Unix_Linux

  1. c==========================================================================
  2. c
  3. c ROUTINE
  4. c               postfilt2
  5. c
  6. c FUNCTION
  7. c                
  8. c               reduce coder noise (block wise AGC version)
  9. c
  10. c SYNOPSIS
  11. c               subroutine postfilt2(s, l, alpha, beta, powerin
  12. c powerout, 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 powerin real i/o input power estimate
  24. c powerout 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 postfilt2(s, l, alpha, beta, powerin,
  70.      &                       powerout, dp1, dp2, dp3, dp4)
  71. implicit undefined(a-z)
  72. integer l
  73. real s(l), alpha, beta, powerin, powerout
  74. include 'ccsub.com'
  75. convex #include "ccsub.com"
  76. real dp1(maxno), dp2(maxno), dp3(2), dp4(2) 
  77. integer n
  78. real pcexp1(maxno+1), pcexp2(maxno+1), rcexp2(maxno)
  79. real ast(2), scale, shape, tc
  80. parameter (shape = 0.3)
  81. parameter (tc = 0.01)
  82. c
  83. c *estimate input power
  84. do 10 n = 1, l
  85.    powerin = (1.-tc)*powerin + tc*s(n)**2
  86. 10 continue
  87. c
  88. c *BW expansion
  89. call bwexp(beta, fci, pcexp1, no)
  90. call bwexp(alpha, fci, pcexp2, no)
  91. c
  92. c *pole-zero postfilter
  93. call zerofilt(pcexp1, no, dp1, s, l)
  94. call polefilt(pcexp2, no, dp2, s, l)
  95. c
  96. c *find spectral tilt (1st order fit) of postfilter
  97. c *(denominator dominates the tilt)
  98. call pctorc(pcexp2, rcexp2, no)
  99. c
  100. c *tilt compensation by a scaled zero
  101. c *(don't allow HF roll-off)
  102. ast(1) = 1.0
  103. ast(2) = min(-0.5*rcexp2(1), 0.)
  104. call zerofilt(ast, 1, dp3, s, l)
  105. c
  106. c *estimate output power
  107. do 20 n = 1, l
  108.    powerout = (1.-tc)*powerout + tc*s(n)**2
  109. 20 continue
  110. c
  111. c *block wise automatic gain control
  112. if (powerout .gt. 0.0) then
  113.    scale = sqrt(powerin/powerout)
  114.    do 30 n = 1, l
  115.       s(n) = scale*s(n)
  116. 30    continue
  117. end if
  118. return
  119. end