第四章:算术编码 算术编码:越来越流行(在很多标准中被采用) 适合的场合: 内容: 自适应模型 QM编码器:自适应二进制编码

Slides:



Advertisements
Similar presentations
2.8 函数的微分 1 微分的定义 2 微分的几何意义 3 微分公式与微分运算法则 4 微分在近似计算中的应用.
Advertisements

四、后期物理复习备考建议 不同阶段复习课教学设计(知识建构)的目的 复习课教学 设计的目的 理 解 · 对某知识的全面、抽 象理解 · 抽象知识和具体情景 的转化 综 合 · 多知识点联合解决问 题 基本素质 · 审题、表达、审视答 案等基本能力 复习 ( 一 ) 复习(二) ☆ ☆☆☆ ☆☆  进行科学规划.
练一练: 在数轴上画出表示下列各数的点, 并指出这些点相互间的关系: -6 , 6 , -3 , 3 , -1.5, 1.5.
德 国 鼓 励 生 育 的 宣 传 画.
第三章 函数逼近 — 最佳平方逼近.
2017/3/16 上 (興) 櫃 公 司 僑外資持股情形申報作業.
小学生游戏.
第二章 數字系統:電腦內部的資料表示法 在第一章中,我們對於電腦有了初步的認識,在深入介紹電腦的各項組成元件之前,首先我們必須先了解另一種不同於人類使用習慣的二進位表示法,由於電腦的半導體、磁性、光學元件適合用來表示二進位,因此二進位表示法非常適合用來設計電腦。
了解太平天国运动的主要史实,认识农民起义在民主革命时期的作用与局限性。
第5章 定积分及其应用 基本要求 5.1 定积分的概念与性质 5.2 微积分基本公式 5.3 定积分的换元积分法与分部积分法
第1节 光的干涉 (第2课时).
第一部分:概率基础 对应教材Chp1-5 可能需要复习本科概率论的相应内容 课堂上讲述会较快,将知识点串起来,建议大家通读教材
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
CH1 Number Systems and Conversion
Introduction To Mean Shift
第三章 多维随机变量及其分布 §2 边缘分布 边缘分布函数 边缘分布律 边缘概率密度.
四川大学 计算机学院 陈 虎 多媒体技术基础 四川大学 计算机学院 陈 虎
Lexicographical order VS canonical order
第三章:Huffman编码 信源概率模型已知的Huffman编码 信源概率模型未知的Huffman编码 Huffman编码中的码字设计
第4章 非线性规划 一维搜索方法 2011年11月.
§2 求导法则 2.1 求导数的四则运算法则 下面分三部分加以证明, 并同时给出相应的推论和例题 .
What have we learned?.
Chapter 2 密碼基礎數學I:模數算數、同餘 與矩陣.
高等数学提高班 (省专升本) 教师: 裴亚萍 数学教研室: 东校区 2118 电话: 长号:
第3章 信息与信息系统 陈恭和.
使用矩阵表示 最小生成树算法.
第十章 模糊图像变换编码 指导教师:高新波 学 生: 王来雄 年 1 2 月.
第一章 函数与极限.
本节内容 字符编码 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
Sorting in Linear Time Michael Tsai 2013/5/21.
习题 一、概率论 1.已知随机事件A,B,C满足 在下列三种情况下,计算 (1)A,B,C相互独立 (2)A,B独立,A,C互不相容
计算机问题求解 – 论题3-2 - 贪心算法 2018年09月18日.
105-1 Data Structure Exam /12/27.
数列.
抽样和抽样分布 基本计算 Sampling & Sampling distribution
学习目标 1、什么是字符集 2、字符集四个级别 3、如何选择字符集.
VII. Data Compression (A)
苏 教 版 五 年 级 数 学(上) 用字母表示数 青阳体仁小学 胡春雅.
概 率 统 计 主讲教师 叶宏 山东大学数学院.
线 性 代 数 厦门大学线性代数教学组 2019年4月24日6时8分 / 45.
5.2 常用统计分布 一、常见分布 二、概率分布的分位数 三、小结.
數字系統 資訊工程系 國立清華大學資訊基礎教育 教學改進計畫 數字系統 資訊工程系 /4/22.
Lightweight Data-flow Analysis for Execution-driven Constraint Solving
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
第4章 Excel电子表格制作软件 4.4 函数(一).
实验三 16位算术逻辑运算实验 不带进位控制的算术运算 置AR=1: 设置开关CN 1 不带进位 0 带进位运算;
第三章 从概率分布函数的抽样 (Sampling from Probability Distribution Functions)
§6.7 子空间的直和 一、直和的定义 二、直和的判定 三、多个子空间的直和.
3.1.2 空间向量的数量积运算 1.了解空间向量夹角的概念及表示方法. 2.掌握空间向量数量积的计算方法及应用.
3.16 枚举算法及其程序实现 ——数组的作用.
1.设A和B是集合,证明:A=B当且仅当A∩B=A∪B
概 率 统 计 主讲教师 叶宏 山东大学数学院.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
第一部分:概率 产生随机样本:对分布采样 均匀分布 其他分布 伪随机数 很多统计软件包中都有此工具 如在Matlab中:rand
第七、八次实验要求.
第15讲 特征值与特征向量的性质 主要内容:特征值与特征向量的性质.
§5.2 抽样分布   确定统计量的分布——抽样分布,是数理统计的基本问题之一.采用求随机向量的函数的分布的方法可得到抽样分布.由于样本容量一般不止2或 3(甚至还可能是随机的),故计算往往很复杂,有时还需要特殊技巧或特殊工具.   由于正态总体是最常见的总体,故本节介绍的几个抽样分布均对正态总体而言.
第二节 函数的极限 一、函数极限的定义 二、函数极限的性质 三、小结 思考题.
难点:连续变量函数分布与二维连续变量分布
第三章 从概率分布函数的抽样 (Sampling from Probability Distribution Functions)
数据表示 第 2 讲.
微机原理与接口技术 西安邮电大学计算机学院 董 梁.
第十七讲 密码执行(1).
第十二讲 密码执行(上).
§4.5 最大公因式的矩阵求法( Ⅱ ).
最小生成树 最优二叉树.
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
《手把手教你学STM32-STemWin》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
学习目标 1、什么是列类型 2、列类型之数值类型.
Hybrid fractal zerotree wavelet image coding
Presentation transcript:

