循环码编译码实验报告.docx
《循环码编译码实验报告.docx》由会员分享,可在线阅读,更多相关《循环码编译码实验报告.docx(19页珍藏版)》请在冰豆网上搜索。
循环码编译码实验报告
HarbinInstituteofTechnology
信息论与编码报告
题目:
循环码编译码实验
院(系)电子与信息工程学院
班级通信1班
学生
学号
序号
哈尔滨工业大学
循环码编译码实验
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的八种错误图样中的一种,得到实际接收码字
%%时间:
2013-11-29
function[code_R,error_picture]=error_pattern(code_S)
%code_S:
本来发送的码字
%code_R:
实际接收到的码字
%error_picture:
随机生成的重量为0或1的八种错误图样中的一种
n=7;
k=4;
[L,W]=size(code_S);
num=L*W;
code_send=reshape(code_S',1,num);
code_send_7=(reshape(code_send,n,length(code_send)/n))';%%%将码元变成length(code_in)/n行,n列矩阵
forloop=1:
length(code_send)/7
error=zeros(1,n);%错误图样序列
error_place=randi([0,n],1,1);%错误图样位置
if(error_place==0)
code_R(loop,:
)=code_send_7(loop,:
);
else
error(8-error_place)=1;
fori=1:
n
code_temp=mod(code_send_7(loop,i)+error(i),2);%接收码字序列
code_R(loop,i)=code_temp;
end
end
error_picture(loop,:
)=error;
end
end
3.3译码模块
学生设计了校验子译码和梅吉特译码两种译码方式,其中校验子译码时校验子多项式与错误图样多项式的对应关系表如下:
表1校验子多项式与错误图样多项式对应关系
S(x)
E(x)
0
0
1
1
x
x
x2
x2
x+1
x3
x2+x
x4
x2+x+1
x5
x2+1
x6
梅吉特译码电路如下图:
图4梅吉特译码电路
图5校验子译码流程图图6梅吉特译码流程图
校验子译码源程序如下:
%%函数功能:
校验子译码
%%时间:
2013-11-29
function[C_decode_n,C_decode_k]=check(code_R,code_in_L)
%code_R:
接收码字序列
%code_in_L:
信息码元长度
%C_decode_n:
译码后的码字序列
%C_decode_k:
译码后的信息码元
n=7;
k=4;
gen=[1011];%生成多项式向量
[L,W]=size(code_R);
num=L*W;
code_recrive=reshape(code_R',1,num);
code_recrive_7=(reshape(code_recrive,n,length(code_recrive)/n))';%%%将码元变成length(code_in)/n行,n列矩阵
forloop=1:
length(code_recrive)/7
%在二元域进行运算,必须把信息码字多项式向量和生成多项式向量转到二元域GF
(2)上
%函数gf(X,M)用于从向量X生成GF(2^M)上对应的向量
R_g=gf(code_recrive_7(loop,:
),1);
gen_g=gf(gen,1);
%用R_g除以生成多项式g(x)
[Q,rem_g]=deconv(R_g,gen_g);%多项式除法其实就是解卷积运算,得到除法的商式Q,余式rem_g
S_rem_2=rem_g.x;%rem_g.x表示二元域向量rem_g的一个属性,即多项式的系数
%rem_g.x是在实数域中,而rem_g是在二元域中
L_S_rem_2=length(S_rem_2);%%长度
S_rem=S_rem_2(L_S_rem_2)+2*S_rem_2(L_S_rem_2-1)+4*S_rem_2(L_S_rem_2-2);%%2进制转化为10进制
error=zeros(1,n);
ifS_rem==0
error=[0000000];
elseifS_rem==1
error=[0000001];
elseifS_rem==2
error=[0000010];
elseifS_rem==4
error=[0000100];
elseifS_rem==3
error=[0001000];
elseifS_rem==6
error=[0010000];
elseifS_rem==7
error=[0100000];
elseifS_rem==5
error=[1000000];
end
fori=1:
length(error)
iferror(i)==1
E_place=i;%%定位错误的位置
code_recrive_7(loop,E_place)=~code_recrive_7(loop,E_place);%错误码字译码
end
end
code_temp=code_recrive_7(loop,:
);
%输出译码
C_decode_n(loop,:
)=code_temp;
C_decode_k0(loop,:
)=code_temp(1:
k);
end
%输出译码
%C_decode_n=reshape(C_decode_n0',1,length(code_recrive));
C_decode_k1=reshape(C_decode_k0',1,length(code_recrive)/7*4);
C_decode_k=C_decode_k1(1:
code_in_L);
end
梅吉特译码源程序如下:
%%函数功能:
(7,4)系统循环码梅吉特译码
%%编程时间:
2013-11-29
function[C_decode_n,C_decode_k]=encoder(code_R,code_in_L)
%%code_R:
接收到的码字
%%code_in_L:
信息码元长度
%%C_decode_n:
译码之后得到的码字
%%C_decode_k:
译码之后得到的信息码元
n=7;
k=4;
[L,W]=size(code_R);
num=L*W;
code_recrive=reshape(code_R',1,num);
code_recrive_7=(reshape(code_recrive,n,length(code_recrive)/n))';%%%将码元变成length(code_in)/n行,n列矩阵
forloop=1:
length(code_recrive)/7
D=[0,0,0];%%开始译码时门打开
%%寄存器初始化D=[D0D1D2]
fori=1:
n
D_temp
(1)=mod(D(3)+code_recrive_7(loop,i),2);
D_temp
(2)=mod(D
(1)+D(3),2);
D_temp(3)=D
(2);
D=D_temp;
end
fori=1:
n%输入端关闭,移位寄存器中的接收码
S=double(D
(1)&(~D
(2))&D(3));%模2加后输出,S反馈到D寄存器
D_temp
(1)=mod(D(3)+S,2);
D_temp
(2)=mod(D
(1)+D(3),2);
D_temp(3)=D
(2);
D=D_temp;
code_temp(i)=mod(code_recrive_7(loop,i)+S,2);
end
%输出译码
C_decode_n(loop,:
)=code_temp;
C_decode_k0(loop,:
)=code_temp(1:
k);
end
%输出译码
%C_decode_n=reshape(C_decode_n0',1,length(code_recrive));
C_decode_k1=reshape(C_decode_k0',1,length(code_recrive)/7*4);
C_decode_k=C_decode_k1(1:
code_in_L);
end
3.4BSC信道传输时的译码模块
本模块的编程比较简单,主要是调用bsc函数,设置一下错误概率参数p即可,故不在此报告中给出源代码。
需要指出的是,本模块的主要作用不只是看一下不同错误概率时的实际接收码字,更重要的是,可以验证(7,4)系统循环码的纠错能力,因为理论上讲,(7,4)系统循环码只能纠一位错,本模块正好验证了这一点。
4运行方法及相应结果
利用Matlab进行GUI设计生成的用户界面如图7所示。
需要注意的是,不可直接在扩展名为.fig的文件下进行编译码操作,而需要运行该.fig的源m文件,在新弹出的界面中进行编译码操作,否则会提示错误:
Attempttoreferencefieldofnon-structurearray.
图7(7,4)系统循环码编译码演示工具界面
本工具的操作方法如下,以下4步按操作依次进行:
(1)在编码模块的“输入信息码元”处输入信息码元,点击“开始编码”按键,即进行(7,4)系统循环码编码操作,在“输出循环码码字”处输出编码后的码字。
主要注意的是:
本工具中,输入的信息码元形式不能为0000的形式,而应该是0000(码元之间用空格隔开)或者0,0,0,0(码元之间用逗号隔开)的形式,当然两端也可以加中括号,输入的码元长度不是4的倍数也无所谓。
比如可以输入信息码元[11]或者[0011]或者[11110101]。
(2)在产生随机错误图样模块,点击“产生错误图样”按键,显示错误图样和实际接收码字。
(3)在译码模块,在校验子译码板块点击“译码”按键则显示译码得到的码字和相应的信息码元,同样,在梅吉特译码板块点击“译码”按键也显示译码得到的码字和相应的信息码元。
(4)在BSC信道传输时板块,首先在“错误概率”处输入相应的错误概率,点击“显示实际接收码字”按键,则显示实际接收码字,然后点击“译码”按键分别显示校验子译码和梅吉特译码的结果。
运行结果见下面的5个图,其中图8、图9、图10分别为输入码元不同,分别为[11],[0011],[11110101],分别代表了三种不同的情形。
图11、图12则为输入码元[0011],信道错误概率p=0.1时的情形,验证了(7,4)系统循环码只能纠一位错误。
图8输入信息码元为[11]时的情形
图9输入信息码元为[0011]时的情形
图10输入信息码元为[11110101]时的情形
图11每个码字错一位码元的情形
由图11可知,错一位码元时,译码可以纠正。
图12每个码字错两位的情形
由图12可知,错两位码元时,校验子译码和梅吉特译码不仅不能纠错,可能还会导致更多的错误。
5实验心得及课程建议
通过本次试验,学生对(7,4)系统循环码的编译码过程有了更深的了解,掌握了循环码编码、校验子译码和梅吉特译码的编程方法,更值得高兴的是,学生初步了解了利用Matlab进行用户界面GUI设计,并进行了相应的实际操作。
学生对于课程的建议是,由于几乎所有同学本科室都学过信息论这门课,而对于编码掌握的并不好,故是不是可以适当压缩信息论部分的学时,多讲一些编码方面的知识,比如RS码等,感觉在做编码方面或者跳频方面(因为跳频图案的设计时需要一些编码的知识)的课题时,这些知识很有用。