linux上用c实现算术编码(三)--算术编码理论讲解

一、算术编码定义

它是一种非分组编码算法。它是从全序列出发,采用递推形式的连续编码。它不是将单个的信源符号映射成一个码字,而是将整个输入序列的符号依据它们的概率映射为实数轴上区间[0 1)内的一个小区间,再在该小区间内选择一个代表性的二进制小数,作为实际的编码输出。

算术编码不同于霍夫曼码,它是非分组(非块)码。它从全序列出发,考虑符号之间的关系来进行编码。

算术编码利用了累积概率的概念。

算术码主要的编码方法是计算输入信源符号序列所对应的区间

因为在编码过程中,每输入一个符号要进行乘法和加法运算,所以称此编码方法为算术编码。

二、算术编码的编码

设输入符号串s取自符号集S={a1,a2,a3,…,am},p(ai)={p1,p2,p3,…,pm},s后跟符号ai扩展成符号串sai,算术编码的迭代关系为:

1)码字刷新:C(sai)=C(s)+P(ai)A(s)

2)区间刷新:A(sai)=p(ai)A(s)

符号累积概率:

初始条件:

三、算术编码的码字计算

通过关于信源符号序列的累积分布函数的计算,把区间分割成许多小区间,不同的信源符号序列对应不同的区间为[F(s),F(s)+P(s)) 。可取小区间内的一点来代表这序列。

编码方法:将符号序列的累积分布函数写成二进位的小数,取小数点后k位,若后面有尾数,就进位到第k位,这样得到的一个数C,并使k满足:

举例:

四、例题

[]假设信源符号为{a,b,
c, d}
,这些符号的概率分别为{
0.1, 0.4, 0.2, 0.3 }
,对输入消息序列cadacdb进行算术编码。

解:根据这些概率可把间隔[0, 1)分成4个子间 
隔:[0, 0.1), [0.1, 0.5), [0.5, 0.7), [0.7, 1)。信息可综合在表中:

编码时首先输入的符号是c,找到它的编码范围是[0.5, 0.7)。由于消息中第二个符号a的编码范围是[0, 0.1),因此它的间隔就取[0.5, 0.7)的第一个十分之一作为新间隔[0.5, 0.52)。依此类推,编码第3个符号d时取新间隔为[0.514, 0.52),… 。消息的编码输出可以是最后一个间隔中的任意数。

我们可以根据码字计算求出:K取17。

进而将最终输出的小数0.5143876转换为二进制:0.10000011101011110

进而最终的结果为:10000011101011110

具体的实现可以参考我的代码,谢谢!!!

时间: 2024-09-30 04:33:01

linux上用c实现算术编码(三)--算术编码理论讲解的相关文章

GIT在Linux上的安装和使用 第三章

