📜  错误检测和更正代码

📅  最后修改于: 2021-01-08 05:40:09             🧑  作者: Mango


我们知道,位0和1对应于两个不同的模拟电压范围。因此,在将二进制数据从一个系统传输到另一个系统的过程中,也可能会增加噪声。因此,在其他系统上接收到的数据可能存在错误。

这意味着位0可能变为1或位1可能变为0。我们无法避免噪声的干扰。但是,我们可以先检测是否存在任何错误,然后再纠正这些错误,以获取原始数据。为此,我们可以使用以下代码。

  • 错误检测代码
  • 纠错码

错误检测代码-用于检测接收到的数据(位流)中存在的错误。这些代码包含一些位,这些位被包含(附加)到原始位流中。如果在原始数据(位流)传输期间发生错误,这些代码将检测到错误。示例-奇偶校验码,汉明码。

纠错码-用于纠正接收到的数据(位流)中存在的错误,以便获得原始数据。纠错码也使用类似的检错码策略。示例-汉明码。

因此,为了检测和纠正错误,在传输时将附加位附加到数据位。

奇偶校验码

在原始位流的MSB左侧或LSB右侧很容易包含(附加)一个奇偶校验位。根据选择的奇偶校验类型,有两种类型的奇偶校验代码,即偶数奇偶校验代码和奇数奇偶校验代码。

偶校验码

如果二进制代码中的偶数个奇偶校验位的值应为零。否则,它应该是一个。因此,偶校验码中存在偶数个。偶校验码包含数据位和偶校验位。

下表显示了与每个3位二进制代码相对应的偶校验码。在此,偶数奇偶校验位包含在二进制代码的LSB的右侧。

Binary Code Even Parity bit Even Parity Code
000 0 0000
001 1 0011
010 1 0101
011 0 0110
100 1 1001
101 0 1010
110 0 1100
111 1 1111

此处,偶校验码中存在的位数为4。因此,这些偶校验码中可能的偶数为0、2和4。

  • 如果另一个系统接收到这些偶校验码中的一个,则接收到的数据中没有错误。偶校验位以外的其他位与二进制码相同。

  • 如果另一个系统甚至没有收到奇偶校验码,则接收到的数据中将存在错误。在这种情况下,我们无法预测原始的二进制代码,因为我们不知道错误的位位置。

因此,偶校验位仅用于检测接收到的奇偶码中的错误。但是,仅纠正错误是不够的。

奇校验码

如果二进制代码中存在奇数个奇偶校验位,则其值应为零。否则,它应该是一个。因此,奇校验码中存在奇数个。奇校验位包含数据位和奇校验位。

下表显示了与每个3位二进制代码相对应的奇校验码。在此,奇偶校验位包含在二进制代码的LSB的右侧。

Binary Code Odd Parity bit Odd Parity Code
000 1 0001
001 0 0010
010 0 0100
011 1 0111
100 0 1000
101 1 1011
110 1 1101
111 0 1110

在此,奇校验码中存在的位数为4。因此,这些奇校验码中可能的奇数个为1和3。

  • 如果另一个系统接收到这些奇校验码之一,则接收到的数据中没有错误。除奇偶校验位外的其他位与二进制码相同。

  • 如果另一个系统收到的不是奇偶校验码,则接收到的数据中有错误。在这种情况下,我们无法预测原始的二进制代码,因为我们不知道错误的位位置。

因此,奇数奇偶校验位仅用于检测接收到的奇偶校验码中的错误。但是,仅纠正错误是不够的。

海明码

汉明码对于检测和纠正接收到的数据中存在的错误很有用。此代码使用多个奇偶校验位,我们必须将这些奇偶校验位置于2的幂的位置。

下列关系正确(有效)的“ k”最小值不过是所需的奇偶校验位数。

$$ 2 ^ k \ geq n + k + 1 $$

哪里,

‘n’是二进制代码(信息)中的位数

“ k”是奇偶校验位数

因此,汉明码中的位数等于n + k。

假设汉明码为$ b_ {n + k} b_ {n + k-1} ….. b_ {3} b_ {2} b_ {1} $和奇偶校验位$ p_ {k},p_ {k -1},…. p_ {1} $。我们只能将“ k”个奇偶校验位置于2个位置的幂。在其余的位位置,我们可以放置二进制代码的“ n”位。

根据要求,我们可以在形成汉明码的同时使用偶校验或奇校验。但是,应该使用相同的奇偶校验技术来确定接收到的数据中是否存在任何错误。

