主要内容

执行循环冗余检查

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

手工计算检查值

从16位二进制数开始,这是要传输的消息:

1101100111011010

要得到校验值,请将该数除以多项式 x 3. + x 2 + x + 1 .您可以用其系数表示该多项式:1111

除法是一步一步执行的,在每一步之后,多项式除数与数字中最左边的1对齐。因为除以四项多项式的结果有三个比特(通常除以一个长度的多项式 n + 1 生成长度的校验值 n ),在号码后加上000计算剩下的时间。在每个步骤中,结果使用所操作的四个比特的比特WISE XOR,并且所有其他位都不变。

第一部门是

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

每一个连续的除法都是对前一个步骤的结果进行运算,所以第二次除法是

0010100111011010000 1111 ---------------- 0001010111011010000

一旦被除数全为0,除法就完成了。完整的除法,包括以上两步,为

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位的余数)。

除数= Bitshift(除数,Divisordogree);剩余= bitshift(消息、divisorDegree);dec2bin(因子)
ans ='1111000000000000000'
dec2bin(剩余部分)
ans ='1101100111011010000'

使用a执行CRC的分区步骤循环。的循环总是每步向前推进一位,因此要检查当前数字是否为1。如果当前数字是1,则执行除法步骤;否则,循环将继续向前推进。

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

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

crc_check_value = bitshift(余数,-messaghelength);DEC2BIN(CRC_CHECK_VALUE)
ans = ' 110 '

检查消息的完整性

您可以使用check值通过重复相同的除法操作来验证消息的完整性。然而,与其使用剩余的000要启动,请使用检查值110.如果消息无错误,则该划分的结果将为零。

重置余数变量,并使用逐位OR将CRC校验值加到余数位上。通过反转其中一个位值来在消息中引入错误bitset

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

执行CRC除法运算,检查结果是否为零。

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

参考

[1] Sklar,伯纳德。数字通信:基础和应用.恩格尔伍德悬崖,新泽西州:普伦蒂斯霍尔,1988。

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

另请参阅

|

相关话题