第四章:算术编码 算术编码:越来越流行(在很多标准中被采用) 适合的场合: 内容: 自适应模型 QM编码器:自适应二进制编码 小字母表:如二进制信源 概率分布不均衡 建模与编码分开 内容: 算术编码的基本思想 一些性质 实现 有限精度:区间缩放(浮点数/整数实现) 计算复杂度:用移位代替乘法二进制编码 自适应模型 QM编码器:自适应二进制编码

回顾: Huffman编码 例1:信源的符号数目很少 a b 1 a=0, b=1

回顾:扩展的Huffman编码 例2:信源的符号的概率严重不对称: Huffman编码: 问题:能做得更好吗? A = {a, b, c}, P(a) = 0.95, P(b) = 0.02, P(c) = 0.03 H = 0.335 bits/symbol Huffman编码: a 0 b 11 c 10 l = 1.05 bits/symbol 冗余(Redundancy) = l - H = 0.715 bits/sym (213%!) 问题:能做得更好吗? 1 a b c 例1:信源的符号数目很少

回顾:扩展的Huffman编码 基本思想: 考虑对两个字母序列而不是单个字母编码 l = 1.222/2 = 0.611 Letter Probability Code aa 0.9025 ab 0.0190 111 ac 0.0285 100 ba 1101 bb 0.0004 110011 bc 0.0006 110001 ca 101 cb 110010 cc 0.0009 110000 l = 1.222/2 = 0.611 冗余 = 0.276 bits/symbol (27%)

回顾:扩展的Huffman编码 该思想还可以继续扩展 理论上:考虑更长的序列能提高编码性能 实际上: 考虑长度为n的所有可能的mn 序列 (已做了32) 理论上:考虑更长的序列能提高编码性能 实际上: 字母表的指数增长将使得这不现实 例如:对长度为3的ASCII序列:2563 = 224 = 16M 需要对长度为n的所有序列产生码本 很多序列的概率可能为0 分布严重不对称是真正的大问题: A = {a, b, c}, P(a) = 0.95, P(b) = 0.02, P(c) = 0.03 H = 0.335 bits/symbol l1 = 1.05, l2 = 0.611, … 当n = 8时编码性能才变得可接受 但此时|alphabet| = 38 = 6561 !!!

