信息论与编码实验报告

合集下载

信息论编码实验报告 费诺编码附源代码

信息论编码实验报告 费诺编码附源代码

中南大学信息论与编码实验报告选题:费诺编码学生姓名:学号:专业班级:通信工程指导老师:学院:信息科学与工程学院时间: 2015目录一、实验目的二、实验原理2.1 费诺编码思想2.2 费诺编码流程图三、实验内容四、实验要求五、代码调试结果六、心得体会七、程序源代码一实验目的1. 掌握费诺编码的原理和过程。

2. 熟悉 C/C++语言,练习使用C/C++实现香农码和Huffman 编码。

二、实验原理2.1 费诺编码思想设有离散无记忆信源∑==⎥⎦⎤⎢⎣⎡ni i n n x p x p x p x p x x x 121211)(,)(.....)()(.....1.按信源符号的概率从大到小的顺序排队 不妨设)(......)()(21n x p x p x p ≥≥≥2.将依次排列的信源符号按概率值分为两大组,使两个组的概率之和近似相同,并对各组赋予一个二进制码元“0”和“1”。

3.将每一大组的信源符号再分为两组,使划分后的两个组的概率之和近似相同,并对各组赋予一个二进制符号“0”和“1”。

4.如此重复,直至每个组只剩下一个信源符号为止。

5.信源符号所对应的码字即为费诺码。

例:有一单符号离散无记忆信源⎭⎬⎫⎩⎨⎧=⎥⎦⎤⎢⎣⎡04.008.016.018.022.032.0)(654321x x x x x x X P X对该信源编二进制费诺码)i /(35.2)(gn s bit X H = m L KR 2log =%92.97)(==R x H η∑===61)/(4.2)(i i i k x p K 符号比特2.2 费诺编码流程图三、实验内容使用C\C++实现费诺编码,并自己设计测试案例。

四、实验要求1.提前预习实验,认真阅读实验原理以及相应的参考书。

2.认真高效的完成实验,实验中服从实验室管理人员以及实验指导老师的管理。

3.认真撰写实验报告,内容可以自己编排,可以考虑包括以下一些方面:原理概述、程序设计与算法描述、源程序及注释(程序太长可以只选取重要部分)、运行输出结果实例、调试和运行程序过程中产生的问题及采取的措施、对实验的讨论分析、总结。

汉明码编码译码实验报告(信息论与编码)及源程序

汉明码编码译码实验报告(信息论与编码)及源程序
2
一个二元(7,4)汉明码的系统码形式的矩阵和校验矩阵分别为
1 0 0 0 1 0 1 1 1 1 0 1 0 0
G=0 1 0 0 1 1 1 H= 0 1 1 1 0 1 0
0 0 1 0 1 1 0 1 1 0 1 0 0 1
0 0 0 1 0 1 1
等价的编码方程为
Ci=mi, i=0,1,2,3
到现在为止,我已经学了C语言程序设计、数据结构等课程,这次的信息论与编码实验让我感觉到以前学习的东西有了用武之地,把知识和理论付诸实践才能有所提高。在编程的过程中,我发现自己的编程能力还非常有待提高,以前C语言课程里的很多知识掌握还不牢,时常需要翻书查阅。对信息论与编码这门课的学习还要加深,只有深刻理解了要做的事情,才能把事情做好。以后我要更加努力,逐步解决这些问题。
int f[3];
int ww[10000/4*7];
printf("汉明(7,4)码的编码与译码程序:\n");
printf("请输入你想产生的二进制个数:");
scanf("%d",&N); //输入想产生的信源的个数
while(N<4)
{
printf("输入无效,请重新输入");
printf("请输入你想产生的二进制个数:");
汉明码是一种能够纠正一位错码且编码效率较高的线性分组码。
汉明码是一种多重(复式)奇偶检错系统。它将信息用逻辑形式编码,以便能够检错和纠错。用在汉明码中的全部传输码字是由原来的信息和附加的奇偶监督位组成的。每一个这种奇偶位被编在传输码字的特定比特位置上。
推导并使用长度为m位的码字的汉明码,所需步骤如下:

信息论与编码实验报告-率失真函数

信息论与编码实验报告-率失真函数

实验报告课程名称:信息论与编码姓名:系:专业:年级:学号:指导教师:职称:年月日实验五 率失真函数一、 实验目的验证率失真函数的极值特性,理解相关参数的变化对率失真函数的影响。

二、实验原理(1)输入S ,d 的初始值、条件概率、输出分布等值; (2)计算输出分布∑==Mi j i j pji pi q 1;(3)进入迭代,标志为0或者误差大于指定eps 则迭代,否则退出迭代; (4)计算一个互信息∑∑===Mi Mj jij ij i q pji pji pi pji qj I 11)log();(;(5)计算一个条件概率分布∑==Mk Sd k Sd j ikijeq eq i j P 1);(;(6)重算一次(4),并计算∑==M i ij ij i d pji pi D 1;(7)重算(3)-(7)步骤,直到退出迭代;三、实验环境Microsoft Windows 7、 Visual Studio 2005 profession四、编码程序#include <iostream>#include <math.h> #include <iomanip> using namespace std; //Define some global var const int M = 10; //M 元信源 const double S = -50; //迭代算法中的中间量,S 越小,允许最大失真度D 越小,当S 很小时(例如-100),R(D)=H(X) static int d[M][M]; //失真函数 static double q[M], Pji[M][M]; //输出分布和条件概率分布static double Pi[M] = {0.4, 0.1, 0.25, 0.1, 0.05, 0.05, 0.01, 0.02, 0.005, 0.015}; //初始化信源的概率分布 const int systemDefine = 2; //定义进制(默认为2进制,结果为bit ,为e 时,结果为nat )const double eps = 1e-8; //允许误差//计算输出分布(qj)void calcOutDistribution(){int i, j;for(j=0; j<M; j++){q[j]=0;for(i=0; i<M; i++){q[j] += Pi[i] * Pji[i][j];}}}//计算条件概率分布pjivoid calcProbabilityDistribution(){int i, j, k;double temp = 0;for(i=0; i<M; i++){temp = 0;for(k=0; k<M; k++){temp = temp + q[k] * exp(S*d[i][k]);}for(j=0; j<M; j++){//设定一个初始的条件概率分布Pji[i][j] = q[j] * exp(S*d[i][j])/temp;}}}//取得R(r,r)=I(qj;Pji)【实际上就是根据互信息量公式求互信息】double getSelfInformation(){int i, j;double I=0;for(i=0; i<M; i++)for(j=0; j<M; j++){I += Pi[i] * Pji[i][j] * log(Pji[i][j]/q[j])/log(systemDefine); //求互信息量}}return I;}int main(int argc, char *argv[]){double probabilityCount = 0.0; //概率和for(int k=0; k<M; k++){probabilityCount += Pi[k];}//和不为1,说明概率有错误if(fabs(probabilityCount-1.0) > eps){cout<<"概率和不为1,程序异常退出!"<<endl;return -1;}//前两个变量代表求的相邻的两个互信息R(r, r)和R(r, r+1);D代表限定失真double mutualInformation1, mutualInformation2, D;int i, j, flag, nCount;//初始值mutualInformation1 = 0;mutualInformation2 = 0;D = 0;flag = 0;nCount = 0; //迭代次数指示器//init mothod//输出分布的初始化for(i=0; i<M; i++){q[i] = 0;}//率失真函数的初始化,根据汉明失真距离来初始化for(i=0; i<M; i++){for(j=0; j<M; j++){if(i == j){d[i][j] = 0;}else{d[i][j] = 1;}}}for(i=0; i<M; i++){for(j=0; j<M; j++){//设定一个初始的条件概率分布Pji[i][j] = 1/(double)(M);}}//计算输出分布calcOutDistribution();//迭代算法cout<<"误差精度:"<<eps<<endl;while(flag == 0 || fabs(mutualInformation2-mutualInformation1) > eps){cout<<setprecision(20)<<endl<<"第"<<++nCount<<"次迭代"<<endl;flag = 1;//获得一个互信息R(r, r)mutualInformation1 = getSelfInformation();//计算下一个条件概率分布calcProbabilityDistribution();//在上面的原来的输出分布q和新生成的条件概率分布Pji的基础上获得新的互信息R(r, r+1)mutualInformation2 = getSelfInformation();//再计算条件概率分布calcOutDistribution();cout<<"互信息1:"<<mutualInformation1<<endl<<"互信息2:"<<mutualInformation2<<endl;for(i=0; i<M; i++){for(j=0; j<M; j++){//求最大允许失真度DD = D + Pi[i]*Pji[i][j]*d[i][j];}}cout<<"D = "<<D<<endl;cout<<"R(D) = "<<mutualInformation2<<endl; //这是利用迭代算法求出的最大允许失真度为D时的R(D)cout<<"------------================------------"<<endl;}return 0;}五、实验结果运行实验结果如下:六、实验总结通过这次实验,让我们更好的掌握了率失真的求解方法,而且通过计算机解决问题效率提高了很多,节省了很多繁琐的步骤,更加直观和方便的让我们了解到相关参数变化对率失真的影响。

信息论与信源编码实验报告

信息论与信源编码实验报告

《信息论与编码》实验报告1 实验目的(1) 理解信源编码的基本原理;(2) 熟练掌握Huffman编码的方法;(3) 理解无失真信源编码和限失真编码方法在实际图像信源编码应用中的差异。

2 实验设备与软件(1) PC计算机系统(2) VC++6.0语言编程环境(3) 基于VC++6.0的图像处理实验基本程序框架imageprocessing(4) 常用图像浏览编辑软件Acdsee和数据压缩软件winrar。

(5) 实验所需要的bmp格式图像(灰度图像若干幅)3 实验内容与步骤(1) 针对“图像1.bmp”、“图像2.bmp”和“图像3.bmp”进行灰度频率统计(即计算图像灰度直方图),在此基础上添加函数代码构造Huffman码表,针对图像数据进行Huffman编码,观察和分析不同图像信源的编码效率和压缩比。

(2) 利用图像处理软件Acdsee将“图像1.bmp”、“图像2.bmp”和“图像3.bmp”转换为质量因子为10、50、90的JPG格式图像(共生成9幅JPG图像),比较图像格式转换前后数据量的差异,比较不同品质因素对图像质量的影响;(3) 数据压缩软件winrar将“图像1.bmp”、“图像2.bmp”和“图像3.bmp”分别生成压缩包文件,观察和分析压缩前后数据量的差异;(4) 针对任意一幅图像,比较原始BMP图像数据量、Huffman编码后的数据量(不含码表)、品质因素分别为10、50、90时的JPG文件数据量和rar压缩包的数据量,分析不同编码方案下图像数据量变化的原因。

4 实验总结分析实验步骤(1):实验代码:void CImageProcessingDoc::OnImageHuffman(){// TODO: Add your command handler code hereint m_Width, m_Height, m_SaveWidth;int i,j,k;int *b;double *a,acl=0,size=0,ratio=0,ce=0,e=0;//acl:average code length(平均码长);ce:code efficiency(编码效率);e:entropy (信息熵);size:图像大小;ratio:压缩比;long s=0;b=new int[256];a=new double[256];for (i=0; i<256; i++){b[i]=0;a[i]=0;}m_Width = m_pDibInit->GetWidth();m_Height = m_pDibInit->GetHeight();m_SaveWidth = m_pDibInit->GetSaveWidth();for(j=0;j<m_Height;j++)for(i=0;i<m_Width;i++){k=m_pDibInit->m_pDibBits[j*m_SaveWidth + i];b[k]+=1;}//图像统计灰度个数for (i=0; i<256; i++)a[i]=(double)b[i]/((double)m_Width*m_Height);//灰度概率统计//霍夫曼编码程序段Huffm huffm(256);huffm.Huffman(a);huffm.HuffmanCode();for (i=0; i<256; i++){acl+=a[i]*(256-huffm.code[i].start);//编码后的平均码长s+=(256-huffm.code[i].start)*b[i];}for (i=0; i<256; i++){if (a[i]>0.000001)e+=-1.0*a[i]*log10(a[i])/log10(2.0);//图像信息熵}ce=e/acl;//霍夫曼编码效率size=s/(1024.0*8.0);//图像大小ratio=((double)m_Height*(double)m_Width*8.0)/s;//图像信源的压缩比ss.Format("信息熵:%.3f 平均码长:%.3f 编码效率:%.3f%% 压缩比:%.3f 图像大小:%.3f kB ",e,acl,ce*100,ratio,size);}实验结果图:图像1 图像2 图像3 名称类型信息熵(比特/符号) 5.928 4.410 6.709 编码效率99.468% 99.237% 99.628% 压缩比 1.342 1.800 1.188实验分析:不同图像信源的霍夫曼编码效率都很高,都超过了99%,这与编码方式有关,因为霍夫曼编码是一种高效的编码方式,应用了最优码的构造方式,所得的是最短的平均码长的码字,是一种最优码;编码后的图像压缩比与图像信息熵有关,信息熵越大,图像的平均信息量较大,霍夫曼编码后压缩比越小。

信息论课程实验报告—哈夫曼编码

信息论课程实验报告—哈夫曼编码
else if(T[j].weight < T[*p2].weight)
*p2 = j;
}
}
void CreateHuffmanTree(HuffmanTree T)
{
int i,p1,p2;
InitHuffmanTree(T);
InputWeight(T);
for(i = n;i < m;i++)
4)依次继续下去,直至信源最后只剩下两个信源符号为止,将这最后两个信源符号分别用二元码符号“0”和“1”表示;
5)然后从最后—级缩减信源开始,进行回溯,就得到各信源符号所对应的码符号序列,即相应的码字。
四、实验目的:
(1)进一步熟悉Huffman编码过程;(2)掌握C语言递归程序的设计和调试技术。以巩固课堂所学编码理论的知识。
#include "stdio.h"
#include "stdlib.h"
#include <float.h>
#include <math.h>
#define n 8
#define m 2*n-1
typedef struct
{
float weight;
int lchild,rchild,parent;
}
}
void InputWeight(HuffmanTree T)
{
float temp[n] = {0.20,0.18,0.17,0.15,0.15,0.05,0.05,0.05};
for(int i = 0;i < n;i++)
T[i].weight = temp[i];
}

