算术编码

算术编码
算术编码

实验三算术编码

一、实验目的

1、复习C++语言基本编写方法,熟悉VC编程环境。

2、复习算术编码基本流程, 学会调试算术编码编码程序。

3、根据给出资料,自学自适应0阶算术编、解码方法。

二、实验内容

1.复习C++代码基本语法(类和虚函数等面向对象数据结构定义)

2.根据实验提供的源代码,学习算术编码实现流程,培养实际动手调试能力和

相应的编程技巧。

三、实验仪器、设备

1.计算机-系统最低配置256M 内存、P4 CPU。

2.C++ 编程软件-Visual C++ 7.0 (Microsoft Visual Studio 2003)

Visual C++ 8.0 (Microsoft Visual Studio 2005)

四、实验原理

1.算术编码基本原理是将编码消息表示成实数0 和1 之间的一个间隔,消息

越长,编码表示它的间隔就越小,表示这一间隔所需的二进制位就越多。算术编码用到两个基本的参数:符号的概率和它的编码间隔。信源符号的概率决定压缩编码

的效率,也决定编码过程中信源符号的间隔,而这些间隔包含在0 到1 之间。编码

过程中的间隔决定了符号压缩后的输出。如何解压缩呢?那就更简单了。解压缩之前仍然假定三个字符的概率相等。解压缩时面对的是二进制流 1010001111,先在前面加上 0 和小数点把它变成小数0.1010001111,也就是十进制 0.64。这时我们发现 0.64 在分布图中落入字符 b 的区间内,立即输出字符 b,并得出三个字符新的概率分布。类似压缩时采用的方法,我们按照新的概率分布划分字符 b 的区间。在新的划分中,我们发现 0.64 落入了字符c 的区间,我们可以输出字符 c。同理,我们可以继续输出所有的字符,完成全部解压缩过程。

2.小数存储方法

如果信息内容特别丰富,我们要输出的小数将会很长很长,该如何在内存中表

示如此长的小数呢?其实,没有任何必要在内存中存储要输出的整个小数。从上面

的例子可以知道,在编码的进行中,会不断地得到有关要输出小数的各种信息。具

体地讲,当我们将区间限定在 0.6390 - 0.6501 之间时,我们已经知道要输出的小数第一位(十进制)一定是 6,那么我们完全可以将 6 从内存中拿掉,接着在区间

0.390 - 0.501 之间继续我们的压缩进程。内存中始终不会有非常长的小数存在。

使用二进制时也是一样的,我们会随着压缩的进行不断决定下一个要输出的二进制

位是 0 还是 1,然后输出该位并减小内存中小数的长度,具体可以参考E1/E2/E3

放大原理,及它们之间关系的描述。

3.静态模型与自适应模型

1)静态模型

对信息 bccb 我们统计出其中只有两个字符,概率分布为 Pb = 0.5,Pc = 0.5。在压缩过程中不必再更新此概率分布,每次对区间的划分都依照此分布即可,对上例

也就是每次都平分区间。这样,压缩过程可以简单表示为:

输出区间的下限输出区间的上限

------------------------------------------------------------------------

压缩前 0.0 1.0

输入 b 0.0 0.5

输入 c 0.25 0.5

输入 c 0.375 0.5

输入 b 0.375 0.4375

最后的输出区间在 0.375 - 0.4375 之间,甚至连一个十进制位都没有确定,

也就是说,整个信息根本用不了一个十进制位。

2)自适应模型

既然使用静态模型可以很好地接近熵值,为什么还要采用自适应模型呢?要知

道,静态模型无法适应信息多样性,另外还有最重要的一点,对较长的信息,静态模型统计出的符号概率是该符号在整个信息中的出现概率,而自适应模型可以统计出某个符号在某一局部的出现概率或某个符号相对于某一上下文的出现概率,换句话说,自适应模型得到的概率分布将有利于对信息的压缩(可以说结合上下文的自适应模型的信息熵建立在更高的概率层次上,其总熵值更小),好的基于上下文的自适应模型得到的压缩结果将远远超过静态模型。

3)自适应模型的阶

通常用“阶”(order)这一术语区分不同的自适应模型。前面例子中采用的是 0

阶自适应模型,该例子中统计的是符号在已输入信息中的出现概率,没有考虑任何上下文信息。如果我将模型变成统计符号在某个特定符号后的出现概率,那么,模型就成为了 1 阶上下文自适应模型。举个例子要对一篇英文文本进行编码,已经编码了 10000 个英文字符,刚刚编码的字符是 t,下一个要编码的字符是 h。我们在前面的编码过程中已经统计出前 10000 个字符中出现了 113 次字母 t,其中有 47 个 t 后面跟着字母 h。我们得出字符 h 在字符 t 后的出现频率是 47/113,我们使用这一频率对字符 h 进行编码,需要 -log2(47/113) = 1.266 bit。对比 0 阶自适应模型,如果前 10000 个字符中 h 的出现次数为 82 次,则字符 h 的概率是82/10000,我们用此概率对 h 进行编码,需要 -log2(82/10000) = 6.930 bit。考虑上下文因素的优势显而易见。还可以进一步扩大这一优势,例如要编码字符 h 的前两个字符是 gt,而在已经编码的文本中 gt 后面出现 h 的概率是 80%,那么我们只需要 0.322 bit 就可以编码输出字符 h。此时,使用的模型叫做 2 阶上下文自适应模型。最理想的情况是采用 3 阶自适应模型。此时,如果结合算术编码,对信息的压缩效果将达到惊人的程度。采用更高阶的模型需要消耗的系统空间和时间至少在目前还无法让人接受,使用算术压缩的应用程序大多数采用 2 阶或 3 阶的自适应模型。

五、实验步骤

项目文件建立步骤同实验二,下面列出对给定序列的算术编码步骤:

步骤1:编码器在开始时将“当前间隔”[ L,H) 设置为[0,1)。

步骤2:对每一事件,编码器按步骤(a)和(b)进行处理

