信息论与编码实验报告.docx
- 文档编号:11086964
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:34
- 大小:159.69KB
信息论与编码实验报告.docx
《信息论与编码实验报告.docx》由会员分享,可在线阅读,更多相关《信息论与编码实验报告.docx(34页珍藏版)》请在冰豆网上搜索。
信息论与编码实验报告
实验报告
课程名称:
信息论与编码
姓名:
系:
专业:
年级:
学号:
指导教师:
职称:
年月日
实验一信源熵值的计算
一、实验目的
1进一步熟悉信源熵值的计算
2熟悉Matlab编程
二、实验原理
熵(平均自信息)的计算公式
MATLAB实现:
;或者
流程:
第一步:
打开一个名为“nan311”的TXT文档,读入一篇英文文章存入一个数组temp,为了程序准确性将所读内容转存到另一个数组S,计算该数组中每个字母与空格的出现次数(遇到小写字母都将其转化为大写字母进行计数),每出现一次该字符的计数器+1;
第二步:
计算信源总大小计算出每个字母和空格出现的概率;
最后,通过统计数据和信息熵公式计算出所求信源熵值(本程序中单位为奈特nat)。
程序流程图:
三、实验内容
1、写出计算自信息量的Matlab程序
2、已知:
信源符号为英文字母(不区分大小写)和空格。
输入:
一篇英文的信源文档。
输出:
给出该信源文档的中各个字母与空格的概率分布,以及该信源的熵。
四、实验环境
MicrosoftWindows7
Matlab6.5
五、编码程序
#include"stdio.h"
#include
#include
#defineN1000
intmain(void)
{
chars[N];
inti,n=0;
floatnum[27]={0};
doubleresult=0,p[27]={0};
FILE*f;
char*temp=newchar[485];
f=fopen("nan311.txt","r");
while(!
feof(f)){
fread(temp,1,486,f);}
fclose(f);
s[0]=*temp;
for(i=0;i { s[i]=temp[i]; } for(i=0;i { if(s[i]=='') num[26]++; elseif(s[i]>='a'&&s[i]<='z') num[s[i]-97]++; elseif(s[i]>='A'&&s[i]<='Z') num[s[i]-65]++; } printf("文档中各个字母出现的频率: \n"); for(i=0;i<26;i++) { p[i]=num[i]/strlen(s); printf("%3c: %f\t",i+65,p[i]); n++; if(n==3) { printf("\n"); n=0; } } p[26]=num[26]/strlen(s); printf("空格: %f\t",p[26]); printf("\n"); for(i=0;i<27;i++) { if(p[i]! =0) result=result+p[i]*log(p[i]); } result=-result; printf("信息熵为: %f",result); printf("\n"); return0; } 六、求解结果 其中nan311.txt中的文档如下: Thereisnohatewithoutfear.Hateiscrystallizedfear,fear’sdividend,fearobjectivized.Wehatewhatwefearandsowherehateis,fearislurking.Thuswehatewhatthreatensourperson,ourvanityandourdreamsandplansforourselves.Ifwecanisolatethiselementinwhatwehatewemaybeabletoceasefromhating. 七、实验总结 通过这次实验,我们懂得了不必运行程序时重新输入文档就可以对文档进行统计,既节省了时间而且也规避了一些输入错误。 在实验中,我们进一步了解到信源熵的计算,理论和实践的结合让我们对这个知识点了解的更加深刻了。 实验二Huffman信源编码 一、实验目的 1.理解信源的最优变长编码的基本思想。 2.熟练掌握Huffman信源编码方法。 二、设计原理 设信源S={s1,s2,…..,sq},其对应的概率分布为P(si)={p1,p2,p3,….,pq},则其编码步骤如下: (1)将q个信源符号按递减方式排列。 (2)用0、1码符分别表示概率最小的两个信源符号,并将这两个符号合并成一个新的符号,从而得到q-1个符号的新信源成为S信源的缩减信源S1。 (3)将缩减信源S1中的符号仍按递减顺序排列,再将最小两个概率相加,合并成一个符号,并分别用0、1码表示,这样有形成了q-2个缩减信源S2。 (4)依次继续下去,直到缩减信源只剩下两个符号为止,将最后两个符号用0、1分别表示。 (5)从最后一次缩减信源开始,向前返回,沿信源缩减过程的反方向取出所编的马元。 三、实验内容 计算定信源和输入信号字母表的Huffman编码,并计算Huffman编码的平均码长。 实验具体要求如下: 信源字母表的概率分布为: P={0.15,0.12,0.2,0.08,0.04,0.18,0.02,0.09,0.04,0.02,0.06} 输入信号字母表: U={0,1,2}; 1.独立设计信源和输入信号字母表进行Huffman编码,其中信源字母表元素个数要求是8以上,信号字母表元素个数是2以上; 2.输出Huffman编码的平均码长。 四、实验环境 MicrosoftWindows7 Matlab6.5 五、编码程序 MATLAB编码: function[h,L]=huffman(p,r) %变量p为符号出现概率所组成的概率向量 %返回值h为利用Huffman编码算法编码后最后得到编码结果 %返回值L为进行Huffman编码后所得编码的码字长度 iflength(find(p<0))~=0 error('Notaprob.vector,negativecomponent(s)'); end %判断概率向量中是否有0元素,有0元素程序显示出错,终止运行 if(sum(p,2)>1) error('Notaprob.vector,componentsdonotaddupto1'); end %判断所有符号出现概率之和是否大于1,如果大于1程序显示出错,终止运行 a=length(p);%测定概率向量长度,将长度值赋给变量n k=fix((a-1)/(r-1)); l1=a-k*r+k; q=zeros(1,a); m=zeros(k+1,a); mp=m; q=p; [m(1,: ),mp(1,: )]=sort(q); if(l1>1) s=sum(m(1,1: l1),2); q=[s,m(1,(l1+1): a),ones(1,l1-1)]; [m(2,: ),mp(2,: )]=sort(q); else m(2,: )=m(1,: ); mp(2,: )=1: 1: a; end fori=3: k+1 s=sum(m(i-1,1: r),2); q=[s,m(i-1,r+1: a),ones(1,r-1)]; [m(i,: ),mp(i,: )]=sort(q); end n1=m; n2=mp; fori=1: k+1 n1(i,: )=m(k+2-i,: ); n2(i,: )=mp(k+2-i,: ); end m=n1; mp=n2; c=cell(k+1,a); forj=1: r c{1,j}=num2str(j-1); end fori=2: k p1=find(mp(i-1,: )==1); forj=1: r c{i,j}=strcat(c{i-1,p1},int2str(j-1)); end forj=(r+1): (p1+r-1) c{i,j}=c{i-1,j-r}; end forj=(p1+r): a c{i,j}=c{i-1,j-r+1}; end end ifl1==1 forj=1: a c{k+1,j}=c{k,j}; end else p1=find(mp(k,: )==1); forj=1: l1 c{k+1,j}=strcat(c(k,p1),int2str(j-1)); end forj=(l1+1): (p1+l1) c{k+1,j}=c{k,mp(1,j-l1)}; end forj=(p1 (1)+l1+1): a c{k+1,j}=c{k,mp(1,j-l1+1)}; end end forj=1: a l(j)=length(c{k+1,j}); end h=cell(1,a); forj=1: a h{1,j}=c{k+1,j}; end L=sum(l.*m(k+1,: ));%求平均码长 2、在MATLAB命令窗口中输入: p=[0.15,0.12,0.2,0.08,0.04,0.18,0.02,0.09,0.04,0.02,0.06]; r=3; [h,L]=huffman(p,r). 六、运行结果 得出的结论为: 概率 编码 概率 编码 0.15 2120 0.02 11 0.12 2121 0.09 12 0.2 2122 0.04 20 0.08 210 0.02 22 0.04 211 0.06 0 0.18 10 L=2.0600 七、实验总结 在huffman编码的过程中,我们运用了平时熟悉的数学软件MATLAB的运行来实现,把书本上huffman的算法运用编程来实现。 通过这次实验,使我更加清晰地理解huffman编码的原理及实现过程,并且能够在MATLAB中熟练地进行编码运行。 实验三Shannon编码 一、实验目的 1、熟悉离散信源的特点; 2、学习仿真离散信源的方法 3、学习离散信源平均信息量的计算方法 4、熟悉Matlab编程 二、实验原理 给定某个信源符号的概率分布,通过以下的步骤进行香农编码 1、信源符号按概率从大到小排列; 2、确定满足下列不等式的整数码长 为 3、为了编成唯一可译码,计算第i个消息的累加概率: 4、将累加概率 变换成二进制数; 5、取 二进制数的小数点后 位即为该消息符号的二进制码字。 三、实验内容 1、写出计算自信息量的Matlab程序 2、写出计算离散信源平均信息量的Matlab程序。 3、将程序在计算机上仿真实现,验证程序的正确性并完成习题。 四、实验环境 MicrosoftWindows7 Matlab6.5 五、编码程序 计算如下信源进行香农编码,并计算编码效率: MATLAB程序: (1)a=[0.20.180.190.150.170.10.01]; k=length(a);y=0; fori=1: k-1 forn=i+1: k
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息论 编码 实验 报告