Matlab通信仿真系列——线性分组码之循环码、BCH码、RS码仿真

微信公众号上线,搜索公众号小灰灰的FPGA,关注可获取相关源码,定期更新有关FPGA的项目以及开源项目源码,包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等
在这里插入图片描述
本节目录

一、循环码
1、循环码的定义
2、循环码的Matlab仿真
二、BCH码
1、BCH码的Matlab仿真
三、RS码
1、RS码的Matlab仿真
四、Matlab源码
1、循环码的Matlab仿真源码
2、BCH码的Matlab仿真源码
3、RS码的Matlab仿真源码

本节内容
一、循环码
1、循环码的定义

循环码(Cyclic Code)是一类重要的线性分组码。
循环码具有循环性,即循环码许用码组集合中任一码字循环移位得到的码字仍为该码组集合中的一个码字。
循环码的两个特点:
一是可以用反馈线性移位寄存器实现编码和伴随式计算;
二是循环码具有固有的代数结构,可以找到各种简单使用的译码方式。
循环码通常采用多项式表示码字,(n,k)循环码的码字多项式:
在这里插入图片描述

(7,3)循环码的码字如下表:
在这里插入图片描述

如果一种码的所有码多项式都是多项式g(x)的倍式,则称g(x)是该码的生成多项式。
循环码的生成矩阵G(x)常用多项式的形式来表示:
在这里插入图片描述

循环码的监督矩阵H(x)常用多项式的形式来表示:
在这里插入图片描述

2、循环码的Matlab仿真
Matlab提供了cyclpoly函数和cyclgen函数,用来进行循环编码。
操作步骤:首先需要使用cyclpoly生成循环码的多项式,之后再用cycgen生成循环码的生成矩阵和校验矩阵。
pol=cyclpoly(n,k)用来生成(n,k)循环码的生成多项式。
[h,g]=cyclgen(n,pol)用pol生成多项式来生成循环码的生成矩阵g和校验矩阵h。
当然Matlab也支持encode和decode进行循环码的编码和译码。

matlab代码示例:
使用cyclgen和encode实现(3,2)循环码编码,
并加入噪声,使用decode对二者进行解码并比对结果。

二、BCH码
BCH码,Bose-Chaudhuri-Hocquenghem,是循环码中的一个大类,可以是二进制码也可以是非二进制码。
二进制BCH码的构造,n=2^m-1;n-k≤mt;dmin≤2t+1。其中m(m≥3)和t是任意正整数。
非二进制BCH码包括常用的里德-索罗门。
1、BCH码的Matlab仿真
Matlab提供了与BCH编码和解码相关的函数:bchgenpoly、bchenc和bchdec。
[genpoly,t]=bchgenpoly,用来生成(n,k)BCH码的生成多项式genpoly及纠错能力t。
code=bchenc(msg,n,k),将消息msg以(n,k)的BCH码结构进行编码。
decoded=bchdec(code,n,k),用来对BCH编码的码字进行译码。

matlab代码示例:
使用bchgenpoly得到(15,5)BCH码的纠错能力,
并进行编码和译码。

在这里插入图片描述

三、RS码
RS码是一类具有很强纠错能力的多进制BCH码,首先由里德Reed和索楼门Solomon提出,故称为RS码。
RS(n,k)码可以由m、n和k三个参数表示,其中m表示码元符号取自域GF(2^m),n表示码字长度,k表示信息段长度。
一个可以纠正t个符号错误的RS码,需要满足:
①码字长度,n=2^m-1;
②信息段,k个符号,k=1,2,……,n-1;
③监督位,2t=n-k个符号;
④最小码距,dmin=2t+1个符号。
RS码,通过选择一个合适的生成多项式g(x),并使得对每个信息段计算得到的码字多项式都是g(x)的倍式,也就是码字多项式除以g(x)的余式为0。若接收到的码字多项式除以g(x)的余式不是0,则确认接收码字中存在错误;进一步计算纠正最多t=(n-k)/2个错误。
1、RS码的Matlab仿真
Matlab提供了RS码的编码函数rsenc和译码函数rsdec。
code=rsenc(msg,n,k)表示将消息以(n,k)的RS码结构进行编码。
code=rsenc(msg,n,k,genpoly)表示生成指定RS码的生成多项式。
decoded=rsdec(code,n,k)表示对应code=rsenc(msg,n,k)的译码。
decoded=rsdec(code,n,k,genpoly)表示对应code=rsenc(msg,n,k,genpoly)的译码。

matlab代码示例:
仿真(15,11)RS码通过二进制对称信道后的性能。
每个符号的比特数是4,二进制对称信道的误比特率为0.01。

在这里插入图片描述

经过RS译码的误比特率为0.0012,译码前的误比特率0.01,通过比较发现误比特率明显下降了。
四、Matlab源码
1、循环码的Matlab仿真源码

clear all;
clc;
close all;
%循环码n,k
n=3;
k=2;
%消息比特的行数
N=10000;
%消息比特
msg=randi([0 1],N,k);
%循环码的生成多项式
pol=cyclpoly(n,k);
%生成循环码
[h g]=cyclgen(n,pol);
%循环码编码
code1=encode(msg,n,k,'cyclic/binary');
code2=mod(msg*g,2);
%噪声
noisy=randerr(N,n,[0 1;0.7,0.3]);
%加入噪声
noisycode1=mod(code1+noisy,2);
noisycode2=mod(code2+noisy,2);
%译码
newmsg1=decode(noisycode1,n,k,'cyclic');
newmsg2=decode(noisycode2,n,k,'cyclic');
%误比特率
[number,ratio_1]=biterr(newmsg1,msg);
[number,ratio_2]=biterr(newmsg2,msg);
disp(['The bit error rate1 is',num2str(ratio_1)]);
disp(['The bit error rate2 is',num2str(ratio_2)]);

2、BCH码的Matlab仿真源码

clear all;
clc;
close all;
%BCH码字长度
m=4;
n=2^m-1;
%消息长度
k=5;
%消息比特的行数
N=100;
%消息比特
msg=randi([0 1],N,k);
%BCH码的生成多项式
[genpoly,t]=bchgenpoly(n,k);
%BCH编码
code=bchenc(gf(msg),n,k);
%码字加入不超过纠错能力的误码
noisycode=code+randerr(N,n,1:t);
%BCH译码
[newmsg,err,ccode]=bchdec(noisycode,n,k);
if ccode==code
    disp('所有错误比特都被纠正')
end
if newmsg==msg
    disp('译码消息与原消息相同')
end

3、RS码的Matlab仿真源码

clear all;
clc;
close all;
%每个信号符号包含的比特数
m=4;
%码字长度
n=15;
%码字中的信息符合数
k=11;
%码的纠错能力
t=(n-k)/2;
%消息比特的行数
N=1000;
%消息比特
msg=randi([0 2^m-1],N,k);
msg1=gf(msg,m);
%RS编码
msg1=rsenc(msg1,n,k).';
%转化为二进制
msg2=de2bi(double(msg1.x),'left-msb');
%通过二进制对称信道
y=bsc(msg2,0.01);
%转化十进制
y=bi2de(y,'left-msb');
y=reshape(y,n,N).';
%RS解码
dec_x=rsdec(gf(y,4),n,k);
%解码后的误比特率
[err,ber]=biterr(msg,double(dec_x.x),m);
  • 27
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小灰灰的FPGA

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

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

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

打赏作者

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

抵扣说明:

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

余额充值