信息论与编码实习报告

信息论与编码实习报告

信息论与编码实习报告一、引言信息论与编码是通信工程、计算机科学和电子工程等领域的重要基础课程。

本次实习旨在通过实际操作,深入理解和掌握信息论与编码的基本原理和技术,提高我们的实际操作能力和问题解决能力。

二、实习内容1、信息论基础:实习的第一部分,我们通过自学和讨论的方式,深入学习了信息论的基本概念和原理,包括信息的度量、熵、信道容量等。

2、编码理论:在这一阶段,我们重点学习了线性编码、循环编码、哈夫曼编码等编码方法,并了解了编码的效率及其可靠性。

3、模拟与数字通信系统:我们通过模拟软件,设计和实现了简单的模拟通信系统,同时,也通过实验箱,了解了数字通信系统的基本原理和技术。

4、无线通信和网络:在这一部分,我们重点学习了无线通信和网络的基础知识,包括无线信道模型、无线调制解调技术、无线网络协议等。

5、实习项目:最后,我们根据所学的知识,完成了一个实习项目——设计并实现一个具有高可靠性和高效率的通信系统。

三、实习收获通过这次实习,我们收获颇丰。

首先,我们对信息论与编码的基本概念和原理有了更深入的理解和掌握,能够更好地将理论知识应用到实际中。

