本科生实验报告
实验课程 信息论与编码
学院名称 信息科学与技术学院
专业名称 通信工程
学生姓名 学生学号
指导教师 谢振东
实验地点 6C601 实验成绩
二〇 一五 年 十一 月二〇 一五 年 十一月
实验一:香农(Shannon )编码
一、实验目的
掌握通过计算机实现香农编码的方法。
二、实验要求
对于给定的信源的概率分布,按照香农编码的方法进行计算机实现。
三、实验基本原理
给定某个信源符号的概率分布,通过以下的步骤进行香农编码 1、将信源消息符号按其出现的概率大小排列
p (x 1) ≥p (x 2) ≥ ≥p (x n )
2、确定满足下列不等式的整数码长K i ;
-l o g 2p (x i ) ≤K i
i -1
3、为了编成唯一可译码,计算第i 个消息的累加概率
p i =
∑
k =1
p (x k )
4、将累加概率P i 变换成二进制数。
5、取P i 二进制数的小数点后K i 位即为该消息符号的二进制码。
四、源程序:
#include
#include #include #include #include using namespace std; int main() { int N;
cout>N; cout
double *X=new double[N]; //离散无记忆信源
int i,j;
for(i=0;i
cout>X[i]; }
for(i=0;i
{ double temp=X[i];X[i]=X[j];X[j]=temp;} int *K=new int[N]; for(i=0;i
K[i]=int(-(log(X[i])/log(2)))+1; if(K[i]==(-(log(X[i])/log(2)))+1) }
double *Pa=new double[N]; Pa[0]=0.0;
for(i=1;i
Pa[i]=Pa[i-1]+X[i-1]; string *code=new string[N]; for(i=0;i
for(j=0;j=1) { code[i]+="1"; Pa[i]=Pa[i]*2-1; }
else
code[i]+="0"; Pa[i]*= 2; } }
for(i=0;i
code[i]= code[i].substr(0,K[i]);
cout
cout
六、调试过程中出现的错误:
1、在源代码的基础上添加: #include #include #include #include #include using namespace std; 2、出现错误的语句
double *Pa =new double[N];[0]=0.0,[i]=[i-1]+X[i-1];红色部分应该改为和前面绿色的格式一样,不然编译程序时会出现红色部分为定义
3、出现错误的语句: retuen 0; retuen 书写错误,应改为return 。
七、实验内容:
x 2x 3x 4x 5x 6x 7⎤⎡X ⎤⎡x 1
1、对给定信源⎢⎥=⎢0. 20. 190. 180. 170. 150. 10. 01⎥进行二进q (X ) ⎣⎦⎣⎦制香农编码,编码结果如下所示:
x 2x 3x 4x 5x 6⎤⎡X ⎤⎡x 1
2、对给定信源⎢=⎥⎢0. 250. 250. 200. 150. 100. 05⎥进行二进制香农q (X ) ⎣⎦⎣⎦编码,编码结果如下所示:
3、自已选择一个例子进行香农编码,选择的例子为
⎡ X ⎤⎡ x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8⎤
⎢q (X )⎥=⎢0. 2 0. 15 0. 15 0. 1 0. 1 0. 1 0. 1 0. 1⎥,编码结果如下所示:
⎣⎦⎣⎦
实验二:费诺编码
一、实验目的
掌握通过计算机实现费诺编码。
二、实验要求
对于给定的信源的概率分布, 按照费诺编码的方法进行计算机实现。
三、实验基本原理
费诺编码的步骤:
1、将概率按从大到小的顺序排列;
2、按编码进制数将概率分组,使每组概率和尽可能接近或相等; 3、给每组分配一位码元;
4、将每一分组再按同样原则划分,重复2和3,直到概率不再可分为止。
四、源程序:
#include #include
using namespace std; class DATA/ {
public:DATA(){next=NULL;pre=NULL;r=NULL;PXi=1;key[0]='\0';key[1]='\0';key[2]='\0';key[3]='\0';key[4]='\0';key[5]='\0';
key[6]='\0';key[7]='\0';key[8]='\0';key[9]='\0';key[10]='\0';} char Xi; double PXi; char key[11];
DATA *next,*pre,*r; };
DATA *head=new DATA,*p=head; int k=(-1);
void encoding(DATA * pp); DATA * sort(DATA * pp);
DATA *HEAD=new DATA,*tt=HEAD,*T; void input() {
double l,sum=0; int n,i; char L;
cout>n;
for(i=0;i
cout>L; cout>l; p->Xi=L; p->PXi=l; sum=sum+p->PXi;
p->next=new DATA; p->next->pre=p;/ p->r=p->next; p=p->next; }
if(sum!=1) {
cout
T=sort(head); tt->next=T;
tt->next->pre=tt; tt=tt->next;
tt->next=new DATA;
tt->next->pre=tt;
tt=tt->next;
HEAD->next->next->pre=NULL; HEAD=HEAD->next->next;
coutnext!=NULL;p=p->next) coutXiPXi
cout
/***********************编码************************/ void encoding(DATA * pp)/ {
double y=1; k++;
DATA *head1=pp,*head2; int o=1; while(1) {
double l=0,z=0;
for(int i=1;i
if(pp->next==NULL) break; l=l+pp->PXi; pp=pp->next; }
head2=pp->pre;
for(;pp->next!=NULL;pp=pp->next) z=z+pp->PXi;
if(y>fabs(l-z))/ {
y=fabs(l-z);
pp=head1; o++; continue; }
else if(z==0&&i
coutXikey
for(DATA * u=head1;u->next!=head2->next;u=u->next) u->key[k]='0';
for(DATA * h=head2;h->next!=NULL;h=h->next) h->key[k]='1';
head2->pre->next=new DATA;
head2->pre->next->pre=head2->pre;
encoding(head1); encoding(head2); break; } k--; }
DATA * sort(DATA * pp)
{//函数递归后头变到HEAD->next->next.返回值得到最后个head2没有与tt 相连,需另设.得不到结尾为空的(next=MULL)地址 DATA *head1=pp,*head2=pp; if(pp->next==NULL) return pp;
for(;pp->next!=NULL;pp=pp->next) {
if(1-pp->PXi>=1-head2->PXi) head2=pp; }
if(head2->pre==NULL) {
head2->next->pre=NULL; head1=head1->next; } else {
head2->pre->next=head2->next;
head2->next->pre=head2->pre; }
tt->next=sort(head1); tt->next->pre=tt; tt=tt->next; return head2; }
void main() {
cout
cout
五、程序设计的流程图
六、实验内容:
x 2x 3x 4x 5x 6x 7⎤⎡X ⎤⎡x 1
1、对给定信源⎢⎥=⎢0. 20. 190. 180. 170. 150. 10. 01⎥进行二进q (X ) ⎣⎦⎣⎦
制费诺编码,编码结果如下所示:
x 2x 3x 4x 5x 6⎤⎡X ⎤⎡x 1
2、对给定信源⎢进行二进制费诺=⎥⎢⎥
⎣q (X ) ⎦⎣0. 250. 250. 200. 150. 100. 05⎦编码,编码结果如下所示:
3、自已选择一个例子进行费诺编码选择的例子为
⎡ X ⎤⎡ x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10⎤
⎢q (X )⎥=⎢0. 16 0. 14 0. 13 0. 12 0. 1 0. 09 0. 08 0. 07 0. 06 0. 05⎥,编码⎣⎦⎣⎦结果如下所示:
实验三 霍夫曼编码
一、实验目的
掌握通过计算机实现霍夫曼编码
二、实验要求
对于给定的信源的概率分布,按照霍夫曼编码的方法进行计算机实现。
三、实验基本原理
霍夫曼编码的步骤:
1、 把信源符号按概率大小顺序排列, 并设法按逆次序分配码字的长度。 2、 在分配码字长度时,首先将出现概率 最小的两个符号的概率相加合成一个概率
3、把这个合成概率看成是一个新组合符号地概率,重复上述做法直到最后只剩下两个符号概率为止。
4、完成以上概率顺序排列后,再反过来逐步向前进行编码,每一次有二个分支各赋予一个二进制码,可以对概率大的赋为0,概率小的赋为1。
四、源程序:
#include #include #include #include #include using namespace std;
#define MAXVALUE 10000 #define MAXLEAF 30 #define MAXNODE MAXLEAF*2-1 #define MAXBIT 50 typedef struct node {
char letter; int weight; int parent; int lchild;
int rchild; }HNodeType; typedef struct {
char letter;
int bit[MAXBIT]; int start; }HCodeType; typedef struct {
char s; int num; }lable;
void HuffmanTree(HNodeType HuffNode[],int n,lable a[]) {
int i,j,m1,m2,x1,x2,temp1; char temp2;
for (i=0;i
HuffNode[i].letter=0; HuffNode[i].weight=0; HuffNode[i].parent=-1; HuffNode[i].lchild=-1; HuffNode[i].rchild=-1; }
for (i=0;i
for (j=i+1;j
if (a[j].num>a[i].num) {
temp1=a[i].num; a[i].num=a[j].num; a[j].num=temp1; temp2=a[i].s; a[i].s=a[j].s; a[j].s=temp2; }
for (i=0;i
HuffNode[i].weight=a[i].num; HuffNode[i].letter=a[i].s; }
for (i=0;i
m1=m2=MAXVALUE; x1=x2=0;
for (j=0;j
{
if (HuffNode[j].parent==-1&&HuffNode[j].weight
m2=m1; x2=x1;
m1=HuffNode[j].weight; x1=j; }
else if (HuffNode[j].parent==-1&&HuffNode[j].weight
m2=HuffNode[j].weight; x2=j; } }
HuffNode[x1].parent=n+i; HuffNode[x2].parent=n+i;
HuffNode[n+i].weight=HuffNode[x1].weight+HuffNode[x2].weight; HuffNode[n+i].lchild=x1; HuffNode[n+i].rchild=x2; } }
void HuffmanCode(int n,lable a[]) {
HNodeType HuffNode[MAXNODE]; HCodeType HuffCode[MAXLEAF],cd; int i,j,c,p;
HuffmanTree(HuffNode,n,a); for (i=0;i
cd.start=n-1; c=i;
p=HuffNode[c].parent; while (p!=-1) {
if (HuffNode[p].lchild==c) cd.bit[cd.start]=0; else cd.bit[cd.start]=1; cd.start--; c=p;
p=HuffNode[c].parent; }
for (j=cd.start+1;j
for (i=0;i
{
HuffCode[i].letter=HuffNode[i].letter;
printf(" %c ",HuffCode[i].letter);
for (j=HuffCode[i].start+1;j
int main() {
lable data[30]; char s[100],*p; int i,count=0; for (;;) {
cout
if (!strcmp(s,"end")) exit(0);
for (i=0;i
data[i].s=0; data[i].num=0; } p=s;
while (*p) {
for (i=0;i
if (data[i].s==0) {
data[i].s=*p; data[i].num++; count++; break; }
else if (data[i].s==*p) {
data[i].num++; break; } } p++; }
/"
printf("\n");
printf(" different letters:%d\n",count); for (i=0;i
printf(" %c ",data[i].s); printf("weight:%d\n",data[i].num); }
HuffmanCode(count,data); count=0; }
return 0; }
五、程序设计的流程图
六、实验内容:
x 2x 3x 4x 5x 6x 7⎤⎡X ⎤⎡x 1
1、对给定信源⎢=⎥⎢0. 20. 190. 180. 170. 150. 10. 01⎥进行二进q (X ) ⎣⎦⎣⎦制霍夫曼编码,编码结果如下所示:
x 2x 3x 4x 5x 6⎤⎡X ⎤⎡x 1
2、对给定信源⎢=⎥⎢0. 250. 250. 200. 150. 100. 05⎥进行二进制霍夫曼q (X ) ⎣⎦⎣⎦编码,编码结果如下所示:
3、自已选择一个例子进行霍夫曼编码,例子为
⎡ X ⎤⎡ x 1 x 2 x 3 x 4 x 5 ⎤
⎢q (X )⎥=⎢0. 4 0. 2 0. 2 0. 1 0. 1⎥,编码结果如下所示:
⎣⎦⎣⎦
实验四:信道容量的迭代算法
一、实验目的
1、进一步熟悉信道容量的迭代算法。
2、通过该实验,掌握通过计算机实验信道容量的计算方法,学习如何将复杂的公式转化为程序。
3、掌握C 或C++语言数值计算的设计和调试技术。
二、实验要求
已知信源符号个数,信道符号个数,信道转移概率矩阵,用C 语言或C++设计程序,实现最佳信源分布时,求出信道容量C 。
三、实验基本原理
一般离散信道容量的计算步骤如下:
(1) 由∑p (y j /x i ) βj =∑p (y j /x i ) log 2p (y j /x i ), 求βj ;
j =1
j =1
m
m
⎛m βj (2) 由C =log 2 ∑2
⎝j =1(3) 由p (y j ) =2
βj -C
⎫
⎪, 求C ; ⎪⎭
, 求p (y j ) ;
(4) 由p (y j ) =∑p (x i ) p (y j /x i ), 求p (x i ) 。
i =1
n
需要指出的是,在第(2)步信道容量C 被求出后,计算并没有结束。必须解出相应的p (x i ) ,并确认所以的
p (x i ) 都大于等于零时(i=1,2,…n ),
所求的C 才存在。因为我们在对I (X , Y ) 求偏导时,仅限制
∑p (x ) =1,
i
i =1
n
并没有限制p (x i ) ≥0,所以求出的p (x i ) 可能为负值,此时的C 就不存在,必须对p (x i ) 进行调整,再从新求解C 。一般要通过迭代算法来实现。
用迭代算法计算信道容量C 的步骤如下:
记p (y j /x i ) =p ij , p (x i ) =p i , p (x i /y j ) =ϕji
算法:
i =1, 2, , r ; j =1, 2, , s
① 初始化信源分布p
(0)
=(p 1, p 2, p i , p r ) (一般初始化为均
匀分布)置迭代计算器k =0,设置信道容量相对误差门限为δ,δ>0。
②
ϕ(ji k ) =
p ij p i (k )
p ij p i (k )
i
⎡⎤(k ) exp ⎢∑p ij ln ϕji ⎥⎣j ⎦(k +1)
p =③ i ⎧⎫⎤⎪⎡⎪(k )
⎨exp ⎢∑p ij ln ϕji ⎥⎬∑i ⎪⎦⎪⎩⎣j ⎭⎧⎤⎫⎪⎡(k +1) (k ) ⎪=ln ∑⎨exp ⎢∑p ij ln ϕji ⎥⎬ ④ C
i ⎪⎦⎪⎩⎣j ⎭
⑤ 如果∆C
(k +1)
C (k +1) -C (k ) =≤δ, 转向⑦; (k +1)
C
⑥ 置迭代序号k+1→k,转向②; ⑦ 输出p (x i ) ⑧ 结束。
可以证明,平均互信息I [p (x i ), p (x i y j )]具有收敛性,即
(k +1)
和C (k +1) 的结果;
lim C (k +1) -C (k ) =0,所以迭代算法最终能求出任意精度的解。算法的收敛速
k →∞
度与信源初始概率分布的选择有很大的关系,初始分布选择越接近最佳分布,则收敛的速度越快,若初始分布选的正好是最佳分布,则一步就可以求得信道容量。
四、源程序:
#include #include #include void main() {
int num_in,num_out; int i,j;
cout>num_in;
cout
cin>>num_out;
cout
P_in=new float[num_in]; float *P_out;
P_out=new float[num_out]; for (i=0;i
P_in[i]=1.0/(float)num_in; cout
cout
cout
p_ji[i]=new float[num_out]; }
for (i=0;i
for (j=0;j
cin>>p_ji[i][j]; } }
for (i=0;i
float validate=0.0;
for (j=0;j
validate+=p_ji[i][j]; }
if (validate>1.000001||validate
cout
float **p_ij;
p_ij=new float *[num_in]; for (i=0;i
p_ij[i]=new float[num_out]; }
float C_Pre,C;
C=10.0;
double Pe=0.000001;
int r=0;
float *p_up;
p_up=new float[num_in];
float p_down;
do
{
r++;
for (j=0;j
{
P_out[j]=0.0;
for (i=0;i
{
P_out[j]+=p_ji[i][j]*P_in[i]; //
}
if (P_out[j]>=0.000001)
{
for (i=0;i
{
p_ij[i][j]=P_in[i]*p_ji[i][j]/P_out[j];
}
}
else
{
for (i=0;i
{
p_ij[i][j]=0.0;
}
}
}
p_down=0.0;
for (i=0;i
{
p_up[i]=0.0;
for (j=0;j
{
if (p_ij[i][j]>=0.000001)
{
p_up[i]+=p_ji[i][j]*log(p_ij[i][j])/log(2.0);
}
}
p_up[i]=pow(2.0,p_up[i]);
p_down+=p_up[i];
}
for (i=0;i
{
P_in[i]=p_up[i]/p_down;
}
C_Pre=C;
C=log(p_down)/log(2.0);
cout
}
while (fabs(C-C_Pre)/C>Pe);
cout
}
五、程序设计的流程图
六、实验内容:
⎡0. 980. 02⎤1、信道转移矩阵为p =⎢⎥,求信道容量及最佳的概率分布,运行0. 050. 95⎣⎦
结果如下所示:
⎡0. 790. 160. 05⎤ 2、信道转移矩阵为p =⎢,求信道容量及最佳的概率分布,⎥⎣0. 050. 150. 8⎦
运行结果如下所示:
⎡1⎢3、信道转移矩阵为p =⎢31⎢⎣6
行结果如下所示: 161313161⎤6⎥,求信道容量及最佳的概率分布,运1⎥⎥3⎦
4、自己选择一个例子求信道容量及最佳的概率分布,选择的例子为:
⎡0.3 0.7⎤,运行结果如下所示:
P =⎢⎥⎣0.5 0.5 ⎦
实验五:循环码编码
一、实验目的:
掌握通过计算机实现系统循环码编码
二、实验要求:
对于给定的消息序列, 按照循环码编码的方法进行计算机实现.
三、实验基本原理
循环码的编码步骤:
循环码的系统码构造的步骤为:
1)消息多项式乘x
2) x m (x )/g(x )=q (x ) +r (x )/g(x )
其中:q (x ) 是商,r (x ) 是余数
3)C(x )= x m (x )+r (x ) n-k n-k n-k
四、源程序:
#include "stdio.h"
#include
#define N 10
void X(int g[N],int c[N],int r,int n)
{int degg,degc,i,k,t,j,e,u,sum=0;
int d[N][2*N]={0},C[N],R[N],a[N][2*N],q[N];
degg=r;
for(i=0;i
{if(c[i]!=0)
{degc=n-i-1;
break; }
}
for(i=0;i
{q[i]=g[i];
R[i]=c[i];}
k=degc-degg;
e=k;
for(j=0;j
{for(i=0;i
{q[i]=g[i];
}
for(i=n-1;i>=e;i--)
{t=q[i];q[i]=q[i-e];q[i-e]=t;
}
for(i=0;i
{c[i]=(c[i]+q[n-1-i])%2;
}
for(i=0;i
{if(c[i]!=0)
{degc=n-i-1;
break; }
}
e=degc-degg;
u=j;
if(e
}
for(i=0;i
{C[i]=(R[i]+c[i])%2;
}
printf("系统编码的结果为:\n");
printf("\t");
for(j=0;j
printf("%d ",C[j]);
printf("\n");
}
void UX(int g[N],int c[N],int r,int n)
{int a[N][2*N],x[N];
int i,j,k,sum=0;
for(j=0;j
{for(i=0;i
a[j][i]=0;
for(i=0;i
a[j][i+j]=c[j]*g[i];
for(k=i+j;k
a[j][k]=0;
}
for(j=0;j
{sum=0;
for(i=0;i
sum=(a[i][j]+sum)%2;
x[j]=sum;
}
printf("非系统编码的结果:\n");
printf("\t");
for(j=0;j
printf("%d ",x[j]);
printf("\n");
}
void main()
{int i,n,m,t,r;
int g[N]={0},c[N]={0};
printf("****循环码编码方法(码长n
printf("\t输入码长n:");
scanf("%d",&m);
n=m;
switch(n)
{case 1 :printf("输入校验位r
scanf("%d",&r);
switch(r)
{case 0:g[0]=1;break;
} break;
case 2 :printf("输入校验位r
scanf("%d",&r);
switch(r)
{case 0:g[0]=1;break;
case 1:g[0]=1;g[1]=1;break;
} break;
case 3 :printf("输入校验位r
scanf("%d",&r);
switch(r)
{case 0:g[0]=1;break;
case 1:g[0]=1;g[1]=1;break;
case 2:g[0]=1;g[1]=1;g[2]=1;break;
} break;
case 4 :printf("输入校验位r
scanf("%d",&r);
switch(r)
{case 0:g[0]=1;break;
case 1:g[0]=1;g[1]=1;break;
case 2:g[0]=1;g[1]=0;g[2]=1;break;
case 3:g[0]=1;g[1]=1;g[2]=1;g[3]=1;break;
} break;
case 5 :printf("输入校验位r=0,1,4:");
scanf("%d",&r);
switch(r)
{case 0:g[0]=1;break;
case 1:g[0]=1;g[1]=1;break;
case 4:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;break;
} break;
case 6 :printf("输入校验位r
scanf("%d",&r);
switch(r)
{case 0:g[0]=1;break;
case 1:g[0]=1;g[1]=1;break;
case 2:g[0]=1;g[1]=1;g[2]=1;break;
case 3:g[0]=1;g[1]=0;g[2]=0;g[3]=1;break;
case 4:g[0]=1;g[1]=0;g[2]=1;g[3]=0;g[4]=1;break;
case 5:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;break;
} break;
case 7 :printf("输入校验位r=0,1,3,4,6:");
scanf("%d",&r);
switch(r)
{case 0 :g[0]=1;break;
case 1 :g[0]=1;g[1]=1;break;
case 3 :g[0]=1;g[1]=1;g[2]=0;g[3]=1;break;
case 4 :g[0]=1;g[1]=1;g[2]=1;g[3]=0;g[4]=1;break;
case 6 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1; g[6]=1;break; } break;
case 8 :printf("输入校验位r
scanf("%d",&r);
switch(r)
{case 0 :g[0]=1;break;
case 1 :g[0]=1;g[1]=1;break;
case 2 :g[0]=1;g[1]=0;g[2]=1;break;
case 3 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;break;
case 4 :g[0]=1;g[1]=0;g[2]=0;g[3]=0;g[4]=1;break;
case 5 :g[0]=1;g[1]=1;g[2]=0;g[3]=0;g[4]=1;g[5]=1;break;
case 6 :g[0]=1;g[1]=0;g[2]=1;g[3]=0;g[4]=1;g[5]=0; g[6]=1;break; case7:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;g[6]=1;
g[7]=1;break;
} break;
case 9 :printf("输入校验位r
scanf("%d",&r);
switch(r)
{case 0 :g[0]=1;break;
case 1 :g[0]=1;g[1]=1;break;
case 2 :g[0]=1;g[1]=0;g[2]=1;break;
case 3 :g[0]=1;g[1]=0;g[2]=0;g[3]=1;break;
case 4 :g[0]=1;g[1]=0;g[2]=1;g[3]=0;g[4]=1;break;
case 5 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;break;
case 6 :g[0]=1;g[1]=1;g[2]=0;g[3]=1;g[4]=0;g[5]=1; g[6]=1;break;
case7:g[0]=1;g[1]=0;g[2]=1;g[3]=1;g[4]=1;g[5]=1;g[6]=0;g[7]=1;break; case8:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;g[6]=1;g[7]=1; g[8]=1;break;
} break;
case 10 :printf("输入校验位r=0,1,2,4,5,6,8,9:");
scanf("%d",&r);
switch(r)
{case 0 :g[0]=1;break;
case 1 :g[0]=1;g[1]=1;break;
case 2 :g[0]=1;g[1]=0;g[2]=1;break;
case 4 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;break;
case 5 :g[0]=1;g[1]=0;g[2]=0;g[3]=0;g[4]=0;g[5]=1;break;
case 6 :g[0]=1;g[1]=1;g[2]=0;g[3]=0;g[4]=0; g[5]=1;g[6]=1;break; case8:g[0]=1;g[1]=0;g[2]=1;g[3]=0;g[4]=1;g[5]=0;g[6]=1;g[7]=0; g[8]=1;break;
case9:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;g[6]=1;g[7]=1
;g[8]=1;g[9]=1;break; } break;
}
printf("生成多项式系数矩阵为(幂次从低到高):\n");
for(i=0;i
printf("%d ",g[i]);
printf("\n");
printf("输入信源信息向量c(%d位) :\n",n-r);
for(i=0;i
scanf("%d",&c[i]);
while(1)
{ printf("\t*****选择编码方式及命令*****\n");
printf("\t 1:系统编码\n");
printf("\t 2:非系统编码\n");
printf("\t 3:退出程序!!!\n");
printf("\t***************************\n");
scanf("%d",&t);
switch(t)
{case 1 :X(g,c,r,n);break;
case 2 :UX(g,c,r,n);break;
case 3 :printf("退出程序〉〉〉");exit(0);break; }
printf("\n"); } }
五、程序设计的流程图
六、实验内容:
1、GF(2)中(7,4)循环码,生成多项式g(x)=x3+x+1,对信息组(1101)进行编码,运行结果如下所示:
2、自己选择一个例子进行编码,例子为:GF(2)中(7,3)循环码,生成多项式g (x )=x 4+x 2+x +1,对信息组(100)进行编码,运行结果如下所示:
本科生实验报告
实验课程 信息论与编码
学院名称 信息科学与技术学院
专业名称 通信工程
学生姓名 学生学号
指导教师 谢振东
实验地点 6C601 实验成绩
二〇 一五 年 十一 月二〇 一五 年 十一月
实验一:香农(Shannon )编码
一、实验目的
掌握通过计算机实现香农编码的方法。
二、实验要求
对于给定的信源的概率分布,按照香农编码的方法进行计算机实现。
三、实验基本原理
给定某个信源符号的概率分布,通过以下的步骤进行香农编码 1、将信源消息符号按其出现的概率大小排列
p (x 1) ≥p (x 2) ≥ ≥p (x n )
2、确定满足下列不等式的整数码长K i ;
-l o g 2p (x i ) ≤K i
i -1
3、为了编成唯一可译码,计算第i 个消息的累加概率
p i =
∑
k =1
p (x k )
4、将累加概率P i 变换成二进制数。
5、取P i 二进制数的小数点后K i 位即为该消息符号的二进制码。
四、源程序:
#include
#include #include #include #include using namespace std; int main() { int N;
cout>N; cout
double *X=new double[N]; //离散无记忆信源
int i,j;
for(i=0;i
cout>X[i]; }
for(i=0;i
{ double temp=X[i];X[i]=X[j];X[j]=temp;} int *K=new int[N]; for(i=0;i
K[i]=int(-(log(X[i])/log(2)))+1; if(K[i]==(-(log(X[i])/log(2)))+1) }
double *Pa=new double[N]; Pa[0]=0.0;
for(i=1;i
Pa[i]=Pa[i-1]+X[i-1]; string *code=new string[N]; for(i=0;i
for(j=0;j=1) { code[i]+="1"; Pa[i]=Pa[i]*2-1; }
else
code[i]+="0"; Pa[i]*= 2; } }
for(i=0;i
code[i]= code[i].substr(0,K[i]);
cout
cout
六、调试过程中出现的错误:
1、在源代码的基础上添加: #include #include #include #include #include using namespace std; 2、出现错误的语句
double *Pa =new double[N];[0]=0.0,[i]=[i-1]+X[i-1];红色部分应该改为和前面绿色的格式一样,不然编译程序时会出现红色部分为定义
3、出现错误的语句: retuen 0; retuen 书写错误,应改为return 。
七、实验内容:
x 2x 3x 4x 5x 6x 7⎤⎡X ⎤⎡x 1
1、对给定信源⎢⎥=⎢0. 20. 190. 180. 170. 150. 10. 01⎥进行二进q (X ) ⎣⎦⎣⎦制香农编码,编码结果如下所示:
x 2x 3x 4x 5x 6⎤⎡X ⎤⎡x 1
2、对给定信源⎢=⎥⎢0. 250. 250. 200. 150. 100. 05⎥进行二进制香农q (X ) ⎣⎦⎣⎦编码,编码结果如下所示:
3、自已选择一个例子进行香农编码,选择的例子为
⎡ X ⎤⎡ x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8⎤
⎢q (X )⎥=⎢0. 2 0. 15 0. 15 0. 1 0. 1 0. 1 0. 1 0. 1⎥,编码结果如下所示:
⎣⎦⎣⎦
实验二:费诺编码
一、实验目的
掌握通过计算机实现费诺编码。
二、实验要求
对于给定的信源的概率分布, 按照费诺编码的方法进行计算机实现。
三、实验基本原理
费诺编码的步骤:
1、将概率按从大到小的顺序排列;
2、按编码进制数将概率分组,使每组概率和尽可能接近或相等; 3、给每组分配一位码元;
4、将每一分组再按同样原则划分,重复2和3,直到概率不再可分为止。
四、源程序:
#include #include
using namespace std; class DATA/ {
public:DATA(){next=NULL;pre=NULL;r=NULL;PXi=1;key[0]='\0';key[1]='\0';key[2]='\0';key[3]='\0';key[4]='\0';key[5]='\0';
key[6]='\0';key[7]='\0';key[8]='\0';key[9]='\0';key[10]='\0';} char Xi; double PXi; char key[11];
DATA *next,*pre,*r; };
DATA *head=new DATA,*p=head; int k=(-1);
void encoding(DATA * pp); DATA * sort(DATA * pp);
DATA *HEAD=new DATA,*tt=HEAD,*T; void input() {
double l,sum=0; int n,i; char L;
cout>n;
for(i=0;i
cout>L; cout>l; p->Xi=L; p->PXi=l; sum=sum+p->PXi;
p->next=new DATA; p->next->pre=p;/ p->r=p->next; p=p->next; }
if(sum!=1) {
cout
T=sort(head); tt->next=T;
tt->next->pre=tt; tt=tt->next;
tt->next=new DATA;
tt->next->pre=tt;
tt=tt->next;
HEAD->next->next->pre=NULL; HEAD=HEAD->next->next;
coutnext!=NULL;p=p->next) coutXiPXi
cout
/***********************编码************************/ void encoding(DATA * pp)/ {
double y=1; k++;
DATA *head1=pp,*head2; int o=1; while(1) {
double l=0,z=0;
for(int i=1;i
if(pp->next==NULL) break; l=l+pp->PXi; pp=pp->next; }
head2=pp->pre;
for(;pp->next!=NULL;pp=pp->next) z=z+pp->PXi;
if(y>fabs(l-z))/ {
y=fabs(l-z);
pp=head1; o++; continue; }
else if(z==0&&i
coutXikey
for(DATA * u=head1;u->next!=head2->next;u=u->next) u->key[k]='0';
for(DATA * h=head2;h->next!=NULL;h=h->next) h->key[k]='1';
head2->pre->next=new DATA;
head2->pre->next->pre=head2->pre;
encoding(head1); encoding(head2); break; } k--; }
DATA * sort(DATA * pp)
{//函数递归后头变到HEAD->next->next.返回值得到最后个head2没有与tt 相连,需另设.得不到结尾为空的(next=MULL)地址 DATA *head1=pp,*head2=pp; if(pp->next==NULL) return pp;
for(;pp->next!=NULL;pp=pp->next) {
if(1-pp->PXi>=1-head2->PXi) head2=pp; }
if(head2->pre==NULL) {
head2->next->pre=NULL; head1=head1->next; } else {
head2->pre->next=head2->next;
head2->next->pre=head2->pre; }
tt->next=sort(head1); tt->next->pre=tt; tt=tt->next; return head2; }
void main() {
cout
cout
五、程序设计的流程图
六、实验内容:
x 2x 3x 4x 5x 6x 7⎤⎡X ⎤⎡x 1
1、对给定信源⎢⎥=⎢0. 20. 190. 180. 170. 150. 10. 01⎥进行二进q (X ) ⎣⎦⎣⎦
制费诺编码,编码结果如下所示:
x 2x 3x 4x 5x 6⎤⎡X ⎤⎡x 1
2、对给定信源⎢进行二进制费诺=⎥⎢⎥
⎣q (X ) ⎦⎣0. 250. 250. 200. 150. 100. 05⎦编码,编码结果如下所示:
3、自已选择一个例子进行费诺编码选择的例子为
⎡ X ⎤⎡ x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x 10⎤
⎢q (X )⎥=⎢0. 16 0. 14 0. 13 0. 12 0. 1 0. 09 0. 08 0. 07 0. 06 0. 05⎥,编码⎣⎦⎣⎦结果如下所示:
实验三 霍夫曼编码
一、实验目的
掌握通过计算机实现霍夫曼编码
二、实验要求
对于给定的信源的概率分布,按照霍夫曼编码的方法进行计算机实现。
三、实验基本原理
霍夫曼编码的步骤:
1、 把信源符号按概率大小顺序排列, 并设法按逆次序分配码字的长度。 2、 在分配码字长度时,首先将出现概率 最小的两个符号的概率相加合成一个概率
3、把这个合成概率看成是一个新组合符号地概率,重复上述做法直到最后只剩下两个符号概率为止。
4、完成以上概率顺序排列后,再反过来逐步向前进行编码,每一次有二个分支各赋予一个二进制码,可以对概率大的赋为0,概率小的赋为1。
四、源程序:
#include #include #include #include #include using namespace std;
#define MAXVALUE 10000 #define MAXLEAF 30 #define MAXNODE MAXLEAF*2-1 #define MAXBIT 50 typedef struct node {
char letter; int weight; int parent; int lchild;
int rchild; }HNodeType; typedef struct {
char letter;
int bit[MAXBIT]; int start; }HCodeType; typedef struct {
char s; int num; }lable;
void HuffmanTree(HNodeType HuffNode[],int n,lable a[]) {
int i,j,m1,m2,x1,x2,temp1; char temp2;
for (i=0;i
HuffNode[i].letter=0; HuffNode[i].weight=0; HuffNode[i].parent=-1; HuffNode[i].lchild=-1; HuffNode[i].rchild=-1; }
for (i=0;i
for (j=i+1;j
if (a[j].num>a[i].num) {
temp1=a[i].num; a[i].num=a[j].num; a[j].num=temp1; temp2=a[i].s; a[i].s=a[j].s; a[j].s=temp2; }
for (i=0;i
HuffNode[i].weight=a[i].num; HuffNode[i].letter=a[i].s; }
for (i=0;i
m1=m2=MAXVALUE; x1=x2=0;
for (j=0;j
{
if (HuffNode[j].parent==-1&&HuffNode[j].weight
m2=m1; x2=x1;
m1=HuffNode[j].weight; x1=j; }
else if (HuffNode[j].parent==-1&&HuffNode[j].weight
m2=HuffNode[j].weight; x2=j; } }
HuffNode[x1].parent=n+i; HuffNode[x2].parent=n+i;
HuffNode[n+i].weight=HuffNode[x1].weight+HuffNode[x2].weight; HuffNode[n+i].lchild=x1; HuffNode[n+i].rchild=x2; } }
void HuffmanCode(int n,lable a[]) {
HNodeType HuffNode[MAXNODE]; HCodeType HuffCode[MAXLEAF],cd; int i,j,c,p;
HuffmanTree(HuffNode,n,a); for (i=0;i
cd.start=n-1; c=i;
p=HuffNode[c].parent; while (p!=-1) {
if (HuffNode[p].lchild==c) cd.bit[cd.start]=0; else cd.bit[cd.start]=1; cd.start--; c=p;
p=HuffNode[c].parent; }
for (j=cd.start+1;j
for (i=0;i
{
HuffCode[i].letter=HuffNode[i].letter;
printf(" %c ",HuffCode[i].letter);
for (j=HuffCode[i].start+1;j
int main() {
lable data[30]; char s[100],*p; int i,count=0; for (;;) {
cout
if (!strcmp(s,"end")) exit(0);
for (i=0;i
data[i].s=0; data[i].num=0; } p=s;
while (*p) {
for (i=0;i
if (data[i].s==0) {
data[i].s=*p; data[i].num++; count++; break; }
else if (data[i].s==*p) {
data[i].num++; break; } } p++; }
/"
printf("\n");
printf(" different letters:%d\n",count); for (i=0;i
printf(" %c ",data[i].s); printf("weight:%d\n",data[i].num); }
HuffmanCode(count,data); count=0; }
return 0; }
五、程序设计的流程图
六、实验内容:
x 2x 3x 4x 5x 6x 7⎤⎡X ⎤⎡x 1
1、对给定信源⎢=⎥⎢0. 20. 190. 180. 170. 150. 10. 01⎥进行二进q (X ) ⎣⎦⎣⎦制霍夫曼编码,编码结果如下所示:
x 2x 3x 4x 5x 6⎤⎡X ⎤⎡x 1
2、对给定信源⎢=⎥⎢0. 250. 250. 200. 150. 100. 05⎥进行二进制霍夫曼q (X ) ⎣⎦⎣⎦编码,编码结果如下所示:
3、自已选择一个例子进行霍夫曼编码,例子为
⎡ X ⎤⎡ x 1 x 2 x 3 x 4 x 5 ⎤
⎢q (X )⎥=⎢0. 4 0. 2 0. 2 0. 1 0. 1⎥,编码结果如下所示:
⎣⎦⎣⎦
实验四:信道容量的迭代算法
一、实验目的
1、进一步熟悉信道容量的迭代算法。
2、通过该实验,掌握通过计算机实验信道容量的计算方法,学习如何将复杂的公式转化为程序。
3、掌握C 或C++语言数值计算的设计和调试技术。
二、实验要求
已知信源符号个数,信道符号个数,信道转移概率矩阵,用C 语言或C++设计程序,实现最佳信源分布时,求出信道容量C 。
三、实验基本原理
一般离散信道容量的计算步骤如下:
(1) 由∑p (y j /x i ) βj =∑p (y j /x i ) log 2p (y j /x i ), 求βj ;
j =1
j =1
m
m
⎛m βj (2) 由C =log 2 ∑2
⎝j =1(3) 由p (y j ) =2
βj -C
⎫
⎪, 求C ; ⎪⎭
, 求p (y j ) ;
(4) 由p (y j ) =∑p (x i ) p (y j /x i ), 求p (x i ) 。
i =1
n
需要指出的是,在第(2)步信道容量C 被求出后,计算并没有结束。必须解出相应的p (x i ) ,并确认所以的
p (x i ) 都大于等于零时(i=1,2,…n ),
所求的C 才存在。因为我们在对I (X , Y ) 求偏导时,仅限制
∑p (x ) =1,
i
i =1
n
并没有限制p (x i ) ≥0,所以求出的p (x i ) 可能为负值,此时的C 就不存在,必须对p (x i ) 进行调整,再从新求解C 。一般要通过迭代算法来实现。
用迭代算法计算信道容量C 的步骤如下:
记p (y j /x i ) =p ij , p (x i ) =p i , p (x i /y j ) =ϕji
算法:
i =1, 2, , r ; j =1, 2, , s
① 初始化信源分布p
(0)
=(p 1, p 2, p i , p r ) (一般初始化为均
匀分布)置迭代计算器k =0,设置信道容量相对误差门限为δ,δ>0。
②
ϕ(ji k ) =
p ij p i (k )
p ij p i (k )
i
⎡⎤(k ) exp ⎢∑p ij ln ϕji ⎥⎣j ⎦(k +1)
p =③ i ⎧⎫⎤⎪⎡⎪(k )
⎨exp ⎢∑p ij ln ϕji ⎥⎬∑i ⎪⎦⎪⎩⎣j ⎭⎧⎤⎫⎪⎡(k +1) (k ) ⎪=ln ∑⎨exp ⎢∑p ij ln ϕji ⎥⎬ ④ C
i ⎪⎦⎪⎩⎣j ⎭
⑤ 如果∆C
(k +1)
C (k +1) -C (k ) =≤δ, 转向⑦; (k +1)
C
⑥ 置迭代序号k+1→k,转向②; ⑦ 输出p (x i ) ⑧ 结束。
可以证明,平均互信息I [p (x i ), p (x i y j )]具有收敛性,即
(k +1)
和C (k +1) 的结果;
lim C (k +1) -C (k ) =0,所以迭代算法最终能求出任意精度的解。算法的收敛速
k →∞
度与信源初始概率分布的选择有很大的关系,初始分布选择越接近最佳分布,则收敛的速度越快,若初始分布选的正好是最佳分布,则一步就可以求得信道容量。
四、源程序:
#include #include #include void main() {
int num_in,num_out; int i,j;
cout>num_in;
cout
cin>>num_out;
cout
P_in=new float[num_in]; float *P_out;
P_out=new float[num_out]; for (i=0;i
P_in[i]=1.0/(float)num_in; cout
cout
cout
p_ji[i]=new float[num_out]; }
for (i=0;i
for (j=0;j
cin>>p_ji[i][j]; } }
for (i=0;i
float validate=0.0;
for (j=0;j
validate+=p_ji[i][j]; }
if (validate>1.000001||validate
cout
float **p_ij;
p_ij=new float *[num_in]; for (i=0;i
p_ij[i]=new float[num_out]; }
float C_Pre,C;
C=10.0;
double Pe=0.000001;
int r=0;
float *p_up;
p_up=new float[num_in];
float p_down;
do
{
r++;
for (j=0;j
{
P_out[j]=0.0;
for (i=0;i
{
P_out[j]+=p_ji[i][j]*P_in[i]; //
}
if (P_out[j]>=0.000001)
{
for (i=0;i
{
p_ij[i][j]=P_in[i]*p_ji[i][j]/P_out[j];
}
}
else
{
for (i=0;i
{
p_ij[i][j]=0.0;
}
}
}
p_down=0.0;
for (i=0;i
{
p_up[i]=0.0;
for (j=0;j
{
if (p_ij[i][j]>=0.000001)
{
p_up[i]+=p_ji[i][j]*log(p_ij[i][j])/log(2.0);
}
}
p_up[i]=pow(2.0,p_up[i]);
p_down+=p_up[i];
}
for (i=0;i
{
P_in[i]=p_up[i]/p_down;
}
C_Pre=C;
C=log(p_down)/log(2.0);
cout
}
while (fabs(C-C_Pre)/C>Pe);
cout
}
五、程序设计的流程图
六、实验内容:
⎡0. 980. 02⎤1、信道转移矩阵为p =⎢⎥,求信道容量及最佳的概率分布,运行0. 050. 95⎣⎦
结果如下所示:
⎡0. 790. 160. 05⎤ 2、信道转移矩阵为p =⎢,求信道容量及最佳的概率分布,⎥⎣0. 050. 150. 8⎦
运行结果如下所示:
⎡1⎢3、信道转移矩阵为p =⎢31⎢⎣6
行结果如下所示: 161313161⎤6⎥,求信道容量及最佳的概率分布,运1⎥⎥3⎦
4、自己选择一个例子求信道容量及最佳的概率分布,选择的例子为:
⎡0.3 0.7⎤,运行结果如下所示:
P =⎢⎥⎣0.5 0.5 ⎦
实验五:循环码编码
一、实验目的:
掌握通过计算机实现系统循环码编码
二、实验要求:
对于给定的消息序列, 按照循环码编码的方法进行计算机实现.
三、实验基本原理
循环码的编码步骤:
循环码的系统码构造的步骤为:
1)消息多项式乘x
2) x m (x )/g(x )=q (x ) +r (x )/g(x )
其中:q (x ) 是商,r (x ) 是余数
3)C(x )= x m (x )+r (x ) n-k n-k n-k
四、源程序:
#include "stdio.h"
#include
#define N 10
void X(int g[N],int c[N],int r,int n)
{int degg,degc,i,k,t,j,e,u,sum=0;
int d[N][2*N]={0},C[N],R[N],a[N][2*N],q[N];
degg=r;
for(i=0;i
{if(c[i]!=0)
{degc=n-i-1;
break; }
}
for(i=0;i
{q[i]=g[i];
R[i]=c[i];}
k=degc-degg;
e=k;
for(j=0;j
{for(i=0;i
{q[i]=g[i];
}
for(i=n-1;i>=e;i--)
{t=q[i];q[i]=q[i-e];q[i-e]=t;
}
for(i=0;i
{c[i]=(c[i]+q[n-1-i])%2;
}
for(i=0;i
{if(c[i]!=0)
{degc=n-i-1;
break; }
}
e=degc-degg;
u=j;
if(e
}
for(i=0;i
{C[i]=(R[i]+c[i])%2;
}
printf("系统编码的结果为:\n");
printf("\t");
for(j=0;j
printf("%d ",C[j]);
printf("\n");
}
void UX(int g[N],int c[N],int r,int n)
{int a[N][2*N],x[N];
int i,j,k,sum=0;
for(j=0;j
{for(i=0;i
a[j][i]=0;
for(i=0;i
a[j][i+j]=c[j]*g[i];
for(k=i+j;k
a[j][k]=0;
}
for(j=0;j
{sum=0;
for(i=0;i
sum=(a[i][j]+sum)%2;
x[j]=sum;
}
printf("非系统编码的结果:\n");
printf("\t");
for(j=0;j
printf("%d ",x[j]);
printf("\n");
}
void main()
{int i,n,m,t,r;
int g[N]={0},c[N]={0};
printf("****循环码编码方法(码长n
printf("\t输入码长n:");
scanf("%d",&m);
n=m;
switch(n)
{case 1 :printf("输入校验位r
scanf("%d",&r);
switch(r)
{case 0:g[0]=1;break;
} break;
case 2 :printf("输入校验位r
scanf("%d",&r);
switch(r)
{case 0:g[0]=1;break;
case 1:g[0]=1;g[1]=1;break;
} break;
case 3 :printf("输入校验位r
scanf("%d",&r);
switch(r)
{case 0:g[0]=1;break;
case 1:g[0]=1;g[1]=1;break;
case 2:g[0]=1;g[1]=1;g[2]=1;break;
} break;
case 4 :printf("输入校验位r
scanf("%d",&r);
switch(r)
{case 0:g[0]=1;break;
case 1:g[0]=1;g[1]=1;break;
case 2:g[0]=1;g[1]=0;g[2]=1;break;
case 3:g[0]=1;g[1]=1;g[2]=1;g[3]=1;break;
} break;
case 5 :printf("输入校验位r=0,1,4:");
scanf("%d",&r);
switch(r)
{case 0:g[0]=1;break;
case 1:g[0]=1;g[1]=1;break;
case 4:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;break;
} break;
case 6 :printf("输入校验位r
scanf("%d",&r);
switch(r)
{case 0:g[0]=1;break;
case 1:g[0]=1;g[1]=1;break;
case 2:g[0]=1;g[1]=1;g[2]=1;break;
case 3:g[0]=1;g[1]=0;g[2]=0;g[3]=1;break;
case 4:g[0]=1;g[1]=0;g[2]=1;g[3]=0;g[4]=1;break;
case 5:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;break;
} break;
case 7 :printf("输入校验位r=0,1,3,4,6:");
scanf("%d",&r);
switch(r)
{case 0 :g[0]=1;break;
case 1 :g[0]=1;g[1]=1;break;
case 3 :g[0]=1;g[1]=1;g[2]=0;g[3]=1;break;
case 4 :g[0]=1;g[1]=1;g[2]=1;g[3]=0;g[4]=1;break;
case 6 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1; g[6]=1;break; } break;
case 8 :printf("输入校验位r
scanf("%d",&r);
switch(r)
{case 0 :g[0]=1;break;
case 1 :g[0]=1;g[1]=1;break;
case 2 :g[0]=1;g[1]=0;g[2]=1;break;
case 3 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;break;
case 4 :g[0]=1;g[1]=0;g[2]=0;g[3]=0;g[4]=1;break;
case 5 :g[0]=1;g[1]=1;g[2]=0;g[3]=0;g[4]=1;g[5]=1;break;
case 6 :g[0]=1;g[1]=0;g[2]=1;g[3]=0;g[4]=1;g[5]=0; g[6]=1;break; case7:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;g[6]=1;
g[7]=1;break;
} break;
case 9 :printf("输入校验位r
scanf("%d",&r);
switch(r)
{case 0 :g[0]=1;break;
case 1 :g[0]=1;g[1]=1;break;
case 2 :g[0]=1;g[1]=0;g[2]=1;break;
case 3 :g[0]=1;g[1]=0;g[2]=0;g[3]=1;break;
case 4 :g[0]=1;g[1]=0;g[2]=1;g[3]=0;g[4]=1;break;
case 5 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;break;
case 6 :g[0]=1;g[1]=1;g[2]=0;g[3]=1;g[4]=0;g[5]=1; g[6]=1;break;
case7:g[0]=1;g[1]=0;g[2]=1;g[3]=1;g[4]=1;g[5]=1;g[6]=0;g[7]=1;break; case8:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;g[6]=1;g[7]=1; g[8]=1;break;
} break;
case 10 :printf("输入校验位r=0,1,2,4,5,6,8,9:");
scanf("%d",&r);
switch(r)
{case 0 :g[0]=1;break;
case 1 :g[0]=1;g[1]=1;break;
case 2 :g[0]=1;g[1]=0;g[2]=1;break;
case 4 :g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;break;
case 5 :g[0]=1;g[1]=0;g[2]=0;g[3]=0;g[4]=0;g[5]=1;break;
case 6 :g[0]=1;g[1]=1;g[2]=0;g[3]=0;g[4]=0; g[5]=1;g[6]=1;break; case8:g[0]=1;g[1]=0;g[2]=1;g[3]=0;g[4]=1;g[5]=0;g[6]=1;g[7]=0; g[8]=1;break;
case9:g[0]=1;g[1]=1;g[2]=1;g[3]=1;g[4]=1;g[5]=1;g[6]=1;g[7]=1
;g[8]=1;g[9]=1;break; } break;
}
printf("生成多项式系数矩阵为(幂次从低到高):\n");
for(i=0;i
printf("%d ",g[i]);
printf("\n");
printf("输入信源信息向量c(%d位) :\n",n-r);
for(i=0;i
scanf("%d",&c[i]);
while(1)
{ printf("\t*****选择编码方式及命令*****\n");
printf("\t 1:系统编码\n");
printf("\t 2:非系统编码\n");
printf("\t 3:退出程序!!!\n");
printf("\t***************************\n");
scanf("%d",&t);
switch(t)
{case 1 :X(g,c,r,n);break;
case 2 :UX(g,c,r,n);break;
case 3 :printf("退出程序〉〉〉");exit(0);break; }
printf("\n"); } }
五、程序设计的流程图
六、实验内容:
1、GF(2)中(7,4)循环码,生成多项式g(x)=x3+x+1,对信息组(1101)进行编码,运行结果如下所示:
2、自己选择一个例子进行编码,例子为:GF(2)中(7,3)循环码,生成多项式g (x )=x 4+x 2+x +1,对信息组(100)进行编码,运行结果如下所示: