(7,4)汉明码编译码程序说明

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

(7,4)汉明码编译码原理程序说明书

1、线性分组码

假设信源输出为一系列二进制数字0和1.在分组码中,这些二进制信息序列分成固定长度的消息分组(message blocks )。每个消息分组记为u ,由k 个信息位组成。因此共有2k 种不同的消息。编码器按照一定的规则将输入的消息u 转换为二进制n 维向量v ,这里n>k 。此n 维向量v 就叫做消息u 的码字(codeword )或码向量(code vector )。因此,对应于2k 种不同的消息,也有2k 种码字。这2k 个码字的集合就叫一个分组码(block code )。

一个长度为n ,有2k 个码字的分组码,当且仅当其2k 个码字构成域GF (2)上所有n

维向量空间的一个k 维子空间时被称为线性(linear )(n ,k )码。

对于线性分组码,希望它具有相应的系统结构(systematic structure ),其码字可分为消息部分和冗余校验部分两个部分。消息部分由k 个未经改变的原始信息位构成,冗余校验部分则是n-k 个奇偶校验位(parity-check )位,这些位是信息位的线性和(linear sums )。具有这样的结构的线性分组码被称为线性系统分组码(linear systematic block code )。 本实验以(7,4)汉明码的编译码来具体说明线性系统分组码的特性。 其主要参数如下:

码长:21m

n =-

信息位:

21m

k m =-- 校验位:m n k =-,且3m ≥ 最小距离:min 03

d d ==

由于一个(n ,k )的线性码C 是所有二进制n 维向量组成的向量空间n V 的一个k 维子

空间,则可以找到k 个线性独立的码字,0,1,1k g g g -…… ,使得C 中的每个码字v 都是这k 个码字的一种线性组合。

(7,4)汉明码的生成矩阵如下,前三位为冗余校验部分,后四位为消息部分。

0123 1 1 0 1 0 0 00 1 1 0 1 0 01 1 1 0 0 1 01 0 1 0 0 0 1g g G g g ⎧⎫⎧⎫⎪⎪⎪⎪⎪⎪⎪⎪==⎨⎬⎨⎬⎪⎪⎪⎪⎪⎪⎪

⎪⎩⎭⎩⎭

如果()0123u u u u u =是待编码的消息序列,则相应的码字可如下给出:

()

0101230011223323g g v u G u u u u u g u g u g u g g g ⎧⎫⎪⎪⎪⎪

===+++⎨⎬⎪⎪⎪⎪⎩⎭

编码结构即码字()0123456v v v v v v v v =,对于(7,4)线性分组码汉明码而言,

3456,,,v v v v 为所提供的消息序列,而0356v v v v =⊕⊕,1345v v v v =⊕⊕,2456v v v v =⊕⊕。

由以上关系可以得到(7,4)汉明码的全部码字如下所示:

2、用C++编写(7,4)汉明码编译码程序的思路如下: (1)编码程序

循环输入待编码消息序列()0123u u u u u =,首先判断输入是否符合输入条件:输入必须是4位0,1序列,共有4

2种情况。

编码程序如下:(本人水平有限,使用直接赋值的方法,望见笑) for(j=0;j<7;j++) {

if(j==3) v[j]= u[0];

if(j==4) v[j]= u[1];

if(j==5) v[j]= u[2];

if(j==6) v[j]= u[3]; if(j==0)

v[j]= ((u[0]^u[2])^u[3]); //异或运算 if(j==1)

v[j]= ((u[0]^u[1])^u[2]); //异或运算 if(j==2)

v[j]= ((u[1]^u[2])^u[3]); //异或运算 cout << v[j] << " "; }

cout<

编码的思想为: 30v u =

41v u = 52v u =

0356v v v v =⊕⊕ 1345v v v v =⊕⊕ 2456v v v v =⊕⊕

(2)译码程序:

循环输入待译码的码字序列()0123456v v v v v v v v =,第一步判断输入是否符合输入条件:输入必须是7位0,1序列,共有72种情况。但是72种情况中只有4

2即16个有效码字,那么第二步则是要判断是否是4

2即16个有效码字,这也是编码的一个检错方式,利用其奇偶校验矩阵T

H ,校正子s ,接收到的码字序列为r ,判断*T

s r H =是否等于0。若等于0,则证明是有效码字;若不等于0,则证明不属于16个有效码字的一个。

● 奇偶校验矩阵100101101011100010111H ⎧⎫

⎪⎪

=⎨⎬⎪⎪⎩⎭

● 奇偶校验矩阵100010001110011111101T

H ⎧⎫⎪⎪⎪⎪⎪⎪⎪⎪=⎨⎬⎪⎪⎪⎪⎪⎪⎪⎪⎩⎭

以下为纠错的关键程序:

for(j=0;j<3;j++)

{

a=(v[0]*ht[0][j])^(v[1]*ht[1][j])^(v[2]*ht[2][j])^(v[3]*ht[3][j])^(

v[4]*ht[4][j])^(v[5]*ht[5][j])^(v[6]*ht[6][j]);

result=result+a;

}

if(result!=0)

{

cout<<"输入的是无效的字码"<

goto loop;

}

else cout<<"输入字码有效"<

cout<<"您所输入的待译码的码字序列为:";

接下来便是译码的两个主要方法:

第一个方法为查表法:程序中check_table()函数便是查表法。

第二个方法编码方法便是:系统码直接取信息位译码

程序如下:

for(j=0;j<4;j++)

{

if(j==0)

u[j]= v[3];

if(j==1)

u[j]= v[4];

if(j==2)

u[j]= v[5];

if(j==3)

u[j]= v[6];

cout << u[j] << " ";

}

相关文档
最新文档