算术编码(Arithmetic Coding) 算术编码:从另一种角度对很长的信源符号序列进行有效编码 对整个序列信源符号串产生一个唯一的标识( tag ) 直接对序列进行编码(不是码字的串联):非分组码 不用对该长度所有可能的序列编码 标识是[0,1)之间的一个数(二进制小数,可作为序列的二进制编码)

概率复习 随机变量: 用数字代替符号 给定信源的概率模型P 将试验的输出映射到实数 X(ai) = i, 其中 ai  A (A = {ai}, i = 1..n) 给定信源的概率模型P 概率密度函数(probability density function, pdf) 累积密度函数(cumulative density function, cdf)

产生标识 将[0, 1)分为m个区间: 定义一一映射: ak  [FX(k-1), FX(k)], k = 1..m, FX(0) = 0 [FX(k-1), FX(k)]区间内的任何数字表示 ak 对2字母序列ak aj编码 对ak ,选择[FX(k-1), FX(k)] 然后将该区间按比例分割并选取第j个区间:

产生标识:例 考虑对a1a2a3编码: A = {a1, a2, a3}, P = {0.7, 0.1, 0.2) cdf: FX(1) = 0.7, FX(2) = 0.8, FX(3) = 1 .0

映射成实数 A = {a1, a2, …, am} 对公平掷骰子的例子:{1, 2, 3, 4, 5, 6}

词典顺序( Lexicographic order ) 字符串的词典顺序: 其中 表示“在字母顺序中,y在x的前面” n 为序列的长度

词典顺序:例 考虑两轮连续的骰子: 输出 = {11, 12, …, 16, 21, 22, …, 26, …, 61, 62, …, 66} 注意: 为了产生13的标识,我们不必对产生其他标识 但是,为了产生长度为n的字符串的标识,我们必须知道比其短的字符串的概率 这与产生所有的码字一样繁重! 应该想办法来避免此事

区间构造 观察 基本思想 上述骰子的例子: 包含某个标识的区间与所有其他标识的区间不相交 递归:将序列的下/上界视为更短序列的界的函数 考虑序列:3 2 2 令u(n), l(n) 为长度为n序列的上界和下界,则 u(1) = FX(3), l(1) = FX(2) u(2) = FX(2)(32), l(2) = FX(2)(31)

区间构造

区间构造

产生标识 通常,对任意序列x = x1x2…xn 只需知道信源的cdf,即信源的概率模型 算术编码:编码和解码过程都只涉及算术运算(加、减、乘、除)

产生标识:例 考虑随机变量X(ai) = i 对序列1 3 2 1编码: 1 132 1321 13

解码标识 Algorithm Initialize l(0) = 0, u(0) = 1. For each i, i = 1..n Compute t*=(tag-l(k-1))/(u(k-1)-l(k-1)). Find the xk: FX(xk-1)  t*  FX(xk). Update u(n), l(n) If done--exit, otherwise goto 1.

解码:例 1321 Algorithm Initialize l(0) = 0, u(0) = 1. Compute t*=(tag-l(k-1))/(u(k-1)-l(k-1)). Find the xk: FX(xk-1)  t*  FX(xk). Update u(k), l(k) If done--exit, otherwise goto 1. 1 132 13 1321

算术编码的唯一性和效率 上述产生的标识可以唯一表示一个序列,这意味着该标识的二进制表示为序列的唯一二进制编码 但二进制表示的精度可以是无限长:保证唯一性但不够有效 为了保证有效性,可以截断二进制表示,但如何保证唯一性? 答案:为了保证唯一性和有效性,需取小数点后l位数字作为信源序列的码字,其中 注意:P(x)为最后区间的宽度,也是该符号串的概率 符合概率匹配原则:出现概率较大的符号取较短的码字,而对出现概率较小的符号取较长的码字

算术编码的唯一性和效率 长度为n的序列的算术编码的平均码长为: 算术编码的效率高:当信源符号序列很长,平均码长接近信源的熵

实现 迄今为止 观测:当区间变窄时 已有能工作的编码/解码算法 假设实数(无限精度) 我们需要对字符串增量式编码 最终l(n) 和u(n) 将集中到一起 我们需要对字符串增量式编码 观测:当区间变窄时 [l(n), u(n)]  [0, 0.5), 或 [l(n), u(n)]  [0.5, 1), 或 l(n)  [0, 0.5), u(n)  [0.5, 1). 先集中处理1. & 2,稍后再讨论3 算术编码以渐增( incremental )的方式实现,即信源符号逐个送入编码器,逐步精化区间。 随着信源符号长度的增加,区间的宽度越来越小,表示该区间需要的位数越来越多,带来所谓的精度问题。正是该问题使得算术编码一直没有实用化,直到上个世纪70年代末解决这个问题后,算术编码才变得成一种越来越重要的编码技术。

实现 编码器: 解码器 一旦我们到达1. 或2.,就可以忽略[0,1)的另一半 还需要告知解码器标识所在的半区间: 发送0/1 比特用来指示下上界所在区间 将标识区间缩放到[0, 1): E1: [0, 0.5) => [0, 1); E1(x) = 2x E2: [0. 5,1) => [0, 1); E2(x) = 2(x-0.5) 注意:在缩放过程中我们丢失了最高位 但这不成问题—我们已经发送出去了 解码器 根据0/1比特并相应缩放 与编码器保持同步

标识产生:带缩放的例子 考虑随机变量X(ai) = i 对序列1 3 2 1编码: Input: 1321 Output:

标识产生:带缩放的例子 Input: --21 Output: 11 Input: ---1 Output: 1100

标识产生:带缩放的例子 EOT: [l(n),u(n)]区间内的任何一个数字 在此选 0.510 = 0.12 Input: ---1 Output: 110001 Input: ---1 Output: 110001 Input: ---1 Output: 110001 EOT: [l(n),u(n)]区间内的任何一个数字 在此选 0.510 = 0.12 Output: 11000110… 注意:0.1100011 = 2-1+2-2+2-6+2-7= 0.7734375  [0.7712,0.77408]

增量式标识解码 我们需要增量式解码 问题 如:网络传输 如何开始? 怎样继续? 如何结束? 必须有足够的信息,可以对第一个字符无歧义解码  接收到的比特数应比最小标识对应的区间更小 怎样继续? 一旦有一个非歧义的开始,只要模拟编码器即可 如何结束?

标识解码:例 假设码字长为6 0.1100012 = 0.76562510 第1位:1 输入:110001100000 Output: 1 Input: -10001100000 (0.546875) Input: 110001100000 Output: 132 Output: 13 Input: --0001100000 (左移) Input:-10001100000 (左移) Input: ---001100000 (左移)

标识解码:例 此时解码最后一个符号 Input: -----100000 Input: ----01100000 (左移) Output: 1321 Input: -----100000 (左移)

第三种情况:E3 回忆三种情况 E3 缩放 编码 规则:记录E3 连续的次数,并在输出下一个E2/E1 之后发送该次数 [l(n), u(n)]  [0, 0.5): E1: [0, 0.5) => [0, 1); E1(x) = 2x [l(n), u(n)]  [0.5, 1): E2: [0. 5, 1) => [0, 1); E2(x) = 2(x-0.5) l(n)  [0, 0.5), u(n)  [0.5, 1): E3(x) = ??? E3 缩放 E3: [0.25, 0.75) => [0, 1); E3(x) = 2(x-0.25) 编码 E1 = 0, E2 = 1, E3 = ??? 注意: E3 … E3 E1 = E1 E2 … E2 E3 … E3 E2 = E2 E1 … E1 规则:记录E3 连续的次数,并在输出下一个E2/E1 之后发送该次数 若为第3种情况,接下来的两位数值必然相反:01/10 如果下一位为0,将High降到Half之下,则必然要将[0,Half)  [0,1),则接下来的一位肯定为1 也可能要经过多次缩放,则后面跟多位相反的位,如1 000 证明请见文献: Witten, Radford, Neal, Cleary, “Arithmetic Coding for Data Compression” Communications of the ACM, vol. 30, no. 6, pp. 520-540, June 1987.

