习题1-4,1-9 ,1-10类别:通信原理

1-4一个由字母A,B,C,D组成的字,对于传输的每一个字母用二进制脉冲编码,00代替A,01代替B,10代替C,11代替D,每个脉冲宽度为5ms。
(1)不同的字母是等可能出现时,试计算传输的平均信息速率
(2)若每个字母出现的可能性分别为
p( A) = 1/5
p( B) = 1/4
p( C) = 1/4
p( D) = 3/10
试计算传输的平均信息速率。

解:(1)因一个字母对应两个二进制脉冲,属于四进制符号,故一个字母的持续时间为2x5ms,
传送字母的符号速率为 RB4 = 1/(2x5x10-3) = 100B
等概时,平均信息速率 Rb = RB4log24 = 200b/s
(2)每个符号的平均信息量为
H = -Σ(i=1,4)(Pilog2Pi)
= -1/5log21/5 - 1/4log21/4 - 1/4log21/4 - 3/10log23/10
= 1.985bit/符号
平均信息速率RB = RB4H = 100x1.985 =198.5b/s

1-9如果二进制独立等概信号的码元宽度为0.5ms,求RB和Rb;若改为四进制信号,码元宽度不变,求传码率RB和独立等概时的传信率Rb
解:由已知条件码元宽度为0.5ms
所以RB = 1/0.5x10-3 = 2000B
Rb = RBlog2 N 因为 N = 2
所以 Rb = 2000bit/s
当 N = 4时, RB4 = 2000B
Rb = RB4log24 = 4000bit/s

