一、算术编码起源

早在1948年,香农就提出将信源符号依美出现的概率降序排序,用符号序列累计概率的二进值作为对信源的编码,并从理论上论证了它的优越性。1960年,Peter Elias 发现无需排序,只要编、解码端使用相同的符号顺序即可,提出了算术编码的概念。Elias 没有公布他的发现,因为他知道算术编码在数学上虽然成立,但不可能在实际中实现。1976年,R. Pasco和] Rissanen分别用定长的寄存器实现了有限精度的算术编码。1979年Rssnen和G. G Langdon一起将算术编码系统化,并于1981年实现了二进制编码。1987 年Witten等人发表了一个实用的算术编码程序.即CACM87(后用于ITU_T的H.263视频压缩标准)。同期,IBM公司发表了著名的Q编码器(后用于JPEG和JBIG图像压缩标准)。从此,算术编码迅速得到了广泛的注意。

二、算术编码过程

算术编码的基本原理是将编码的消息表示成实数0和1之间的一个同隔(Interval), 消息越长,编码表示它的间隔就越小,表示这一间隔所需的二进制位就越多。
编码步骤:

1.根据二维码中提取的有效文本信息,计算各个信号源出现的频率,将[0, 1)这个区间分成若干段,这样每个信号源就会有自己对应的区间了;

2.将[0.1)这个区间设置为初始间隔;

3.从RFID中提取出来有效信号,共有6组,每组信号长度不等;

4.将待处理的信号,一个一个信号源的读入,每读入一个信号,就将该信号源在[0.1)上的范围等比例的缩小到最新得到的间隔中。

5.然后依次迭代,不断重复进行步骤4,直到该组中信号源全部被读完为止;

6.若通过步骤5计算得到的该组信号的概率区间记为: [n1,n2),则该组信号对应的红外报警器码计算方式为:(n1+n2)*10^x/2)%256 (其中x为各组总的迭代次数,x取值范围1-5)

7.重复步骤4、5、6将6组信号全部处理完成,最终得到红外报警器的六字节开启码。

三、算术编码示例

1.从二维码中提取的有效信息为:A1B2C3D4,则每个信号源出现的概率分别为A:0.1;B: 0.2; C: 0.3; D: 0.4;
2.将[0, 1)这个区间设置为初始间隔,则每个信号源所在的概率区间(在这里我们规定以A、B、C、D的顺序划分概率区间)为:

3.从RFID中提取的6组信号(在这里我们规定,按照数据读取的先后顺序进行排序)分别为:AAB、DCAB、CCB、ABCD、BCA、AC;

4.首先处理第一组信号,将信号源一个一个读入,先读入A.得到概率区间为[0,01);

5.重复步骤4,读入还是A,因为A在初始区间内是占整个区间的前10%, 因此对应的也是占上一次编码间隔的前10%,所以此时编码区间变为: [0,0.01)了;再然后我们读入B,B占整个区间的10%-30%,所以读入之后也占上一个编码区间的10%~30%, 读入之后得到新的编码操作区间为[0.001, 0.003);

6.通过公式计算得到第一组信号的报警码为0x02 (十进制为2);

7.重复步骤4、5、 6将6组信号全部处理完成,最终得到红外报警器的六字节开启码为: 0x02、0x38、 0x98、 0xD0、 0xA3、 0x04

8.附各组信号编码过程:

四、关键分析


设Low和High分别表示“当前间隔”的下边界和上边界,CodeRange为编码间隔的长度,LowRange(symbol)和HighRange(symbol)分别代表为了事件symbol分配的初始间隔下边界和上边界。上述过程的实现可用伪代码描述如下:

set Low to 0

set High to 1

while there are input symbols do

take a symbolCodeRange = High – LowHigh = Low + CodeRange *HighRange(symbol)Low = Low + CodeRange * LowRange(symbol)

end of while

output Low

五、具体代码如下

import org.w3c.dom.ranges.Range;import java.math.BigDecimal;public class Ssbm {//private static Object Range;public static double getIndex(char s){char xinhaos[] = { 'A', 'B', 'C', 'D' };double gsilv[] = {0.1,0.2,0.3,0.4};for (int i = 0;i<xinhaos.length;i++){if (s==xinhaos[i]){//                System.out.println(gsilv[i]);return gsilv[i];}}return 0;}public static double getLow(char s){char xinhaos[] = { 'A', 'B', 'C', 'D' };double gsilv[] = {0.0, 0.1,0.3,0.6};for (int i = 0;i<xinhaos.length;i++){if (s==xinhaos[i]){return gsilv[i];}}return 0;}
//    public static double getLcForLow(char res[]){//        double Lc = 1;
//        for (int i=0;i< res.length-1;i++){//            Lc = Lc * getIndex(res[i]);
//        }
//        return Lc;
//    }public static void getInfos() {String[] rresResult = {"AAB","DCAB","CCB","ABCD","BCA","AC"};for (int i =0;i<rresResult.length;i++){//            String res[] = {"D", "C", "A","B"};char[] res =rresResult[i].toCharArray();double low = 0;double high =1;double codeRange = 0;double LowRange = 0;double range = 1.0;double zwl;//codeRange = getLcForLow(res);for (int j = 0; j < res.length; j++) {LowRange = getLow(res[j]);codeRange = getIndex(res[j]);range = high - low;low = add(low , mul(range,LowRange));high = add(low , mul(range,codeRange));//System.out.println(low);//System.out.println(high);}zwl = mul(add(low , high),Math.pow(10,res.length)/2)%256;String zwll= Integer.toHexString((int) zwl); //十进制转成十六进制System.out.println(zwll);}}public static double mul(double v1,double v2){BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.multiply(b2).doubleValue();}public static double add(double v1,double v2){BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.add(b2).doubleValue();}public static double div(double v1,double v2,int scale){if(scale<0){throw new IllegalArgumentException("The scale must be a positive integer or zero");}BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();}public  static void main(String args[]){//        System.out.println("hello world");//getIndex("B");//getHigh("A");//getLow("D");getInfos();}
}