第三种情况:E3

整数实现 假设码字长度为n,则 ni = 长度为TotalCount(TC) 的序列中字符i出现的次数 累积计数:CC

整数实现 MSB(x) = Most Significant Bit of x LSB(x) = Least Significant Bit of x SB(x, i) = ith Significant Bit of x MSB(x) = SB(x, 1); LSB(x) = SB(x, m) E3(l, u) = (SB(l, 2) == 1 && SB(u, 2) == 0)

整数编码器 l=00…0, u=11…1, e3_count=0 repeat x=get_symbol l=l+ (u-l+1)CC(x-1)/TC // lower bound update u=l+ (u-l+1)CC(x)/TC-1 // upper bound update while(MSB(u)==MSB(l) OR E3(u,l)) // MSB(u)=MSB(l)=0  E1 rescaling if(MSB(u)==MSB(l)) // MSB(u)=MSB(l)=1  E2 rescaling send(MSB(u)) l = (l<<1)+0 // shift left, set LSB to 0 u = (u<<1)+1 // shift left, set LSB to 1 while(e3_count>0) send(!MSB(u)) // encode accumulated E3 rescalings e3_count-- endwhile endif if(E3(u,l)) // perform E3 rescaling & remember l = (l<<1)+0 u = (u<<1)+1 complement MSB(u) and MSB(l) e3_count++ until done

整数编码器:例 序列:1 3 2 1 Count {1, 2, 3} = {40, 1, 9} Total count TC = 50 Cumulative count CC {0, 1, 2, 3} = {0, 40, 41, 50} 记住:区间的终点不会重叠 n = ? 最小的[l(n),u(n)] =整个范围内的1/4,仍能区分0..TC 的最小区间: => 28 x ¼ > 50/1 => 最小 n = 8 (28 = 256) l=00…0, u=11…1, e3_count=0 repeat x=get_symbol l=l+ (u-l+1)CC(x-1)/TC u=l+ (u-l+1)CC(x)/TC-1 while(MSB(u)==MSB(l) OR E3(u,l)) if(MSB(u)==MSB(l)) send(MSB(u)) l = (l<<1)+0 u = (u<<1)+1 while(e3_count>0) send(!MSB(u)) e3_count-- endwhile endif if(E3(u,l)) complement MSB(u) and MSB(l) e3_count++ until done

整数编码器:例 Input: 1321 Output: Input: -321 Output: 1 l=00…0, u=11…1, e3_count=0 repeat x=get_symbol l=l+ (u-l+1)CC(x-1)/TC u=l+ (u-l+1)CC(x)/TC-1 while(MSB(u)==MSB(l) OR E3(u,l)) if(MSB(u)==MSB(l)) send(MSB(u)) l = (l<<1)+0 u = (u<<1)+1 while(e3_count>0) send(!MSB(u)) e3_count-- endwhile endif if(E3(u,l)) complement MSB(u) and MSB(l) e3_count++ until done Input: 1321 Output: Input: -321 Output: 1

整数编码器:例 e3_count = 1 Input: --21 Output: 110 l=00…0, u=11…1, e3_count=0 repeat x=get_symbol l=l+ (u-l+1)CC(x-1)/TC u=l+ (u-l+1)CC(x)/TC-1 while(MSB(u)==MSB(l) OR E3(u,l)) if(MSB(u)==MSB(l)) send(MSB(u)) l = (l<<1)+0 u = (u<<1)+1 while(e3_count>0) send(!MSB(u)) e3_count-- endwhile endif if(E3(u,l)) complement MSB(u) and MSB(l) e3_count++ until done Input: --21 Output: 110

