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

语音压缩

开发平台:

Unix_Linux

  1. c==========================================================================
  2. c
  3. c ROUTINE
  4. c               decodeham
  5. c
  6. c FUNCTION
  7. c               This subroutine decodes the bitstream generated by 
  8. c encodeham.  It will correct a single error, and detect 2 
  9. c errors.
  10. c               
  11. c
  12. c SYNOPSIS
  13. c               subroutine decodeham(codelength1,codelength2,hmatrix,
  14. c      syndrometable,paritybit,codeword,twoerror,synflag)
  15. c
  16. c   formal 
  17. c
  18. c                       data    I/O
  19. c       name            type    type    function
  20. c       -------------------------------------------------------------------
  21. c       codelength1 int i number of data bits
  22. c codelength2 int i number of information bits
  23. c hmatrix int i vector to encode an decode by
  24. c syndrometable int i errormasks used to correct single
  25. c errors
  26. c paritybit int i overall parity bit
  27. c codeword int i/o encoded/decoded stream 
  28. c twoerror log o flag for 2 error detect
  29. c synflag int o value 0 or 1, 1 if syndrome .ne. 0
  30. c
  31. c
  32. c==========================================================================
  33. c
  34. c DESCRIPTION
  35. c
  36. c This subroutine is part of a set of subroutines which perform
  37. c a Generalized Hamming Code.  As you know, Hamming codes are perfect
  38. c codes and can only detect and correct one error.  We added an overall
  39. c  parity checkbit, which allows us to detect 2 errors.  When 2 errors 
  40. c are detected, (in subroutine dcodham.f) no correction attempt is
  41. c made.  This would most likely result in more errors.  Instead, a flag
  42. c is sent to the calling program notifying it of multiple errors so
  43. c that smoothing may be attempted.  The Hamming codes presently supported
  44. c by the routines are (63,57), (31,26), (15,11), and shortened variations
  45. c thereof.  It could be made even more general by making minor modifications
  46. c to the dectobin.f subroutine.  This routine at present will calculate 
  47. c a maximum of 6 bits.
  48. c
  49. c Hamming routines consist of the following files:
  50. c
  51. c matrixgen - generates the hmatrix and sydrometable.
  52. c dectobin - does a simple decimal to binary conversion.
  53. c encodeham - generates the code word and overall paritybit.
  54. c decodeham - recovers infobits, checks for errors, corrects 1
  55. c error, and sends out flag for smoothing.
  56. c
  57. c This subroutine, decodeham, is responsible for checking for errors,
  58. c correcting the error if there is only one, and sending a smoothing flag
  59. c to the calling routine if there is more than one.
  60. c
  61. c==========================================================================
  62. c
  63. c REFERENCES
  64. c
  65. c Lin and Costello : Error Control Coding
  66. c Berlekamp : Algebraic Coding Theory
  67. c
  68. c**************************************************************************
  69. c
  70. subroutine decodeham(codelength1,codelength2,hmatrix,
  71.      1   syndrometable,paritybit,codeword,twoerror,synflag)
  72. implicit undefined(a-z)
  73. integer codelength1,codelength2,hmatrix(codelength1)
  74. integer syndrometable(codelength1),codeword(codelength1)
  75. integer paritybit, parityflag, errorflag, synflag, i, j, temp3
  76. logical twoerror
  77. c
  78. twoerror=.false.
  79. errorflag=0
  80. parityflag=1
  81. c
  82. c This part of the routine checks the overall parity of the code word
  83. c and compares it with the overall paritybit sent.  If they are not the
  84. c same that means there is at least one error.  If, later on in the routine,
  85. c the syndrome check indicates that there is an error and the parity is
  86. c correct in this part of the routine, that indicates there are two errors.
  87. c One of the weaknesses of this method is that there is no way of knowing
  88. c if we have 3,5,7,... errors.  We always smooth if there are 2,4,6,...
  89. c errors.
  90. c
  91. if (parityflag.eq.1) then
  92.    synflag=0
  93.    do 10 i=1,codelength1
  94.       synflag= synflag .xor. codeword(i)
  95. 10    continue
  96.    if (paritybit.ne.synflag)errorflag=errorflag+1
  97. end if
  98. c
  99. c This part of the routine generates the syndrome.  The syndrome will
  100. c equal zero if there are no errors.  synflag accumulates the syndrome
  101. c and is used as the offset in the syndrome table, which tells the 
  102. c routine which bit is in error.
  103. c
  104. synflag=0
  105. temp3=0
  106. do 30 i=1,codelength1
  107.    if(codeword(i).ne.0)synflag = synflag .xor. hmatrix(i)
  108.    if(codeword(i).ne.0)temp3 = temp3 + 1
  109. 30 continue
  110. c
  111. c *** Check to see if the parityflag is set and if it is then check
  112. c to see if the parity bit was in error.
  113. c If the parityflag was set and there was an error in the syndrome,
  114. c the errorflag should equal 1.
  115. c If it doesn't, then there are more errors than can be corrected
  116. c and the infobits are passed on unchanged.
  117. c
  118. if (synflag.ne.0)then
  119.    if(errorflag.ne.1 .and. parityflag .eq. 1)then
  120.       twoerror = .true.
  121.       goto 20
  122.    end if
  123.    j=syndrometable(synflag)
  124.    codeword(j)=codeword(j) .xor. 1
  125. end if
  126. c
  127. c *** If the syndrome is equal to zero and the errorflag is set
  128. c (not likely, but must be checked) then more than one error has
  129. c occured, but it cannot be corrected, so I pass on the infobits
  130. c the same as if there were no errors.
  131. c
  132. 20 return
  133. end