数据处理方法-算术编码(香农算法、java编码实现)相关推荐

  1. 香农-范诺编码(Shannon–Fano Coding)

    香农-范诺编码 香农-范诺编码 简介 算法 示例 香农-范诺编码 简介 香农-范诺编码(Shannon–Fano Coding)是一种基于一组符号集及其出现的或然率(估量或测量所得),从而构建前缀码的 ...

  2. java实现.费诺编码_香农费诺编码的matlab实现.doc

    香农费诺编码的matlab实现.doc 信息论与编码实验香农费诺编码的matlab实现学院班级-姓名学号摘要 用预先规定的方法将文字.数字或其他对象编成数码,或将信息.数据转换成规定的电脉冲信号.编码 ...

  3. 信息论与编码-python实现三种编码(香农编码,费诺编码,赫夫曼编码)

    香农编码,费诺编码,赫夫曼编码(python实现) 开始参考了网上其他人的代码,但后来都发现要么代码有错误,要么输出结果不符合自己的预期,于是就重新实现了一下,代码仍存在一些小问题,但是能够满足作业要 ...

  4. 香农码字matlab,香农--费诺编码的matlab实现

    香农--费诺编码的matlab实现 信息论与编码实验香农 --费诺编码的 matlab 实现学院:------班级:-----姓名:----学号:----摘要:用 预 先 规 定 的 方 法 将 文 ...

  5. CN_@物理层@信噪比@分贝单位@奈奎斯特定理@香农公式@常用编码方式(曼彻斯特编码/差分曼彻斯特编码)波形图

    文章目录 CN_@信噪比@分贝单位@奈奎斯特定理@香农公式@常用编码方式(曼彻斯特编码/差分曼彻斯特编码)波形图 通信基础概念 数据 (data) 信号 (signal) 基带信号 模拟信号 (ana ...

  6. 香农费诺编码 c语言实现,信息论课程设计(香农、费诺编码)

    <信息论课程设计(香农.费诺编码)>由会员分享,可在线阅读,更多相关<信息论课程设计(香农.费诺编码)(34页珍藏版)>请在人人文库网上搜索. 1.华北科技学院信息论基础课程设 ...

  7. 信息论与编码|香农编码的Matlab实现

    1. 香农编码原理 (1)将信源消息符号按其出现的概率大小依次降序排列为: (2)对概率向上取整求整数码长K (3)为了编成唯一可译码,计算第i个消息的累加概率P (4)将累加概率转换成二进制数 (5 ...

  8. 香农费诺编码 c语言实现,对于香农编码、费诺编码和哈夫曼编码,编码方法惟一的是()。...

    问题标题 对于香农编码.费诺编码和哈夫曼编码,编码方法惟一的是(). 2019-8-15来自ip:15.170.14.227的网友咨询 浏览量:533 手机版 问题补充: 题目类型:[填空题] 对于香 ...

  9. java java编码_5个重视Java编码技能的工作领域

    java java编码 在这篇文章中,我们将重点介绍5个重视Java编码技能的工作领域. 人们常说Java是一种垂死的语言,因为近年来它在全球的使用量一直在稳步下降. 但是,使用量的减少并不一定等于J ...

最新文章

  1. 输入和输出移位寄存器的同步串行模式
  2. python下载教程1001python下载教程-Python知识圈
  3. 试题 F: 特别数的和 第十届蓝桥杯
  4. OO Unit4 UML
  5. 详解tf.nn.dropout
  6. Java中therad_java中Thread的深入了解(一)
  7. nginx配置静态文件过期时间
  8. java8新生代_jdk8.0的jvm详情
  9. CentOS 7安装Development Tools 失败 报错 group tools does not exist. Maybe run: yum groups mark install
  10. char装cstring_VC中char*转换为CString
  11. MyBatis和Hibernate的优缺点对比。
  12. nginx从入门到精通:第一阶段快速入门
  13. 宿舍管理系统 php,基于php的大学生宿舍管理系统
  14. 机器学习之多项式拟合
  15. win10开启虚拟化服务器,win10怎么开启virtualization technology虚拟化技术
  16. Visio导出矢量图转eps格式
  17. Bomb Game(翻译)
  18. CAD显示顺序(com接口)
  19. autojs ui界面漂亮模板2
  20. 实现汽车租赁系统的计价功能

热门文章

  1. Unity Shader 实现简单的宝石渲染
  2. 数据挖掘学习之认识数据
  3. Java字符串反转函数reverse()
  4. C语言解决经典问题约瑟夫环--数组
  5. 背包问题——01背包
  6. Python Socket网络编程(一)初识Socket和Socket初步使用
  7. hide,hidden,display:none,visibility的区别
  8. request库的基本用法
  9. 浏览器搜索去除广告项
  10. 常见内网穿透-花生壳、神卓互联、FRP、ngork分析