整数编码器:例 Input: ---1 Output: 1100 Input: ---1 Output: 11000 Input: ---1 l=00…0, u=11…1, e3_count=0 repeat x=get_symbol l=l+ (u-l+1)CC(x-1)/TC u=l+ (u-l+1)CC(x)/TC-1 while(MSB(u)==MSB(l) OR E3(u,l)) if(MSB(u)==MSB(l)) send(MSB(u)) l = (l<<1)+0 u = (u<<1)+1 while(e3_count>0) send(!MSB(u)) e3_count-- endwhile endif if(E3(u,l)) complement MSB(u) and MSB(l) e3_count++ until done Input: ---1 Output: 11000 Input: ---1 Output: 110001

整数编码器:例 Input: ---1 Output: 1100010 Input: ---1 e3_count = 1 l=00…0, u=11…1, e3_count=0 repeat x=get_symbol l=l+ (u-l+1)CC(x-1)/TC u=l+ (u-l+1)CC(x)/TC-1 while(MSB(u)==MSB(l) OR E3(u,l)) if(MSB(u)==MSB(l)) send(MSB(u)) l = (l<<1)+0 u = (u<<1)+1 while(e3_count>0) send(!MSB(u)) e3_count-- endwhile endif if(E3(u,l)) complement MSB(u) and MSB(l) e3_count++ until done Input: ---1 e3_count = 1

整数编码器:例 结束 通常,发送l(4): (00000000)2 但是 e3_count = 1,因此 Input: ---1 Output: 1100010 l=00…0, u=11…1, e3_count=0 repeat x=get_symbol l=l+ (u-l+1)CC(x-1)/TC u=l+ (u-l+1)CC(x)/TC-1 while(MSB(u)==MSB(l) OR E3(u,l)) if(MSB(u)==MSB(l)) send(MSB(u)) l = (l<<1)+0 u = (u<<1)+1 while(e3_count>0) send(!MSB(u)) e3_count-- endwhile endif if(E3(u,l)) complement MSB(u) and MSB(l) e3_count++ until done 结束 通常,发送l(4): (00000000)2 但是 e3_count = 1,因此 在发送l(4)的第一个‘0’后发送‘1’ 最后 output: 1100010010000000

整数解码器 Initialize l, u, t // t = first n bits repeat k=0 while( ((t-l+1)TC-1)/(u-l+1)  CC(k) k++ x = decode_symbol(k) l=l+ (u-l+1)CC(x-1)/TC u=l+ (u-l+1)CC(x)/TC-1 while(MSB(u)==MSB(l) OR E3(u,l)) if(MSB(u)==MSB(l)) // Perform E1/E2 rescaling of l,u,t l = (l<<1)+0 // add 0 to the right of l u = (u<<1)+1 // add 1 to the right of u t = (t<<1)+next_bit endif if(E3(u,l)) // Perform E3 rescaling of l,u,t l = (l<<1)+0 u = (u<<1)+1 complement MSB(u), MSB(l), MSB(t) endwhile until done

