MATLAB实现CRC校验码的计算

循环冗余校验(cyclicredundancy check,CRC)对传输序列进行一次规定的除法操作,将除法操作的余数附加在传输信息的后面。在接收端,也对收到的数据做相同的除法。如果接收端除法得到的结果其余数不是零,就表明发生了错误。

循环冗余校验是将要发送的数据位序列当作一个多项式f(x)的系数,f(x)的系数只有1与0两种形式。在发送方用收发双方预定的约定的生成多项式G(x)去除,求得一个余数多项式。将余数多项式加到数据多项式之后发送到发送端。这里的除法是错位不减的模2减法,相当于异或运算。接收端采用同样的生成多项式G(x)去除接收到的数据多项式f'(x),如果传输无差错,则接收端除法运算f'(x)/G(x)的结果,其余数为零。否则就认为出现了差错。

基于除法的循环冗余校验,其计算量大于奇偶与求和校验,其差错检测的有效性也比较高,它能够检测出大约99.95%的错误。

程序流程图

MATLAB程序

本文程序以CRC-16 (X^16+X^15+X^2+1)为例

%输入想要转化的数据
data1=input('Please input the num U want to transform:');

%将十进制数转化成二进制数输出
dec=[];
i=1;
while(data1)
    if mod(data1,2)
     dec=[1,dec];
    else
     dec=[0,dec];
    end
    data1=(data1-mod(data1,2))./2;
end
disp('The below is your num in binary system')
display(num2str(dec))

% 校验多项式CRC-16
polynomial = [1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1]; 

%进行异或运算
lpol= length(polynomial);
data_dec=dec;
lnum=length(data_dec);
data=[data_dec,zeros(1,lpol-1)];
lpol= length(polynomial);
n=find(data==1,1);
while n<=lnum
for i=1:lpol
    if polynomial(i)==data(n+i-1)
        data(n+i-1)=0;
    else
        data(n+i-1)=1;
    end
end
n=find(data==1,1);
end

%拼接计算结果并显示
result=[data_dec,data(lnum+1:end)];
disp('The polynomial used to CRC is X^16+X^15+X^2+1')
disp('The transform result is')
disp(num2str(result))

%进行结果校验
result2=result;
n=find(result2==1,1);
while n<lnum+lpol-1
for i=1:lpol
    if polynomial(i)==result2(n+i-1)
        result2(n+i-1)=0;
    else
        result2(n+i-1)=1;
    end
end
n=find(result2==1,1);
end
disp('The CRC result is')
disp(num2str(result2))

代码运行效果

Please input the num U want to transform:20201503113

The below num is your num in binary system

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

The polynomial used to CRC is X^16+X^15+X^2+1

The transform result is

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

The CRC result is

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值