(a)编码器将“当前间隔”分为子间隔,每一个事件一个。

(b)一个子间隔的大小与下一个将出现的事件的概率成比例,编码器选择子间

隔对应于下一个确切发生的事件相对应,并使它成为新的“当前间隔”。

步骤3:最后输出的“当前间隔”的下边界就是该给定事件序列的算术编码。

六,实验代码

// Ac_algo.cpp : 定义控制台应用程序的入口点。

//

#include "stdafx.h"

#include "ModelOrder0C.h"

using namespace std;

// signature: "ACMC" (0x434D4341, intel byte order)

const int g_Signature = 0x434D4341;

int __cdecl main(int argc, char *argv[])

{

cout << "Arithmetic Coding" << endl;

if( argc != 3 )

{

cout << "Syntax: AC source target" << endl;

return 1;

}

fstream source, target;

ModelI* model;

// choose model, here just order-0

model = new ModelOrder0C;

source.open( argv[1], ios::in | ios::binary );

target.open( argv[2], ios::out | ios::binary );

if( !source.is_open() )

{

cout << "Cannot open input stream";

return 2;

}

if( !target.is_open() )

{

cout << "Cannot open output stream";

return 3;

}

unsigned int signature;

source.read(reinterpret_cast(&signature),sizeof(signature));

if( signature == g_Signature )

{

cout << "Decoding " << argv[1] << " to " << argv[2] << endl;

model->Process( &source, &target, MODE_DECODE );

}

else

{

cout << "Encoding " << argv[1] << " to " << argv[2] << endl;

source.seekg( 0, ios::beg );

target.write( reinterpret_cast(&g_Signature),

sizeof(g_Signature) );

model->Process( &source, &target, MODE_ENCODE );

}

source.close();

target.close();

return 0;

}

八、思考题

能否根据算法流程和C++源代码写出Matlab 下算术编码程序?

算术编码

实现算术编码及其译码 一、实验内容 借助C++编程来实现对算术编码的编码及其译码算法的实现 二、实验环境 1.计算机 2.VC++6.0 三、实验目的 1.进一步熟悉算术编码的原理,及其基本的算法; 2.通过编译,充分对于算术编码有进一步的了解和掌握; 3.掌握C++语言编程(尤其是数值的进制转换,数值与字符串之间的转换 等) 四、实验原理 算术编码 算术编码的基本原理是将编码的消息表示成实数0和1之间的一个间隔,消息越长,编码表示它的间隔就越小,表示这一间隔所需的二进制位就越多。 算术编码用到两个基本的参数:符号的概率和它的编码间隔。信源符号的概率决定压缩编码的效率,也决定编码过程中信源符号的间隔,而这些间隔包含在0到1之间。编码过程中的间隔决定了符号压缩后的输出。 给定事件序列的算术编码步骤如下: (1)编码器在开始时将“当前间隔”设置为[0,1)。 (2)对每一事件,编码器按步骤(a)和(b)进行处理 (a)编码器将“当前间隔”分为子间隔,每一个事件一个。 (b)一个子间隔的大小与下一个将出现的事件的概率成比例,编码器选择子间隔对应于下一个确切发生的事件相对应,并使它成为新的“当前间 隔”。 (3)最后输出的“当前间隔”的下边界就是该给定事件序列的算术编码。 编码过程 假设信源符号为{A, B, C, D},这些符号的概率分别为{ 0.1, 0.4, 0.2,0.3 },根据这些概率可把间隔[0, 1]分成4个子间隔:[0, 0.1], [0.1, 0.5],

[0.5, 0.7], [0.7, 1],其中[x,y]表示半开放间隔,即包含x不包含y。上面的信息可综合在表03-04-1中。 下表为信源符号,概率和初始编码间隔 如果二进制消息序列的输入为:C A D A C D B。编码时首先输入的符号是C,找到它的编码范围是[0.5,0.7]。由于消息中第二个符号A的编码范围是[0,0.1],因此它的间隔就取[0.5, 0.7]的第一个十分之一作为新间隔[0.5,0.52]。依此类推,编码第3个符号D时取新间隔为[0.514, 0.52],编码第4个符号A 时,取新间隔为[0.514, 0.5146],…。消息的编码输出可以是最后一个间隔中的任意数。整个编码过程如图03-04-1所示。 编码和译码的全过程分别表示在下表。 编码过程

多媒体技术基础试题