整数解码器:例 Input: 1100010010000000 Output: 1 Output: 13 Initialize l, u, t repeat k=0 while( (t-l+1)CC(x-1)/TC  CC(k) k++ x = decode_symbol(k) l=l+ (u-l+1)CC(x-1)/TC u=l+ (u-l+1)CC(x)/TC-1 while(MSB(u)==MSB(l) OR E3(u,l)) if(MSB(u)==MSB(l)) l = (l<<1)+0 u = (u<<1)+1 t = (t<<1)+next_bit endif if(E3(u,l)) complement MSB(u), MSB(l), MSB(t) endwhile until done Output: 13

整数解码器:例 Input: 1100010010000000 Initialize l, u, t repeat k=0 while( (t-l+1)CC(x-1)/TC  CC(k) k++ x = decode_symbol(k) l=l+ (u-l+1)CC(x-1)/TC u=l+ (u-l+1)CC(x)/TC-1 while(MSB(u)==MSB(l) OR E3(u,l)) if(MSB(u)==MSB(l)) l = (l<<1)+0 u = (u<<1)+1 t = (t<<1)+next_bit endif if(E3(u,l)) complement MSB(u), MSB(l), MSB(t) endwhile until done Input: 1100010010000000 Input: 1100010010000000

整数解码器:例 结束 Output: 132 Output: 1321 已解码接收到了预定数目的字符,或 接收到EOT Initialize l, u, t repeat k=0 while( (t-l+1)CC(x-1)/TC  CC(k) k++ x = decode_symbol(k) l=l+ (u-l+1)CC(x-1)/TC u=l+ (u-l+1)CC(x)/TC-1 while(MSB(u)==MSB(l) OR E3(u,l)) if(MSB(u)==MSB(l)) l = (l<<1)+0 u = (u<<1)+1 t = (t<<1)+next_bit endif if(E3(u,l)) complement MSB(u), MSB(l), MSB(t) endwhile until done Output: 132 Output: 1321 结束 已解码接收到了预定数目的字符,或 接收到EOT

算术编码 vs. Huffman编码 n = 序列长度 平均码长: 观察 算术: 扩展Huffman: 二者的积渐近性质相同 扩展的Huffman要求巨大数量的存储和编码mn 而算术编码不用  实际应用中可以对算术编码假设较大的长度n 但 Huffman不可  我们期望算术编码表现更好(除了当概率为2的整数次幂的情况)

算术编码 vs. Huffman编码 增益为字母表大小和分布的函数 很容易将算术编码扩展到多个编码器 不均衡的分布更适合算术编码 很容易将算术编码扩展到多个编码器 QM编码器 很容易将算术编码适应到统计变化模型(自适应模型、上下文模型) 不必对树重新排序 可以将建模与编码分开

应用:图像压缩 自适应算术编码: 对像素值 自适应算术编码: 对像素差分 Image Bits/pixel Image Bits/pixel Ratio Arithmetic Huffman Sena 6.52 1.23 1.16 Sensin 7.12 1.12 1.27 Earth 4.67 1.71 1.67 Omaha 6.84 1.17 1.14 自适应算术编码: 对像素值 Image Bits/pixel Ratio Arithmetic Huffman Sena 3.89 2.06 2.08 Sensin 4.56 1.75 1.73 Earth 3.92 2.04 Omaha 6.27 1.28 1.26 自适应算术编码: 对像素差分

自适应算术编码 算术编码很容易与自适应建模相结合。 统计编码技术需要利用信源符号的概率,获得这个概率的过程称为建模。不同准确度(通常也是不同复杂度)的模型会影响算术编码的效率。 建模的方式: 静态建模:在编码过程中信源符号的概率不变。但一般来说事先知道精确的信源概率是很难的,而且是不切实际的。 自适应动态建模:信源符号的概率根据编码时符号出现的频繁程度动态地进行修改。当压缩消息时,我们不能期待一个算术编码器获得最大的效率,所能做的最有效的方法是在编码过程中估算概率。 算术编码很容易与自适应建模相结合。

自适应算术编码 自适应算术编码: 在编码之前,假设每个信源符号的频率相等(如都等于1),并计算累积频率 从输入流中读入一个字符,并对该符号进行算术编码 更新该符号的频率,并更新累积频率 由于在解码之前,解码器不知道是哪个信源符号,所以概率更新应该在解码之后进行 对应的,编码器也应在编码后进行概率更新

自适应算术编码 为了提高解码器的搜索效率,信源符号的频率、累积频率表按符号出现频率降序排列 在自适应算术编码中,可以用平衡二叉树来快速实现对频率和累积频率的更新 平衡二叉树可用数组实现(类似Huffman编码中的堆) 最可能出现的符号安排在根附近,从而平均搜索的次数最小 详见《数据压缩原理与应用》第2.15节

自适应算术编码 例:信源符号及其出现频率为: 数组下标: 1 2 3 4 5 6 7 8 9 10 信源符号: 频率: 辅助变量: 1 2 3 4 5 6 7 8 9 10 信源符号: 频率: 辅助变量: 辅助变量为该节点左子树的总计数,用于计算累积频率 例:计算a6 的累积频率 得到从节点10(a6)到根节点的路径: 10 5  2 1 a6  a1 a2a8 2. 令 af=0, 沿树枝从根节点向节点10(a6) 1) 取根节点的左分支到子节点a2,af不变 2) 取节点a2的右分支到到节点a1 , 将该节点的两个数值加到af af = af + 12 + 16 = 28 2)取节点a1的左分支到到节点a6后 ,将其左子树计数0加至af,最后af=28为累积频率区间的起点

