1、 由于一个(n,k)的线性码C是所有二进制n维向量组成的向量空间的一个k维子空间,则可以找到k个线性独立的码字, ,使得C中的每个码字v都是这k个码字的一种线性组合。 (7,4)汉明码的生成矩阵如下,前三位为冗余校验部分,后四位为消息部分。如果是待编码的消息序列,则相应的码字可如下给出:编码结构即码字,对于(7,4)线性分组码汉明码而言,为所提供的消息序列,而,。由以上关系可以得到(7,4)汉明码的全部码字如下所示: k=4,n=7的线性分组码消息码字(0000)(0000000)(0001)(1010001)(1000)(1101000)(1001)(0111001)(0100)(01101
2、00)(0101)(1100101)(1100)(1011100)(1101)(0001101)(0010)(1110010)(0011)(0100011)(1010)(0011010)(1011)(1001011)(0110)(1000110)(0111)(0010111)(1110)(0101110)(1111)(1111111)2、用C+编写(7,4)汉明码编译码程序的思路如下:(1)编码程序循环输入待编码消息序列,首先判断输入是否符合输入条件:输入必须是4位0,1序列,共有种情况。编码程序如下:(本人水平有限,使用直接赋值的方法,望见笑)for(j=0;j7;j+) if(j=3) v
3、j= u0; if(j=4) vj= u1; if(j=5) vj= u2; if(j=6) vj= u3; if(j=0) vj= (u0u2)u3); /异或运算 if(j=1) vj= (u0u1)u2); if(j=2) vj= (u1u2)u3); cout vj ; coutendl;编码的思想为:(2)译码程序:循环输入待译码的码字序列,第一步判断输入是否符合输入条件:输入必须是7位0,1序列,共有但是种情况中只有即16个有效码字,那么第二步则是要判断是否是即16个有效码字,这也是编码的一个检错方式,利用其奇偶校验矩阵,校正子,接收到的码字序列为,判断是否等于0。若等于0,则证明
4、是有效码字;若不等于0,则证明不属于16个有效码字的一个。奇偶校验矩阵以下为纠错的关键程序:3; a=(v0*ht0j)(v1*ht1j)(v2*ht2j)(v3*ht3j)(v4*ht4j)(v5*ht5j)(v6*ht6j); result=result+a;if(result!=0)输入的是无效的字码 goto loop;else cout输入字码有效cout您所输入的待译码的码字序列为:接下来便是译码的两个主要方法:第一个方法为查表法:程序中check_table()函数便是查表法。表格如下:第二个方法编码方法便是:系统码直接取信息位译码 程序如下: for(j=0;4; if(j=0
5、) uj= v3; if(j=1) uj= v4; if(j=2) uj= v5; uj= v6; uj 3、程序附录/(7,4)编译码程序#include using namespace std;void check_table();/编码程序int main() int g47=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; /声明生成矩阵G,即4个线性独立的码字,可以使码本C中的码字v都是这k个码字的一种线性组合, int h37=1,0,0,1,0,1,1,0,1,0,1,1,1,0,0,0,1,0,1,1,1; /声明
6、校验矩阵H, int ht73=1,0,0,0,1,0,0,0,1,1,1,0,0,1,1,1,1,1,1,0,1; /声明校验矩阵H的转置矩阵HT(这里的T是H 的上标) int u4; /声明待编码的消息序列,即未编码前的信息序列 int v7; /声明编码后的码字序列 /int s7; int i,j,k;/顺序输入待编码4位信息序列lable:请输入4位待编码消息序列: for(i=0;iui;/判断是否输入正确数据 if(u0=0|u0=1)&(u1=0|u1=1)&(u2=0|u2=1)&(u3=0|u3=1) cout您所输入的待编码消息序列为: for(i=0; cout el
7、se 输入错误!请输入正确的二进制4位0,1信息序列! goto lable; cout/输出生成矩阵 cout (7,4)汉明码的生成矩阵G为: for(j=0; cout gij cout endl;/码字的系统结构分为冗余校验部分和消息部分,结构形式:v(x)=v0,v1,v2,v3,v4,v5,v6/编码序列中v3,v4,v5,v6均为所提供的消息序列,对于(7,4)汉明码:/ v0=v3v5v6;/ v1=v3v4v5;/ v2=v4v5v6; 等待编码中 编码成功!编码后的码字序列为:/顺序输入7位待译码有效码字序列loop: int a,result=0;请输入7位待译码有效的消
8、息序列:vi;/1.判断是否输入正确0,1序列 if(v0=0|v0=1)&(v1=0|v1=1)&(v2=0|v2=1)&(v3=0|v3=1)&(v4=0|v4=1)&(v5=0|v5=1)&(v6=0|v6=1)输入字码合法 else 请输入正确的二进制7位0,1码字序列! goto loop;/2.判断是否为有效码字 a=(v0*ht0j)(v1*ht1j)(v2*ht2j)(v3*ht3j)(v4*ht4j)(v5*ht5j)(v6*ht6j); if(result! else cout/输出校验矩阵H(7,4)汉明码的校验矩阵H为:hij/输出校验矩阵HT(这里的T为H 的上标,代
9、表转置),目的是为了利用校正子进行编码检测s=r*HT;cout (7,4)汉明码的校验矩阵H的转置矩阵为:htij/检错算法check_table();/查表法译码方法二:系统码直接取信息位译码 等待译码中 译码成功!译码后的消息序列为: system(pause); return 0;/查表法函数void check_table()译码方法一:查表法 k=4,n=7的线性分组码的全部码字 消息 码字 | 消息 码字(0000) (0000000) | (0001) (1010001)(1000) (1101000) | (1001) (0111001)(0100) (0110100) | (0101) (1100101)(1100) (1011100) | (1101) (0001101)(0010) (1110010) | (0011) (0100011)(1010) (0011010) | (1011) (1001011)(0110) (1000110) | (0111) (0010111)(1110) (0101110) | (1111) (1111111)运行结果如下:编码结果为:译码结果为:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1