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

语音压缩

开发平台:

Unix_Linux

  1. c==========================================================================
  2. c
  3. c ROUTINE
  4. c               segsnr
  5. c
  6. c FUNCTION
  7. c                
  8. c               calculate average segmental SNR 
  9. c
  10. c SYNOPSIS
  11. c               subroutine segsnr(s, ts, sumsnr, framesnr, snrflag)
  12. c
  13. c   formal 
  14. c
  15. c                       data    I/O
  16. c       name            type    type    function
  17. c       -------------------------------------------------------------------
  18. c       s real i "reference" speech input
  19. c ts i*2 i "test" speech input
  20. c l int i number of samples
  21. c sumsnr real o average snr
  22. c framesnr int o number of calculations averaged
  23. c snrflag log o flag for valid snr value
  24. c
  25. c==========================================================================
  26. c
  27. c DESCRIPTION
  28. c
  29. c
  30. c**************************************************************************
  31. c
  32. subroutine segsnr(s, ts, l, sumsnr, framesnr, snrflag)
  33. c
  34. implicit undefined(a-z)
  35. c
  36. integer l, framesnr
  37. real s(l), sumsnr
  38. integer*2 ts(l)
  39. logical snrflag
  40. real seng, neng, snr
  41. integer j
  42. c
  43. snrflag = .false.
  44. seng = 0.
  45. neng = 0.
  46. do 10 j = 1, l
  47.    seng = seng + s(j)**2
  48.    neng = neng + (s(j)-ts(j))**2
  49. 10 continue
  50. if (neng .gt. 0.) then
  51.    snr = seng/neng
  52.    if (snr .gt. 0) then
  53. c       only include segments whose snr is between -10 dB and 64 dB 
  54.       if (10*log10(snr).gt.-10. .and. 10*log10(snr).lt.64.)then
  55.  snrflag = .true.
  56.          sumsnr = sumsnr + snr
  57.          framesnr = framesnr + 1
  58.       else
  59. c  print *,'segsnr value not valid for analysis'
  60.  snrflag = .false.
  61.       end if
  62.    end if
  63. end if
  64. return
  65. end