多媒体技术基础及应用试题(一)1.单项选择题(每小题2分,共20分) 1.下列说法不正确的是()。 A.熵压缩法会减少信息量 B.熵压缩法是有损压缩法 C.熵压缩法可以无失真地恢复原始数据 D.熵压缩法的压缩比一般都较大 2.在数字音频信息获取与处理过程中,下列顺序正确的是()。 A.A/D变换,采样,压缩,存储,解压缩,D/A变换 B.采样,压缩,A/D变换,存储,解压缩,D/A变换 C.采样,A/D变换,压缩,存储,解压缩,D/A变换 D.采样,D/A变换,压缩,存储,解压缩,A/D变换3.某音频信号的采样频率为44.1kHz,每个样值的比特数是8位,则每秒存储数字音频信号的字节数是()。 A.344.531k B.43.066k C.44.1k D.352.8k 4.全电视信号主要由()组成。 A.图像信号、同步信号、消隐信号 B.图像信号、亮度信号、色度信号 C.图像信号、复合同步信号、复合消隐信号 D.图像信号、复合同步信号、复合色度信号 5.下列说法不正确的是()。 A.预测编码是一种只能针对空间冗余进行压缩的方法 B.预测编码是根据某一模型进行的 C.预测编码需将预测的误差进行存储或传输 D.预测编码中典型的压缩方法有DPCM、ADPCM 6.国际标准MPEG—II采用了分层的编码体系,提供了四种技术,它们是()。 A.空间可扩展性;信噪比可扩充性;框架技术;等级技 术 B.时间可扩充性;空间可扩展性;硬件扩展技术;软件 扩展技术 C.数据分块技术;空间可扩展性;信噪比可扩充性;框 架技术 D.空间可扩展性;时间可扩充性;信噪比可扩充性;数 据分块技术 7.如果按三个色差信号B-Y,R-Y,G-Y来传输彩色全电视信号,会造成()失真。 A.幅度 B.传输 C.色彩 D.图像 8.人们在实施音频数据压缩时,通常应综合考虑的因素有()。 A.音频质量、数据量、音频特性 B.音频质量、计算复杂度、数据量 C.计算复杂度、数据量、音频特性 D.音频质量、计算复杂度、数据量、音频特性 9.彩色可用()来描述。 A.亮度,饱和度,色调 B.亮度,饱和度,颜色 C.亮度,对比度,颜色 D.亮度,色调,对比度 10.帧频率为25帧/秒的制式为()。 A.PAL、NTSC B.PAL、SECAM C.SECAM、NTSC D.PAL、YUV 二、多项选择题(每小题3分,共15分) 1.多媒体计算机的发展趋势是()。 A.进一步完善计算机支持的协同工作环境CSCW B.智能多媒体技术 C.把多媒体信息实时处理和压缩编码算法作到CPU芯 片中 D.多媒体创作工具极其丰富 2.音频卡的核心,是声音的合成与处理,它由以下几部分组成()。 A.数字声音处理器 B.混合信号处理器 C.功率放大器 D.FM音乐合成器 E.MIDI控制器 3.下列会议系统属于点对点视频会议系统的是()。 A.可视电话 B.桌面视频会议系统 C.会议室型视频会议系统 D.MCU视频会议系统 4.下面列出的卡中,属于视频采集卡的有()。 A.Video Blaster SE100 B.MegaMotion C.Media Magic ISP-16 D.Intel Smart Video Recorder Pro 5.三个重要的有关视频图像压缩编码的国际标准是()。 A.JPEG标准 B.H.261标准 C.H.320标准 D.AIF E.MPEG标准 一、单项选择题(每小题1分,共10分) 1.C 2.C 3.B 4.C 5.A 6.D 7.A 8.B 9.A 10.B

算术编码工作原理

算术编码工作原理 在给定符号集和符号概率的情况下,算术编码可以给出接近最优的编码结果。使用算术编码的压缩算法通常先要对输入符号的概率进行估计,然后再编码。这个估计越准,编码结果就越接近最优的结果。 例: 对一个简单的信号源进行观察,得到的统计模型如下: ?60% 的机会出现符号中性 ?20% 的机会出现符号阳性 ?10% 的机会出现符号阴性 ?10% 的机会出现符号数据结束符. (出现这个符号的意思是该信号源'内部中止',在进行数据压缩时这样的情况是很常见的。当第一次也是唯一的一次看到这个符号时,解码器就知道整个信号流都被解码完成了。) 算术编码可以处理的例子不止是这种只有四种符号的情况,更复杂的情况也可以处理,包括高阶的情况。所谓高阶的情况是指当前符号出现的概率受之前出现符号的影响,这时候之前出现的符号,也被称为上下文。比如在英文文档编码的时候,例如,在字母Q 或者q出现之后,字母u出现的概率就大大提高了。这种模型还可以进行自适应的变化,即在某种上下文下出现的概率分布的估计随着每次这种上下文出现时的符号而自适应 更新,从而更加符合实际的概率分布。不管编码器使用怎样的模型,解码器也必须使用同样的模型。 一个简单的例子以下用一个符号串行怎样被编码来作一个例子:假如有一个以A、B、C三个出现机会均等的符号组成的串行。若以简单的分组编码会十分浪费地用2 bits 来表示一个符号:其中一个符号是可以不用传的(下面可以见到符号B正是如此)。为此,这个串行可以三进制的0和2之间的有理数表示,而且每位数表示一个符号。例如,“ABBCAB”这个串行可以变成0.011201(base3)(即0为A, 1为B, 2为C)。用一个定点二进制数字去对这个数编码使之在恢复符号表示时有足够的精度,譬如 0.001011001(base2) –只用了9个bit,比起简单的分组编码少(1 – 9/12)x100% = 25%。这对于长串行是可行的因为有高效的、适当的算法去精确地转换任意进制的数字。 编码过程的每一步,除了最后一步,都是相同的。编码器通常需要考虑下面三种数据: ?下一个要编码的符号 ?当前的区间(在编第一个符号之前,这个区间是[0,1), 但是之后每次编码区间都会变化) ?模型中在这一步可能出现的各个符号的概率分布(像前面提到的一样,高阶或者自适应的模型中,每一步的概率并不必须一样) 编码其将当前的区间分成若干子区间,每个子区间的长度与当前上下文下可能出现的对应符号的概率成正比。当前要编码的符号对应的子区间成为在下一步编码中的初始区间。

算术编码的C实现

算术编码的C++实现 #include #include #include #include using namespace std; #define N 50 //输入的字符应该不超过50个 struct L //结构用于求各字符及其概率 { char ch; //存储出现的字符(不重复) int num; //存储字符出现的次数 double f;//存储字符的概率 }; //显示信息 void disp(); //求概率函数,输入:字符串;输出:字符数组、字符的概率数组;返回:数组长度; int proba(string str,char c[],long double p[],int count); //求概率的辅助函数 int search(vector arch,char,int n); //编码函数,输入:字符串,字符数组,概率数组,以及数组长度;输出:编码结果 long double bma(char c[],long double p[],string str,int number,int size); //译码函数,输入:编码结果,字符串,字符数组,概率数组,以及它们的长度;输出:字符串 //该函数可以用于检测编码是否正确 void yma(string str,char c[],long double p[], int number,int size,long double input); int main() { string str; //输入要编码的String类型字符串 int number=0,size=0; //number--字符串中不重复的字符个数;size--字符串长度char c[N]; //用于存储不重复的字符 long double p[N],output; //p[N]--不重复字符的概率,output--编码结果 disp(); cout<<"输入要编码的字符串:"; getline(cin,str); //输入要编码的字符串 size=str.length(); //字符串长度 number=proba(str,c,p,size);//调用求概率函数,返回不重复字符的个数 cout.setf(ios::fixed); //“魔法配方”规定了小数部分的个数 cout.setf(ios::showpoint); //在此规定编码结果的小数部分有十个 cout.precision(10); output=bma( c, p, str, number, size);//调用编码函数,返回编码结果 yma(str,c, p, number, size, output); //调用译码函数,输出要编码的字符串, //以验证编码是否正确 return 0;

