香农三大定理复习,转自https://baike.baidu.com/item/%E9%A6%99%E5%86%9C%E4%B8%89%E5%A4%A7%E5%AE%9A%E7%90%86/9029931?fr=aladdin

香农三大定理是信息论的基础理论。香农三大定理是存在性定理,虽然并没有提供具体的编码实现方法,但为通信信息的研究指明了方向。香农第一定理是可变长无失真信源编码定理。香农第二定理是有噪信道编码定理。香农第三定理是保失真度准则下的有失真信源编码定理。

香农第一定理(可变长无失真信源编码定理)

设离散无记忆信源X包含N个符号{x1,x2,…,xi,..,xN},信源发出K重符号序列,则此信源可发出N^k个不同的符号序列消息,其中第j个符号序列消息的出现概率为PKj,其信源编码后所得的二进制代码组长度为Bj,代码组的平均长度B为

B=PK1B1+PK2B2+…+PKN^kBN^k

当K趋于无限大时,B和信息量H(X)之间的关系为B/k=H(X)(K趋近无穷)

香农第一定理又称为无失真信源编码定理或变长码信源编码定理。

香农第一定理的意义:将原始信源符号转化为新的码符号,使码符号尽量服从等概分布,从而每个码符号所携带的信息量达到最大,进而可以用尽量少的码符号传输信源信息。

香农第二定理(有噪信道编码定理)

有噪信道编码定理。当信道的信息传输率不超过信道容量时,采用合适的信道编码方法可以实现任意高的传输可靠性,但若信息传输率超过了信道容量,就不可能实现可靠的传输。

设某信道有r个输入符号,s个输出符号,信道容量为C,当信道的信息传输率R<C,码长N足够长时,总可以在输入的集合中(含有r^N个长度为N的码符号序列),找到M ((M<=2^(N(C-a))),a为任意小的正数)个码字,分别代表M个等可能性的消息,组成一个码以及相应的译码规则,使信道输出端的最小平均错误译码概率Pmin达到任意小。

公式:

注:B为信道带宽;S/N为信噪比,通常用分贝(dB)表示。

香农第三定理(保失真度准则下的有失真信源编码定理)

保真度准则下的信源编码定理,或称有损信源编码定理。只要码长足够长,总可以找到一种信源编码,使编码后的信息传输率略大于率失真函数,而码的平均失真度不大于给定的允许失真度,即D'<=D.

设R(D)为一离散无记忆信源的信息率失真函数,并且选定有限的失真函数,对于任意允许平均失真度D>=0,和任意小的a>0,以及任意足够长的码长N,则一定存在一种信源编码W,其码字个数为M<=EXP{N[R(D)+a]},而编码后码的平均失真度D'(W)<=D+a。

固定算术编码与译码代码解析

由于C++小数位的精度有限,在信源符号过长时容易因为精度不够导致编码错误,固对一段信源采用分组编译码(每组8个)。

算术编码是将一个符号序列表示成0和1之间的一个间隔(Interval),并用该间隔内的一个浮点小数表示,再将该小数转换成二进制数。符号序列越长,对应的间隔越小,表示这一间隔的二进制位数就越多。固定算术编码又称静态算术编码。下面以如下习题为例编写代码:

题目1:设信源可能输出的符号是26个字母,且每个字母出现的概率为:a, b, c, d, e, f 均为0.1,其它是等概的,试编写程序可以对任意字母序列(如presentation)进行固定模式的算术编码,并进行相应的译码。

定义的全局变量如下:

#include<iostream.h>
#include<iomanip.h>
#include<string.h>
#include<math.h>
#define N 26
char str[1000];  //输入字符串数组
char decode_str[1000];  //译出字符串数组
char string[N]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
double probability[N]={0.1,0.1,0.1,0.1,0.1,0.1,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02,0.02};
double result,interval_begin,interval_end;
int cord[1000],cordlength=0,cordlength_temp[1000];
int strlength=0;  //输入字符串的长度

result存储每一分组中最终区间所选择出的数;interval_begin为区间下限,interval_end为区间上限;cord[1000]数组存储编码的码字,每一分组编码之后放入其中;cordlength为已经编码的长度,配合每一分组编码之后存入cord[1000]的操作;cordlength_temp数组存储每一分组中编码的长度,同样起配合每一分组编码之后存入cord[1000]的操作的作用,同时也为译码作准备。即cordlength_temp数组中的数据由编码产生,为译码服务。

