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

语音压缩

开发平台:

Unix_Linux

  1. c==========================================================================
  2. c
  3. c ROUTINE
  4. c               smoothpgain
  5. c
  6. c FUNCTION
  7. c                
  8. c               smooth pgain values when two errors detected in 
  9. c Hamming block
  10. c
  11. c SYNOPSIS
  12. c               smoothpgain(pgain,twoerror,syndavg)
  13. c
  14. c   formal 
  15. c
  16. c                       data    I/O
  17. c       name            type    type    function
  18. c       -------------------------------------------------------------------
  19. c       pgain real i/o input pgain
  20. c twoerror log i two error flag
  21. c syndavg real i error rate estimation parameter
  22. c pgains real i vector of pgains 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 pgain (alpha) when errors are detected:
  30. c
  31. c Due to the range of PGAIN, statistical variance is not appropriate.
  32. c Pseudovariance is used and calculated as: 
  33. c sum of delta oldpgains/# of deltas
  34. c
  35. c If this variance of past pgain values is within the range VARLIMIT, 
  36. c the validity of the current pgain value is tested.  If the current 
  37. c value of pgain is within the range PGAINLIMIT, PGAIN is passed.  
  38. c If PGAIN is not within that range it is reset to the average
  39. c value of surrounding pgain values.
  40. c
  41. c The array OLDPGAIN contains past values of pgain.  The array
  42. c PGAINS contains current and future values of pgain.  The array 
  43. c VECTOR is constructed from the arrays OLDPGAIN and PGAINS 
  44. c depending on the current subframe.  PGAIN is smoothed based on 
  45. c the statistics of VECTOR, which contains the nearest four 
  46. c surrounding pgain values, both past and future values, except 
  47. c where future values are not available (subframes 3 and 4).
  48. c
  49. c Absolute values of pgain are used in averaging and reassigning
  50. c pgain.  All reassigned pgains are limited to the range 0.0-1.0.
  51. c
  52. c Note:  The smoothing parameters should be capable of adapting
  53. c to various bit error rate estimates. For example, different
  54. c values of SYNDAVG should select different levels of PGAINLIMIT,
  55. c VARLIMIT, and SYNDLIMIT.
  56. c
  57. c
  58. c**************************************************************************
  59. c
  60. subroutine smoothpgain(pgain,twoerror,syndavg,pgains,subframe)
  61. implicit undefined(a-z)
  62. c
  63. real pgain,syndavg,pgains(4)
  64. logical twoerror,enable
  65. include 'ccsub.com'
  66. convex #include "ccsub.com"
  67. integer pgainhistory
  68. parameter (pgainhistory=4)
  69. real oldpgain(pgainhistory),varlimit,pgainlimit,abspgain
  70. integer i,subframe
  71. real avg,var,sum1,sum2,vector(4),syndlimit
  72. c
  73. save oldpgain,enable
  74. c
  75. parameter (pgainlimit=0.9)
  76. parameter (varlimit=0.2)
  77. parameter (syndlimit=0.04)
  78. c
  79. abspgain=abs(pgain)
  80. if (subframe .ne. 4) enable = .true.
  81. if ((twoerror .or. syndavg.gt.syndlimit) .and. enable) then
  82.    if (subframe .eq. 1) then
  83.       vector(1)=oldpgain(1)
  84.       vector(2)=oldpgain(2)
  85.       vector(3)=abs(pgains(2))
  86.       vector(4)=abs(pgains(3))
  87.    else if (subframe .eq. 2) then
  88.       vector(1)=oldpgain(1)
  89.       vector(2)=oldpgain(2)
  90.       vector(3)=abs(pgains(3))
  91.       vector(4)=abs(pgains(4))
  92.    else if (subframe .eq. 3) then
  93.       vector(1)=oldpgain(1)
  94.       vector(2)=oldpgain(2)
  95.       vector(3)=oldpgain(3)
  96.       vector(4)=abs(pgains(4))
  97.    else if (subframe .eq. 4) then
  98.       vector(1)=oldpgain(1)
  99.       vector(2)=oldpgain(2)
  100.       vector(3)=oldpgain(3)
  101.       vector(4)=oldpgain(4)
  102.    else
  103.       print *,' smoothpgain:  Error in subframe number'
  104.    end if
  105.    sum1=0.
  106.    do 10 i=1,pgainhistory
  107.       sum1=sum1+vector(i)
  108. 10    continue
  109.    avg=sum1/float(pgainhistory)
  110.    sum2=0.
  111.    do 20 i=1,pgainhistory-1
  112.       sum2=sum2+abs(vector(i)-vector(i+1))
  113. 20    continue
  114.    var=sum2/float(pgainhistory-1)
  115.    if ((var.lt.varlimit) .and. enable) then
  116.       if (abspgain.gt.avg+pgainlimit  .or.
  117.      1            abspgain.lt.avg-pgainlimit) then
  118.          pgain=avg
  119.  if (pgain.gt.1.0) pgain=1.0
  120.  if (pgain.lt.-1.0) pgain=-1.0
  121.          print *,' smoothpgain:  pgain value reset to avg',
  122.      &                   ' at frame', frame,' subframe', subframe
  123.  if (subframe .eq. 3) then
  124.     enable = .false.
  125.     print *,' smoothpgain:  smoothing disabled for subframe 4'
  126.  end if
  127.       end if
  128.    end if
  129. end if
  130. do 30 i=pgainhistory-1,1,-1
  131.    oldpgain(i+1)=oldpgain(i)
  132. 30 continue
  133. oldpgain(1)=abspgain
  134. return
  135. end