循环码编译码实验报告文档格式.docx
《循环码编译码实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《循环码编译码实验报告文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
(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
3.2产生错误图样模块
本模块产生随机产生重量为0或1的八种错误图样中的一种,并得到实际接收码字。
程序流程图如图3所示。
图3产生随机错误图样流程图
产生错误图样源程序如下:
%%函数功能:
随机产生重量为0或1的八种错误图样中的一种,得到实际接收码字
%%时间:
function[code_R,error_picture]=error_pattern(code_S)
%code_S:
本来发送的码字
%code_R:
实际接收到的码字
%error_picture:
随机生成的重量为0或1的八种错误图样中的一种
[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列矩阵
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
error_picture(loop,:
)=error;
3.3译码模块
学生设计了校验子译码和梅吉特译码两种译码方式,其中校验子译码时校验子多项式与错误图样多项式的对应关系表如下:
表1校验子多项式与错误图样多项式对应关系
S(x)
E(x)
1
x
x2
x+1
x3
x2+x
x4
x2+x+1
x5
x2+1
x6
梅吉特译码电路如下图:
图4梅吉特译码电路
图5校验子译码流程图图6梅吉特译码流程图
校验子译码源程序如下:
校验子译码
function[C_decode_n,C_decode_k]=check(code_R,code_in_L)
接收码字序列
%code_in_L:
信息码元长度
%C_decode_n:
译码后的码字序列
%C_decode_k:
译码后的信息码元
n=7;
k=4;
gen=[1011];
[L,W]=size(code_R);
code_recrive=reshape(code_R'
code_recrive_7=(reshape(code_recrive,n,length(code_recrive)/n))'
length(code_recrive)/7
R_g=gf(code_recrive_7(loop,:
),1);
%用R_g除以生成多项式g(x)
[Q,rem_g]=deconv(R_g,gen_g);
S_rem_2=rem_g.x;
%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进制
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];
length(error)
iferror(i)==1
E_place=i;
%%定位错误的位置
code_recrive_7(loop,E_place)=~code_recrive_7(loop,E_place);
%错误码字译码
code_temp=code_recrive_7(loop,:
%输出译码
C_decode_n(loop,:
)=code_temp;
C_decode_k0(loop,:
)=code_temp(1:
k);
%输出译码
%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);
梅吉特译码源程序如下:
(7,4)系统循环码梅吉特译码
%%编程时间:
function[C_decode_n,C_decode_k]=encoder(code_R,code_in_L)
%%code_R:
接收到的码字
%%code_in_L:
%%C_decode_n:
译码之后得到的码字
%%C_decode_k:
译码之后得到的信息码元
code_recrive_7=(reshape(code_recrive,n,length(c