微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等
本节目录
一、线性分组码
二、Hamming码的编码仿真
三、CRC校验码的编码仿真
四、Matlab源码
1、Hamming码的编码仿真源码
2、CRC校验码的编码仿真源码
本节内容
一、线性分组码
在(n,k)分组码中,若每个监督元都是码组中某些信息元按模2和得到的,即监督元是信息元按线性关系相加而得到的,则称为线性分组码。
通常,线性分组码,可以用线性方程组表述码元规律性。
对于(n,k)线性分组码,生成矩阵是一个k×n的矩阵。
输入的信息位X=[X1,X2,……,Xk]
生成码字为C=[C1,C2,……,Ck]
则C=XG,其中G是生成矩阵。
对于生成码字中前k位与信息完全相同的码称为系统码。
系统码的生成矩阵G=[Ik,P],Ik是k×k的单位矩阵,P为一个k×(n-k)的单位矩阵。
(n,k)码的一致性校验矩阵H,满足:
接收端的接收信号表示为:
上式中C为发送码组;e=[e1,e2,……,en]为传输中的误码。
若传输无差错,则e=0,也是说,接收端必然码组监督方程式:
若传输中有差错,即e≠0,接收端的监督方程以及校正子S为
二、Hamming码的编码仿真
Hamming码具有的特性是(n,k)=((2m)-1,(2m)-1-m)。m≥3且为正整数。
Matlab提供了生成Hamming码的函数hammgen,进行Hamming码的编码encode函数,以及进行Hamming码的解码decode函数。
matlab代码示例:
仿真(7,4)Hamming码的编码及硬判决译码过程
原始信息x和译码结果x_dec完全一致。
三、CRC校验码的编码仿真
CRC(Cyclic Redundancy Check),循环冗余校验。
循环冗余校验码是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督码,也就是CRC码,并附加在信息位后面,构成一个新的共n=k+r位的二进制码序列。
对于一个给定的(n,k)码,根据G(x)可以生成k位信息的校验码,G(x)称为这个CRC校验码的生成多项式。
在发送信息时,用信息多项式G(x)表示,将G(x)左移r位,表示为C(x)×2r,G(x)的右边就会空出r位,也就是校验码的位置。通过C(x)×2r除以生成多项式G(x)得到的余数就是校验码。
接收方将接收到的二进制序列数(信息码和CRC校验码)除以多项式,如果余数为0,表示传输过程中无错误发生。否则说明传输出错。
matlab代码示例:
仿真CRC-8校验码在二进制对称信道中的检错性能,
CRC生成多项式为g(x)=x^8+x^7+x^6+x^4+x^2+1,
每一帧中含有的消息比特个数为16,
其中二进制对称信道采用16-QAM调制,
Eb/N0的范围是0-10dBd。
四、Matlab源码
1、Hamming码的编码仿真源码
clear all;
clc;
close all;
%信息比特的行数
N=10;
%Hamming码组长度n
n=7;
%监督长度
m=3;
%产生Hamming码的生成矩阵和校验矩阵
[H,G]=hammgen(m);
%产生比特数据
x=randi([0 1],N,n-m);
%Hamming编码
y=mod(x*G,2);
%在每个编码码组中引入一个随机比特错误
y1=mod(y+randerr(N,n),2);
%生成n*n的单位矩阵,其中每一行中的1代表错误比特位置
mat1=eye(n);
%校验结果对应所有的错误矢量
errvec=mat1*H.';
%译码
y2=mod(y1*H.',2);
%根据译码结果,找出错误比特的位置,并纠错
for indx=1:N
for indx1=1:n
if(y2(indx,:)==errvec(indx1,:))
y1(indx,:)=mod(y1(indx,:)+mat1(indx1,:),2);
end
end
end
%恢复原始信息比特
x_dec=y1(:,m+1:end);
%纠错后的信息比特与原始信息比特对比
s=find(x~=x_dec)
2、CRC校验码的编码仿真源码
clear all;
clc;
close all;
%发送的帧数
N=100000;
%一帧中的消息比特个数
L=16;
%CRC生成多项式
poly=[1 1 1 0 1 0 1 1];
%CRC码的长度
N1=length(poly)-1;
%SNR的范围
EbNo=0:10;
%16-QAM理论误比特率
ber=berawgn(EbNo,'qam',16);
for indx=1:length(ber)
%BSC信道错误概率
pe=ber(indx);
for iter=1:N
%消息比特
msg=randi([0 1],1,L);
%消息比特左移
msg1=[msg zeros(1,N1)];
%多项式除以CRC校验码,q-商,r-余数
[q,r]=deconv(msg1,poly);
%模2处理
r=mod(abs(r),2);
%CRC校验码
crc=r(L+1:end);
%发送帧
frame=[msg crc];
%通过二进制对称信道
x=bsc(frame,pe);
%接收序列除以多项式
[q1,r1]=deconv(x,poly);
%模2处理
r1=mod(abs(r1),2);
%统计本帧是否产生误码
err(iter)=biterr(frame,x);
%通过CRC统计本帧是否产生误码
err1(iter)=sum(r1);
end
%误帧率
fer1(indx)=sum(err~=0);
%CRC计算误帧率
fer2(indx)=sum(err1~=0);
end
%CRC捡漏的概率
pmissed=(fer1-fer2)/N;
semilogy(EbNo,pmissed);
title('CRC-8检测性能');
xlabel('EbNo');
ylabel('漏检概率');