hamming.c
上传用户:tsjrly
上传日期:2021-02-19
资源大小:107k
文件大小:8k
源码类别:

语音压缩

开发平台:

C/C++

  1. /**************************************************************************
  2. *
  3. * ROUTINE
  4. *               encodeham
  5. *
  6. * FUNCTION
  7. *               This subroutine calculates the parity bits necessary
  8. * to form the code word.
  9. *
  10. *
  11. * SYNOPSIS
  12. *               encodeham(codelength1,codelength2,hmatrix,
  13. *   paritybit,codeword)
  14. *
  15. *   formal
  16. *
  17. *                       data    I/O
  18. *       name            type    type    function
  19. *       -------------------------------------------------------------------
  20. * codelength1 int i number of data bits
  21. * codelength2 int i number of information bits
  22. * hmatrix int i vector to encode a decode by
  23. * paritybit int o overall parity bit
  24. * codeword int o encoded stream (paritybits at end)
  25. *
  26. ***************************************************************************
  27. *
  28. * DESCRIPTION
  29. *
  30. * This subroutine is part of a set of subroutines which perform
  31. * a Generalized Hamming Code.  As you know, Hamming codes are perfect
  32. * codes and can only detect and correct one error.  We added an overall
  33. *  parity checkbit, which allows us to detect 2 errors.  When 2 errors
  34. * are detected, (in subroutine decodeham) no correction attempt is
  35. * made.  This would most likely result in more errors.  Instead, a flag
  36. * is sent to the calling program notifying it of multiple errors so
  37. * that smoothing may be attempted.  The Hamming codes presently supported
  38. * by the routines are (63,57), (31,26), (15,11), and shortened variations
  39. * thereof.  It could be made even more general by making minor 
  40. * modifications to the decimal to binary output vector code in the 
  41. * encodeham procedure.  This routine at present will calculate
  42. * a maximum of 6 bits.
  43. *
  44. * Hamming routines consist of the following procedures:
  45. *
  46. * matrixgen - generates the hmatrix and sydrometable.
  47. * encodeham - generates the code word and overall paritybit.
  48. * decodeham - recovers infobits, checks for errors, corrects 1
  49. *     error, and sends out flag for smoothing.
  50. *
  51. *
  52. *               This subroutine performs the Hamming encode function.
  53. * It will calculate the necessary parity bits, depending on 
  54. * which code is requested, and will add the overall parity bit 
  55. * to the end of the code word generated.
  56. *
  57. *
  58. ***************************************************************************
  59. *
  60. * CALLED BY
  61. *
  62. * celp
  63. *
  64. * CALLS
  65. *
  66. *
  67. ***************************************************************************
  68. *
  69. * REFERENCES
  70. *
  71. * Lin and Costello : Error Control Coding
  72. * Berlekamp : Algebraic Coding Theory
  73. *
  74. **************************************************************************/
  75. #define PARITYFLAG 1
  76. encodeham(codelength1, codelength2, hmatrix, paritybit, codeword)
  77. int codelength1, codelength2, hmatrix[], *paritybit, codeword[];
  78. {
  79.   int temp, i, *codeptr = &codeword[codelength1];
  80.   /* First generate the parity bits for the Hamming code word.  This is
  81. relatively straightforward.  hmatrix was generated in matrixgen.c,
  82. which is called as part of the Hamming initialization routines. */
  83.   for (temp = i = 0; i < codelength2; i++)
  84.   {
  85.     if (codeword[i] != 0)
  86.       temp ^= hmatrix[i];
  87.   }
  88.   /* since the hmatrix is stored in a packed decimal format, the parity
  89. bits must be unpacked and appended to the end of the bitsteam.
  90. after this code you will have the complete code word.      */
  91.   /*  the following code converts a decimal number into a binary output 
  92.       vector.  */
  93.   for (i = codelength1 - codelength2; --i >= 0;)
  94.     *--codeptr =(temp & 1<<i)>>i;
  95.   /* Now I check to see if the parityflag is set, indicating the user
  96. requests an overall parity bit be generated.  Normally this will
  97. be the case.  */
  98. #if PARITYFLAG == 1
  99.   for (temp = i = 0; i < codelength1; i++)
  100.   {
  101.     temp ^= codeword[i];
  102.   }
  103.   *paritybit = temp;
  104. #endif
  105. }
  106. /**************************************************************************
  107. *
  108. * ROUTINE
  109. *               decodeham
  110. *
  111. * FUNCTION
  112. *               This subroutine decodes the bitstream generated by
  113. * encodeham.  It will correct a single error, and detect 2
  114. * errors.
  115. *
  116. *
  117. * SYNOPSIS
  118. *               subroutine decodeham(codelength1, hmatrix, syndrometable,
  119. * paritybit, codeword, twoerror, synflag)
  120. *
  121. *   formal
  122. *
  123. *                       data    I/O
  124. *       name            type    type    function
  125. *       -------------------------------------------------------------------
  126. *       codelength1 int i number of data bits
  127. * hmatrix int i vector to encode a decode by
  128. * syndrometable int i errormasks used to correct single
  129. * errors
  130. * paritybit int i overall parity bit
  131. * codeword int i/o encoded/decoded stream
  132. * twoerror int o flag for 2 error detect
  133. * synflag int o value 0 or 1, 1 if syndrome  !=  0
  134. *
  135. ***************************************************************************
  136. *
  137. * DESCRIPTION
  138. *
  139. * This subroutine is part of a set of subroutines which
  140. * perform a Generalized Hamming Code.  As you know, Hamming codes
  141. * are perfect codes and can only detect and correct one error.  We
  142. *  added an overall parity checkbit, which allows us to detect 2 errors.
  143. * When 2 errors are detected, (in subroutine decodeham) no correction
  144. * attempt is made.  This would most likely result in more errors.
  145. * Instead, a flag is sent to the calling program notifying it of
  146. * multiple errors so that smoothing may be attempted.  The Hamming
  147. * codes presently supported by the routines are (63,57), (31,26),
  148. * (15,11), and shortened variations thereof.  It could be made even 
  149. * more general by making minor modifications to the decimal to binary 
  150. * output vector code in the encodeham procedure.  This routine at  
  151. * presentwill calculate a maximum of 6 bits.
  152. *
  153. * Hamming routines consist of the following procedures:
  154. *
  155. * matrixgen - generates the hmatrix and sydrometable.
  156. * encodeham - generates the code word and overall paritybit.
  157. * decodeham - recovers infobits, checks for errors, corrects 1
  158. *     error, and sends out flag for smoothing.
  159. *
  160. *
  161. * This subroutine, decodeham, is responsible for checking for errors,
  162. * correcting the error if there is only one, and sending a smoothing
  163. * flag to the calling routine if there is more than one.
  164. *
  165. ***************************************************************************
  166. *
  167. * CALLED BY
  168. *
  169. * celp
  170. *
  171. * CALLS
  172. *
  173. *
  174. ***************************************************************************
  175. *
  176. * REFERENCES
  177. *
  178. * Lin and Costello : Error Control Coding
  179. * Berlekamp : Algebraic Coding Theory
  180. *
  181. **************************************************************************/
  182. #define TRUE 1
  183. #define FALSE 0
  184. decodeham(codelength1, hmatrix, syndrometable,
  185.   paritybit, codeword, twoerror, synflag)
  186. int codelength1, hmatrix[], syndrometable[];
  187. int paritybit, codeword[], *twoerror, *synflag;
  188. {
  189.   int parityflag, errorflag, i, j;
  190.   *twoerror = FALSE;
  191.   errorflag = 0;
  192.   parityflag = 1;
  193.   /* This part of the routine checks the overall parity of the code word and
  194.      compares it with the overall paritybit sent.  If they are not the same
  195.      that means there is at least one error.  If, later on in the routine,
  196.      the syndrome check indicates that there is an error and the parity is
  197.      correct in this part of the routine, that indicates there are two
  198.      errors.  One of the weaknesses of this method is that there is no way
  199.      of knowing if we have 3,5,7,... errors.  We always smooth if there are
  200.      2,4,6,... errors.    */
  201.   if (parityflag == 1)
  202.   {
  203.     for (*synflag = i = 0; i < codelength1; i++)
  204.       *synflag ^= codeword[i];
  205.     if (paritybit != *synflag)
  206.       errorflag++;
  207.   }
  208.   /* This part of the routine generates the syndrome.  The syndrome will
  209.      equal zero if there are no errors.  synflag accumulates the syndrome
  210.      and is used as the offset in the syndrome table, which tells the 
  211.      routine which bit is in error.  */
  212.   for (*synflag = i = 0; i < codelength1; i++)
  213.   {
  214.     if (codeword[i] != 0)
  215.       *synflag ^= hmatrix[i];
  216.   }
  217.   /* *** Check to see if the parityflag is set and if it is then check to see
  218.      if the parity bit was in error. If the parityflag was set and there was
  219.      an error in the syndrome, the errorflag should equal 1. If it doesn't,
  220.      then there are more errors than can be corrected and the infobits are
  221.      passed on unchanged.    */
  222.   if (*synflag != 0)
  223.   {
  224.     if (errorflag != 1 && parityflag == 1)
  225.     {
  226.       *twoerror = TRUE;
  227.       return;
  228.     }
  229.     j = syndrometable[*synflag - 1];
  230.     codeword[j - 1] ^= 1;
  231.   }
  232.   /* *** If the syndrome is equal to zero and the errorflag is set (not
  233.      likely, but must be checked) then more than one error has occured, 
  234.      but it cannot be corrected, so I pass on the infobits the same as  
  235.      if there were no errors.    */
  236. }