ECC
汉明码是通过奇偶校验的方式对编码是否有错进行判断并纠正。
对于任一数据,首先需要将其改造为汉明码,即,预留,第01,10,100,1000(二进制)位等的数据。
然后比如,第110位,因为其位可以同时含有010和100,那么对应的第01和100位就需要记录对应位的值,并对所有记录的值进行奇偶性计算。比如,如果所有含有最后一位为1的位的数里,含有1的数量为奇数,那么第01位需要补一个1,使所有含有最后一位为1的位的数里的1的个数保持为偶数。以此类推,计算所有特殊位的值。计算有多少个1的数量是偶数还是奇数的过程可以通过xor来实现。
经过传递编码之后,现在需要对数字进行校验。
首先校验所有含有最后一位为1的位的数里1的数量的奇偶性。由于我们人工已经确保了这个值一定是偶数,如果出现奇数,则代表一定出现了错误。 以此类推,不断计算所有特殊位,如第10,100,1000,即倒数第二位为1,倒数第三位为1...等等。
假如,最后计算的结果是,倒数第一位为1的位的所有1的数量为奇数,且倒数第三位为1的的所有1的数量为奇数,其他都是偶数,那么发生错误的坐标可以直接计算出来:
第101位,即,汉明码的第5位。
这是因为实际上,我们利用二进制的加法,对原始数据进行了特殊处理,从而保证了所有奇偶校验位可以表达所有的位。 比如第8,4,2,1位的奇偶校验位可以表示直到汉明码的第15位。比如,第1111位,它实际含有四个1,所以他被这四个奇偶校验位全部追踪,有且只有它发生错误时,才会导致所有四位出现问题。实际上可以理解为,比如第1010位发生错误,由于它含有倒数第二位和倒数第四位的1,所以它被第8和第4位所检验的奇偶性包含。那么反过来,当8 4 两个奇偶性出问题时,这代表着所出现问题的数字一定是包含了1000和0010,即1010。 由于汉明码采取了正好是对应二进制数字每位的编码方式,如果其他位不出现奇偶性不出现问题,那么也证明所出现问题的位数一定不包含那些位。
这样的方法使得汉明码拥有一位纠错能力。
而实际上,我们还会使用最后多加的一位奇偶校验位来多验证一位。最后一位作为奇偶校验位时,如果只发生一位数字出错,那么由于奇偶性,可以检测,但是如果两位同时翻转,就无能为力了。
所以,将最后的奇偶校验位和汉明码结合一起就是,设最后一位奇偶校验位为S,当E所测试的整个字的奇偶性不出问题时,E为0,否则为1。设汉明码的前面的奇偶校验结果E,发现错误时为1,否则为0。
那么就会有四种情况:
E为0,S为0: 都没有发现奇偶性的错误,编码无损耗。
E为1,S为0:S没有发现错误,但是E发现错误,那么便是S无法识别的两位出错。
E为0,S为1:S发现错误,E没有发现错误,那么则是S本身的奇偶校验位出错。
E为1,S为1: 二者共同发现了错误,那么就是发现一位错,且可以纠正。
Comments
Post a Comment