主要内容

执行循环冗余检查

这个例子展示了如何执行循环冗余校验(CRC)在一个数字的位上。crc用于检测数字系统中数据传输中的错误。当一段数据被发送时,短检查值是依附于它的。校验值是用多项式除以数据中的位得到的。当接收到数据时,重复多项式除法,并将结果与校验值进行比较。如果结果不同,则数据在传输过程中被损坏。

手工计算核对值

开始与一个16位的二进制数,这是要被发送的消息:

1101100111011010

为了得到校验值,将这个数除以多项式 x 3. + x 2 + x + 1 .你可以代表这个多项式其系数:1111

除法是一步一步进行的,每一步之后多项式的除数与数字中最左边的1对齐。因为除以四项多项式的结果有三位(通常除以一个长度多项式) n + 1 生成长度检查值 n ),将数字追加为000计算的余数。在每个步骤中,结果使用在其上操作的四个比特的逐位异或,并且所有其它位保持不变。

第一部是

1101100111011010 000 1111 ---------------- 0010100111011010 000

每一个连续的除法都作用于前一步的结果,所以第二次除法是

0010100111011010 000 1111 ---------------- 0001010111011010 000

一旦被除数全部为零,除法就完成了。完整的划分,包括以上两个步骤,是

1101100111011010 000 1111 0010100111011010 000 1111 0001010111011010 000 1111 0000101111011010 000 1111 0000010011011010 000 1111 0000001101011010 000 1111 0000000010011010 000 1111 0000000001101010 000 1111 0000000000010010 000 1111 0000000000001100 000 1111 0000000000000011 000 11 11 0000000000000000 110

其余的部分,110,是此消息的检查值。

计算校验值编程

在MATLAB®,然后才能执行此相同的操作来获得使用位运算的校验值。首先,定义消息和多项式除数变量。使用32位无符号整数,这样额外位可用于剩余。

消息= 0 b1101100111011010u32;messageLength = 16;除数= 0 b1111u32;divisorDegree = 3;

接下来,初始化多项式除数。使用dec2bin显示结果的比特。

除数= bitshift(除数,messageLength-divisorDegree-1);dec2bin(因子)
ans = ' 1111000000000000 '

现在,移动除数和消息,使它们有正确的位数(消息16位,余数3位)。

除数=位位移(除数,divisorDegree);剩余= bitshift(消息、divisorDegree);dec2bin(因子)
ANS = '1111000000000000000'
dec2bin(剩余部分)
ANS = '1101100111011010000'

执行CRC使用的分裂步骤循环。的循环总是每一步向前推进一位,所以要检查当前数字是否为1。如果当前数字是1,则执行除法步骤;否则,循环向前推进一点并继续。

k = 1: messageLength如果bitget(remainder,messageLength+divisorDegree) remainder = bitxor(remainder,除数);结束余数=位位移(余数,1);结束

将余数的位向右移动以获得操作的校验值。

CRC_check_value =位位移(余数,-messageLength);DEC2BIN(CRC_check_value)
ans = ' 110 '

检查消息的完整性

通过重复相同的除法操作,可以使用检查值来验证消息的完整性。然而,与其使用余数000开始,使用校验值110.如果该消息是无差错,则除法运算的结果将是零。

重置余数变量,并使用逐位或将CRC检查值添加到余数位。通过翻转其中一个位值来引入一个错误到消息中bitset

剩余= bitshift(消息、divisorDegree);剩余= bitor(余数,CRC_check_value);剩余剩余= bitset (6);dec2bin(剩余部分)
ans = ' 1101100111011110110 '

执行CRC除法操作,检查结果是否为零。

k = 1: messageLength如果bitget(remainder,messageLength+divisorDegree) remainder = bitxor(remainder,除数);结束余数=位位移(余数,1);结束如果余数== 0“消息是无差错的”。其他的DISP(“消息包含错误。”结束
消息包含错误。

参考

[1] Sklar,伯纳德。数字通信:基础与应用.Englewood Cliffs, NJ: Prentice Hall, 1988。

[2] Wicker, Stephen B。数字通信和存储的误差控制系统.上鞍河,新泽西州:普伦蒂斯霍尔,1995。

另请参阅

|

相关话题