算术编码与解码

算术编码与解码 1、编码过程 算术编码方法是将被编码的一则消息或符号串(序列)表示成0和1之间的一个间隔(Interval),即对一串符号直接编码成[0,1]区间上的一个浮点小数。符号序列越长,编码表示它的间隔越小,表示这一间隔所需的位数就越多。信源中的符号序列仍然要根据某种模式生成概率的大小来减少间隔。可能出现的符号概率要比不太可能出现的符号减少范围小,因此,只正加较少的比特位。 在传输任何符号串之前,0符号串的完整范围设为[0,1]。当一个符号被处理时,这一范围就依据分配给这一符号的那一范围变窄。算术编码的过程,实际上就是依据信源符号的发生概率对码区间分割的过程。 输入:一个字符串 输出:一个小数 考虑某条信息中可能出现的字符仅有a b c 三种,要压缩保存的信息为bccb。 假设对a b c 三者在信息中的出现概率一无所知(采用自适应模型),暂时认为三者的出现概率相等,也就是都为1/3,将0 - 1 区间按照概率的比例分配给三个字符,即a 从0.0000 到0.3333,b 从0.3333 到0.6667,c 从0.6667 到 1.0000。用图形表示就是: +-- 1.0000 | Pc = 1/3 | | +-- 0.6667 | Pb = 1/3 | | +-- 0.3333 | Pa = 1/3 | | +-- 0.0000 对于第一个字符b,选择b 对应的区间0.3333 - 0.6667。这时由于多了字符b,三个字符的概率分布变成:Pa = 1/4,Pb = 2/4,Pc = 1/4。再按照新的概率分布比例划分0.3333 - 0.6667 这一区间,划分的结果可以用图形表示为: +-- 0.6667 Pc = 1/4 | +-- 0.5834 | | Pb = 2/4 | | | +-- 0.4167 Pa = 1/4 | +-- 0.3333 接着字符c,上一步中得到的 c 的区间0.5834 - 0.6667。新添了c 以后,三个字符的概率分布变成Pa = 1/5,Pb = 2/5,Pc = 2/5。用这个概率分布划分区间0.5834 - 0.6667: +-- 0.6667 | Pc = 2/5 | | +-- 0.6334 | Pb = 2/5 | | +-- 0.6001 Pa = 1/5 | +-- 0.5834 现在输入下一个字符c,三个字符的概率分布为:Pa = 1/6,Pb = 2/6,Pc = 3/6。划分c 的区间0.6334 - 0.6667: +-- 0.6667 | | Pc = 3/6 | | | +-- 0.6501 | Pb = 2/6 | | +-- 0.6390 Pa = 1/6 | +-- 0.6334 输入最后一个字符b,因为是最后一个字符,不用再做进一步的划分了,上一步中得到的 b 的区间为0.6390 - 0.6501,好,让我们在这个区间内随便选择一个容易变成二进制的数,例如0.64,将它变成二进制0.1010001111,去掉前面没有太多意义的0 和小数点,我们可以输出1010001111,这就是信息被压缩后的结果,我们完成了一次最简单的算术压缩过程。我的代码: publicstaticvoidBianMa(String info,StringDeal sd){ int i = 0, j = 0; //定义上下限 double low = 0, high = 1; double count = sd.getCount(); //定义初始各字符频率 double[] zifu = new double[(int)(count)]; for(i = 0;i < zifu.length;i++){ zifu[i] = 1;

简单短序列的算术编码的MATLAB实现

简单短序列的算术编码的MATLAB实现 正确实现的算术编码算法压缩能力Shannond定理描述的理论极限,是目前已知的压缩能力最强的无损压缩算法。 不过,由于算术编码算法的实现比较复杂,使用它作为默认压缩算法的应用程序还相当少。在Unix平台上非常流行的bzip2(这个工具有命令行模式的Windows版本)使用的就是经过修改的算术编码算法。 目前为止还没有使用算术编码作为默认压缩算法的Windows应用程序,WinRAR和WinIMP能够支持bzip2的解压。除此之外,在最新的JPEG标准中也用到了经过修改的算术编码压缩算法,但JPEG所用的那种算法受专利保护,因此使用时必须获得授权。 在之后的文章会很好的研究这个算法的实现: 现在给出一个简单的实例:

运行过程如下:

%I=imread('001.bmp') %imshow(I); clear I=[3 3 1 1 3 3 1 2;2 3 3 1 3 2 3 2;1 2 3 3 3 3 1 2]; %I=[1 1 1 1 0 0 1 0 1 1 1 0]; [m,n]=size(I); % 第一列为灰度值,第二列为个数,第三列为概率百分数,应该也可以用imhist table = tabulate(I(); % 注意的是,tabulate要求I的元素必须为非负整数 % 否则,以采用如下方法求解 % 如[1 2 3;1 2 2],则统计出结果1是2个,2是3个,3是1个 % sortM=sort(M(); % uniqueM=([diff(sortM);1]>0); % count = [sortM(uniqueM) diff(find([1;uniqueM]))] % 即color,p如下所示 color = table(:,1)'; p = table(:,3)'/100; % 计算上下限 csump = cumsum(table(:,3)'); allLow =[0,csump(1:end-1)/100]; allHigh = csump/100; numberlow = 0; numberhigh = 1; for k = 1:m for kk = 1:n data = I(k,kk); low = allLow(data==color); high = allHigh(data==color); range = numberhigh-numberlow; tmp = numberlow; numberlow = tmp+range*low; numberhigh = tmp+range*high; end

转 算术编码算法的分析与实现

转算术编码算法的分析与实现 [转]算术编码算法的分析与实现2011-06-09 14:20本论文题目:算术编码算法的分析与实现,作者:叶叶,于2010年10月16日在编程论坛上发表。页面地址:。本论文全文及相关配套程序可以在上述页面中下载。请尊重他人劳动成果,转载或引用时请注明出处。 目录 1前言2 2理论2 2.1编码2 2.2解码3 3改进4 3.1整数运算4 3.2正规化5 4实现8 4.1编码8 4.2解码10 4.3统计模型11 5分析12 6结束语12 参考文献13 附录13 算术编码算法的分析与实现 作者:叶叶(网名:yeye55) 摘要:分析了算术编码的理论基础,着重介绍WNC算法的实现方式。详细讨论了算术编码原理、正规化操作、WNC算法代码实现等技术。给出了一个切实可行的应用程序。 关键词:算术编码;正规化;Delphi 中图分类号:TP301.6 1前言 早在1948年C.E.Shannon提出信息论[1]的时候,就提出了算术编码的思想。但是经过多年的研究,许多学者认为算术编码是无法实现的。算术编码要求进行无限精度的实数运算,这在仅能进行有限精度运算的计算机系统上是无法进行的。随着研究的深入,终于在1987年Ian H.Witten、Radford M.Neal和John G.Cleary发表了一篇论文[2],提出了一种基于整数运算的算术编码实现算法。该算法后来被命名为CACM87,并应用于ITU-T的H.236视频编码标准。也有学者根据作者姓名将该算法称之为WNC算法。WNC算法是一个实用性算法,它可以应用在许多方面。在Witten等人的论文[2]中给出了一个使用C语言编写的WNC算法实现程序的源代码(以下简称"WNC源代码")。在许多时候,WNC源代码已经作为算术编码的范本程序

H.264标准的特点及应用

H.264标准的特点及应用 随着人类精神需求和空间需求的提升,人们不再满足面对面的语言交流,空间距离的增加导致人们面对面的语言交流变得越来越少,人们更需要在时空中交流与交往。当传统的交流方式难以实现时,更需要视觉、感观以及信息交流。正因为如此,促进了卫星通信、微波通信、有线/无线传输技术的发展,也推动信息压缩技术和宽带传输技术,同时推动了安防业的迅猛发展。视频信息传输和视频通讯的猛增,给视频压缩技术带来了很大挑战。无论是互联网还是无线网络,都需要一种新型的压缩算法,新算法要求高压缩比,且能适应不同的网络环境。以较小的失真、较高的压缩比、更小的花费、较低的码率在信道中传递视频,进行多媒体通信是今后视频压缩技术研究的一个方向。 H.264,又称MPEG-4part10,也称AVC(AdvancedVideoCoding),是一个数字视频压缩标准,由 VCEG(ITU-TVideoCodingExpertsGroup)和MPEG(ISO/IECMovingPictureExpertsGroup)联合组成的 JVT(JointVideoTeam)于2003年3月正式发布[1,2]。H.264标准的主要目标就是在同等保真条件下,提高编码效率。这是一对矛盾,既然要求图像不失真,则图像传输的比特数就大,在网络带宽一定的情况下,图像信号传输的速度就快,因此,只有提高编码效率才能实现。 H.264的源起 在以往众多的视频编码算法中,被广泛认可并应用于实际的是ISO/IEC制定的MPEG-X和ITU-T制定的H.26x两大系列视频编码国际标准。 H.261是早期的编码标准,主要是规范ISDN网上的会议电视和可视对讲。它采用的是可减少时间冗余的帧间预测和减少空间冗余的DCT变换的混合编码方法,以及ISDN信道匹配,其输出码率是P×64kbit/s。P较小时,传输清晰度不太高的图像;P较大时,可以传输清晰度较好的会议电视图像。 H.263是低码率图像压缩标准,在技术上是H.261的改进和扩充,且支持码率小于64kbit/s的应用。后期263+、263++已能支持全码率应用,支持众多图像,可看出,其支持多格式图像信息传输,如Sub-QCIF、QCIF、CIF、4CIF、16CIF等格式。 MPEG-1标准的码率为1.2mbit/s,可实现30帧/sCIF(352×288)图像传输,它与H.261和H.263相似,也采用运动补偿的帧间预测、二维DCT及VLC游程编码等措施。此外还引入帧内帧(I)、预测帧(P)、双向预测帧(B)和直流帧(D)等概念,进一步提高了编码效率。在MPEG-1的基础上,MPEG-2将针对提高分辨率、兼容数字电视方面做一些改进。 从编码方面知,MPEG-4标准编码技术是简单档次(SimpleProfile),比如Microsoft的WindowsMediaPlayer就是这种档次的媒体系统。这种传统的编码技术因为基于对象编码的难点就是对象的提取,所以影响实用进程。从传输方面分析,目前流行的基于MPEG-4的流媒体技术其本质上没有采用14496-6所提出的传输多媒体集成框架(DMLF),而是根据IEIF提出的传输建议来实现的,还不成熟,目前可实际应用的编码技术仍然是基于帧编码的技术。H.261、H.263、MPEG-1/2/4都是在尽可能低的码率(存储容量)下获得尽可能好的图像质量。目前,H.264标准被广泛应用于有线/无线视频远程监控、网络交互媒体、数字电视及视频会议等等。 H.264的关键技术及优势

多媒体计算机技术期末复习

一、填空题: 1、国际电报电话咨询委员会(CCITT,目前已被ITU取代)曾对媒体作过如下分类: (1)感觉媒体:直接作用于人的感官、使人能直接产生感觉。 (2)表示媒体:为了加工、处理和传输感觉媒体而人为研究、构造出来的一种数据类型。 (3)表现媒体:指感觉媒体和用于通信的电信号相互转换用的物理手段或设备。 (4)存储媒体:用于存放表示媒体,以便计算机随时处理、加工和调用信息编码。 (5)传输媒体:用来将媒体从一处传送到另一处的物理载体。 2、(感觉媒体)指能直接作用于人的感官、使人能直接产生感觉的一类媒体。 3、(表示媒体)是为了加工、处理和传输感觉媒体而人为研究、构造出来的一种数据类型。 4、(表现媒体)是指感觉媒体和用于通信的电信号相互转换用的物理手段或设备。 5、(存储媒体)用于存放表示媒体(感觉媒体数字化后的代码),以便计算机随时处理、加工和调用信息编码。 6、(传输媒体)是用来将媒体从一处传送到另一处的物理载体。 7、多媒体技术有时被简称为(多媒体),或(多媒体计算机技术)。 8、人类获取的信息主要是通过(视觉)获取的。 9、DPCM系统中的误差来源是发送端的量化器,而与接收端(无)关。 10、预测编码主要是在(时)域上进行,变换编码则利用频域中能量较集中的特点,在(频)域(变换域)上进行。 11、Huffman编码/算术编码是(可逆[无失真])编码。 12、MPEG音频压缩后的比特流可以按(4)种模式之一支持单声道或(双声道)。 13、MPEG算法允许编码选择I图像的(频率)和位置。 14、基于块的(运动补偿)技术,就是在其(参照)帧中寻找符合—定条件限制、当前被预测块的最佳匹配块。 15、为了适应不同应用的要求,并保证数据的可交换性,MPEG-2 Video定义了不同的功能档次,每个档次又分为几个(功能档次、等级和规 范)。 16、一般情况下,对细节多、运动部分少的图像在(帧)内进行DCT,而细节少、运动分量多的图像在(场)内进行DCT。 17、MPEG算法编码过程和解码过程是一种非(镜像)对称算法,解码过程要比编码过程相对(简单)些。 18、目前市场上流行的MPEG软解压软件有哪些?答:金山解霸、豪杰超级解霸、Xing等。 19、与同期硬盘相比,单片光盘容量比硬盘略(小)。 20、光盘的用户容量比格式化容量要(少)。 21、光盘存储数据采用EFM编码,即将1字节的8位编码为 (14 ) 位的光轨道位。 22、CD-DA即激光唱盘常采用(常线速)伺服方式。 23、激光唱盘的每秒的音频数据分为(75)个扇区。 24、Video CD标准是目前流行的视频光盘标准,它描述一个使用(CD-ROM)格式和(MPEG1)标准的数字电视播放系统。 25、实践中常用的多媒体功能卡有:(声卡、视频卡和图形加速卡)。 26、声卡可选择多种声源(麦克风、CD唱机、线路)输入。 27、(MIDI)是一种电子乐器之间、电子乐器与电脑之间的统一交流协议。 28、目前主要的声音合成手段有:(FM合成和波表合成)。(FM合成)多用于以前的ISA声卡; 波表合成是现在最先进的声音合成方法,它的合成原理要比FM合成复杂得多。 29、如果一首MIDI乐曲中的复音数超过了声卡的复音数,则将丢失某些声部,但一般不会丢失(主旋律)。 30、声音采样位数越(高),采样精度越(高)。 31、声音采样频率越(高),记录声音的波形就越(准确),保真度就越高,但采样产生的数据量也越(大),要求的存储空间也越(多)。 32、声卡复音数越 (大 ),音色就越好,播放MIDI时可以听到的声部越多、越细腻。 33、目前PC 视频采集卡通常采用32位的(PCI)总线接口,插到PC机主板的扩展槽中,以实现采集卡与PC机的通讯与数据传输。 34、低档视频采集卡通过PC机上的(声卡)获取数字化的伴音并把伴音与采集到的数字视频同步到一起。 35、可以把国际标准JPEG或MPEG算法集成在一块(视频处理)芯片上。 36、高性能的视频采集卡一般具有一个( 采集卡)接口和一个S-Video接口,以便与模拟视频设备相连。 37、一般的采集卡都支持(NTSC)和(PAL)两种电视制式。(NTSC,PAL,SECAM) 38、一般的PC视频采集卡采用帧内压缩的算法把数字化的视频存储成( AVI)文件。 39、视频采集卡一般都配有( 图形加速卡 )以控制和操作采集过程。 40、画面刷新率(Frame Rate)即显示器上图像画面的更新速度,单位为FPS或帧每秒。 41、凹凸贴图(Bump Mapping)是一种在3D场景中模拟粗糙表面的技术。 42、常见的3D贴图有:材质3D贴图、Mip贴图、凹凸贴图、视频材质贴图。

算术编码算法的Matlab实现

实验1 算术编码算法的Matlab实现 实验学时:2 实验类型:(演示、验证、综合、√设计、研究) 实验要求:(√必修、选修) 一、实验目的 掌握算数编码原理。 二、实验内容 利用Matlab编写程序实现算数编码,包括: 1、对文件符号进行概率统计,生成编码表; 2、对文件进行压缩编码; 3、(选做)对文件进行解压缩,比较原始数据和解压后的数据之间是否有损耗。 三、实验仪器 1、计算机一台; 2、Matlab仿真软件。 四、实验原理 算术编码的编码对象是一则消息或一个字符序列,其编码思路是将该消息或字符序列表示成0和1之间的一个间隔(Interval)上的一个浮点小数。 在进行算术编码之前,需要对字符序列中每个字符的出现概率进行统计,根据各字符出现概率的大小,将每个字符映射到[0,1]区间上的某个子区间中。然后,再利用递归算法,将整个字符序列映射到[0,1]区间上的某个Interval中。在进行编码时,只需从该Interval中任选一个小数,将其转化为二进制数。 符号序列越长,编码表示它的Interval的间隔就越小,表示这一间隔所需的二进制位数就越多,编码输出的码字就越长。 五、实验步骤 对字符序列“state_tree”进行算术编码的步骤如下:

1、对文件符号“state_tree”进行概率统计,生成编码表; 2、初始化时,被分割范围的初始值是[0,1],即被分割范围的下限为low=0,上限为high =1,该范围的长度为range_length=high-low =1。 3、对消息的第一字符s进行编码,如果s的概率范围的下限为Low=,上限为High=, 则下一个被分割范围的下限和上限分别为: next_low=low+range_length×Low=0+1×=; next_ high=low+range _length×High =0+1×=; low=next_low=,high=next_high=; range _length = high-low =; s将分割范围从[0,1]变成了[,]。 4、重复上述步骤,依次对字符t,a,t,e,_t,r,e,e进行编码; 5、编码结束,将最终得到的编码结果从一个十进制小数值转化为二进制数,从而得到 最终的编码码字。 算术编码算法的解码过程步骤如下: 1、将最终的算数编码结果(十进制小数值)与之前得到的编码表进行对比,确 定与该数值对应的概率范围,从而解码出字符序列的第一个字母。 2、利用公式(number-range_low)/range=>number_next进行解码,直到整个字符 序列解码完毕。其中number为字符序列的当前编码,number_next为下一步解码时的字符序列编码。 六、实验报告 1、对文件符号“state_tree”进行概率统计,得出编码表;

H264标准的主要特点如下

H264标准的主要特点如下: 1.更高的编码效率:同H.263等标准的特率效率相比,能够平均节省大于50%的码率。 2.高质量的视频画面:H.264能够在低码率情况下提供高质量的视频图像,在较低带宽上提供高质量的图像传输是H.264的应用亮点。 3.提高网络适应能力:H.264可以工作在实时通信应用(如视频会议)低延时模式下,也可以工作在没有延时的视频存储或视频流服务器中。 4.采用混合编码结构:同H.263相同,H.264也使用采用DCT变换编码加DPCM的差分编码的混合编码结构,还增加了如多模式运动估计、帧内预测、多帧预测、基于内容的变长编码、4x4二维整数变换等新的编码方式,提高了编码效率。 5.H.264的编码选项较少:在H.263中编码时往往需要设置相当多选项,增加了编码的难度,而H.264做到了力求简洁的“回归基本”,降低了编码时复杂度。 6.H.264可以应用在不同场合:H.264可以根据不同的环境使用不同的传输和播放速率,并且提供了丰富的错误处理工具,可以很好的控制或消除丢包和误码。 7.错误恢复功能:H.264提供了解决网络传输包丢失的问题的工具,适用于在高误码率传输的无线网络中传输视频数据。 8.较高的复杂度:264性能的改进是以增加复杂性为代价而获得的。据估计,H.264编码的计算复杂度大约相当于H.263的3倍,解码复杂度大约相当于H.263的2倍。 H.264标准的关键技术 1.帧内预测编码 帧内编码用来缩减图像的空间冗余。为了提高H.264帧内编码的效率,在给定帧中充分利用相邻宏块的空间相关性,相邻的宏块通常含有相似的属性。因此,在对一给定宏块编码时,首先可以根据周围的宏块预测(典型的是根据左上角的宏块,因为此宏块已经被编码处理),然后对预测值与实际值的差值进行编码,这样,相对于直接对该帧编码而言,可以大大减小码率。 H.264提供6种模式进行4×4像素宏块预测,包括1种直流预测和5种方向预测,如图2所示。在图中,相邻块的A到I共9个像素均已经被编码,可以被用以预测,如果我们选择模式4,那么,a、b、c、d4个像素被预测为与E相等的值,e、f、g、h4个像素被预测为与F相等的值,对于图像中含有很少空间信息的平坦区,H.264也支持16×16的帧内编码。图2 帧内编码模式 2.帧间预测编码 帧间预测编码利用连续帧中的时间冗余来进行运动估计和补偿。H.264的运动补偿支持以往的视频编码标准中的大部分关键特性,而且灵活地添加了更多的功能,除了支持P帧、B帧外,H.264还支持一种新的流间传送帧——SP帧,如图3所示。码流中包含SP帧后,能在有类似内容但有不同码率的码流之间快速切换,同时支持随机接入和快速回放模式。图3 SP-帧示意图H.264的运动估计有以下4个特性。 (1)不同大小和形状的宏块分割

编程实现算术编码算法

编程实现算术编码算法 中国地质大学计算机学院信息安全专业 信息论实验报告 实验三算术编码 一、实验内容 编程实现算术编码算法 二、实验环境 1.计算机 2.Windows 2000或以上 3.DEVC++ 三、实验目的 1.进一步熟悉算术编码算法; 2.掌握C语言编程(尤其是数值的进制转换,数值与字符串之间的转换等) 四、实验要求 1.提前预习实验,认真阅读实验原理。 2.认真高效的完成实验,实验过程中服从实验室管理人员以及实验指导老师的管理。 3.认真填写实验报告。 五、实验原理 算术编码是把一个信源表示为实轴上0和1之间的一个区间,信源集合中的每一个元素都用来缩短这个区间。

1.算法流程 (1)输入信源符号个数,信源概率分布,还有需要编码的符号序列,(2)根据概率可以算出初始编码间隔, High——当前编码的上限, Low——当前编码的下限, high——中间变量,用来计算下一个编码符号的当前间隔的上限,low——中间变量,用来计算下一个编码符号的当前间隔的下限,d——当前间隔之间的距离。 (3)扫描需编码的符号序列,确定编码空间 第1个编码符号的当前间隔为其初始的编码间隔, 第i个编码符号的当前间隔为第i-1个编码后的[Low,High),第i+1个编码符号的当前间隔算法如下:high=Low+d*第i+1个初始编码符号对应的上限,low=Low+d*第i+1个编码符号对应的下限,然后High=high,Low=low,d=d*第i 个编码符号的概率。 六、参考书 1.《信息论——基础理论及应用》傅祖芸,电子工业出版社 七、源代码 #include #include #include const double proc[]={0.10,0.10,0.10,0.1,0.1,0.1,0.1,0.1,0.15,0.05}; double result,areaBegin,areaEnd; int cord[1000],cordLength;

数字图像处理和算术编码

数字图像处理课程设计 题目:数字图像处理及算术编码 (或D C T压缩编码)仿真实现学生姓名: 学院:信息工程学院 系别:电子信息工程系 专业:电子信息工程 班级:电子09-2班 指导教师:韩建峰辛莉 2012 年 12月 17 日 数字图像处理课程设计 1、课程设计目的 通过本课程设计使学生了解数字图像的基本概念,掌握数字图像处理的基本内容,如图像点运算、几何变换、增强处理、图像复原、边缘检测以及图像压缩等的基本原理和Matlab实现方法。 通过本次课程设计,让学生掌握如何学习一门语言,如何进行资料查阅搜集,如何自己解决问题等方法,养成良好的学习习惯。扩展理论知识,培养学生的综合设计能力。 2、课程设计内容 2.1 图像处理基本功能 1)数字图像的变换:普通傅里叶变换(ft)与逆变换(ift)、快速傅里叶变 换(fft)与逆变换(ifft)、离散余弦变换(DCT),小波变换。

2) 数字图像直方图的统计及绘制等; 2.2 图像处理综合功能 1)图像平滑算法程序设计: 2)DCT压缩(保留不同系数),要求显示原图像、压缩后图像的文件大小、压缩比或算术编码压缩 3、课程设计的一般步骤 1)选题与搜集资料:选择课题,进行系统调查,搜集资料。 2)分析与设计:根据搜集的资料,进行功能分析,并对系统功能与模块划分等设计。 3)程序设计:运用掌握的语言,编写程序,实现所设计的功能。 4)调试与测试:自行调试程序,同学之间交叉测试程序,并记录测试情况。 5)验收与评分:指导教师对每个成员开发的程序进行综合验收,结合设计报告,根据课程设计成绩的评定方法,评出成绩。 4、要求 4.1总体要求 1、要充分认识课程设计对培养自己的重要性,认真做好设计前的各项准 备工作。尤其是对编程软件的使用有基本的认识。 2、既要虚心接受老师的指导,又要充分发挥主观能动性。结合课题, 独立思考,努力钻研,勤于实践,勇于创新。 3、独立按时完成规定的工作任务,不得弄虚作假,不准抄袭他人内容, 否则成绩以不及格计。 4、在设计过程中,要严格要求自己,树立严肃、严密、严谨的科学态 度,必须按时、按质、按量完成课程设计。 4.2 课程设计报告的内容及要求 在完成课题验收后,学生应在规定的时间内完成课程设计报告一份,报告的内容和要求如下: 1.目的与要求 这部分主要说明本课程设计的目的、任务和要求; 2.设计的内容 根据指导书的讲述,介绍系统中所设计的主要功能和原理方法; 3.各个功能的实现程序及结果 附各个功能的实现程序,需要在程序中做适当的注释,附处理前后效果图。 5.测试和调试 按课程设计要求,选用多幅图像(自己的照片)对程序进行测试,并提供系统的主要功能实现的效果图。并在调试中发现的问题做说明。 6.课程设计总结与体会

