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