其次,我们提高了自己的实际操作能力和问题解决能力,能够在实践中发现和解决问题。

最后,我们了解了通信系统的基本原理和技术,对未来的学习和工作有了更好的准备。

四、结论本次实习是我们学习信息论与编码的重要环节,我们通过实际操作,深入理解和掌握了信息论与编码的基本原理和技术,提高了自己的实际操作能力和问题解决能力。

我们也发现了自己的不足之处,将在未来的学习和工作中更加努力,不断提高自己的能力和水平。

信息论与编码曹雪虹课后习题答案随着科技的发展,信息已经成为现代社会中不可或缺的一部分。

在大学中,信息论与编码作为一门重要的学科,已经成为了计算机科学、通信工程、电子工程等专业的必修课程。

而在这门课程中,曹雪虹教授的教材《信息论与编码》被广泛使用。

本文将介绍一些该教材的课后习题答案,以帮助读者更好地掌握信息论与编码的相关知识。

信息论与编码实验报告-汉明编码

信息论与编码实验报告-汉明编码

实验报告课程名称:信息论与编码姓名:系:专业:年级:学号:指导教师:职称:年月日实验七 汉明编码一、实验目的1、掌握线性分组码的编码原理2、掌握汉明码编码方法3、了解编码对误码性能的改善二、实验原理(n ,k )线性分组码的H 矩阵是一个n r n k n ⨯=⨯-)(阶矩阵,这里k n r -=是校验元的数目。

显然,r 个校验元能组成r 2列互不相同的r 重矢量,其中非全零矢量有12-r 个。

如果用这12-r 个非全零矢量作为H 矩阵的全部列,即令H 矩阵的列数12-=r n ,则此H 矩阵的各列均不相同,且无全零列,由此可构造一个纠正单个错误的(n ,k )线性分组码。

同时,12-r 是n 所能取的最大值,因为如果12->r n ,那么H 矩阵的n 列中必会出现相同的两列,这样就不能满足对H 矩阵的要求。

而由于12-=r n 是n 所能取的最大值,也就意味着码率R 取得了最大值,即1211--=-=-==r r n r n r n n k R这样设计出来的码是符合我们的要求的,这样的码就是汉明码。

定义 若H 矩阵的列是由非全零且互不相同的所有二进制r 重矢量组成,则由此得到的线性分组码,称为GF(2)上的(12-r ,r r --12)汉明码。

三、实验内容1、写出产生汉明码的的Matlab 程序2、将程序在计算机上仿真实现,验证程序的正确性并完成习题。

四、实验环境Microsoft Windows 7 Matlab 6.5五、编码程序本实验要求写出产生(3,1)汉明码的生成矩阵,由上述可知,我们的n=12-r =3,而k=r r --12=1,由此可得出r=2.当r=2时,有3个非全零的二重矢量: (01),(10),(11)构成矩阵:⎥⎦⎤⎢⎣⎡=101110H由此得到一个能纠正单个错的(3,1)汉明码。

若码字传输中左边第一位出错,则相应的伴随式)01(=s 就是H 矩阵的第一列,也正好是“1”的二进制表示。

中南大学信息论与编码编码部分实验报告

中南大学信息论与编码编码部分实验报告

信息论与编码编码部分实验报告课程名称:信息论与编码实验名称:关于香农码费诺码Huffman码的实验学院:信息科学与工程学院班级:电子信息工程1201姓名:viga学号:指导老师:张祖平日期:2014年1月3日目录⊙实验目的及要求1.1 实验目的 (4)1.2 开发工具及环境 (4)1.3 需求分析与功能说明 (4)⊙实验设计过程2.1 用matlab实现香农码、费诺码和Huffman编码2.1.1 说明 (6)2.1.2 源代码 (7)2.1.3 运行结果(截图) (19)2.2 用C\C++ 实现香农码2.2.1 说明 (22)2.2.2 源代码 (23)2.2.3 运行结果(截图) (26)2.3 用C\C++ 实现Huffman码2.3.1 说明 (26)2.3.2 源代码 (29)2.3.3 运行结果(截图) (36)2.4 用C\C++ 实现费诺码2.4.1 说明 (37)2.4.2 源代码 (37)2.4.3运行结果结果(截图) (40)⊙课程设计总结 (42)⊙参考资料4.1 课程设计指导书 (43)实验目的及要求1.1 实验目的1.掌握香农码、费诺码和Huffman编码原理和过程。

2.熟悉matlab软件的基本操作,练习使用matlab实现香农码、费诺码和Huffman编码。

3.熟悉C/C++语言,练习使用C/C++实现香农码、费诺码和Huffman编码。

4.应用Huffman编码实现文件的压缩和解压缩。

1.2 开发工具及环境MATLAB 7.0、wps文字、红精灵抓图精灵2010Windows7 系统环境1.3 需求分析与功能说明1、使用matlab实现香农码、费诺码和Huffman编码,并自己设计测试案例。

2、使用C\C++实现香农码、费诺码和Huffman编码,并自己设计测试案例。

3、可以用任何开发工具和开发语言,尝试实现Huffman编码应用在数据文件的压缩和解压缩中,并自己设计测试案例。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告课程名称:信息论与编码姓名:系:专业:年级:学号:指导教师:职称:年月日目录实验一信源熵值的计算 (1)实验二 Huffman信源编码 (5)实验三 Shannon编码 (9)实验四信道容量的迭代算法 (12)实验五率失真函数 (15)实验六差错控制方法 (20)实验七汉明编码 (22)实验一 信源熵值的计算一、 实验目的1 进一步熟悉信源熵值的计算 2熟悉 Matlab 编程二、实验原理熵(平均自信息)的计算公式∑∑=--==qi i i qi i i p p p p x H 1212log 1log )(MATLAB 实现:))(log *.(2x x sum HX -=;或者))((log *)(2i x i x h h -= 流程:第一步:打开一个名为“nan311”的TXT 文档,读入一篇英文文章存入一个数组temp ,为了程序准确性将所读内容转存到另一个数组S ,计算该数组中每个字母与空格的出现次数(遇到小写字母都将其转化为大写字母进行计数),每出现一次该字符的计数器+1;第二步:计算信源总大小计算出每个字母和空格出现的概率;最后,通过统计数据和信息熵公式计算出所求信源熵值(本程序中单位为奈特nat )。

程序流程图:三、实验内容1、写出计算自信息量的Matlab 程序2、已知:信源符号为英文字母(不区分大小写)和空格。

输入:一篇英文的信源文档。

输出:给出该信源文档的中各个字母与空格的概率分布,以及该信源的熵。

四、实验环境Microsoft Windows 7Matlab 6.5五、编码程序#include"stdio.h"#include <math.h>#include <string.h>#define N 1000int main(void){char s[N];int i,n=0;float num[27]={0};double result=0,p[27]={0};FILE *f;char *temp=new char[485];f=fopen("nan311.txt","r");while (!feof(f)) {fread(temp,1, 486, f);}fclose(f);s[0]=*temp;for(i=0;i<strlen(temp);i++){s[i]=temp[i];}for(i=0;i<strlen(s);i++){if(s[i]==' ')num[26]++;else if(s[i]>='a'&&s[i]<='z')num[s[i]-97]++;else if(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");return 0;}六、求解结果其中nan311.txt中的文档如下:There is no hate without fear. Hate is crystallized fear, fear’s dividend, fear objectivized. We hate what we fear and so where hate is, fear is lurking. Thus we hate what threatens our person, our vanity andour dreams and plans for ourselves. If we can isolate this element in what we hate we may be able to cease from hating.七、实验总结通过这次实验,我们懂得了不必运行程序时重新输入文档就可以对文档进行统计,既节省了时间而且也规避了一些输入错误。

在实验中,我们进一步了解到信源熵的计算,理论和实践的结合让我们对这个知识点了解的更加深刻了。

实验二 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编码的平均码长。

四、实验环境Microsoft Windows 7Matlab 6.5五、编码程序MATLAB编码:function[h,L]=huffman(p,r)%变量p为符号出现概率所组成的概率向量%返回值h为利用Huffman编码算法编码后最后得到编码结果%返回值L为进行Huffman编码后所得编码的码字长度if length(find(p<0))~=0error('Not a prob.vector,negative component(s)');end%判断概率向量中是否有0元素,有0元素程序显示出错,终止运行if (sum(p,2)>1)error('Not a prob.vector,components do not add up to 1');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);elsem(2,:)=m(1,:);mp(2,:)=1:1:a;endfor i=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;for i=1:k+1n1(i,:)=m(k+2-i,:);n2(i,:)=mp(k+2-i,:);endm=n1;mp=n2;c=cell(k+1,a);for j=1:rc{1,j}=num2str(j-1);endfor i=2:kp1=find(mp(i-1,:)==1);for j=1:rc{i,j}=strcat(c{i-1,p1},int2str(j-1));endfor j=(r+1):(p1+r-1)c{i,j}=c{i-1,j-r};endfor j=(p1+r):ac{i,j}=c{i-1,j-r+1};endendif l1==1for j=1:ac{k+1,j}=c{k,j};endelsep1=find(mp(k,:)==1);for j=1:l1c{k+1,j}=strcat(c(k,p1),int2str(j-1));endfor j=(l1+1):(p1+l1)c{k+1,j}=c{k,mp(1,j-l1)};endfor j=(p1(1)+l1+1):ac{k+1,j}=c{k,mp(1,j-l1+1)};endendfor j=1:al(j)=length(c{k+1,j});endh=cell(1,a);for j=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.......np p p ≥≥≥2、确定满足下列不等式的整数码长i K为()()1i i i lb p K lb p -≤<-+3、为了编成唯一可译码,计算第i 个消息的累加概率:4、将累加概率i P 变换成二进制数;5、取i P 二进制数的小数点后i K 位即为该消息符号的二进制码字。

相关文档
最新文档