算术编码与哈夫曼编码

安徽大学 本科毕业论文(设计、创作)题目:哈夫曼编码与算术编码压缩效率比较 学生姓名:李伟学号:E20714134 院(系):计算机科学与技术专业:软件工程 入学时间:2007年9月 导师姓名:韩莉职称/学位:讲师/硕士 导师所在单位:安徽大学计算机科学与技术学院 完成时间:2011年5月

哈夫曼编码与算术编码压缩效率比较 摘要 算术编码和哈夫曼编码都利用信源符号的概率分布特性进行编码,使平均码长逼近信息熵是压缩编码算法的第一要求,算术编码比哈夫曼编码逼近信息熵的能力要强,但是编码效率和实现往往是一对矛盾,编码效率的提高,往往要在实现上付出代价,所以,选择压缩算要权衡这两点。本论文开篇先引入了信息论的一些概念,因为编码理论发源于信息论,是各种编码算法的数学基础。然后在第2章分析了算术编码原理,并从无限精度的算术编码原理过渡到在计算机上能够实现的二进制编码原理。在第3章紧接着介绍了哈夫曼编码原理,并讨论了怎样把信源符号映射为对应的码字,过程中用到的哈夫曼编码表是编码与解码的关键。在第4章对两者的编码效率作了比较,主要是结合信息论中的一些概念从微观上对两者逼近信息熵的能力作了比较,并在这章最后对两者在文本文件的压缩效果的表现上给出了一些实验结果。最后,在5章,主要是对前面内容做了些补充和总结。 关键词:信息熵;算术编码;哈夫曼编码;编码效率

