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

语音压缩

开发平台:

C/C++

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