首页 > 其他分享 >【CRC】基于MATLAB的CRC纠错码的设计

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

时间:2022-11-08 22:25:44浏览次数:70  
标签:编码 code rr 多项式 CRC zeros MATLAB 纠错码

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,则表示传输过程没有错误;否则,传输过程存在错误。

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

标签:编码,code,rr,多项式,CRC,zeros,MATLAB,纠错码
From: https://www.cnblogs.com/matlabfpga/p/16871414.html

相关文章

  • 【分子相互作用】基于MATLAB的分子相互作用的表征模型仿真
    1.软件版本matlab2013b2.本算法理论知识分子在永不停息地作无规则运动。扩散现象是分子作无规则运动的例证。所谓扩散是指两种不同的物质相互接触时,彼此进入对方的现象......
  • MATLAB:画图知识积累(未完)
    改变画布大小有画布figure(1)使用set()函数,分别四个边的位置set(figure(1),'Position',[left,bottom,width,height]);也可以最大化set(figure(1......
  • matlab solve函数解方程 带参数
    以Gaussianp.d.f.求方差的一元一次方程为例,已知均值(MU)/样本点(x,y),求方差(sigma2)。实参赋值MU=4.5e-8;%均值x_thres=5.1e-4;%找一个好的门限->对于solve(s......
  • 基于SNN脉冲神经网络的Hebbian学习训练过程matlab仿真
    目录一、理论基础二、案例背景1.问题描述2.思路流程三、部分MATLAB仿真四、仿真结论分析五、参考文献一、理论基础近年来,深度学习彻底改变了机器学习领域......
  • 基于模糊规则的金属腐蚀类型判决算法matlab仿真
    目录一、理论基础二、核心程序三、测试结果一、理论基础A不平整金属腐蚀金属表面为不规则表明。识别方法:金属表面是否为直线。   B金属腐蚀点金属腐蚀部分......
  • MATLAB:quiver()函数
    quiver()用来画矢量图,这里仅介绍常使用的quiver(x,y,u,v)语句x,y表示起始点;u,v表示向量的相关信息:向量的长度为sqrt(u^2+v^2);向量的夹角为arctan(v/u),注意是v/ux,y......
  • MATLAB:列表操作(未完)
    维度不变的列表合成a=[1,2];b=[3,4];c=[a;b;5,6];%通过直接在列表中用分号隔开直接插入效果  切片:列表某列如上面合成的列表c,要取出第2列所有......
  • 非正式图像处理-matlab
    处理后的素描图  ......
  • 【节点免疫】基于时空特性的节点免疫算法的故障诊断matlab仿真
    1.软件版本MATLAB2017b2.算法理论整体算法流程图:步骤一、网络节点的状态初始化,随机产生不同的网络节点,以及对各个网络节点赋值初始的状态信息。步骤二、对每个需要检......
  • matlab 计算区间交集
    %xy是数组,z是数字x可以取(1:0.1:2)y=(0.5:0.1:3)%function[a,b,c,d]=jiaoji(x,y,z)function[a,c,d]=jiaoji(x,z)a(1)=min(x);a(2)=max(x);%b(1)=min(......