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

语音压缩

开发平台:

Unix_Linux

  1. c==========================================================================
  2. c
  3. c ROUTINE
  4. c               encodeham
  5. c
  6. c FUNCTION
  7. c               This subroutine calculates the parity bits necessary 
  8. c to form the code word.
  9. c
  10. c
  11. c SYNOPSIS
  12. c               encodeham(codelength1,codelength2,hmatrix,
  13. c   paritybit,codeword)
  14. c
  15. c   formal 
  16. c
  17. c                       data    I/O
  18. c       name            type    type    function
  19. c       -------------------------------------------------------------------
  20. c   codelength1 int i number of data bits 
  21. c codelength2 int i number of information bits 
  22. c hmatrix int i vector to encode an decode by
  23. c paritybit int o overall parity bit
  24. c codeword int o encoded stream (paritybits at end)
  25. c
  26. c==========================================================================
  27. c
  28. c DESCRIPTION
  29. c
  30. c This subroutine is part of a set of subroutines which perform
  31. c a Generalized Hamming Code.  As you know, Hamming codes are perfect
  32. c codes and can only detect and correct one error.  We added an overall
  33. c  parity checkbit, which allows us to detect 2 errors.  When 2 errors 
  34. c are detected, (in subroutine dcodham.f) no correction attempt is
  35. c made.  This would most likely result in more errors.  Instead, a flag
  36. c is sent to the calling program notifying it of multiple errors so
  37. c that smoothing may be attempted.  The Hamming codes presently supported
  38. c by the routines are (63,57), (31,26), (15,11), and shortened variations
  39. c thereof.  It could be made even more general by making minor modifications
  40. c to the dectobin.f subroutine.  This routine at present will calculate 
  41. c a maximum of 6 bits.
  42. c
  43. c Hamming routines consist of the following files:
  44. c
  45. c matrixgen - generates the hmatrix and sydrometable.
  46. c dectobin - does a simple decimal to binary conversion.
  47. c encodeham - generates the code word and overall paritybit.
  48. c decodeham - recovers infobits, checks for errors, corrects 1
  49. c error, and sends out flag for smoothing.
  50. c
  51. c               This subroutine performs the Hamming encode function.
  52. c It will calculate the necessary parity bits, depending on which code
  53. c is requested, and will add the overall parity bit to the end of the 
  54. c code word generated.
  55. c
  56. c
  57. c==========================================================================
  58. c
  59. c REFERENCES
  60. c
  61. c Lin and Costello : Error Control Coding
  62. c Berlekamp : Algebraic Coding Theory
  63. c
  64. c**************************************************************************
  65. c
  66. subroutine encodeham(codelength1,codelength2,hmatrix,
  67.      1     paritybit,codeword)
  68. implicit undefined(a-z)
  69. c
  70. integer codelength1,codelength2,paritybit
  71. integer codeword(codelength1),hmatrix(codelength1)
  72. integer parityflag,temp1,temp2,i,temp3
  73. c
  74. paritybit=0
  75. parityflag=1
  76. temp1=codelength1-codelength2
  77. temp2=0
  78. temp3=0
  79. c
  80. c First generate the parity bits for the Hamming code word.  This is
  81. c relatively straightforward.  hmatrix was generated in matrixgen.f,
  82. c which is called as part of the Hamming initialization routines.
  83. c
  84. do 10 i=1, codelength2
  85.    if(codeword(i).ne.0) temp2= temp2 .xor. hmatrix(i)
  86. 10 continue
  87. c
  88. c since the hmatrix is stored in a packed decimal format, the parity
  89. c bits must be unpacked and appended to the end of the bitsteam.
  90. c after this routine you will have the complete code word.
  91. c
  92. call dectobin(temp1,temp2,codeword(codelength2+1))
  93. c
  94. c Now I check to see if the parityflag is set, indicating the user
  95. c requests an overall parity bit be generated.  Normally this will
  96. c be the case.
  97. c
  98. temp2=0
  99. if (parityflag.eq.1)then
  100.    do 20 i=1,codelength1
  101.       temp2 = temp2 .xor. codeword(i)
  102.       if (codeword(i).ne.0) temp3=temp3+1
  103. 20    continue
  104.    paritybit=temp2
  105. end if
  106. c
  107. return
  108. end