循环码编译码实验报告.doc
循环码编译码实验
1设计内容
循环码是线性分组码中最重要的一类码,它的结构完全建立在有限域多项式的基础上,它具有两个基本特点:一是编码电路与译码电路非常简单,易于实现;二是其代数性质好,分析方便,有一定的成熟的译码方法。
一个(n,k)线性分组码C,如果码组中的一个码字的循环移位也是这个码组中的一个码字,则称C为循环码。
本实验主要完成以下四项内容:
(1)利用(7,4)系统循环码的生成多项式为:,请设计该循环码的编码器。
(2)随机产生重量为0或1的八种错误图样中的一种,得到实际接收码字。
(3)根据接收到的码字进行译码,译码方式分为校验子译码和梅吉特译码两种。
(4)对于在BSC信道传输时的情形进行讨论,验证(7,4)系统循环码的纠错能力。
2编程环境
本实验采用Matlab作为编程工具,所有代码均在Matlab软件中运行,此软件功能强大,应用广泛,在此不再赘述。
3各模块设计
3.1编码器模块
利用(7,4)系统循环码的生成多项式为:,请设计该循环码的编码器。流程图为:
图1(7,4)循环码编码流程图图24位信息码元编码流程图
在学生设计的演示工具中输入的信息码元可以为任意多个,系统自动按每4个连续的码字一组进行编码,当输入的信息码元不是4的倍数时,自动补零到与信息码元长度最接近的4的倍数。译码时也是按照每7个连续的码字一组进行译码。但是为了流程图的清晰明了,在本文的流程图除流程图1以外,其余均按一个循环码码字(即7位)来描述。
编码器模块源程序如下:
%%%函数功能:(7,4)系统循环码编码器
%%%编程时间:2013-11-29
%%%该系统循环码编码器的生成多项式是g(x)=x^3+x+1;
%%%系统循环码编码的原理是,首先用x^r乘以信息码字多项式m(x),这里r=3;然后用x^r*m(x)除以生成多项式g(x),
%%%得余式r(x);最后得系统循环码多项式c(x)=x^r*m(x)+r(x)
function[code_out,code_in_L]=coder(code_in)
%%code_in:输入信息码字
%%code_out:输出编码后的码字
%%L:输入的信息码元的长度
n=7;%%每个码字长度
k=4;%%每个码字中信息码元长度
code_in_L=length(code_in);
a=rem(code_in_L,k);%信息码元的长度除以k后的余数
ifa~=0%%%信息码元长度不是k的整数倍,则补0
array_0=zeros(1,k-a);%%%补零个数
code_in=[code_in,array_0];
end
code_in_4=(reshape(code_in,k,length(code_in)/k));%%%将补零后的码元变成length(code_in)/4行,4列矩阵
forloop=1:length(code_in)/k
mes_code=[code_in_4(loop,:),zeros(1,3)];%在信息码字后面补上三个零,相当于乘上x^r
gen=[1011];%生成多项式向量
%在二元域进行运算,必须把信息码字多项式向量和生成多项式向量转到二元域GF(2)上
%函数gf(X,M)用于从向量X生成GF(2^M)上对应的向量
mes_g=gf(mes_code,1);
gen_g=gf(gen,1);
%用x^r*m(x)除以生成多项式g(x)
[Q,rem_g]=deconv(mes_g,gen_g);%多项式除法其实就是解卷积运算,得到除法的商式Q,余式rem_g
%%相应的,多项式乘法其实是系数的卷积
code_rem=rem_g.x;%rem_g.x表示二元域向量rem_g的一个属性,即多项式的系数。
%rem_g.x是在实数域中,而rem_g是在二元域中
%输出系统循环码
code_out(loop,:)=[code_in_4(loop,:),code_rem(5:n)];
end
end
3.2产生错误图样模块
本模块产生随机产生重量为0或1的八种错误图样中的一种,并得到实际接收码字。程序流程图如图3所示。
图3产生随机错误图样流程图
产生错误图样源程序如下:
%%函数功能:随机产生重量为0或1的