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

语音压缩

开发平台:

Unix_Linux

  1. c==========================================================================
  2. c
  3. c ROUTINE
  4. c               smoothtau
  5. c
  6. c FUNCTION
  7. c                
  8. c               smooth tau values when two errors detected in Hamming block
  9. c
  10. c SYNOPSIS
  11. c               smoothtau(tau,twoerror,syndavg,tau3,subframe)
  12. c
  13. c   formal 
  14. c
  15. c                       data    I/O
  16. c       name            type    type    function
  17. c       -------------------------------------------------------------------
  18. c       tau real i/o input tau
  19. c twoerror log i two error flag
  20. c syndavg real i error rate estimation parameter
  21. c tau3 int i third tau value
  22. c subframe int i subframe number
  23. c
  24. c==========================================================================
  25. c
  26. c DESCRIPTION
  27. c
  28. c Smoothing routine to smooth tau (pitch lag) when errors are detected:
  29. c
  30. c If the variance of past tau values is within the range VARLIMIT 
  31. c (indicating voiced speech) the validity of the current tau value
  32. c is tested.  If the current value of tau is within the range TAULIMIT,
  33. c TAU is passed.  If TAU is not within the range TAULIMIT, TAU is reset
  34. c to the average value of taus.
  35. c The array OLDTAU contains past values of tau.  The array VECTOR
  36. c is constructed from the array OLDTAU and TAU3 for subframes 1
  37. c and 2 (TAU3 is a future absolute tau value).  For subframes 3
  38. c and 4 there are no valid future values (since delta taus in the 
  39. c future are not valid), therefore the array VECTOR is constructed 
  40. c entirely from the array OLDTAU.  Decisions concering smoothing of 
  41. c a particular tau are made on the variance of the array VECTOR and 
  42. c the tau in question (TAU).
  43. c
  44. c If the value of tau is smoothed in subframe 3, smoothing is disabled
  45. c for subframe 4 of the same frame since the tau value in subframe 4
  46. c is a delta based on subframe 3.
  47. c
  48. c Note:  The smoothing parameters should be capable of adapting
  49. c to various bit error rate estimates. For example, different
  50. c values of SYNDAVG should select different levels of TAULIMIT and
  51. c VARLIMIT.
  52. c
  53. c**************************************************************************
  54. c
  55. subroutine smoothtau(tau,twoerror,syndavg,tau3,subframe)
  56. implicit undefined(a-z)
  57. c
  58. real tau,syndavg,tau3
  59. logical twoerror,enable
  60. include 'ccsub.com'
  61. convex #include "ccsub.com"
  62. integer tauhistory,taulimit,varlimit,subframe,i
  63. parameter (tauhistory=4)
  64. real avg,var,vector(4),oldtau(tauhistory)
  65. c
  66. save oldtau,enable
  67. c
  68. parameter (taulimit=15)
  69. parameter (varlimit=15)
  70. c
  71. if (subframe .ne. 4) enable = .true.
  72. if ((twoerror .or. syndavg.gt.0.04) .and. enable) then
  73.    if (subframe .eq. 1) then
  74.       vector(1)=oldtau(1)
  75.       vector(2)=oldtau(2)
  76.       vector(3)=oldtau(3)
  77.       vector(4)=tau3
  78.    else if (subframe .eq. 2) then
  79.       vector(1)=oldtau(1)
  80.       vector(2)=oldtau(2)
  81.       vector(3)=oldtau(3)
  82.       vector(4)=tau3
  83.    else if (subframe .eq. 3) then
  84.       vector(1)=oldtau(1)
  85.       vector(2)=oldtau(2)
  86.       vector(3)=oldtau(3)
  87.       vector(4)=oldtau(4)
  88.    else if (subframe .eq. 4) then
  89.       vector(1)=oldtau(1)
  90.       vector(2)=oldtau(2)
  91.       vector(3)=oldtau(3)
  92.       vector(4)=oldtau(4)
  93.    else
  94.       print *,' smoothtau:  Error in subframe number'
  95.    end if
  96.    call variance(vector,4,var,avg)
  97.    if (var.lt.varlimit .and. 
  98.      &           (tau.ge.avg+taulimit .or. tau.le.avg-taulimit)) then
  99.       tau=nint(avg)
  100.       print *,' smoothtau:  tau value reset to avg',
  101.      &                ' at frame', frame,' subframe', subframe
  102.       if (subframe .eq. 3) then
  103.  enable = .false.
  104.  print *,' smoothtau:  tau smoothing disabled for subframe 4'
  105.       end if
  106.    end if
  107. end if
  108. do 30 i=tauhistory-1,1,-1
  109.    oldtau(i+1)=oldtau(i)
  110. 30 continue
  111. oldtau(1)=tau
  112. return   
  113. end