基于C++的(7-4)汉明码编解码设计与实现Word文档格式.docx
《基于C++的(7-4)汉明码编解码设计与实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于C++的(7-4)汉明码编解码设计与实现Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
[1]《差错控制编码ErrorControlCoding》(美)ShuLinJr何元智
[2]《C++程序设计(第二版)》谭浩强
2.程序概述
2.1程序用途
(1)由(7,4)汉明码的生成矩阵实现(7,4)码的编码。
输入4位消息序列,通过程序编码得到7位输出码字。
(2)由(7,4)汉明码的校验矩阵对接收码字进行检错与纠错并译码得到输入的消息。
输入7位接收码字,通过程序检错并纠错得到正确的输出码字,译码得到4
位正确的输入消息序列。
2.2实现原理
(1)(7,4)汉明码的编码方法:
a.给定(7,4)汉明码的生成矩阵G
b.输入一个4位消息序列u=(u0,u1,u2,u3),并判断输入是否正确,若正确则进行编码,不正确则再次输入正确的消息序列。
c.通过输入的消息序列与生成矩阵相乘,得到一个1*7的矩阵
v=(v0,v1,v2,v3,v4,v5,v6),即得到输出码字。
(2)(7,4)汉明码的检错与纠错
a.求校正子
a1.给定(7,4)汉明码的校验矩阵H
a2.由接受到的码字r(r0,r1,r2,r3,r4,r5,r6)与校验矩阵H相乘,得到校正子
s=(s1,s2,s3)。
b.根据校正子的值判断错误位置
错误位置
V0
V1
V2
V3
V4
V5
V6
s1,s2,s3
100
010
001
110
011
111
101
通过if语句判断(s1,s2,s3)取值,来判断错误位置,并将错误位置取反后输出正确的码字向量。
c.求错误图样
通过接受码字与纠错后的码字进行模2加得到错误图样e=(e0,e1,e2,e3,e4,e5,e6)。
d.译码
因为(7,4)汉明码为系统码,因此纠错后的码字后四位即为输入消息序列。
2.3编程实现结果
如下图所示,编程实现结果即为输入左列消息后,输出右列码字。
由于
(7,4)码可以纠错一位,因此当输入有一位错误的码字序列时,程序可纠错为正确码字并译码为正确码字对应的消息序列。
运行实例如下:
2.4实现框图
(7,4)码编码
输入4位编码消息
序列与生成矩阵G
N
输入正确
Y
编码函数
V=u*G
输出结果
(7,4)码译码
输入7位码字序列
与校验矩阵H
求校正子
根据校正子判
断错误位置
求错误图样
译码
3.程序使用说明
3.1运行步骤
a. 输入:
4位编码消息输出:
7位输出码字
b.输入7位接收码字(注意由于纠错能力为1位,因此输入有一位错误的接收码字)。
输出:
接收到的码字的校正子s;
校正后的码字;
错误图样;
译码得到的消息序列。
3.2运行说明
程序具有检查输入是否为正确二进制信息序列的功能,当输入不是0,1序列时,程序输出“请输入正确的二进制信息序列”,并需要重新输入。
4.编程体会
问题1:
当输入不是二进制消息序列时译码结果出现错误。
解决办法:
编写判断输入是否正确的语句,若输入错误则提示重新输入正确的二进制0,1序列。
问题2:
校正后的结果不是0,1二进制序列
将结果对2求余数,则得到二进制序列。
问题3:
根据校正子的值判断错误位置时,起初想通过switch语句来根据不同的s值得到不同的输出,但是由于switch()中要用字符串序列,但是数组是整形数组,一直出现错误。
由于我的编程能力有限,只能使用比较直接的方法,后改用if语句判断s的值,然后将错误的位取反,其他位不变,将校正结果输出。
(注:
也可以根据线性分组码的性质,将接收向量与错误图样相加即得到纠错后的码字)
问题4:
译码得到消息序列时我最初的思想是想通过矩阵的相除,即输出码字
与生成矩阵相除得到输入消息,但是由于c++语言中不能直接进行矩阵相除,因此在这部分耽误了很多时间。
由系统码的性质知码字的后4为即为输入消息,因此译码变得很容易,不用繁琐的矩阵除法实现。
5.源程序清单(附代码注释)
#include<
iostream>
usingnamespacestd;
//定义生成矩阵G
intG[4][7]={{1,1,0,1,0,0,0},{0,1,1,0,1,0,0},{1,1,1,0,0,1,0},{1,0,1,0,0,0,1}};
//定义校正矩阵
intH[3][7]={{1,0,0,1,0,1,1},{0,1,0,1,1,1,0},{0,0,1,0,1,1,1}};
intu[4],v[7],r[7],s[3],rr[7],e[7],uu[4];
//输入消息序列;
输出码字;
接收码字;
校正子;
纠错后的接收码字;
译码后得到的消息序列
voidbianma(intu[4],intv[]);
//编码函数声明voidyima(intr[7],ints[]);
//译码函数声明
voidmain()
{
inti;
cout<
<
"
*****(7,4)汉明码编解码程序*****"
endl;
(7,4)汉明码的生成矩阵为:
\n G[4][7]= \n 1,1,0,1,0,0,0\n0,1,1,0,1,0,0\n1,1,1,0,0,1,0\n1,0,1,0,0,0,1\n"
(7,4)汉明码的校验矩阵为:
\nH[3][7]=\n1,0,0,1,0,1,1\n0,1,0,1,1,1,0
\n0,0,1,0,1,1,1\n"
//编码输入消息序列
lable:
cout<
请输入4位编码消息:
for(i=0;
i<
4;
i++)
cin>
>
u[i];
}
//判断是否输入正确for(i=0;
if((u[0]==0||u[0]==1)&
(u[1]==0||u[1]==1)&
(u[2]==0||u[2]==1)&
(u[3]==0||u[3]
==1))
输入的待编码消息序列为:
;
for(i=0;
else
cout<
请输入正确的二进制4位0,1消息序列"
gotolable;
bianma(u,v);
//调用编码函数
输出码字为:
7;
i++) cout<
v[i]<
"
//译码输入接收码字
loop:
请输入7位接收码字:
r[i];
for(i=0;
if((r[0]==0||r[0]==1)&
(r[1]==0||r[1]==1)&
(r[2]==0||r[2]==1)&
(r[3]==0||r[3]==1)&
(r[4]==0||r[4]==1)&
(r[5]==0||r[5]==1)&
(r[6]==0||r[6]==1))
输入的接收码字为:
请输入正确的二进制7位0,1信息序列!
gotoloop;
yima(r,s);
//调用译码函数cout<
system("
pause"
);
//编码程序
voidbianma(intu[4],intv[])
inti,j,temp;
temp=0;
for(j=0;
j<
j++)temp+=u[j]*G[j][i];
v[i]=temp%2;
//译码程序
voidyima(intr[7],ints[])
//求校正子inti,j,temp;
3;
j++)temp+=r[j]*H[i][j];
s[i]=temp%2;
接受到的码字的校正子s为:
i++)cout<
s[i]<
//根据校正子的值判断错误位置if(s[0]==1&
&
s[1]==0&
s[2]==0)
rr[0]=(r[0]+1)%2;
rr[1]=r[1];
rr[2]=r[2];
rr[3]=r[3];
rr[4]=r[4];
rr[5]=r[5];
rr[6]=r[6];
第一位输入错误,校正后的码字为:
for(i=0;
rr[i]<
elseif(s[0]==0&
s[1]==1&
rr[1]=(r[1]+1)%2;
rr[0]=r[0];
第二位输入错误,校正后的码字为:
s[2]==1)
rr[2]=(r[2]+1)%2;
第三位输入错误,校正后的码字为:
elseif(s[0]==1&
rr[3]=(r[3]+1)%2;
rr[