The comparison of Huffman Coding and Arithmetic Coding in File Compression Abstract Full use of the probability distribution of source symbols is the feature of the arithmetic encoding and Huffman encoding. Approaching the average code length to the information entropy come first when designing a compression algorithm. To the capacity of closing to information entropy, arithmetic encoding is stronger than Huffman encoding. However, the coding efficiency and implementation is often a contradiction: to improve coding efficiency, which means the algorithm implementation process needs to pay a higher price. Therefore, you need to weigh both when choosing a compression algorithm. In the beginning of this thesis, it first introduced some of the concepts of information theory. Because encoding algorithms are derived from information theory and information theory is the mathematical foundation of various coding algorithms. Then in Chapter 2, it introduces the principle of arithmetic coding. For better to understand the binary arithmetic coding principle, it first introduces the unlimited precision arithmetic coding. In Chapter 3, it describes the Huffman coding theory, and discusses how to map source symbol to the corresponding code word, among which Huffman coding and decoding table is the key. In Chapter 4, the coding efficiency of the two algorithms is compared. Mainly compare the capacities to approximate information entropy with some of the concepts in information theory. And the final part in this chapter, some experimental results are given to show the compression effect to compress a text file. Finally, in Chapter 5, it gives some additions and summary. Keywords:Information Entropy; Arithmetic Coding; Huffman Coding;Coding Efficiency

相关文档
最新文档