循环冗余码CRC使用matlab实现

循环冗余编码
基本思想:发送端按照给定的规则,在k个信息比特后面增加L个按照某种规则计算的校验比特;在接收端对收到的信息比特重新计算L个校验比特。比较接收到的校验比特和本地重新计算的校验比特,如果相同则认为传输无误,否则认为传输有误。
循环冗余编码需要生成多项式,

CRC编码程序

%CRC循环冗余编码函数
function crc_encode_scr=crc_encode(scr, poly)
%scr为信息多项式系数向量,poly为生成多项式系数向量[],例如,若系数为1100,则输入为[1 1 0 0]
[M,N]=size(poly);
scrg=[scr zeros(1,N-1)];%在信息多项式系数后补零
[q,r]=deconv(scrg, poly);%多项式除法q中为商,r为余数,此为十进制多项式除法
r=abs(r);
for i=1:length(r)
    a=r(i);
    if(mod(a,2)==0)%将余数变为模二结果
        r(i)=0;
    else
        r(i)=1;
    end
end
crc=r(length(scr)+1:end);%获取余项
crc_encode_scr=bitor(scrg,r);%余项加在信息位后面构成编码


这里起初有一个疑问:模二除和直接十进制除法之后再除2取余数 结果一致吗?
通过实验的方式验证是一致的,数学基础好像是代数论的问题。
比如对于原信息比特和生成多项式src=[1 1 1 1 1 1 1 1]; poly=[1 0 1 1];
经过简单的列竖式计算(模二除)得到 crc校验位是011.

下面看一下 直接十进制除法之后再除2取余数 的结果
得到余数为
在这里插入图片描述
然后对2取余数 发现也是 011

分析

deconv函数
不管是u,v还是q,r都是多项式的系数(所以,这是一个长除法的运算)。

>> help deconv
deconv - Deconvolution and polynomial division 反卷积和多项式除法

    This MATLAB function deconvolves a vector v out of a vector u using long
    division, and returns the quotient q and remainder r such that u = conv(v,q)+r.
    该函数使用长除法从向量u中解出向量v,并且返回商q和余数r,使得u=conv(v,q)+r;,
    这里conv是多项式乘法

    [q,r] = deconv(u,v)

bitor函数
返回两数的异或值

>> help bitor
bitor - Bit-wise OR

    This MATLAB function returns the bit-wise OR of A and B.

    C = bitor(A,B)
    C = bitor(A,B,assumedtype)
    objout = bitor(netobj1,netobj2)

mod函数
返回余数,取模。

>> help mod
mod - Remainder after division (modulo operation)

    This MATLAB function returns the remainder after division of a by m, where a is
    the dividend and m is the divisor.

    b = mod(a,m)

CRC解码程序

%解码
function [crc_decode_rev, error]=crc_decode(rev,poly)
%rev为接收到的码向量,poly为生成多项式系数向量

[M,N]=size(poly);
[q r]=deconv(rev,poly);%得到长除法之后的商和余数,十进制下
r=mod(abs(r),2);%转化为二进制下
if r==zeros(1,length(rev))
    error=0;
else
    error=1;
end
crc_decode_rev=rev(1:length(rev-N+1));%去掉后面校验码,得到原始信息比特

猜你喜欢

转载自blog.csdn.net/shizheng_Li/article/details/106685443