读数据程序如下:

bool readdata(){int i;cout<<"***********固定模式算术编码***********"<<endl;cout<<"请输入字符串(a-z):"<<endl;cin>>str;while(str[strlength]!='\0'){strlength++;}for(i=0;i<strlength;i++)   //判断输入是否合法  if(str[i]>'z'||str[i]<'a') return 1; cout<<"输入字符串长度为:"<<strlength<<endl<<endl;return 0;
}

编码程序如下:

void encode(){int m=1;double w,length;cout<<"编码:"<<endl<<endl;for(int k=0;k<strlength;k=k+8){cout<<"第"<<m<<"组编码:"<<endl;w=0.0;interval_begin=0.0;interval_end=1.0;for(int i=k;i<k+8;i++){if(str[i]=='\0'){break;}int n=str[i]-'a';w=0.0;for(int j=0;j<n;j++)w+=probability[j];   //计算所在区间length=interval_end-interval_begin;   //计算当前区间长度interval_begin+=length*w;   //计算新的区间下限interval_end=interval_begin+length*probability[j];    //计算新的区间上限}result=interval_begin*0.01+interval_end*0.99;  //选择适当的点cordlength=cordlength+int(-log(interval_end-interval_begin)/log(2))+1;cordlength_temp[m-1]=int(-log(interval_end-interval_begin)/log(2))+1;  //将临时片段编码长度存入cordlength_temp数组cout<<"编码选取的数为:"<<setprecision(16)<<result<<endl;cout<<"编码位数为:"<<cordlength_temp[m-1]<<endl;cout<<"编码结果为:"<<endl;for(int j=0;j<cordlength_temp[m-1];j++){  //十进制转换成二进制cord[j+cordlength-cordlength_temp[m-1]]=int(result*2);  //将每一位编码利用cordlength_temp[m-1]长度值以及已编码cordlength值存储在cord数组中,每次循环跨越前面一组的编码长度result=result*2-cord[j+cordlength-cordlength_temp[m-1]];cout<<cord[j+cordlength-cordlength_temp[m-1]];}cout<<endl<<endl;m++;}cout<<"总编码位数为:"<<cordlength<<endl;for(int i=0;i<cordlength;i++)cout<<cord[i];cout<<endl<<endl;
}

译码程序如下(此时需要用到编码产生的cordlength_temp数组):

void decode(){int m=1;int temp,number=0;double length,wei;cordlength=0;cout<<"译码:"<<endl<<endl;for(int k=0;k<strlength;k=k+8){cout<<"第"<<m<<"组译码:"<<endl;wei=0.5;result=0.0;for(int i=0;i<cordlength_temp[m-1];i++){   //二进制转换成十进制result+=wei*cord[i+cordlength];wei*=0.5;}cordlength+=cordlength_temp[m-1];//得出已经译码的长度cout<<"译码选取的数为:"<<setprecision(16)<<result<<endl;interval_begin=0.0;interval_end=1.0;wei=0.0;cout<<"译码结果为:";for(i=k;i<k+8;i++){if(str[i]=='\0'){break;}temp=0;wei=0.0;length=interval_end-interval_begin;while(result-interval_begin>wei*length){wei+=probability[temp++];}        //搜索所在区间temp--;interval_end=interval_begin+wei*length;         //计算新的区间上限interval_begin=interval_end-probability[temp]*length;   //计算新的区间下限cout<<string[temp];decode_str[number++]=string[temp];}m++;cout<<endl<<endl;}cout<<"总译码结果为:";for(int i=0;i<number;i++)cout<<decode_str[i];cout<<endl;
}

调用主函数:

void main(){if(readdata())cout<<"字符输入错误!";else{encode();decode();}
}

结果为:

课设复习之信息论固定算术编码与译码相关推荐

  1. 课设复习之信息论自适应算术编码与译码

    接上一篇博客:课设复习之信息论固定算术编码与译码https://blog.csdn.net/hfuter2016212862/article/details/90517908 对于自适应算术编码仍然存 ...

  2. 算术编码、译码以及matlab实现

    算术编码是一种采用的编码,我们用matlab语言来实现算术码的编码.译码过程. 首先,我们给定研究范围为 2元信号.用{0,1}符号来表示,然后我们假设发送方和接收方都知道符号0出现的概率p(0)和符 ...

  3. 信息论与编码实验报告——MATLAB实现算术编码

    一.实验内容 试用MATLAB编制算术编码算法实现程序. 二.实验过程 2.1 算术编码实现原理 算术编码的算法思想如下: (1)对一组信源符号按照符号的概率从大到小排序,将[0,1)设为当前分析区间 ...

  4. 信息论中用c语言进行算术编码,信息论与编码之算术编码

    例5-10 有4个符号a,b,c,d构成简单序列S=(a,b,d,a),各符号及其对应概率如下表5-9所列. 符号 符号概率pi 符号累积概率Pj a 0.100(1/2) 0.000 b 0.010 ...

  5. 信息论与编码之算术编码

    例5-10 有4个符号a,b,c,d构成简单序列S=(a,b,d,a),各符号及其对应概率如下表5-9所列. 符号 符号概率pi 符号累积概率Pj a 0.100(1/2) 0.000 b 0.010 ...

  6. C/C++程序设计课设题[2023-05-20]

    C/C++程序设计课设题[2023-05-20] ATM仿真系统-薛景 背单词-叶水仙-理科实验班 电信优惠套餐推荐系统的设计与实现-朱立华-通信工程 多媒体文件管理及检索系统-刘林峰-广播电视工程 ...

  7. sr锁存器 数电_数电课设其实也没那么难2.1

    1 引言 如上就是 课题二.数字式抢答器 课题三.多路彩灯控制器 相比天天在路口见的红绿灯 这俩题可能抽象了一点 我自己是课题三 做的时候发现 这题还真不是最简单的一个... 一步一步来吧 数电并不是 ...

  8. [转]算术编码+统计模型=数据压缩 - 第二部分:统计模型

    转自:http://deercrane.spaces.live.com/blog/cns!8BEF692B75EB8095!189.entry 算术编码 + 统计模型 = 数据压缩 - 第二部分:统计 ...

  9. 南京航空航天大学2020数据结构课设

    南京航空航天大学2020数据结构课设 目录 1.系统进程设计 2.迷宫问题 3.家谱管理系统 4.Huffman编码与解码 5.地铁修建 6.公交线路提示 7.B-树应用 8.排序算法比较 9.数字排 ...

最新文章

  1. 2012最炙手可热的10项IT技术——相对应的技术书
  2. 成功解决eric6-EditorConfig Properties The EditorConfig properties for file h5py\numpy.pxd could not be l
  3. C#面向对象设计模式纵横谈——6.Prototype 原型模式(创建型模式)
  4. 用excel制作双层饼图_双层饼图,让你的工作更出彩
  5. 13 计算机组成原理第七章 输入/输出系统 I/O方式 I/O接口
  6. BZOJ 2660 (BJOI 2012) 最多的方案
  7. jquer WdatePicker 使用 手册
  8. H265框架编码流程(一)
  9. 凸优化问题,凸二次规划问题QP,凸函数
  10. 用计算机打爸爸妈妈,看图写话打电脑
  11. Python数据分析-北京房价分析
  12. 输入密码三次,简单程序
  13. full outer join应用场景
  14. java读取json文件把数据存入数据库中
  15. 使用Gitbook写电子书
  16. Google 开源的项目集合
  17. python图片数字识别_python 识别图片上的数字
  18. js+css 灵活层叠 绝对/相对 定位 2
  19. MyBatis中日期时间的处理
  20. read函数读串口数据“分包”问题及解决方案

热门文章

  1. 卸载mysql5.6.34_5.6.34版本安装后需要做的事项\mysql\.\innodb_table_stats\ not found.-hxl-ChinaUnix博客...
  2. 【已解决】Spring容器中找不到ServletWebServerFactory类出现的异常
  3. 计算机主机不过电,电脑主板不通电的解决方法
  4. 启动Spring项目报错,Springboot启动报错 Disconnected from the target VM 解决过程
  5. Java实现 LeetCode 564 寻找最近的回文数(今天要GG在这道题了 头晕+题难(((φ(◎ロ◎;)φ))))...
  6. 短期目标:三月、四月、五月
  7. 2、ESP8266入门(AT模式)——烧录固件
  8. 如何将dataframe数据类型某两列合并成一列
  9. 科学计算机复利现值怎么计算公式,怎么用科学计算器算年金现值和复利现值是那个......
  10. WEB前端2020年更新实用代码段(持续更新)