#include #include #include #include #include #include typedef struct { int weight; int parent,lchild,rchild; }HTNode,* HuffmanTree;//哈夫曼结构 typedef char **HuffmanCode;//哈夫曼编码 HuffmanTree HT; HuffmanCode HC; int *w,i=0,j=0,n=0,number=0; char *z; void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n)//W存放N个符的权值,构造哈夫曼树HT,并求出N个符的哈夫曼编码HC { int m,i,s1,s2,start; int c,f; HuffmanTree p; char *cd; if(n<=1) return; m=2*n-1; HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); for(p=HT+1,i=1;iweight=*w; p->parent=0; p->lchild=0; p->rchild=0; } for(;iparent=0; for(i=n+1;i<=m;++i)//建树 { j=1; p=HT; while((j<=i-1)&&(p[j].parent!=0))//未建结点个数 j++; s1=j; while(j<=i-1) { if(p[j].parent==0&&p[j].weight<p[s1].weight)//找出最小值s1 s1=j; j++; } p[s1].parent=i; j=1; p=HT; while(j<=i-1&&p[j].parent!=0)//剩余未建结点个数 j++; s2=j; while(j<=i-1) { if(p[j].parent==0&&p[j].weights2) { j=s1; s1=s2; s2=j; } HT[s1].parent=HT[s2].parent=i; HT[i].lchild=s1; HT[i].rchild=s2; HT[i].weight=HT[s1].weight+HT[s2].weight; } //从叶子到根逆向求每个符的哈夫曼编码 HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); cd=(char*)malloc(n*sizeof(char)); cd[n-1]=&#39;\0&#39;; //编码结束符 for(i=1;i<=n;i++)//逐个符求哈夫曼编码 { start=n-1;//编码结束位置 for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)//从叶子逆向求编码 if(HT[f].lchild==c)//左0右1编码 cd[--start]=&#39;0&#39;; else cd[--start]=&#39;1&#39;; HC[i]=(char*)malloc((n-start)*sizeof(char)); strcpy(HC[i],&cd[start]); //复制串 } free(cd); } void Initialization()//初使化,从终端读入符集大小n,以及n个符和n个权值,建树,并存入文件中 { int num; int quan; cout<>num; n=num; w=(int*)malloc(n*sizeof(int));//存放权 z=(char*)malloc(n*sizeof(char));//存放符 cout<<"请依次输入"<<n<<"个符"<<endl; char cs[2]; for(i=0;i<n;i++)//存放符 { cout<<"第"<<i+1<>cs; *(z+i)=*cs; } cout<<endl<<"请依次输入"<<n<<"个权值"<<endl; for(i=0;i<=n-1;i++)//存放权 { cout<<"第"<<i+1<>quan; *(w+i)=quan; } cout<<"字母表为"; for(i=0;i<=n-1;i++) { cout<<setw(3)<<*(z+i); } cout<<endl; cout<<"权值表为"; for(i=0;i<=n-1;i++) { cout<<setw(3)<<*(w+i); } HuffmanCoding(HT,HC,w,n);//建树,编码 cout<<endl<<"各符对应的编码为:"<<endl; for(i=1;i<=n;i++) { cout<<*(z+i-1)<<"............................"; cout<<HC[i]<<endl; } //存入文件htmTree中 FILE *htmTree; char rt[]={&#39; &#39;,&#39;\0&#39;}; if((htmTree=fopen("htmTree.txt","w"))==NULL) { cout<<"can not open file"<<endl; return; } fputs(z,htmTree); for(i=0;i<n+1;i++) { fprintf(htmTree,"%5d",*(w+i)); fputs(rt,htmTree); } for(i=1;i<=n;i++) { fputs(HC[i],htmTree); fputs(rt,htmTree); } fclose(htmTree); } void InputMessage()//输入要编译的报文,并将其存入文件tobetran中 { FILE *tobetran; char mess[40]; if((tobetran=fopen("tobetran.txt","w"))==NULL) { cout<<"不能打开文件"<<endl; return; } cout<<"请输入想要编码"<<endl; gets(mess); fputs(mess,tobetran); fclose(tobetran); } void Coding()//读取tobetran中的报文,并编码后存入文件codefile中 { FILE *tobetran,*codefile; if((tobetran=fopen("tobetran.txt","rb"))==NULL) cout<<"不能打开文件"<<endl; if((codefile=fopen("codefile.txt","wb"))==NULL) cout<<"不能打开文件"<<endl; char *tran;//中间变量 tran=(char*)malloc(100*sizeof(char)); int i=1; while(i==1) { if(fgets(tran,100,tobetran)==NULL) { cout<<"不能打开文件"<<endl; break; }//将tobetran中读取的符存入tran中 for(i=0;*(tran+i)!=&#39;\0&#39;;i++) { for(j=0;j<=n;j++) { if(*(z+j-1)==*(tran+i))//找到第i个符对应在Z中的位置 fputs(HC[j],codefile);//编码并存入codefile中 } } } fclose(tobetran); fclose(codefile); free(tran); } void Decoding()//利用已建好的哈夫曼树将codefile中的代码进行译码,并将结果存入文件txtfile中 { FILE *codef,*txtfile; if((txtfile=fopen("Textfile.txt","w"))==NULL) cout<<"不能打开文件"<<endl; if ((codef=fopen("codefile.txt","r"))==NULL) cout<<"不能打开文件"<<endl; char w[1000],v[1000]; int j=0,i=0,m=0; fgets(w,2000,codef);//将编码存入W中 m=2*n-1; for(i=0;*(w+i-1)!=&#39;\0&#39;;i++) { if(HT[m].lchild==0&&HT[m].rchild==0) //,无孩子,是叶子结点 { *(v+j)=*(z+m-1);//找到符 j++; m=2*n-1; i--; } else if(*(w+i)==&#39;0&#39;) m=HT[m].lchild;//有孩子 else if(*(w+i)==&#39;1&#39;) m=HT[m].rchild; } *(v+j+1)=&#39;\0&#39;; fputs(v,txtfile);//将符存入文件夹中 fclose(txtfile); fclose(codef); } void Pcode()//将codefile以紧凑可式显式在终端上,每行50个代码,结果存入 CodePrin中 { FILE * CodePrin,* codefile; if((CodePrin=fopen("CodePrin.txt","w"))==NULL) { cout<<"不能打开文件"<<endl; return; } if((codefile=fopen("codefile.txt","r"))==NULL) { cout<<"不能打开文件"<<endl; return; } char *q; //char *y=&#39;\r&#39;; q=(char*)malloc(51*sizeof(char));//存50个符 do {//将codefile中的每50个符存入q中 if(fgets(q,51,codefile)==NULL) { cout<<"不能读取文件"<<endl; break; } fputs(q,CodePrin); //fputs(y,CodePrin); puts(q); }while(strlen(q)==50); free(q); fclose(CodePrin); fclose(codefile); } void Print(HuffmanTree p,HuffmanTree HT)//打印哈夫曼树,并将其存入TreePrint中 { if(p!=HT) { FILE * TreePrint; if((TreePrint=fopen("TreePrint.txt","a"))==NULL) { cout<<"创建文件失败"<rchild,HT); cout<<setw(6*number)<weight<weight); Print(HT+p->lchild,HT); number--; fclose(TreePrint); } } void main() { char a; while(a!=&#39;Q&#39;) { cout<<"请选择要执行的命令:"<<endl; cout<<"I 初使化,建立哈夫曼树; S 输入翻译的报文; E 对报文编码;"<<endl<<" D 对编码进行译码; P 打印代码文件; T 打印哈夫曼树; Q 退出"<>a; switch(a) { case&#39;I&#39;: Initialization();//初使化,建立哈夫曼树 break; case&#39;S&#39;: InputMessage();//输入要翻译的报文 break; case&#39;E&#39;: Coding();//读取报文并编码 break; case&#39;D&#39;: Decoding();//将代码进行译码 break; case&#39;P&#39;: cout<<"打印编码"<<endl; Pcode(); break; case&#39;T&#39;: cout<<"打印哈夫曼树"<<endl; Print(HT+2*n-1,HT);//打印哈夫曼树 cout<<"原文,编码和译码结果可在文件中查找。"; break; } } free(z); free(w); free(HT); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值