循环码编译码实验报告

  • 格式:doc
  • 大小:1.10 MB
  • 文档页数:14

下载文档原格式

  / 14
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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); %接收码字序列