循环码编译码实验报告
- 格式:doc
- 大小:1.10 MB
- 文档页数:14
Harbin Institute of Technology
信息论与编码报告
题目:循环码编译码实验
院(系)电子与信息工程学院
班级通信1班
学生
学号
序号
哈尔滨工业大学
循环码编译码实验
1 设计内容
循环码是线性分组码中最重要的一类码,它的结构完全建立在有限域多项式的基础上,它具有两个基本特点:一是编码电路与译码电路非常简单,易于实现;二是其代数性质好,分析方便,有一定的成熟的译码方法。
一个(n ,k )线性分组码C ,如果码组中的一个码字的循环移位也是这个码组中的一个码字,则称C 为循环码。
本实验主要完成以下四项内容:
(1)利用(7,4)系统循环码的生成多项式为:3()1g x x x =++,请设计该循环码的编码器。
(2)随机产生重量为0或1的八种错误图样中的一种,得到实际接收码字。
(3)根据接收到的码字进行译码,译码方式分为校验子译码和梅吉特译码两种。
(4)对于在BSC 信道传输时的情形进行讨论,验证(7,4)系统循环码的纠错能力。
2 编程环境
本实验采用Matlab 作为编程工具,所有代码均在Matlab 软件中运行,此软件功能强大,应用广泛,在此不再赘述。
3 各模块设计
3.1 编码器模块
利用(7,4)系统循环码的生成多项式为:3()1g x x x =++,请设计该循环码的编码器。流程图为:
图1 (7,4)循环码编码流程图图2 4位信息码元编码流程图
在学生设计的演示工具中输入的信息码元可以为任意多个,系统自动按每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后的余数
if a~=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列矩阵
for loop=1:length(code_in)/k
mes_code = [code_in_4(loop,:),zeros(1,3)]; % 在信息码字后面补上三个零,相当于乘上x^r
gen = [1 0 1 1]; % 生成多项式向量
% 在二元域进行运算,必须把信息码字多项式向量和生成多项式向量转到二元域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列矩阵
for loop=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;
for i=1:n
code_temp=mod(code_send_7(loop,i)+error(i),2); %接收码字序列