关于MATLAB自带的crc类和generate函数

crc.generator

h = crc.generator(polynomial) 构造一个crc generator对象h,由参数 polynomial(生成多项式) 定义。
例:

>>h = crc.generator([1 1 1 1 1])

ans = 

                Type: CRC Generator
          Polynomial: 0xF
        InitialState: 0x0
        ReflectInput: false
    ReflectRemainder: false
            FinalXOR: 0x0

其中,Type自不必多说,就是表示类型而已。

Polynomial:定义线性反馈移位寄存器的连接的生成器多项式。可以将此属性指定为表示多项式幂递减的二进制向量。在这种情况下,必须包含多项式的第一个“1”。它也可以被指定为一个字符串,以’0x’开头,这是多项式幂递减的十六进制表示。在本例中,省略了多项式的第一个“1”。

再翻译一下就是:本例中作为参数的生成多项式为[1 1 1 1 1],转换成16进制就是 1F,省略了第一个"1"后,即是ans中的 0xF。(少于5位的生成多项式,ans中会直接显示原多项式)

InitialState:表示移位寄存器的初始状态,默认值为0;

ReflectInput:一个布尔量,指定输入数据在进入移位寄存器之前是否应按字节翻转。默认值为false;

ReflectRemainder:一个布尔值,指定在输入数据完全通过移位寄存器后,二进制输出CRC校验和是否应该绕其中心翻转。默认值为false;

FinalXOR:在附加到输入数据之前,CRC校验和被xor的值。可以将此属性指定为标量、二进制向量或以’0x’为前缀的字符串(二进制向量的十六进制表示)。作为一个二进制向量,它的长度必须比多项式的二进制向量表示的长度小1。默认值为0x0

H = crc.generator 构造一个具有默认属性的crc.generator 对象H,此语句等同于:

H = crc.generator('Polynomial', '0x1021', 'InitialState', '0xFFFF', ...
                      'ReflectInput', false, 'ReflectRemainder', false, ...
                      'FinalXOR', '0x0000').

h = crc.detector(polynomial) 构造一个crc.detector对象,由参数 polynomial(生成多项式) 定义。
例:

>> h = crc.detector([1 1 0 0 1])

h = 

                Type: CRC Detector
          Polynomial: 0x9
        InitialState: 0x0
        ReflectInput: false
    ReflectRemainder: false
            FinalXOR: 0x0

同理,这里的几种类型都和crc.generator差不多。

generate

generate用于生成CRC校验和并将其附加到输入数据后。
如:encoding = generate(H, MSG)使用CRC生成器的对象H为输入消息MSG生成一个CRC校验和。它将校验和附加到MSG的末尾。二进制值MSG可以是列向量或矩阵。如果它是一个矩阵,那么每一列都被认为是一个单独的通道。

EX:选定CRC校验的生成多项式G(x)=x^4 + x^3+1,待传输二进制序列1011 0011,求出其发送端的CRC校验码以及接收端的校验过程。

答:下面是具体的计算过程:

发送端:

① 将选定的多项式转化为二进制序列:由G(X) = X4 + X3 +
1可知二进制一种有五位,第4位、第三位和第零位分别为1,则序列为11001


多项式的位数位5,则在数据帧的后面加上5-1位0,数据帧变为101100110000,然后使用模2除法除以除数11001,得到余数0100即为CRC校验码。

③ 将计算出来的CRC校验码0100添加在原始帧的后面,真正的数据帧为10110011 0100,再把这个数据帧发送到接收端。

④ 接收端收到数据帧10110011 0100后,依3旧
用上预先选定的除数11001,用模2除法除去,验证余数是否为0,如果为0,则说明数据帧没有出错。 ————————————————
版权声明:此段为CSDN博主「风中少年01」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_26652069/article/details/100578942

实例验证:(用以上引用为例

>> H = crc.generator([1 1 0 0 1]);
encoded = generate(H,[1 0 1 1 0 0 1 1]')

encoded =

     1
     0
     1
     1
     0
     0
     1
     1
     0
     1
     0
     0

可见,encoded的结果经过转置后就是添加校验码后真正的数据帧。

使用crc.detector 和detect 函数检验数据的正确性:

>> h = crc.detector([1 1 0 0 1]);
[output error] = detect(h,[1 0 1 1 0 0 1 1 0 1 0 0]')

output =

     1
     0
     1
     1
     0
     0
     1
     1


error =

  logical

   0

可见,output 的结果与generate 中的原输入多项式相同,且error也为0,即无错误。所以添加CRC校验之后的[1 0 1 1 0 0 1 1 0 1 0 0] 为正确结果。

  • 11
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值