Matlab通信仿真系列——线性分组码之Hamming码和CRC校验码仿真

文章介绍了微信公众号上关于FPGA项目的资源,包括线性分组码、Hamming码和CRC校验码的编码仿真示例,以及Matlab源码,展示了如何使用Matlab实现这些纠错编码的编码和解码过程,以及CRC校验码在信道纠错中的性能分析。
摘要由CSDN通过智能技术生成

微信公众号上线,搜索公众号小灰灰的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('漏检概率');
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小灰灰的FPGA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值