【CRC】基于MATLAB的CRC纠错码的设计

1.软件版本

matlab2017b

2.本算法理论知识

CRC校验利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(即CRC码)r位,并附在信息后面,构成一个新的二进制码序列数共(k+r)位,最后发送出去。

在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。这个规则,在差错控制理论中称为“生成多项式”。

设编码前的原始信息多项式为P(x),P(x)的最高次幂加1等于k;生成多项式为G(x),G(x)的最高次幂等于r;CRC多项式为R(x);编码后带循环校验码CRC的信息多项式为T(x)。

    接收方解码方法:将T(x)除以G(x),若余数为0,则说明传输中无错误发生,否则说明传输有误。

CRC检验码的编码方法是用待发送的二进制数据P(x)除以生成多项式G(x),将最后的余式作为CRC校验码。其实现步骤如下:

第一:设待发送的数据块是k位的二进制多项式P(x),生成多项式为r阶的G(x)。在数据块的末尾添加r个0,数据块的长度增加到k+r位,对应的二进制多项式为

第二:用生成多项式G(x)去模2除 。求得余数为r-1阶的二进制多项式R(x)。此二进制多项式R(x)就是P(x)经生成多项式G(x)编码的CRC校验码。

第三:将校验码R(x)添至P(x x)的末尾,即可得到包含CRC校验码的待发送字符串。

第四:从CRC的编码规则可以看出,CRC编码实际上是将待发送的k位二进制多项式P(x)转换成了可以被G(x)除尽的k+r位二进制多项式T(x)。所以,进行译码时可以用接收到的数据去除G(x),如果余数为0,则表示传输过程没有错误;否则,传输过程存在错误。

扫描二维码关注公众号,回复: 14250188 查看本文章

3.部分源码

对于编码,部分,我们的MATLAB程序如下:
function crc_code=func_crc_encode(signal,k,n,r,G);
%信号长度
Flen       = length(signal);
%将信号按每帧的编码程度分组
signal_team= reshape(signal,Flen/k,k);
%编码矩阵
code_matrix= zeros(Flen/k,n);
for i = 1:Flen/k 
    a = zeros(1,k);
    for j1=1:k
        a(j1) = signal_team(i,j1);
    end
    b=zeros(1,n);
    for j2=1:n
        b(j2) = code_matrix(i,j2);
    end
    b       = [a,zeros(1,r)];
    %基于G进行编码
    [~, rr] = deconv(b,G);
    rr      = abs(rr);
    n       = length(rr);
    for i=1:n
        rr(i) = mod(rr(i),2);
    end
    b = bitor(b,rr);
    for L=1:n 
        code_matrix(i,L) = b(1,L);
    end
end
crc_code = reshape(code_matrix,1,Flen/k*n);
对于解码部分,我们的MATLAB程序如下:
function [D_rec,errornum] = func_crc_decode(crc_code,k,n,G);
errornum   = 0;
FLen       = length(crc_code);
datastream = reshape(crc_code,FLen/n,n);
D_rec      = zeros(FLen/n,k);
error      = zeros(1,FLen/n); 
b          = zeros(1,k);
for ii=1:FLen/n    
    a = zeros(1,n);
    for j=1:n   
        a(1,j)=datastream(ii,j); 
    end
    [~,r] = deconv(a,G);
    r     = abs(r);
    n     = length(r);
    for i=1:n   
        r(i)=mod(r(i),2);
        if r(i)==1
           error(ii)=1;      
        end
    end
   if error(ii)==0   
      b = a(1:k);
      for j=1:k  
          D_rec(ii,j) = b(1,j);
      end
   else
      errornum=errornum+1;
   end
end
D_rec = reshape(D_rec,1,k*FLen/n);

4.仿真结论

下面我们使用MATLAB进行仿真实现:

 上面的就是误码率曲线,

下面我们对不同码长的CRC进行对比仿真。获得如下的结果:

 对比上面的仿真结果可知,随着SNR的增加,CRC的性能逐渐提升,当SNR为13dB的时候,性能达到10-5.在第二个仿真结论中可知,不同码长的CRC有着不同的性能。当码长较长的时候,其性能较优秀。

5.参考文献

[1] Colbourn C J ,  Dinitz J H ,  Ii L C , et al. The CRC Handbook of Combinatorial Designs. CRC Press, 2006.A14-15

猜你喜欢

转载自blog.csdn.net/ccsss22/article/details/125139825
CRC