请按照以下过程查找奇偶校验位

  • 根据位位置b 3 ,b 5 ,b 7等中存在的1的数量找到p 1的值。等效二进制文件中的所有这些位位置(后缀)的位置值2 0均为“ 1”。

  • 根据位位置b 3 ,b 6 ,b 7等中存在的个数,找到p 2的值。等效二进制文件中的所有这些位位置(后缀)的位置值2 1均为“ 1”。

  • 根据位位置b 5 ,b 6 ,b 7等中存在的个数找到p 3的值。等效二进制文件中的所有这些位位置(后缀)的位置值2 2均为“ 1”。

  • 同样,查找奇偶校验位的其他值。

请按照以下步骤查找校验位

  • 根据位位置b 1 ,b 3 ,b 5 ,b 7等中存在的1的数量找到c 1的值。等效二进制文件中的所有这些位位置(后缀)的位置值2 0均为“ 1”。

  • 根据位位置b 2 ,b 3 ,b 6 ,b 7等中存在的1的数量找到c 2的值。等效二进制文件中的所有这些位位置(后缀)的位置值2 1均为“ 1”。

  • 根据位位置b 4 ,b 5 ,b 6 ,b 7等中存在的1的个数,找到c 3的值。等效二进制文件中的所有这些位位置(后缀)的位置值2 2均为“ 1”。

  • 同样,查找校验位的其他值。

接收到的数据中校验位的十进制等效值给出出现错误的位位置的值。只需补充该位位置中的值即可。因此,我们将在删除奇偶校验位后获得原始的二进制代码。

例子1

让我们找到二进制代码的汉明码, d 4 d 3 d 2 d 1 =1000。考虑偶数奇偶校验位。

给定二进制代码中的位数为n = 4。

我们可以使用以下数学关系式找到所需数量的奇偶校验位。

$$ 2 ^ k \ geq n + k + 1 $$

用上述数学关系式中的n = 4代替。

$$ \ Rightarrow 2 ^ k \ geq 4 + k + 1 $$

$$ \ Rightarrow 2 ^ k \ geq 5 + k $$

满足上述关系的k的最小值为3。因此,我们需要3个奇偶校验位p 1 ,p 2和p 3 。因此,汉明码的位数为7,因为二进制码有4位,奇偶校验位为3。如下所示,我们必须将奇偶校验位和二进制代码的位放入汉明码中。

7位汉明码为$ b_ {7} b_ {6} b_ {5} b_ {4} b_ {3} b_ {2} b_ {1} = d_ {4} d_ {3} d_ {2} p_ {3} d_ {1} p_ {2} bp_ {1} $

通过替换二进制代码的位,汉明代码将为$ b_ {7} b_ {6} b_ {5} b_ {4} b_ {3} b_ {2} b_ {1} = 100p_ {3} Op_ {2 } p_ {1} $。现在,让我们找到奇偶校验位。

$$ p_ {1} = b_ {7} \ oplus b_ {5} \ oplus b_ {3} = 1 \ oplus 0 \ oplus 0 = 1 $$

$$ p_ {2} = b_ {7} \ oplus b_ {6} \ oplus b_ {3} = 1 \ oplus 0 \ oplus 0 = 1 $$

$$ p_ {3} = b_ {7} \ oplus b_ {6} \ oplus b_ {5} = 1 \ oplus 0 \ oplus 0 = 1 $$

通过替换这些奇偶校验位,汉明码将为$ b_ {7} b_ {6} b_ {5} b_ {4} b_ {3} b_ {2} b_ {1} = 1001011 $。

例子2

在上面的示例中,汉明代码为$ b_ {7} b_ {6} b_ {5} b_ {4} b_ {3} b_ {2} b_ {1} = 1001011 $。现在,让我们找到当收到的代码为$ b_ {7} b_ {6} b_ {5} b_ {4} b_ {3} b_ {2} b_ {1} = 1001111 $时的错误位置。

现在,让我们找到校验位。

$$ c_ {1} = b_ {7} \ oplus b_ {5} \ oplus b_ {3} \ oplus b_ {1} = 1 \ oplus 0 \ oplus 1 \ oplus1 = 1 $$

$$ c_ {2} = b_ {7} \ oplus b_ {6} \ oplus b_ {3} \ oplus b_ {2} = 1 \ oplus 0 \ oplus 1 \ oplus1 = 1 $$

$$ c_ {3} = b_ {7} \ oplus b_ {6} \ oplus b_ {5} \ oplus b_ {4} = 1 \ oplus 0 \ oplus 0 \ oplus1 = 0 $$

校验位的十进制值给出了接收到的汉明码中的错误位置。

$$ c_ {3} c_ {2} c_ {1} = \ left(011 \ right)_ {2} = \ left(3 \ right)_ {10} $$

因此,汉明码的第三位(b 3 )中存在错误。只需补充该位中存在的值并删除奇偶校验位即可获得原始二进制代码。