自适应算术编码 数组下标: 1 2 3 4 5 6 7 8 9 10 信源符号: 频率: 辅助变量: 频率、累积频率表: a4 2 1 2 3 4 5 6 7 8 9 10 信源符号: 频率: 辅助变量: 频率、累积频率表: a4 2 [0,2) a9 12 [2,14) a7 [14,16) a2 [16,28) a6 1 [28,29) a1 11 [29,40) a8 19 [40,59) a10 8 [59,67) a3 [67,79) a5 5 [79,84)

自适应算术编码 在平衡二叉树上更新频率: 例:读进符号a9,将其频率计数从12变为13 在数组中寻找符号a9的左边、离a9最远的、频率小于a9的元素,同时更新左子树计数值

总结 直接对序列进行编码(不是码字的串联):非分组码 可证明是唯一可译码 渐近接近熵界 对不均衡的分布,比Huffman更有效 只产生必要的码字 但是实现更复杂 允许将建模和编码分开,容易与自适应模型和上下文模型结合 对错误很敏感,如果有一位发生错误就会导致整个消息译码错误

下节课内容 作业: 下节课内容: Sayood 3rd, pp.114-115 必做:5, 6, 7, 8 下节课内容: JPEG、JPEG2000和JBIG中的算术编码: QM编码器

History The idea of encoding by using cumulative probability in some ordering, and decoding by comparison of magnitude of binary fraction was introduced in Shannon’s celebrated paper [1948]. The recursive implementation of arithmetic coding was devised by Elias (another member in Fano’s first information theory class at MIT). This unpublished result was first introduced by Abramson as a note in his book on information theory and coding [1963]. The result was further developed by Jelinek in his book on information theory [1968]. The growing precision problem prevented arithmetic coding from practical usage, however. The proposal of using finite precision arithmetic was made independently by Pasco [1976] and Rissanen [1976].

History Practical arithmetic coding was developed by several independent groups [Rissanen 1979, Rubin 1979, Guazzo 1980]. A well-known tutorial paper on arithmetic coding appeared in [Langdon 1984]. The tremendous efforts made in IBM lead to a new form of adaptive binary arithmetic coding known as the Q-coder [Pennebaker 1988]. Based on the Q-coder, the activities of JPEG and JBIG combined the best features of the various existing arithmetic coders and developed the binary arithmetic coding procedure known as the QM-coder [pennebaker 1992].

Reading W. B. Pennebaker, J. L. Mitchell, G. G. Langdon, Jr., R. B. Arps, “An overview of the basic principles of the Q-Coder adaptive binary arithmetic coder,” IBM J. Res. Develop., vol. 32, no. 6, November 1988. Witten, Radford, Neal, Cleary, “Arithmetic Coding for Data Compression” Communications of the ACM, vol. 30, no. 6, pp. 520-540, June 1987. Moffat, Neal, Witten, “Arithmetic Coding Revisited,” ACM Transactions on Information Systems, vol. 16, vo. 3, pp. 256–294, July 1998.

附:产生随机样本 产生随机样本:对分布采样 均匀分布 其他分布 伪随机数 很多统计软件包中都有此工具 如在Matlab中:rand 直接方法:概率积分变换 通过对均匀分布的采样实现对任意分布的采样 间接方法: 接受/拒绝算法(重要性采样) MCMC方法

概率积分变换 例:[概率积分变换] X有连续CDF ,定义随机变量Y为 ,则Y为[0,1]上的均匀分布,即 对随机数产生特别有用

1.0 0.5

概率积分变换 X有连续严格递增的CDF ,定义随机变量Y为 ,则Y为[0,1]上的均匀分布,即 令 则

对任意分布采样 通过对均匀分布采样,实现对任意分布的采样 从 随机产生一个样本y 令 ,其中 为X的CDF 计算 结果 为对 的采样

对任意分布采样

对任意分布采样 例:对指数分布采样

变形 若X为离散型随机变量,其取值为 则可以通过以下方式产生随机样本 定义 例:为了从 产生一个随机样本,从 产生一个随机样本y,则 若 ,令 定义 例:为了从 产生一个随机样本,从 产生一个随机样本y,则