. GIT最初是由Linus Benedict Torvalds为了更有效地管理Linux内核开发而创立的分布式版本控制软件,与常用的版本控制工具如CVS.Subversion不同,它不必服务器端软件支持,速度和效率也有着相当程度的提高.如果拥有CVS或者SVN的使用背景,那么更熟悉的方法是客户端-服务器端模式,所有的文件仓库(repository)都是存放在服务器上的,用户需要在本地安装客户端去服务器上的项目中获取旧版本,提交新版本. GIT抛弃了这种模式,当用户从远端GIT仓库下载一个工程(

Windows远程调试Linux上的C++程序:Eclipse+MingW+Samba+GDBserver

转自:http://www.heimizhou.com/windows-remote-debug-linux-c-plus-plus.html 最近有一个需求,就是需要在Windows上远程调试Linux上的C++程序,然后我就从网上搜集各种方法,但是发现很多方法中是先在Windows上编译程序,然后再从Linux上编译程序,最后进行远程调试,这种方法使我的调试不能进入源代码,后来经过尝试发现只需要在Linux上编译程序即可.下面从三个方面:需要安装的软件.安装与配置.配置远程调试,来介绍一下我

linux上用c实现算术编码(一)--具体操作

转载注明出处:http://blog.csdn.net/wang_zheng_kai 让学生用开发工具,练习学到的数据压缩编码 天津工业大学,信电学院 本文包括两部分: linux上用c实现算术编码(二)--具体代码 ubuntu14.04上用C语言实现算术编码(固定) 1.打开ubuntu14.04系统,界面如下: 2.按Ctrl+Alt+t,打开Terminal,执行命令ls查看算术编码的代码fixed_arithmetic.c 3.执行如下命令,编译代码. 4.生成可执行程序fixed_a

linux上用c实现算术编码(二)--具体代码

转载注明出处:http://blog.csdn.net/wang_zheng_kai 让学生用开发工具,练习学到的数据压缩编码 本文包括两部分: linux上用c实现算术编码(一)--具体操作 /********************************* ***Arithmetic coding fixed mode*** *****Writed By Wang Zhengkai****** ***********2014.11.24************* *************

So Easy! Oracle在Linux上的安装配置系列三使用create database创建数据库

本文为So Easy! Oracle在Linux上的安装配置系列的第三篇,使用create database创建数据库,本序列第一篇介绍了学习实验环境的搭建包括:在win 7中使用VMware Workstation 创建虚拟机,安装CentOS-6.6-x86_64,网络配置 和使用xshell连接远程linux服务器,上传Oracle软件和使用操作系统安装光盘搭建本地yum源,第二篇专门说了Oracle11g R2在CentOS6.6上的安装,包括Oracle安装前的准备工作,并以图文详细介

在Linux上实现一个可用的stateless双向静态NAT模块

关于Linux上如何配置NAT的资料已经不少,可谓铺天盖地!本文与此无关.本文提供一种iptables之外的方式.iptables?不!why?因为iptables配置的NAT是stateful的,它的实现依赖一个叫做conntrack的模块,什么是conntrack?Oh,NO!这可是我的专长,但我不想在本文中说它,认识我的人都知道,我扯这个话题我能扯上12个小时...都还扯不完.也许你不知道什么是stateful NAT,但是如果你是一个有心人,或者说是一个技术还算精湛的Linux网络管理员

Linux及安全实践五——字符集编码

Linux及安全实践五——字符集编码 一.ASCII码 在表中查找出英文字母LXQ相对应的十六进制数值为: 4c 58 51 在终端中输入命令:vim test1.txt 在vim页面输入命令:%!xxd 输完之后使用命令:%!xxd -r保存后即可看到如下结果: 退出vim编辑器,在终端输入命令:cat test.txt可以查看到test.txt中的内容 二.gb2312编码 在编码表中查找出李雪琦相对应的十六进制数值为: c0ee d1a9 e7f9 在进行vim编辑的时候,首先将终端的编码

H.264---CABAC---第四步--算术编码

转自:https://www.cnblogs.com/TaigaCon/p/5304563.html 算术编码是基于区间划分的,普通的概率划分需要使用到多位乘法.CABAC的算术编码为了降低计算复杂度,并便于硬件实现,采取了如下一些方法: 总是估计小概率符号LPS(pLPS<0.5pLPS<0.5)的概率,并将其概率离散化成64个不同概率状态.概率估计转换成基于表格的概率状态的转换(见初始化部分的描述). 使用9bit的变量R与10bit的L表示当前区间,其中L为区间的起点,R为区间长度 每当

putty对Linux上传下载文件或文件夹

putty是一个开源软件,目前为止最新版本为0.70.对于文件或文件夹的上传下载,在Windows下它提供了pscp和psftp两个命令. (1).pscp pscp在命令提示符中使用,只要putty(ssh)能够远程,就能使用该命令. pscp [Windows上的路径,可绝对可相对] [Linux用户]@[Linux的IP地址或网络内唯一主机名]:[Linux上存放地址,绝对路径] pscp [Linux用户]@[Linux的IP地址或网络内唯一主机名]:[Linux上存放地址,绝对路径]