您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 信息论与编码实验报告
实验报告课程名称:信息论与编码姓名:系:专业:年级:学号:指导教师:职称:年月日目录实验一信源熵值的计算........................................................................1实验二Huffman信源编码.....................................................................5实验三Shannon编码............................................................................9实验四信道容量的迭代算法..............................................................12实验五率失真函数.............................................................................15实验六差错控制方法..........................................................................20实验七汉明编码.................................................................................22实验一信源熵值的计算一、实验目的1进一步熟悉信源熵值的计算2熟悉Matlab编程二、实验原理熵(平均自信息)的计算公式qiiiqiiippppxH1212log1log)(MATLAB实现:))(log*.(2xxsumHX;或者))((log*)(2ixixhh流程:第一步:打开一个名为“nan311”的TXT文档,读入一篇英文文章存入一个数组temp,为了程序准确性将所读内容转存到另一个数组S,计算该数组中每个字母与空格的出现次数(遇到小写字母都将其转化为大写字母进行计数),每出现一次该字符的计数器+1;第二步:计算信源总大小计算出每个字母和空格出现的概率;最后,通过统计数据和信息熵公式计算出所求信源熵值(本程序中单位为奈特nat)。程序流程图:三、实验内容1、写出计算自信息量的Matlab程序2、已知:信源符号为英文字母(不区分大小写)和空格。输入:一篇英文的信源文档。输出:给出该信源文档的中各个字母与空格的概率分布,以及该信源的熵。四、实验环境MicrosoftWindows7Matlab6.5五、编码程序#includestdio.h#includemath.h#includestring.h#defineN1000intmain(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;istrlen(temp);i++){s[i]=temp[i];}for(i=0;istrlen(s);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;i26;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;i27;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编码的平均码长。四、实验环境MicrosoftWindows7Matlab6.5五、编码程序MATLAB编码:function[h,L]=huffman(p,r)%变量p为符号出现概率所组成的概率向量%返回值h为利用Huffman编码算法编码后最后得到编码结果%返回值L为进行Huffman编码后所得编码的码字长度iflength(find(p0))~=0error('Notaprob.vector,negativecomponent(s)');end%判断概率向量中是否有0元素,有0元素程序显示出错,终止运行if(sum(p,2)1)error('Notaprob.vector,componentsdonotaddupto1');end%判断所有符号出现概率之和是否大于1,如果大于1程序显示出错,终止运行a=length(p);%测定概率向量长度,将长度值赋给变量nk=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(l11)s=sum(m(1,1:l1),2);q=[s,m(1,(l1+1):a),ones(1,l1-1)];[m(2,:),mp(2,:)]=sort(q);elsem(2,:)=m(1,:);mp(2,:)=1:1:a;endfori=3:k+1s=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);endn1=m;n2=mp;fori=1:k+1n1(i,:)=m(k+2-i,:);n2(i,:)=mp(k+2-i,:);endm=n1;mp=n2;c=cell(k+1,a);forj=1:rc{1,j}=num2str(j-1);endfori=2:kp1=find(mp(i-1,:)==1);forj=1:rc{i,j}=strcat(c{i-1,p1},int2str(j-1));endforj=(r+1):(p1+r-1)c{i,j}=c{i-1,j-r};endforj=(p1+r):ac{i,j}=c{i-1,j-r+1};endendifl1==1forj=1:ac{k+1,j}=c{k,j};endelsep1=find(mp(k,:)==1);forj=1:l1c{k+1,j}=strcat(c(k,p1),int2str(j-1));endforj=(l1+1):(p1+l1)c{k+1,j}=c{k,mp(1,j-l1)};endforj=(p1(1)+l1+1):ac{k+1,j}=c{k,mp(1,j-l1+1)};endendforj=1:al(j)=length(c{k+1,j});endh=cell(1,a);forj=1:ah{1,j}=c{k+1,j};endL=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.1521200.02110.1221210.09120.221220.04200.082100.02220.042110.0600.1810L=2.0600七、实验总结在huffman编码的过程中,我们运用了平时熟悉的数学软件MATLAB的运行来实现,把书本上huffman的算法运用编程来实现。通过这次实验,使我更加清晰地理解huffman编码的原理及实现过程,并且能够在MATLAB中熟练地进行编码运行。实验三Shannon编码一、实验目的1、熟悉离散信源的特点;2、学习仿真离散信源的方法3、学习离散信源平均信息量的计算方法4、熟悉Matlab编程二、实验原理给定某个信源符号的概率分布,通过以下的步骤进行香农编码1、信源符号按概率从大到小排列;12.......nppp2、确定满足下列不等式的整数码长iK为()()1iiilbpKlbp3、为了编成唯一可译码,计算第i个消息的累加概率:4、将累加概率iP变换成二进制数;5、取iP二进制数的小数点后iK位即为该消息符号的二进制码字。三、实验内容1、写出计算自信息量的Matlab程序2、写出计算离散信源平均信息量的Matlab程序。3、将程序在计算机上仿真实现,验证程序的正确性并完成习题。四、实验环境MicrosoftWindows7Matlab6.5五、编码程序计算如下信源进行香农编码,并计算编码效率:01.01.015.017.018.019.02.06543210aaaaaaaPXMATLAB程序:(1)a=[0.20.180.190.150.170.10.01];k=length(a);y=0;fori=1:k-111()iikkPpaforn=i+1:kif(a(i)a(n))t=a(i);a(i)=a(n);a(n)=t;endendends=zeros(k,1);b
本文标题:信息论与编码实验报告
链接地址:https://www.777doc.com/doc-8547451 .html