循环码实验报告

更新时间:2023-11-23 21:04:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

湖 南 大 学

信息科学与工程学院

实 验 报 告

实验名称 课程名称

香农编码 信息论与编码

1、实验目的

(1)进一步熟悉循环编码、译码算法;

(2)掌握C语言程序设计和调试过程中数值的进制转换、数值与字符串之间的转换等

技术。

2、实验要求

(1)输入:7位信息序列 (2)输出:输出(11,7)循环码

3、循环码编码算法

一个码长为n的(n,k)循环码,它必为按模xn+1运算的一个余式。 Cn-1(x) =c0 xn-1+cn-1xn-2+…+c2 x+c1 Ci (x) ≡xi ·C(x) mod (xn + 1)

循环码完全由其码组长度n和生成多项式g(x)所决定 生成多项式g(x)具有以下特性:

(1) g(x)是一个常数项为1的 r=n-k 次多项式; (2) g(x)是x?1的一个因式;

(3)该循环码中其它码多项式都是g(x)的倍式。 g(x), xg(x) …, xk-1g(x)

如果g(x)是一个 n – k = r 次多项式,并且是xn+1的一个因式,则 g(x)生成一( n , k )循环码。 任何(n,k)循环码的全体码字都是由一个n-k=r次多项式生成。

n?gn?kgn?k?1...g1g0000...0??0gg?...gg00...0n?kn?k?110????G??00gn?kgn?k?1...g1g00...0?

?........?????000...0gn?kgn?k?1...g1g0??生成矩阵

xn+1=g(x

可见H矩阵可由下述的多项式矩阵的系数构成,即由h(x)的反多项式h*(x)循环移位得到r组互不相关的多项式系数矢量构成。称H为循环码的一致监督矩阵

定义一个矩阵是生成矩阵还是监督矩阵,主要是看它们在编码过程中所起的作用。由于H矩阵与G矩阵彼此正交,所以两者的作用可以互换。若g(x)生成一(n,k)循环码,那么h*(x)可生成(n,n-k)循环码,h(x)亦也作为生成多项式得到一(n,n-k)循环码。 h*(x) = x k h(x – 1) =h0 + h1x +…+ hkxk

以 g(x)作为生成多项式生成的 (n,k)循环和以h*(x)作为生成多项式生成的 (n,n-k)循环码互为对偶码,而以g(x)作为生成多项式生成的 (n,k)循环码和以 h(x)作为生成多项式生成的 (n,n-k)循环码互为等效对偶码。 设待编码的信息序列为 I=[cn-1cn-2…cn-k]

I(x)=cn-1xk-1+cn-2xk-2+…+cn-k

一般系统循环码的编码可由下述三个步骤完成: 

(1) 先用xn-k乘以I(x),这相当于用移位寄存器 将信息序列移位n-k位。 

(2) 用生成多项式g(x)除xn-kI(x),得到余式V(x), 即构成监督码元位 

(3) 输出k个未变化的信息元,cn-1,cn-2,cn-3,…,cn-k, 其后紧随n-k个监督码元输出。 

编码电路的关键是如何构造一个以g(x)为除式, 以xn-k·I(x)为被除式的除法电路。

4、循环码译码:

1)由接收到的码多项式B(x)计算校正子(伴随式)多项式S(x); 2)由校正子S(x)确定错误图样E(x);

3)将错误图样E(x)与B(x)相加,纠正错误。

上述第(1)步运算和检错译码类似,也就是求解B(x)整除g(x)的余式,第(3)步也很简单。

因此,纠错码译码器的复杂性主要取决于译码过程的第(2)步。

基于错误图样识别的译码器称,它的原理图如图8-7所示。错误图样识别器是一个具有(n-k)个输入端的逻辑电路,原则上可以采用查表的方法,根据校正子找到错误图样,利用循环码的上述特性可以简化识别电路。梅吉特译码器特别适合于纠正2个以下的随机独立错误。

梅基特译码器

5、实验代码

#include

main(){ int i,j,k,wy=0; int total[128][7]; int temp[7]={0,0,0,0,0,0,0}; int s,ss; int ydev[5]={0,0,0,0,0}; int xdev[5]={1,0,0,1,1}; int YE1[11][64][11]; int in[11]; int end=6; int Y[64][11]; int E[11][11]; //得到7位所有源码 for(i=0;i<128;i++){ for(j=0;j<7;j++)total[i][j]=temp[j]; s=temp[0]*64+temp[1]*32+temp[2]*16+temp[3]*8+temp[4]*4+temp[5]*2+temp[6]*1;//转换为10进制 s++;//加一 ss=s; for(k=6;k>=0;k--){//转换为二进制 temp[k]=ss%2; ss=ss/2; } } for(i=0;i<128;i++){//求64位 第七位为1的码 if(total[i][6]==1){ for(j=0;j<7;j++) Y[wy][j]=total[i][j]; for(;j<11;j++) Y[wy][j]=0; wy++; } } wy=0; while(wy<64){ //把前面的五位信息位赋给保存上位模二加后的数组中,而由其初始化知后两位开始为0 for(i=0;i<5;i++)ydev[i]=Y[wy][i]; while(end!=0){

d];

//做除法 11101 需要六次移位,由end进行判断除法是否结束 if(ydev[0]==0){

ydev[0]=ydev[1];ydev[1]=ydev[2];ydev[2]=ydev[3];ydev[3]=ydev[4];ydev[4]=Y[wy][11-en end--; } //end为0时若ydev[0]=0则停止若为1则还有一次运算 if(ydev[0]==1){ for(j=0;j<5;j++) ydev[j]=(ydev[j]+xdev[j])%2; } } for(j=1;j<5;j++) Y[wy][j+6]=ydev[j]; printf(\ for(j=0;j<7;j++) printf(\ printf(\此信息对应的循环码为:\ for(j=0;j<11;j++)printf(\ printf(\ end=6;wy++; }

printf(\getchar();

/**生成一位错误图样**/ printf(\一位错误图样:\\n\for(i=0;i<11;i++){ E[i][10-i]=1; for(j=0;j<11;j++){ if(j!=(10-i)) E[i][j]=0; } }

/**加到源码中**/ for(k=0;k<11;k++){ for(i=0;i<64;i++){ for(j=0;j<11;j++){ YE1[k][i][j]=(Y[i][j]+E[k][j])%2; } } } for(k=0;k<11;k++){ for(i=0;i<64;i++){ for(j=0;j<11;j++){ printf(\ } printf(\

本文来源:https://www.bwwdw.com/article/jy9t.html

Top