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

语音压缩

开发平台:

Unix_Linux

  1. c==========================================================================
  2. c
  3. c ROUTINE
  4. c               smoothcbgain
  5. c
  6. c FUNCTION
  7. c                
  8. c               smooth cbgain values when two errors detected in 
  9. c Hamming block
  10. c
  11. c SYNOPSIS
  12. c               smoothcbgain(cbgain,twoerror,syndavg,gains,subframe)
  13. c
  14. c   formal 
  15. c
  16. c                       data    I/O
  17. c       name            type    type    function
  18. c       -------------------------------------------------------------------
  19. c       cbgain real i/o input cbgain
  20. c twoerror log i two error flag
  21. c syndavg real i error rate estimation parameter
  22. c gains real i vector of gains to calculate variance
  23. c subframe int i subframe number
  24. c
  25. c==========================================================================
  26. c
  27. c DESCRIPTION
  28. c
  29. c Smoothing routine to smooth cbgain when errors are detected:
  30. c
  31. c If the variance of past cbgain values is within the range VARLIMIT, 
  32. c the validity of the current cbgain value is tested.  If the current 
  33. c value of cbgain is within the range CBGAINLIMIT, CBGAIN is passed.
  34. c If CBGAIN is not within the range CBGAINLIMIT it is reset to the 
  35. c average value of the surrounding cbgain values.
  36. c
  37. c The array OLDCBGAIN contains past values of cbgain.  The array
  38. c GAINS contains current and future values of cbgain.  The array
  39. c VECTOR is constructed from the arrays OLDCBGAIN and GAINS
  40. c depending on the current subframe.  CBGAIN is smoothed based on
  41. c the statistics of VECTOR, which contains the nearest four 
  42. c surrounding cbgain values, both past and future values, except
  43. c where future values are not available (subframes 3 and 4).
  44. c
  45. c Note:  The smoothing parameters should be capable of adapting
  46. c to various bit error rate estimates. For example, different
  47. c values of SYNDAVG should select different levels of CBGAINLIMIT,
  48. c VARLIMIT, and SYNDLIMIT.
  49. c
  50. c**************************************************************************
  51. c
  52. subroutine smoothcbgain(cbgain,twoerror,syndavg,gains,subframe)
  53. implicit undefined(a-z)
  54. c
  55. real cbgain,syndavg,gains(4)
  56. logical twoerror,enable
  57. include 'ccsub.com'
  58. convex #include "ccsub.com"
  59. integer cbgainhistory,subframe
  60. parameter (cbgainhistory=4)
  61. real oldcbgain(cbgainhistory),avg,var,abscbgain,vector(4)
  62. integer i,sign
  63. real varlimit,cbgainlimit,sgainlimit,svarlimit,avglimit,syndlimit
  64. c
  65. save oldcbgain,enable
  66. c
  67. parameter (cbgainlimit=300.)
  68. parameter (varlimit=30000.)
  69. parameter (sgainlimit=9.)
  70. parameter (svarlimit=10.)
  71. parameter (avglimit=6.)
  72. parameter (syndlimit=0.04)
  73. c
  74. abscbgain=abs(cbgain)
  75. if (subframe .ne. 4) enable = .true.
  76. if ((twoerror .or. syndavg.gt.syndlimit) .and. enable) then
  77.    if (subframe .eq. 1) then
  78.       vector(1)=oldcbgain(1)
  79.       vector(2)=oldcbgain(2)
  80.       vector(3)=abs(gains(2))
  81.       vector(4)=abs(gains(3))
  82.    else if (subframe .eq. 2) then
  83.       vector(1)=oldcbgain(1)
  84.       vector(2)=oldcbgain(2)
  85.       vector(3)=abs(gains(3))
  86.       vector(4)=abs(gains(4))
  87.    else if (subframe .eq. 3) then
  88.       vector(1)=oldcbgain(1)
  89.       vector(2)=oldcbgain(2)
  90.       vector(3)=oldcbgain(3)
  91.       vector(4)=abs(gains(4))
  92.    else if (subframe .eq. 4) then
  93.       vector(1)=oldcbgain(1)
  94.       vector(2)=oldcbgain(2)
  95.       vector(3)=oldcbgain(3)
  96.       vector(4)=oldcbgain(4)
  97.    else
  98.       print *,' smoothcbgain:  Error in subframe number'
  99.    end if
  100.    call variance(vector,4,var,avg)
  101.    sign=nint(cbgain/abs(cbgain))
  102.    if (var.lt.varlimit .and. (abscbgain.gt.avg+cbgainlimit .or.
  103.      &         abscbgain.lt.avg-cbgainlimit)) then
  104.       abscbgain=avg
  105.       print *,' smoothcbgain:  cbgain value reset to avg cbgains',
  106.      &                ' at frame', frame,' subframe', subframe
  107.       cbgain=sign*abscbgain
  108.       if (subframe .eq. 3) then
  109.  enable = .false.
  110.  print *,' smoothcbgain:  smoothing disabled for subframe 4'
  111.       end if
  112.    end if
  113.    if ((var.lt.svarlimit) .and. (abscbgain.gt.sgainlimit) .and. 
  114.      &         (avg.lt.avglimit) .and. enable) then 
  115.       abscbgain=avg
  116.       cbgain=sign*abscbgain
  117.       print *,' smoothcbgain:  cbgain value reset to avg (silence?)',
  118.      &       ' at frame', frame,' subframe', subframe
  119.       if (subframe .eq. 3) then
  120.  enable = .false.
  121.  print *,' smoothcbgain:  smoothing disabled for subframe 4'
  122.       end if
  123.    end if
  124. end if
  125. do 30 i=cbgainhistory-1,1,-1
  126.    oldcbgain(i+1)=oldcbgain(i)
  127. 30 continue
  128. oldcbgain(1)=abscbgain
  129. return
  130. end