Featured Post

视频序列中运动对象分割方法的设计与实现

Read More

摘  要    I ABSTRACT    II 第一章 绪论    1 1.1    研究背景与意义    1 1.2 国内外研究状况    3 1.3论文内容与结构安排    4 第二章  典型的图像分割方法    6 2.1阈值法与边缘检测法    6 2.1.1阈值法    6 2.1.2边缘检测法  ...

基于字典编码的数据压缩算法的研究与实现

Posted by 天际的荒草 | Posted in Docs | 文档 | Posted on 19-09-2009

标签:, , , , ,

0

目录

摘要 I
ABSTRACT II
第一章 绪论 1
1.1研究背景和意义 1
1.2数据压缩简介 1
1.3论文的研究内容 2
1.4研究方向和研究目的 3
第二章 字典压缩编码相关技术研究 4
2.1 LZ系列字典压缩编码技术分析 4
2.2 LZ系列字典压缩编码分支算法的分析和相互比较 6
2.2.1 LZ77算法的分析和研究 7
2.2.2 LZ78算法的分析和研究 8
2.2.3 LZW算法的分析及其与LZ78算法的比较 10
第三章 压缩编码软件的设计和实现 13
3.1压缩编码软件设计任务概述及设计思路 13
3.2压缩编码软件关键技术的实现 14
3.2.1 HASH表的实现 14
3.2.2 二分搜索法的实现 15
3.3压缩编码软件中压缩算法外功能的具体实现 16
3.3.1压缩编码软件系统功能的实现 16
3.3.2压缩编码软件文件调用的实现 17
3.4压缩编码软件中压缩算法的实现 17
3.4.1字典压缩编码LZ77算法总体设计 17
3.4.2字典压缩编码LZW算法总体应用设计 21
3.4.3 VC++中算法的实现 26
第四章 压缩编码软件实现说明及结果分析 30
4.1压缩软件的执行及其说明 30
4.2压缩软件实现结果的分析 33
4.3压缩软件改进的措施 35
第五章 结束语 36
5.1总结 36
5.2展望 37
参考文献 38
致谢 39

摘要

21世纪信息化时代到来,信息技术的极大进步提高了人类的生活质量。特别的,为了使大数量的信息得到及时有效的利用,必须对数据压缩技术进行革新,以适应社会发展形势的需求。
字典编码是一种随数据流本身特点,动态地构建适合数据流的编码与解码表的压缩编码方法。基于字典编码的LZ系列编码,各个分支和不同的版本不断丰富和成熟。
本文在VC++环境下设计、实现LZ系列编码中技术比较完善的LZW编码,并设计用常用的压缩算法RLE来对LZW压缩效果进行对比,软件显示实现的压缩对比效果参数主要有压缩率,编码耗时,解码耗时。比较后得出结论:LZW比RLE压缩效果理想,两种算法对大篇幅的文件压缩效果都比对小篇幅文件的压缩效果好,对文字的压缩效果要比对图像压缩的效果好。
由于LZ系列编码在现代压缩软件当中有着广泛而且重要的用途,所以深入研究在技术上的较为成熟的具有代表性的LZW算法,对深入了解和掌握大多数压缩软件有重要意义。

关键词 字典编码,LZW,压缩,字符串,压缩效果

ABSTRACT

In the 21st century an era of information is coming. Tremendous progress has been made in IT (Information Technology) field, which has greatly improved the life quality of human beings. Especially, in order to make a mass of information be used in good time, technical innovations must b

基于语音信号预测编码的数据压缩算法的研究与实现

Posted by 天际的荒草 | Posted in Docs | 文档 | Posted on 19-09-2009

标签:, , ,

0

摘要 I
ABSTRACT II
第一章 绪论 1
1.1语音信号预测编码的数据压缩研究的目的及意义 1
1.2语音信号压缩编码技术及类别 2
1.3语音信号压缩编码技术的发展概况 4
1.4语音信号预测编码的数据压缩的研究内容 5
第二章 语音预测编码的压缩依据及标准 7
2.1语音信号压缩的基本依据 7
2.2语音信号压缩编码的性能指标及质量评估 8
2.2.1 性能指标 8
2.2.2 质量评估 10
2.3 G.7xx:音频压缩协议 12
第三章 语音信号预测编码的算法基础 14
3.1预测编码(Prediction Coding) 14
3.2差分脉冲编码调制(DPCM) 14
3.3自适应差分脉冲编码调制(ADPCM) 16
3.3.1 ADPCM编码 18
3.3.2 ADPCM解码 19
第四章 语音预测编码的压缩系统的设计与实现 20
4.1总体设计 20
4.1.1 整体思想 20
4.1.2 程序功能模块 21
4.2模块的设计与实现 25
4.2.1 压缩模块 25
4.2.2 录音模块 27
4.3设计介绍 29
4.3.1 设计环境及wav文件格式的概述 29
4.3.2 界面功能介绍 30
4.4对本设计所选用的算法和及其衍生算法进行分析、比较 33
第五章 总结与展望 36
5.1设计总结 36
5.2工作展望 37
参考文献 38
致谢 39
附录 40

摘要
随着通信、计算机网络等技术的飞速发展,数据压缩技术已成为当今数字通信、广播、存储和多媒体娱乐中的一项关键的共性技术。大量的数字化多媒体信息,对这些信息量进行有效的压缩,然后投入到实际的应用中显得极为重要。
音频压缩指的是对原始数字音频信号流(PCM编码)运用适当的数字信号处理技术,不损失有用信息量,降低其码率,也称为压缩编码。在预测技术产生之后,语音压缩的灵活运用,多种崭新的技术的出现,使语音编码成为了一个令人振奋、活跃的研究领域。
系统分为录制语音及压缩两个模块,使用Visual C++ 6.0编写。本文介绍了语音信号预测编码的数据压缩算法研究的许多方面,主要集中在语音编码的一些主要观念和设计的思想和实现方法,提供了语音编码方面研究的概论,各种语音编码技术以及G.7xx标准,还详细地叙述了有关预测编码以及ADPCM的相关知识,设计了一个在达到一定压缩比的前提下,具有较高语音质量的,用以实现进行语音压缩的软件。

关键词:语音信号,数据压缩,预测编码,ADPCM

ABSTRACT
With the fact that technologies such as communication , computer network develops at full speed, the data compression technology already becomes one key industry-specific technology in digital communication, broadcast , memory and multi-media entertainment in the nowadays. There is a lot of digital multimedia information. It becomes more important that doing effective compression before putting it into practical application.
Audio compression means to primitive figure an audio signal stream (PCM code) uses appropriate techniques of digital signal processing, before do not lose useful information amounts, and reduce the coding (compressing) rates. Audio compression also called the compression code. The flexible application of speech coding behind predicting technology creation, various brand-new technology appearing, which have made speech coding become an inspiring enthusiasm, active research field.
The data compression system is divided into two modules,voice record and compression, which is using Visual C + + 6.0 to program. This paper, in the respect of a lot of being going to introduce that speech signal predictive code data compression algorithm, is focusing on some main concept of speech coding and the designing thought and realization method. It have provided the introduction of various speech coding technology and the G.7xx standards, also have narrated relevance knowledge about predictive coding and ADPCM detailed, and have designed a software for the realization of speech compression in a certain compression ratio on the premise that high voice quality of speech.

KEY WORDS speech coding, data compression, predictive coding, ADPCM

第一章 绪论
1.1语音信号预测编码的数据压缩研究的目的及意义
在现今的电子信息技术领域,数字化的多媒体信息尤其是数字视频、音频信号的数据量特别庞大,如果不对其进行压缩就难以得到更广泛的应用。现代通信中,科学技术的飞速发展,图像、数据等非话音信息在通信信息总量中所占的比例大大提高,而且这种提高的趋势仍然会继续下去。因此,数据压缩技术已成为当今数字通信、广播、存储和多媒体娱乐中的一项关键的共性技术。
数据压缩能较快地传输各种信号,如传真、Modem通信等;在现有的通信干线并行开通更多的多媒体业务,如各种增值业务;紧缩数据存储容量,如CD-ROM(Compact Disk-Read Only Memory,只读光盘)、VCD(Video Compact Disc,视频光盘)和DVD(Digital Video Disc/Disk,数字化视频光盘)等;降低发信机功率,这对于多媒体移动通信系统尤为重要。由此看来,通信时间、传输带宽、存储空间甚至发射能量,都可能成为数据压缩的对象。
但是,到目前为止,在大多数通信系统中,传输最多的仍然是语音信号,尤其是最近20年,语音压缩编码技术得到了快速发展和广泛应用,在移动通信、卫星通信、多媒体技术以及IP电话通信中得到普遍应用,起着举足轻重的作用。
语音信号是模拟信号,不能直接在数字通信系统中传输,必须先进行模/数转换再进行数/模转换。这种模/数转换和数/模转换就成为语音编译码,其作用是将语音模拟信号转换为数字信号,到了接收端,再将收到的语音数字信号还原为语音模拟信号。语音编译码又简称为语音编码。可见,语音编码技术在数字通信中具有十分重要的作用。
语音编码就是将模拟语音信号数字化,数字化之后可以作为数字信号传输、存储或处理,可以充分利用数字信号处理的各种技术。虽然语音信号在通过一个压缩系统即编解码系统后,可能会引入噪声和一定的失真,但为了减小存储空间或降低传输比特率节省带宽,对数字化之后的语音信号进行压缩编码是必要的,这就必须研究语音预测编码的数据压缩编码技术。
语音编码属于信源编码。自从20世纪70年代以来的二、三十年中,随着科学技术的迅速发展,尤其是随着计算机技术、微电子技术、信号处理技术以及编码理论的发展和进步,语音编码技术取得许多突破性进展,研究出许多实用的编码方案,这些方案在不断研究、改进和应用中日趋成熟,形成了各种实用的语音编码技术。现在,语音编码技术已成为通信技术中一个相当重要的工具,在各种通信网络中都得到了广泛的应用。
在传递语音时选择适当的语音编码技术,充分利用资源并最大限度的利用语音编码方案自身的技术特点是很重要的。语音压缩一般用来描述速率小于64kbit/s语音的数字化。一般情况下,启动时PCM(Pulse Code Modulation,脉冲编码调制)的速率为64kbit/s,压缩后速率变小。在理想状态下,语音质量不会受到影响,但实际上还是会有一些影响,只不过不易察觉而已。目前的语音压缩标准,可以将语音业务在网络中所占带宽可以减少到80%,这样就为其他业务(如数据业务)在网上的传输提供了必要的带宽。
而宽带资源的有限性和对带宽需求的增加,使得语音压缩技术成为分组网络实现语音业务的严峻挑战。将单一的网络合并成为一个整体结构,可以减少通信成本,提高效率,有利于网络资源的管理,因此,研究语音预测编码的数据压缩是很有必要的。

1.2语音信号压缩编码技术及类别
语音信号的压缩编码方法按照传统的分类方法通常分为3类:波形编码、参数编码和混合编码【1】。
波形编码是将时间或频率域(或变换域)信号直接变换为数字信号,力求使重建语音波形保持原始语音信号的波形形状。由于波形编码是对语音时域或频域波形进行编码,这种系统保留原始样值的细节,从而保留了信号的各种过度特征,因此解码声音质量较高,还具有抗噪声性的优点。PCM、△M或DM(Delta Modulation,增量调制)、ADM(Adaptive Delta Modulation,自适应增量调制)、ADPCM(Adaptive Differential Pulse Code Modulation,自适应差分脉冲编码调制)等,都属于波形编码。波形编码当其编码速率进一步降低时,其语音质量等性能指标下降很快。
参数编码又称为声源编码或声码器,有时还称为分析-综合编码,它是将信源信号在频域或其它变换域提取特征参数,然后对这些特征参数进行编码和传输;在译码端再将接收到的数字信号译成特征参数,根据这些特征参数重建语音信号。参数编码是通过对语音信号特征参数的提取和编码,力求使重建信号具有尽可能高的可懂度,即保持原语音信号的语意,却不计较波形的拟合。因此,重建语音信号的波形与原语音信号波形会相差甚远。参数编码的基础是利用人类语音的生成模型,这样在传输过程中只需要传送模型的参数,大大降低了系统的码率,特别适合于无线通信,保密和军事通信领域。参数编码的编码速率可以很低,缺点在于恢复的语音质量较差,只能达到合成语音质量,其次是复杂度高。LPC-10(Linear Predictive Coding,LPC,线性预测编码)和LPC-10e声码器就属于参数编码,还有通道声码器、相位声码器、共振峰声码器、同态声码器等。
计算机技术的发展为语音编码技术的发展提供了强有力的工具,大规模和超大规模集成电路的出现则为各种语音编码算法的实现提供了基础。最近几十年来,语音编码技术取得了许多突破性进展,产生了新一代的编码算法,这就是混合编码。
混合编码是波形编码和参数编码的结合,它克服了波形编码和参数编码的缺点,吸收了他们的长处,从而在4kbit/s~16kbit/s速率上能够得到高质量的合成语音质量。混合编码既利用了语音的生成模型,减少了传输码率,又使解码的语音产生接近原始语音的波形,以保留说话人的各种自然特征,因此当前受到人们较大的关注。MPLPC(Multi Pulse LPC,多脉冲激励线性预测编码)、RPELPC(Regular Pulse Excited LPC,规则脉冲激励线性预测编码)和CELP(Code Excited Linear Prediction,码激励线性预测)编码等,都属于混合编码。

图1.1 语音编码方法

表1.1 语音编码的分类与应用
分类与典型
应用 波形编码 参数编码 混合编码
典型应用 PCM,ADPCM LPC MPLPC,RPE/LTP,
CELP,VSELP

1.3语音信号压缩编码技术的发展概况
由于参数编码达不到语音通信中的“长话质量”,因而早期质量要求高的中、高速语音编码标准都采用基于预测的波形编码。而自从1937年A.H.Reeves提出脉冲编码调制(PCM)以来,语音编码技术已有60余年的发展历史。
第一个语音压缩系统是早在1939年,美国Bell实验室的H.Dudley发明的世界上第一个通道声码器【2】,它将语音谱划分为有限的频带,各带宽内传输其能量电平,压缩比大于100倍。这类技术通常可实现4.8kb/s以下的低速编码,码率甚至可以低至600b/s~2.4kb/s,但合成音质较差,特别时自然度低,即使把码率提高到与波形编码相当,其语音质量也不如波形编码。1938年Reeves提出PCM(脉冲编码调制)编码,后来成为现代电话系统的常规语音编码方式,1977年被ITU-T采用为G.711标准建议。64Kbps速率的PCM方式,采样速率为8K,每个采样点量化为8 bit。现在所说的语音压缩编码,都是相对于64Kbps的PCM标准而言。这种编码方法可以获得较好的语音质量,但占用带宽较多,在带宽资源有限的情况下不宜采用。
1946年Delorain提出了增量调制(DM), 1952年贝尔公司的Culter取得了DPCM(Differential Pulse Code Modulation,差分脉冲编码调制)的专利。为了进一步降低编码速率,以后又陆续提出了一些编码方案。1988年制定的G.722建议采用32Kbps的ADPCM 编码,虽然码率较高,但是实现简单,且音质很好,在目前的ISDN系统中仍然使用这一编码方案。1992年制定的ITU-T G.728建议,采用LD-CELP(Low Delay-Code Excited Linear Prediction,低时延码激励线性预测),编码速率达到16Kbps, 它以其较小的延迟、较低的速率、较高的性能在实际中得到广泛的应用,例如:可视电话伴音、无绳电话机、单路单载波卫星和海事卫星通信、数字插空设备、存储和转发系统、语音信息录音、数字移动无线系统、分组化语音等。
1995年制定的G.723.1建议,采用改进的激励线性预测编码,编码速率达到5.3/6.3Kbps。目前,欧洲的GSM通信系统采用的是13Kbps的RPE-LTP(Regular Pulse Excitation-Long Term Prediction,规则脉冲激励长时预测)压缩编码方案,同时正在开发6.5Kbps的CELP方案作为它的半速率标准方案。近年来,低比特率语音编码(8Kbps以下)的研究取得了很大的飞跃。美国先后公布了4.8Kbps的CELP编码,2.4Kbps的MELP(Mixed Excitation Linear Prediction,混合激励线性预测)编码,目前甚至出现了速率在1Kbps左右的语音编码算法,由于这些算法的延时都比较大,一般在20-80ms。
同样是1995年11月,CS-ACELP(Conjugate Structure-Algebraic Code Excited Linear Prediction,共轭代数码激励线性预测)的8kbit/s语音编码G.729建议在ITU-TSG15全会上通过,并于1996年6月ITU-TSG15会议上通过G.729附件A减少复杂度的8kbit/s的CS-ACELP语音编解码器,正式成为国际标准。这种编码方法延迟小,节省87.5%的带宽,可以仅用8Kbps的带宽传输话音,提供与32kbit/s的ADPCM(差分脉冲编码调制)相同的语音质量,其音质是同档次码速率中最优的,而且在噪声较大的环境中也会有较好的语音质量。ADPCM在全球的公共电话网络中被用于提供长话级话音。此后,这以压缩语音标准又得到了进一步的优化改进,广泛应用于个人移动通信、低C/N数字卫星通信、高质量移动无线通信、存储/检索、分组语音和数字租用信道等领域。其它一些国际组织或国家也积极制定自己的标准。
CELP的编码速率较低,但复杂度较高,可以在4.8kbit/s左右的码速率上获得较高质量的语音,是当今中低速率语音编码技术的主流技术之一,许多国际标准化组织及机构纷纷将这一编码方案作为语音编码标准。在对其改善质量、降低复杂度、减少编码延迟等方面都提出了不少新的方法,使CELP在实践中得到广泛应用。随着DSP技术的发展,CELP技术还具有一定的潜力,例如将G.729扩展到6.4kbit/s。
目前,语音压缩编码技术主要有两个努力方向:一个是中低速率的语音编码的实用化,及如何使用化过程中进一步减低编码速率和提高其抗干扰、抗噪声能力;另一个是如何进一步的降低其编码速率,目前已能在5kbit/s-6kbit/s的速率上获得高质量的重建语音,下一个目标则是要在4kb/s的速率上获得短延时、高质量的重建语音。特别是对中长延时编码,人们正在研究其更低速率(如400bit/s-1200bit/s)的编码算法,在这个过程中当编码速率降至2.4kbit/s速率以下时,CELP算法即使应用更高效的量化技术也无法达到预期的指标,需要其它一些更符合低速率编码要求的算法,目前比较好的算法还有正弦变换编码、混合激励线性预测编码(MELPC)、时频域插值编码、基音同步激励线性预测编码等,同时还要求引入新的分析技术,如非线性预测、多精度时频分析技术(包括子波变换技术)、高阶统计分析技术等,这些技术更能挖掘人耳听觉掩蔽等感知机理,更能以类似人耳的特性作语音的分析与合成,使语音编码系统更接近于人类听觉器官的处理方式工作,从而在低速率语音编码的研究上取得突破。随着算法的进一步改进,语音编码的各种技术应用前景将更加广阔。
技术是不断发展的,新的技术虽然是以前技术的改进,但旧的技术有着其独特的优势,不过相信,随着以上技术的不断更新发展,更能挖掘人耳听觉掩蔽等感知机理,更能以类似人耳的特性作语音的分析与合成,使语音编码系统更接近于人类听觉器官的处理方式工作,从而在各种速率的语音编码的研究上取得更好的发展。

1.4语音信号预测编码的数据压缩的研究内容
对音频压缩技术的研究和应用由来已久,如A律、 律编码就是简单的准瞬时压扩技术,并在ISDN话音传输中得到应用。对语音信号的研究发展较早,也较为成熟,并已得到广泛应用,如自适应差分PCM(ADPCM)、线性预测编码(LPC)等技术。在广播领域,NICAM(Near Instantaneous Companding Audio Multiplex – 准瞬时压扩音频复用)等系统中都使用了音频压缩技术。
除压缩编码技术外,人们还应用许多其它节省带宽的技术来减少语音所占带宽,优化网络资源。ATM和帧中继网中的静音抑制技术可将连接中的静音数据消除,但并不影响其它信息数据的发送。语音活动检测技术可以用来动态的跟踪噪音电平,并为这个噪音电平设置一个享用的语音检测阀值,这样就使得语音/静音检测器可以动态匹配用户的背景噪声环境,并将静音抑制的可听度降到最小。为了置换掉网络中的音频信号,这些信号不再穿过网络,舒适的背景声音在网络的任一端被集成到信道中,以确保话路两端的语音质量和自然声音的连接。
语音压缩一般用来描述速率小于64kbit/s语音的数字化。一般情况下,启动时PCM的速率为64kbit/s,压缩后速率变小。在理想状态下,语音质量不会受到影响,但实际上还是会有一些影响,只不过用户不易察觉而已。各种语音压缩技术都具备各自的特点。目前的语音压缩标准,将语音业务在网络中所占带宽可以减少到80%,这样就为其它业务(如数据业务)在网上的传输提供了必要的带宽。动态压缩则比前者更进一步,它允许网络管理者对网络进行管理,并在业务增加时为每个连接提供合适的语音质量。
宽带资源的有限性和对宽带需求的增加,使得语音压缩技术成为分组网络实现语音业务的严峻挑战。将单一的网络合并成为一个整体结构,可以减少通信成本,提高效率,有利于网络资源的管理。其中关键环节就是如何将这些进行最有效的管理和应用,从而满足用户的各种要求。
以下章节内容主要是对数据压缩的基本理论、技术标准、评价方法进行研究与分析,深入对基于语音信号预测编码的数据压缩算法以及衍生算法的基本理论、技术标准、评价方法进行研究与分析,并且设计一个系统,可以对一段语音信号进行预测编码,具体来说是利用了ADPCM编码方法,在获得一定的压缩比的情况下,能很好地保持原语音信号波形的细节特征。
第二章 语音预测编码的压缩依据及标准
2.1语音信号压缩的基本依据
随着信息技术的发展,信道资源显得更加宝贵,为了在有限的信道内进行更多的信息传输,必须对语音信号进行压缩。从信息保持的角度讲,只有当信源本身具有冗余度,才能对其进行压缩。而语音信号能够压缩的基本依据是语音信号中存在的冗余和人类的听觉感知机理。
根据统计分析的结果,语音信号存在的多种多样的冗余,可分别从时间域和频率域描述【3】。
从时间域分析:
(1)幅度的非均匀分布,即语音中的小幅度样本出现的概率比大幅度样本出现的概率高,信息主要集中在低功率上,又由于通话必然会有间隙,更出现了大量的低电平样本。此外,实际语音信号的功率电平也趋向于出现在编码范围的较低电平端。因此,语音信号的幅值分布是非均匀的;
(2)采样数据间的相关,相邻的语音信号间有很强的相关性,研究表明,当采样率为8kHz时,相邻样值之间的相关系数大于0.85,甚至在相距十个样本之间,相关系数还有0.3左右的数级。如果采样率提高,样本间的相关性将更强;
(3)周期间的相关,虽然电话语音信号的频率分布在300-3400Hz的频带内,但在特定的瞬间,某一声音却往往只是该频带内的少数频率分别起作用。当声音中只存在少数几个基本频率时,就会像某些振荡波形一样,在周期与周期之间存在着一定的相关性。浊音语音段的准周期性,反映在波形上出现图形的重复,即信息冗余;
(4)基音之间的相关性,语音可以分为清音和浊音两种基本类型。浊音是由声带振动产生,每一次振动使一股空气从肺部流进声道。激励声道的各股空气之间的间隔称为基音周期。浊音的波形对应于基音周期的长期重复波形。因此,对语音浊音部分编码的有效方法之一是对一个基音周期波形进行编码,并以它作为其它基音段的模板。
(5)语音间隙,实际语音通信中,存在通话间隙,通话分析表明,全双工话路的典型效率约为通话时间的40%,即静止系数为0.6,这本身也是一种冗余;
(6)长时自相关,除了样本间、同期间的相关外,在较长的时间间隔上,语音信号也存在相关,统计表明,8 kHz采样时的平均相关系数高达0.9 。
从频率域分析:
(1)非均匀的长时功率谱密度,从相当长的时间内统计平均,语音信号的功率谱呈现强烈的非平坦性,这说明语音信号对给定的频段利用的不充分,存在固定的冗余度;
(2)语音特有的短时功率谱密度,语音信号的短时功率潜在某些频率上出现峰值,而在另一些频率上出现谷值,这些峰值频率是能量较大的频率,称为共振峰(Formant),语音特征主要由前3个共振峰频率决定,随着频率的增高,对整个功率谱的影响会快速递减。
正是由于语音信号具有以上特点,对语音的压缩编码才成为可能。语音压缩编码技术大大缓解了信道紧张的状况。
语音压缩的第二个依据是人的听觉生理和心理特性对语音的感知。
其影响主要表现在:
第一,人的听觉系统(HAS,Human Auditory System)对声音具有掩蔽效应(Mask Effect),即一个强的声音能够抑制另一个同时存在相对较弱的声音,利用这一性质可以抑制与信号同时存在的量化噪声。
第二,对不同频段的声音的敏感程度不同。人的听觉对低频端比较敏感,而对高频端不太敏感,这主要是因为浊音的周期和共振峰在这里。
第三,人耳对语音信号的相位变化不敏感。人耳的听觉不像人的视觉对感知的信号相位那样敏感,一定程度的相位失真对听觉来说是可以容忍的。人耳听不到或感知极不灵敏的语音信号都可以认为是冗余,可以利用这些特性进行语音数据压缩。
语音压缩编码的目的是用尽可能低的数码率获得尽可能好的合成语音质量,同时又使编码过程的计算代价尽可能小。降低数码率的实质就是压缩频带宽度,数码率低意味着算法的复杂度增加,延迟变大。所以语音压缩编码算法的研究一直在这个矛盾中向前发展。

2.2语音信号压缩编码的性能指标及质量评估
2.2.1 性能指标
语音编码所要解决的基本问题,是在给定的编码速率条件下,如何得到尽可能好的重建语音质量(或称编码质量),同时应尽可能减少编译码算法的复杂度和时延,并使编译码系统有较好的坚韧性;或者是在给定编码质量,编译码复杂度和时延以及坚韧性要求的条件下,如何尽可能降低语音编码所需的速率等。这五个方面的要求,就是衡量语音编码性能的主要指标。要指出的是,这五个方面的要求(或称五个质量指标)有时是互相矛盾的,它们之间有着紧密的联系,是互相影响的,在不同的应用中,对各个指标要求的侧重点也有所不同。
1.编码质量
评价通信系统性能优劣的根本标志之一是系统所输出语音质量的好坏,所以语音评定技术将成为分析通话质量,不断提高通信系统性能的关键技术。
一般说来,语音质量包含个方面内容:清晰度、可懂度和自然度。清晰度是指语音中音节以下的语音单元(因素、声母、韵母等)的清晰度;可懂度是指语音中音节以上的语言单位(如字、单词和句等)的可懂程度;自然度则是指对讲话人的辨别水平。
2.编码速率
编码速率可以用“比特/秒”(bit/s)来度量,它代表了编码的总速率,一般用 表示。编码速率也可以用“比特/样点”(bit/p)表示,它代表了平均每个语音样点用多少比特编码,一般用 表示。和可以通过取样速率 联系起来:
其中的取样速率 通常根据Nyquist定理由信号带宽决定。
显然,平均每样点比特数 越高,语音波形或参数量化就越惊喜,语音质量也就越好,相应地传输带宽或存储容量的要求也就越高。在波形编码中,为了获得高质量的重建话音,一般取 ( 除外),而在参数编码中 可以低到0.25甚至0.1以下。当然在后一种情况下重建语音只能保持一定的可懂度,而反映讲话人特征的信息和语音的自然度就会有较大的损失。
3.编译码复杂程度
编码和译码算法的复杂程度同语音编码的语音质量有非常密切的关系。在同样数码率的情况下,采用复杂一些的算法将会获得更好的语音质量;而对于相同的话音质量,采用复杂一些的算法能够降低编码所需的速率。编解码算法的复杂程度同硬件的实现也有密切关系。目前在许多应用中都使用通用数字信号处理器芯片(DSP)实时实现各种语音编译码算法。算法的复杂程度对DSP芯片的运算能力以及所需要的存储器容量都提出了一定的要求。算法越复杂则需要越高档的DSP芯片以及较大容量的存储器来实现,其成本、功耗目前都比较高。
4.编译码时延
增加算法的复杂程度可以提高语音编码质量,但往往也便随着增加编译码的时延。在实时语音通信系统中,语音编译码的时延同线路传输时延的作用一样,对系统的通话质量有很大的影响。
时延影响通话质量的另一个原因是回声。对于公用电话网,可能会有几次音频转接,也就是会有多次语音编译码,因此对单次语音编译码时延,通常要求不超过5~10ms。对于其它一些类型通信系统,例如卫星通信,由于传输时延或由于纠错编码引入的时延等已经比较大,再苛求语音编码的时延意义不大,它们主要对语音编码的话音质量、编码率以及抗误码性能等提出要求,在这些应用中,通常允许话音编码时延为几十毫秒到100ms。为了保证正常通话,当总时延超过100ms时,一般都需要采取回升抵消或回声抑制等措施。
5.坚韧性
坚韧性(Robustness)也是衡量语音编码性能优劣的重要指标之一。所谓坚韧性是指语音编码能够适应各种使用环境和条件,在较为不利的环境和条件下能正常工作。这包括一下几种情况:
(1)能够适应各种不同的讲话人的语音。
(2)能在较强的噪声背景下正常工作。
(3)在多级编码的情况下,语音编码质量不应有明显下降。
(4)容许一定误码,即在 ~ 误码率时仍能提供可懂的重建语音。
(5)在部分数据丢失的情况下,避免同步错乱等。

2.2.2 质量评估
评价语音编码质量的方法很多,归纳起来可以分为客观评定法和主观评定法【4】。
1.客观评定法
客观评定法用客观测量的手段来评定语音编码质量。客观评定法研究自七十年代以来迅速发展,国内外学者提出了数以千计的客观评定方法。这些方法从评定原理上可分为基于输入-输出和基于输出这两大类方法,如果从它们各自使用的主要技术方法(如谱分析, LPC分析、听觉模型分析、判断模型分析等)和主要特征参量(时域、参量、频域参量、变换域参量等),又可以将这些客观评定方法分为以下六类:基于SNR的评定方法、基于LPC技术的评定方法、基于谱距离的评定方法、基于听觉模型的评定方法、基于判断模型的评定方法、其它类评定方法。常用的方法有信噪比、加权信噪比、平均分段信噪比等。它们都是建立在度量均方误差的基础上,其特点是计算简单,但不能完全反映人对语音质量的主观感觉,故而客观评定法大多应用于较高速率的波形编码。
2.主观评定法
主观评定法符合人类听话时对语音质量的感觉,是以认为主体根据某种预先约定的尺寸来对失真语音(或参考原始语音)来划分质量等级的,它反映了评听者对语音质量好坏程度的一种主观印象。
目前,国内外使用较多的主观评价方法有:平均意见得分MOS (Mean Opinion Scores,简称MOS得分)、诊断押韵测试DRT (Diagnostic Rhyme Tests)方法、失真平均意见的分DMOS (Degradation Mean Opinion Score-DMOS)和判断满意度测量DAM (Diagnostic Acceptability Measure)。
在实际语音系统应用中,MOS评分法使用最为普遍。它不仅用于语音编码,通信设备性能测试上,也是语音评估方法研究中,衡量评价方法好坏的重要依据之一。
MOS法用于对语音整体满意度或语音通信质量的评价。
MOS采用五级评分标准,其分值如下表2.1所示。

表2.1 MOS判分五级标准及描述该级语音质量的形容词
MOS判分 质量级别 失真级别
5 优(Excellent) 不察觉
4 良(Good) 刚有察觉
3 可(Fair) 有察觉且稍觉可厌
2 差(Poor) 明显察觉且可厌但可忍受
1 坏(Unacceptable) 不可忍受

表2.2 国际上一些一些标准语音编码算法的语音质量主观评估分。
算法名称 比特率 MOS分 DRT分 DAM分
PCM(G.711) 64K 4.3 95 73
ADPCM(G.721) 32K 4.1 94 68
LD-CELP(G.728) 16K 4.0 - -
RPE-LTP(GSM) 13K 3.47 - -
VSELP(IS-54) 8K 3.45 - -
CELP(FS1016) 4.8K 3.52 93.7 62.2
LPC-10e(FS1015) 2.4K 2.3 89.9 52.3

在数字语音通信中,通常认为MOS在4.0-5.0分为高质量数字化语音,达到长途电话网的质量要求,接近于透明信道编码,也常称为网络质量或长途质量。MOS在3.5左右称为通信质量,这是感到重建话音质量下降,但不妨碍正常通话,可以满足话音系统使用要求,MOS在3.0以下常称为合成语音质量,指一些声码器合成的语音所能达到的质量。它一般具有足够的可懂度,但自然度及讲话人的确认等方面不够好。
诊断押韵测试(DRT)是反映话音清晰度或可懂度的一种测试方法,它主要用于低速率语音编码的质量测试,因为这是可懂度已成为主要问题。这种测试方法使用若干对(通常为96对)同韵母的字进行测试,例如中文的“为”和“费”,英文的“fast”和“vast”等。测试中,让受试者每次听到一对韵字中的某个音,然后让他判断所听到的音是哪一个字,全体实验者判断正确的百分比就是DRT得分。通常认为DRT在95%以上时清晰度为优,85%~94%为良,75%~84%为中,65%~75%为差,而65%以下为不可接受。在实际通话中,清晰度为50%时,整句的可懂度大约为80%,这是因为整句中具有较高的冗余度,即使个别字听不清楚,人们也能理解整句话的意思。当清晰度为90%时,整句话的可懂度已接近100%,所以对于低速率语音编码,一般要求其清晰度能达到90%或以上。
判断满意度测量(DAM)是对语音质量的综合评估,它是在多种条件下对语音质量可接收程度的一种度量,也采用百分比评分。

2.3 G.7xx:音频压缩协议
在现今的通信系统当中,各种语音压缩编码得到了广泛的应用,并形成了一系列的语音编码标准。G.7xx 是一组ITU-T标准,用于音频压缩和解压缩。它主要用于电话方面。在电话技术中,有两个主要的算法标准,分别定义在 律算法(美国使用)和A律算法(欧洲及世界其他国家使用)中。两者都是基于对数关系的,但对于计算机的处理来说,后者更为简单。
G.7xx 协议组由以下协议组成:
• G.711――64 kbps 信道上的语音频率脉冲编码调制(PCM),采样速率为8kHz,量化位数为8bit,对应的比特流速为64kbit/s。
CCITT于1972年对话音频谱的模拟信号用脉冲编码调制(PCM)编码时的特性进行了规范,其主要内容有:
(1)模拟信号的取样率标称值为每秒8000个样值,容差为±50ppm。
(2)推荐A律和 律两种编码率,量化值的数目由编码律决定,每个样值编码为8位二进制数码。采用不同编码率的国家之间的数字通道应传送A律编码的信号。若两国采用相同的编码律,两国之间的数字通道就应采用该编码律。任何必要的变换由采用 律的国家来承担。
(3)A律(或 律)的每一个“判决值”和“量化值”应当与一个“均匀的PCM值”相关联,亦即要求采用13比特(或14比特)的均匀PCM码。
(4)串行传输时在一个样值编码码字中首先传送极性比特,最后传送最低有效位比特。
(5)标准对A律或 律各规定了一个字符信号周期序列,当该周期序列加到PCM复用设备解码器输入端时,在设备的任一音频输出端应当出现一个标称电平位0 dBm0的1kHz正弦信号。
(6)理论负载容量:A律为+3.14 dBm0, 律为+3.17 dBm0。
• G.721――32 k bit/s 自适应差分脉冲编码调制(ADPCM),ITU建议的 G.721将64Kbps的比特流转换为32Kbps的流,基于 ADPCM技术。每个数值差分用4位编码,其采样率为8kHz。
G.721标准是CCITT 1988年为实现64kb/s A律或 律PCM与32kb/s数字信道之间相互转换而指定的。在该协议中提出了一种PCM ADPCM转换编码的算法,分别叙述了发端编码和收端解码算法的原理和功能,并对各种计算方法进行了详细规定,对该转换设备进网概貌和数字测试序列作出了说明。
• G.722――64k bit/s 下的 7 kHz 音频编码
• G.722.1――带有低帧损耗的具有免提操作的系统在 24k bit/s和32k bit/s 上的编码
• G.722.2――利用自适应多频率宽带(AMR-WB)以 16k bit/s 多频率语音编码
• G.723――以24Kbps运行的基于ADPCM的有损耗压缩标准。其音质不如非压缩的 G.711PCM标准以及基于 SB-ADPCM的G.722标准。G.723.1和G.723.2用于H.324标准
• G.726――40、32、24、16k bit/s自适应差分脉冲编码调制ADPCM
• G.727――5、4、3和2bit/s嵌入式自适应差分脉冲编码调制 ADPCM
• G.728――利用低延迟代码线性预测以16 bit/s进行语音编码,它的比特率为16Kbps,带宽限于3.4kHz。其音质比G.711或G.722差得多。它基于一种称为低延迟代码激励线性预测(LD—CELP)的向量量化技术。
• G.729――利用共扼结构-代数激励编码线性预测(CS-ACELP)以8bit/s进行语音编码。
第三章 语音信号预测编码的算法基础
3.1预测编码(Prediction Coding)
预测编码是目前应用比较广泛的声码器技术之一。常见的DPCM、ADPCM、ΔM、Δ-∑M 调制等都属于预测编码方式的技术。
预测编码是有损压缩编码,主要用于对统计冗余进行压缩。
所谓预测编码,就是根据过去的信号样值对新样本进行预测,预测下一个样值,然后先对原始模拟信号作脉冲取样,接着,取新样本的实际数值,和预测值进行比较,得到差值后,仅把预测值与现实的样值之差(预测误差)加以量化、编码以后进行传输。在接收端,经过和发信端的预测完全相同的操作,可以得到量化的原信号,然后再通过低通滤波,这样便可恢复与原信号近似的波形。
在这种情况下,如果能进行适当的预测,便可期望预测误差的幅度变化范围比信号自身的振幅变化范围小,预测的越准,差值的幅度越小,压缩率越高。因此,如果解调后的量化噪声相同,则传输预测误差的方式所需的量化比特数将比传输信号瞬时振幅值的一般PCM方式所需的量化比特数少;或者在比特数与PCM方式相同情况下,可获得更高的传输质量。
下面将会以DPCM为例,说明预测编码的原理。

3.2差分脉冲编码调制(DPCM)
常用的差值编码主要有增量调制(Delta Modulation,DM或△M),差分编码调制(Differential Pulse Code Modulation,DPCM)和自适应差分脉冲编码调制(Adaptive Differential Pulse Code Modulation,ADPCM)。
PCM,就是将原始的模拟信号经过时间采样,然后对每一样值进行量化,作为数字信号传输。而DPCM不是对每一样值都进行量化,而是预测下一样值,并量化实际值和预测值之间的差。
基本的DPCM系统框图如图3.1所示【5】。
图中,Q[•]为多电平均匀量化器,预测器产生预测信号 。差值信号 为
(3. 1)
经过量化器被量化成 个电平的信号 。 一路送至线性PCM编码器编成n位DPCM码;另一路与 相加后反馈到预测器,产生下一时刻编码所需的预测信号。
收端解码器中的预测器与发端预测器完全相同。因此,在传输无误码情况下,收端重建信号 与发端 信号相同。

图3.1 DPCM系统原理框图

说明DPCM编码原理:
举例说,设DPCM系统预测器的预测值为前一个样值,假设输入信号已经量化,差值不再进行量化。若系统的输入为{0 1 2 1 1 2 3 3 4 4 …},则预测值为{0 0 1 2 1 1 2 3 3 4 …},差值为{0 1 1 –1 0 1 1 0 1 0 …},差值的范围比输入样值的范围有所减小,可以用较少的位数进行编码。
即设语音信号的样值 ,第 时刻的取样值 ,用 之前的P个样值 的线性组合来预测,此时的预测器称为P阶预测器,则 的预测值 为
(3. 2)
式中 ——预测系数,待定。
语音样值 的实际值与其预测值 之间存在一定的误差 :
(3. 3)
式中 误差 ——余量值或余量信号,也称为残差信号、差值信号等。于是有:
(3. 4)

可以通过适当地选择预测器的阶数P和待定的预测系数 ,使 成为一个零均值的白噪声过程,则有:
(3. 5)
式中 ——具有零均值的、单位方差 的白噪声,G为增益系数。
当误差 不是白噪声时,因其中残留某种相关性,可借助于 改进预测的精度。此时,可用若干个过去时刻的预测误差之和来表示 。
(3. 6)
式中 为系数, 。
(3. 7)
对上式进行Z变换,得到:
(3. 8) 于是,可求得预测系统的传输函数为
(3. 9)
从数字滤波器角度来看, 是一个具有M个零点和P个极点的零-极点模型,称之为自回归滑动平均(Autoregressive-Moving Average)模型或ARMA模型。

3.3自适应差分脉冲编码调制(ADPCM)
如前所述,DPCM利用差值编码可以降低信号传输速率,但其重建语音的质量却不如PCM,究其原因,主要有:量化是均匀的,即量化阶是固定不变的;预测信号波形是阶梯波或近似阶梯波,与输入信号的逼近较差。
因此,在DPCM系统基础上,若能够做到:根据差值的大小,随时调整量化阶的大小,使量化的效率最大(实现方法为自适应量化);提高预测信号的精确度,使输入信号 与预测信号 之间的差值最小,使编码精度更高(实现方法是自适应预测),则可提高语音传输质量【6】。
为了进一步改善量化性能或压缩数据率,上述改进的DPCM系统称作自适应差分脉冲编码调制(ADPCM)系统。ADPCM是波形编码中非常有效的一种数字编码方式。在电信领域,它主要的应用领域是语音压缩编码,因为它利用了语音信号样点间的相关性,并针对语音信号的非平稳特点,使用自适应预测和自适应量化,在保证可接受恢复语音质量的同时,能有效降低比特流数。该编码技术应用于几乎所有的波形编码、高质量音频、图像和调制数据中,主要用于对中等质量的音频信号进行高效率压缩,例如语音信号的压缩、调幅广播音质的信号压缩等。结合对ADPCM算法中各个模块的功能函数的描述,论述了实现ADPCM编解码算法中应该注意的问题。
下面通过介绍自适应量化和自适应预测原理来讨论ADPCM系统的基本原理。
1.自适应量化
自适应量化是在一定的量化级数下,减少量化误差或在相同误差情况下压缩数据。自适应量化必须具有对输入信号幅度值的估算能力,否则无法确定信号改变量的大小。自适应量化的基本思想是让量化阶距 随输入信号的能量(方差)变化而变化。
常用的自适应量化实现方案有两类:一类是直接用输入信号的方差来控制 的变化,成为前馈自适应量化;另一类是通过编码器的输出码流来估算出输入信号的方差,控制阶距自适应调整,成为反馈自适应量化。
按ITU-T G.721协议规定,自适应量化器应根据输入信号的时变性质调整量化阶距的变化速度,以使量化阶变化与输入信号变化相匹配。对于语音信号这类波动较大的差值信号,采用快速自适应调整方法。
自适应量化的两类实现方案的阶距调整算法是类似的。反馈型控制的主要优点是量化阶距信息由码字提供,所以无需额外存储和传输阶距信息,前馈型控制处理传输信号码流外,还要传输阶距信息,增加了传输带宽和复杂度。无论采用反馈型还是前馈型,自适应量化都可以改善系统的动态范围和信噪比。
理论和实践都表明了,在量化电平数相同的条件下采用自适应量化,相对固定量化系统的性能可以改善10~12dB。
2.自适应预测
根据常见的信息源求得多组固定的预测参数,将预测参数提供给编码使用。在实际编码时,根据信息源的特性.以实际值与预测值的均方差最小为原则。自适应地选择其中一组固定的预测参数进行编码。
预测参数的最佳化依赖于信源的统计特性,要得到最佳的预测参数是一件繁琐的工作。而采用固定的预测参数往往又得不到好的性能。为了既能使性能较佳,又不致于有太大的工作量,可以将上述两种方法折衷考虑,采用自适应预测。
具体方法是:预测参数仍采用固定的;但此时有多组预测参数可供选择。这些预测参数根据常见的信源特征求得。编码时具体采用哪组预测参数根据信源的特征来自适应的确定。
为了自适应的选择最佳参数,通常将信源数据分区间编码,编码时自动地选择一组预测参数,使该区间实际值与预测值的均方误差最小。随着编码区间的不同,预测参数自适应的变化,以达到准最佳预测。
ADPCM编解码算法原理【7】:
ADPCM编解码器完成对64kbps A律或 律脉冲编码调制(PCM)信号和40,32,24或16kpsADPCM信号之间的转换。
下图3.2给出了ADPCM编解码原理的简化框图。

图3.2 ADPCM编解码器

3.3.1 ADPCM编码
实现由A率或 率PCM与线性PCM之间的转换可以使用表3.1和表3.2中的对应关系。线性PCM和A率PCM信号转换中线性PCM信号为12位,转换过程中最后几位被省略,A率PCM信号为7位,没有包括符号位。

表3.1 线性PCM和A率PCM转换的对应关系
线性PCM A率PCM
00000001wxyz 000wxyz
0000001wxyza 001wxyz
000001wxyzab 010wxyz
00001wxyzabc 011wxyz
0001wxyzabcd 100wxyz
001wxyzabcde 101wxyz
01wxyzabcdef 110wxyz
1wxyzabcdefg 111wxyz

线性PCM和 率PCM信号转换中线性PCM信号为13位,转换过程中最后几位被省略, 率PCM信号为7位,没有包括符号位。

表3.2 线性PCM和 率PCM转换的对应关系
线性PCM 率PCM

00000001wxyza 000wxyz
0000001wxyzab 001wxyz
000001wxyzabc 010wxyz
00001wxyzabcd 011wxyz
0001wxyzabcde 100wxyz
001wxyzabcdef 101wxyz
01wxyzabcdefg 110wxyz
1wxyzabcdefgh 111wxyz

在A率或 率PCM输人信号转换成均匀PCM信号后,用输入信号减去输人信号的估计值得到差分信号。自适应31,15,7或4级量化分别将差分信号量化后用于编成5,4,3,2位二进制数字序列,传输到解码器端。同时反向量化器分别从这些5,4,3,2位二进制数字序列中产生量化差分信号。信号的估值加上这个量化差分信号得到输人信号的重构信号。编码及量化的对应关系可以在ITU-T的G.726建议中查到。自适应预测器又利用重构信号和量化差分信号产生输入信号的估计信号,这样就完成了反馈环路。

3.3.2 ADPCM解码
如果在编码器的反馈部分,再加上一个均匀PCM到A率或 率的转换部分和一个同步编码调整的部分,就构成了解码器的全部结构。均匀PCM到A率或 率的转换部分和编码器端的对应关系相同。同步编码调整是为了避免在某种情况下由于同步级联编码(ADPCM→PCM→ADPCM,等数字连接)而产生的误差累积。同步编码调整是通过调整PCM输出编码,在某种意义上消除了下一个ADPCM编码级中的误差累积。
而IMA-ADPCM(Adaptive Differential Pulse Code Modulation,ADPCM),是一种针对16bit (或者更高) 声音波形数据的一种有损压缩算法,它将声音流中每次采样的16bit数据以4bit存储,所以压缩比4:1,是一种特殊的ADPCM算法。在解压时,把编码压缩之后的4bit在通过解码之后,返回即可得到16bit的数据,从而实现解压缩的过程。而且IMA-ADPCM的压缩、解压缩算法非常的简单,所以是一种低容量消耗,高质量声音获得的好途径。
第四章 语音预测编码的压缩系统的设计与实现
4.1总体设计
4.1.1 整体思想
基于语音信号预测编码的数据压缩算法非常多,但从模拟状态的语音信号先变为数字状态的信号,即可以通过录制到计算机的方法采集到所需要压缩的语音信号,存储在计算机中的语音已经可以说是最原始的未经压缩的PCM语音流,在设计中把录制下来的语音存储到.wav格式的声音文件中。
wav格式是Microsoft公司的一种音频文件格式,也叫波形声音文件,是最早的数字音频格式,被Windows平台及其应用程序广泛支持。
这种波形声音的文件来源于对声音模拟波形的采样。用不同的采样频率对声音的模拟波形进行采样可以得到一系列离散的采样点,以不同的量化位数(8位或16位)把这些采样点的值转换成二进制数,然后存入磁盘,这就产生了声音的wav文件,即波形文件。它支持许多压缩算法,支持多种音频位数、采样频率和声道,采用44.1kHz的采样频率,16位量化位数, wav的音质与CD相差无几,但wav格式对存储空间需求太大不便于交流和传播。因此,存放录制之后未压缩前最原始的语音信号,用.wav格式的文件来表示是最合适的。
比起PCM所占用的大容量,其包含的冗余量是编码的目标,利用其进行编码的各种算法各有千秋,而ADPCM是语音波形压缩编码传输广泛采用的一种方式,是比较早期和发展成熟的一种算法,利用ADPCM进行编码压缩之后的语音质量可以保持一个比较高的水准,比起其它可以获得高压缩比的、但或多或少会造成语音失真的算法,ADPCM是一种具有一定压缩比,且对音质有较高要求的理想的算法。而且在本设计中利用了IMA-ADPCM算法,它将声音流中每次采样的16bit数据以4bit存储。一般来说,32kb/s ADPCM可以做到与64kb/s PCM相媲美的质量,ITU-T G.721协议就提出了与现有PCM数字电话网兼容的32kb/s ADPCM的算法,由此可见,ADPCM能够满足无论对音质,还是存储空间相对高的要求。
在压缩过程中,无论是要压缩的文件,还是压缩之后的文件,都离不开文件的读写。VC++有很强大的文件功能,在类CFileDialog里有很多的函数,有助于理解和对文件进行操作。在定义了wav文件头之后,对文件的操作就相对简便了很多。文件的创建、文件的类型(二进制还是其它形式的文件)、文件的读写、类函数参数的设置都是很重要的,对要进行这些操作的文件的大小、格式、长度等都有着密切的影响。
以下为界面的简单介绍。
简洁的界面加上比较齐全的功能是这个软件的基本。本程序可以采用录音功能录制一个或者自主选择一个要求压缩的语音文件。录音功能模块包括了录制,播放,停止,保存等基本功能。

4.1.2 程序功能模块图

程序的各个部分功能模块图如图4.1所示:

从图4.1可以看出,语音压缩系统主要分为录音及压缩两个模块。录音主要起录制语音的作用,包含了录音、停止、播放、保存录音文件等功能,而压缩则减少文件在计算机中的存储容量,从而实现更方便存储、传输的功效。

4.1.3 程序流程框图

4.2模块的设计与实现
4.2.1 压缩模块
前面提过,IMA-ADPCM是一种针对16bit (或者更高) 声音波形数据的一种有损压缩算法,它将声音流中每次采样的16bit数据以4bit存储。在本设计中就利用了这个算法,通过判断所要压缩的文件是单声道还是双声道,16bit或者8bit,然后再对其进行压缩。
在进行压缩之前,先读取所要压缩的对象,可以说是保存在计算机里的PCM语音文件即wav文件,假设为PCM.wav。在读取wav文件之前,必须要对wav文件头进行定义,因为wav文件的定义将会对读取,写入wav文件有很大的影响。不同格式的wav文件,压缩出来的wav文件自然不同。通过读取需要压缩的wav文件,这里是PCM.wav,可以得知这个wav文件的所有信息,声道数、采样率、采样精度等,下一小节将仔细说到所定义的wav文件头。
正如ADPCM的原理所示,ADPCM是根据前几个样值来对下一个样值进行预测,将预测值与实际值之差进行编码,这样做比起对实际值直接进行编码,所需的位数将大大减少。预测值越准确,差值越小,所需的位数就越少,压缩比将越高。
在本设计中,利用已有的两个数组可以很方便的实现预测值的调整,即实现自适应的功能【8】。
const short next_step[16] =
{
-1, -1, -1, -1, 2, 4, 6, 8,
-1, -1, -1, -1, 2, 4, 6, 8
};
const short step[89] =
{
7, 8, 9, 10, 11, 12, 13,
14, 16, 17, 19, 21, 23, 25,
28, 31, 34, 37, 41, 45, 50,
55, 60, 66, 73, 80, 88, 97,
107, 118, 130, 143, 157, 173, 190,
209, 230, 253, 279, 307, 337, 371,
408, 449, 494, 544, 598, 658, 724,
796, 876, 963, 1060, 1166, 1282, 1411,
1552, 1707, 1878, 2066, 2272, 2499, 2749,
3024, 3327, 3660, 4026, 4428, 4871, 5358,
5894, 6484, 7132, 7845, 8630, 9493, 10442,
11487, 12635, 13899, 15289, 16818, 18500, 20350,
22385, 24623, 27086, 29794, 32767
};
数组next_step[]是用来决定数组step[]中要用到的数值。而step[]包含了对ADPCM样值编码时所用的step sizes,即所要调整的预测值的多少。
编码时,
①假设定义一个变量diff,用来存放输入样值val和预测值valpred之差,如果diff<0,即可以判定编码样值的最高位为1。最高位为符号位。如果符号为1,则diff = -diff;
②确定符号位,和数值分离之后,然后依次判别剩下三位。假设ADPCM编码之后的输出为delta,而vpdiff作为预测值的调整值,那么是根据delta=diff*4/step;vpdiff=(delta+0.5)*step/4;每判断一次diff>=step?即可以依次得到Bit2、Bit1、Bit0,然后step都要右移一位,换言之,就等于把该数值乘以2。
③得到ADPCM的每一位编码之后,接下来需要根据下一个的预测值的调整大小,更新下一个预测值。根据符号位的不同,下一个预测值valpred相应的加上或者减去在步骤②所得到的vpdiff,由此得到新的预测值。
④ADPCM编码后的符号位和之后的每一位合并,然后更新next_step和step,以便更新下一个预测值时使用。
解码则是编码的逆过程,
①输入需要解码的码流,即经ADPCM编码后的码流,ADPCM编码后的符号位和之后的每一位合并,然后更新next_step和step,以便更新下一个预测值时使用。假设定义一个变量diff,用来存放输入样值val和预测值valpred之差,如果diff<0,即可以判定编码样值的最高位为1。最高位为符号位。如果符号为1,则diff = -diff;
②得到当前为了确定step[]中预测值所需调整的大小,next_step[]数值中的改变量。
③分离出符号位,数值仍存放在delta中。
④计算差值和预测值,根据编码时的vpdiff = (delta+0.5)*step/4。因为编码时step每判断一次条件都要右移一位,所以通过比较delta中每一位,都可以得出vpdiff的改变量。
和编码相似,根据符号位的不同,下一个预测值valpred相应的加上或者减去之前所得到的vpdiff,由此产生新的预测值。
⑤值得注意的是,预测值valpred的范围应保持在-32768~32767之间。
⑥更新数组step[]中预测值所需调整的大小以及数组next_step[]所需要用到的调整值是关键的步骤。

4.2.2 录音模块
播放波形音频文件可以使用以下三种方法之一:
①利用低级的以wave为前缀的WIN32API函数,应用它可以获得丰富的功能,但必须编写较复杂的程序代码。
②利用高级音频函数,使用简单,但功能有限。
③利用Windows的媒体控制接口。
MCI(Media Control Interface,媒体控制接口) 向Windows程序提供了在高层次上控制媒体设备接口的能力。MCI提供了一个对各种多媒体设备的通用接口【9】。这些设备包括音频视频交互(AVI)播放器、动画播放器、声卡上的波形音频和合成器系统等。程序不必关心具体设备,就可以对激光唱机(CD)、视盘机、波形音频设备、视频播放设备和MIDI设备等媒体设备进行控制。
频率采样的频率等于波形被等分的份数,标准的采样频率有三种,即44.1kHz,22.05kHz,11.025kHz。频率越高,声音越接近原始声音。
信息量每个采样点存放的信息数量反映了采样点测量的精度,一般可有8位或16位采样。采样的位数越大,波形的动态范围也越大,声音精确度越高。
声道数即声音通道的个数表明声音记录是只产生一个波形(单声道)还是来给那个波形(立体声双声道)。
数据量波形文件的数据量是十分巨大的,如不经压缩,采样频率仅为11.025kHz时,数据量为0.66MB/min。
在录音模块,就使用了MCI设备来对语音实现录制等功能。
应用程序通过向MCI发送命令来控制媒体设备。利用MCI函数,可以把命令发送到任何设备,每个设备的有效命令取决于设备本身的能力。
MCI命令接口分为命令字符串和命令消息两种【10】,两者具有相同的功能,命令字符串具有使用简单的特点,但是它的执行效率不如命令消息。在本设计中使用的皆为命令消息。
所有的MCI命令消息都是通过mciSendCommand函数发送的。
该函数的声明为:
MCIERROR CHwMCI::hwMciSendCommand(
MCIDEVICEID IDDevice, //设备的ID,在打开设备时不用该参数
UINT uMsg, //命令消息
DWORD fdwCommand, //命令消息的标志
DWORD dwParam //指向包含命令消息参数的结构
); //若成功则返回0,否则返回错误码
因为在该模块中,可以先定义了一个类CHwMCI,把该模块程序所需要的所有函数封装在该类中,这些函数用以实现录制模块的所有功能,包括录制、播放、保存、停止等。
在使用这些函数之前,必须了解到以下几个数据结构MCI_OPEN_PARMS、MCI_PLAY_PARMS、MCI_RECORD_PARMS,不需要记住这些数据结构,但了解数据结构的内容和变量对编程有很大的帮助。
①打开波形音频设备
MCI_OPEN_PARMS OpenParms;
OpenParms.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_WAVEAUDIO;
OpenParms.lpstrElementName = (LPCSTR) FileName; // 打开的声音文件名
OpenParms.wDeviceID = NULL; // 打开的音频设备的ID
mciSendCommand ( NULL,MCI_OPEN,
| MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,
(DWORD)(LPVOID) &OpenParms )
OpenParms.wDeviceID=0;
MCI设备ID知名打开了那个设备,当发送了MCI_OPEN命令时,这个值在参数块中返回——应被保存备用。
②关闭波形音频设备
关闭某一MCI设备可使用如下语句即可:
mciSendCommand ( m_wDeviceID, MCI_CLOSE, NULL, NULL );
③录制
先判断声道数,然后通过步骤①,打开了MCI设备。
利用自己定义的SetPara ()函数
BOOL CHwMCI::SetPara (
WORD wFormatTag, // format type
WORD nChannels, //纪录声音的通道数
DWORD nSamplesPerSec, //记录每秒取样数
DWORD nAvgBytesPerSec, //记录每秒的数据量
WORD nBlockAlign, //记录区块的对齐单位
WORD wBitsPerSample //记录每个取样所需的位元数
)
SetPara ( WAVE_FORMAT_PCM, nChannels, 11025, 11025*nChannels, nChannels, 8 );该语句设定好wav文件的格式以及录制下来的语音的各个参数。
然后,定义 MCI_RECORD_PARMS RecordParms,利用语句
mciSendCommand ( m_wDeviceID, MCI_RECORD, NULL, (DWORD)(LPVOID) &RecordParms) == 0 );即可把语音录制下来。
④播放
MCI_PLAY_PARMS PlayParms; //同理,需要定义数据结构
PlayParms.dwFrom =0; //指定从什么地方(时间)播放WAVE文件
mciSendCommand ( m_wDeviceID, MCI_PLAY,
MCI_FROM,(DWORD)(LPVOID)&PlayParms );
在播放前可以添加一个语句,停止录制(或播放)的语句,确保播放前设备没有被使用。
⑤保存&停止
该步骤与播放等类似,不过保存步骤需要打开对话框,可以自主选择保存地点。因此还需要或许文件名。
语句mciSendCommand ( m_wDeviceID, MCI_STOP, NULL, NULL );即可实现停止功能。

4.3设计介绍
4.3.1 设计环境及wav文件格式的概述
本次编程在Visual C++ 6.0环境中进行。Visual C++ 6.0是美国Microsoft公司于1998年退出的基于Windows 98操作平台的功能强大的编程工具,它具有友好的图形化用户界面、面向对象的程序开发,完善而又丰富的库函数以及Internet网络应用等诸多功能,能够利用它开发出各种有用的应用程序。
因为VC++包含了两套完整的Windows应用开发系统,所有还是可以使用Windows SDK所提供的API来开发用C语音编写的Windows应用。ADPCM的算法是早期的一种已经比较成熟的算法,在这次编程中还可以用C语音来编写。
语音文件的格式有许多种,由于使用了录音功能,保存下来的语音文件使用的是微软的wav文件格式。
wave文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。RIFF是英文Resource Interchange File Format的缩写,每个wave文件的头四个字节便是“RIFF”。 wave文件由文件头和数据体两大部分组成。其中文件头又分为RIFF/WAV文件标识段和声音数据格式说明段两部分【11】。
常见的声音文件主要有两种,分别对应于单声道(11.025KHz采样率、8Bit的采样值)和双声道(44.1KHz采样率、16Bit的采样值)。采样率是指:声音信号在“模→数”转换过程中单位时间内采样的次数。采样值是指每一次采样周期内声音模拟信号的积分值【12】。
对于单声道声音文件,采样数据为八位的短整数(short int 00H-FFH);而对于双声道立体声声音文件,每次采样数据为一个16位的整数(int),高八位和低八位分别代表左右两个声道。
wave文件数据块包含以脉冲编码调制(PCM)格式表示的样本。wave文件是由样本组织而成的。在单声道wave文件中,声道0代表左声道,声道1代表右声道。在多声道wave文件中,样本是交替出现的。
wave文件按照在文件中的出现位置包括:RIFF WAVE Chunk, Format Chunk, Fact Chunk(可选), Data Chunk。

typedef struct _WAVEFILEHEADER
{
DWORD dwRIFF; // 4字节 // “RIFF”标志
DWORD dwSize; // 4字节 // 文件长度 32bit
DWORD dwWAVE; // 4字节 // “WAVE”标志
DWORD dwFmt; // 4字节 // “fmt”标志
DWORD dwFmtSize; // 4字节 // 过渡字节(不定)
WORD wFormatTag; // 2字节// 格式类别(10H为PCM形式的声音数据)
WORD nChanels; // 2字节 // 通道数,单声道为1,双声道为2
DWORD nFreq; // 2字节// 采样率(每秒样本数),表示每个通道的播放速度
DWORD nBitrate; // 4字节//波形音频数据传送速率,其值为通道数×每秒数据位数×每样本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。
WORD nAlign; // 2字节 // 数据块的调整数(按字节算的),其值为通道数×每样本的数据位值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其值用于缓冲区的调整。
WORD wBitsPerSample; // 2字节 // 每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多个声道,对每个声道而言,样本大小都一样。
DWORD dwData; // 4字节 // 数据标记符"data"
DWORD dwDataSize; // 4字节 // 语音数据的长度
}; WAVEFILEHEADER;

对于文件的读写、定位等操作,可以采用fopen(),fread(),fclose(),fseek()等函数来进行。

4.3.2 界面功能介绍
该程序是基于对话框编写的,在界面上也可以很清楚的反映模块的划分。
上半部分是录音模块,下半部分是压缩模块,对于录音部分的按钮比较多,停止和保存按钮必须在录制开始之后才会显示出来。
而压缩模块中当自主选择了压缩文件及保存路径后,编辑框会自动显示所选择文件的路径。
整个界面如下图4.5所示:

图4.5 程序界面图

在上部的组合框下拉菜单中,可以选择声卡类型,根据要求的不同以及计算机所包含的声卡,选择适合的类型,如下图4.6所示,

图4.6声卡设备选择

在Record组框中,显而易见的就是实现录音模块功能的各个部分。左边是在录音前选择录制的语音是单声道(Mono)还是立体声双声道(Stereo)。
而组框中间的组合框是用来选择录音的一些参数。上面的是录音的采样位数,8位或者16位;下面的是录音的采样频率,有8000Hz、11025Hz、22050Hz、44100Hz。通过这些下拉列表可以更好的设置录音参数,得到不同的效果。
按下Rec按钮后,开始录音。
此时,Stop和Save按钮将由灰色状态显示出来,变为如下图4.7所示:

图4.7按钮状态
当录音完成之后按Stop就可以结束录音了,此时,该键变回灰色状态。
保存时,按下Save按钮,弹出“另存为”对话框,这时可以自主选择保存所录制的wav文件在计算机中的位置,保存成功时,即弹出一个提示对话框,显示保存wav文件成功。
例如下图4.8所示:

图4.8保存成功

位于界面中间的是PCM2ADPCM组框,其中包含了两个可以显示PCM文件(即要压缩的文件)路径和ADPCM文件(压缩后的文件)路径的编辑框,编辑框显示是通过右边的“打开”或“另存为”对话框按钮所选择的文件的路径。
当选择了要压缩的文件,即PCM文件之后,在路径编辑框下面的音频信息组框中会显示相应的文件音频信息,包括声道数、采样频率、时长、采样位数。
例如,打开通用对话框,选择了要压缩的文件,然后在编辑框里即可显示其对应的路径,然后,PCM音频信息组框里即如下图4.9所示:

图4.9 PCM音频信息

选择好对应的压缩及保存的wav文件之后,按下Convert按钮,即可进行压缩编码。
当压缩编码成功时,即转换结束了,将弹出一个提示对话框,显示转换成功,单击“确定”即可返回。

图4.10 转换成功
Close按钮,可结束程序。
回到计算机里存放压缩文件所在的文件夹,把压缩前后的文件进行对比。
例如下图4.11所示,

图4.11 压缩前后文件对比

可以很清楚地看出两者在容量上的不同,压缩前后的文件属性如下图4.12、图4.13所示:

图4.12 压缩前文件属性 图4.13 压缩后文件属性

由于录音时的录音设置为11025Hz、8位,压缩前的文件的音频采样大小就为8位,用IMA-ADPCM压缩编码之后的数据为4位,因此实现了压缩比2:1。若选择压缩的文件为16位,以及更高的频率,则可以实现压缩比4:1。但播放这两者时,可以听出,人耳并没有听出在音质上的太大不同,因此没有造成声音的失真,还克服了wav容量过大的缺点。

4.4对本设计所选用的算法和及其衍生算法进行分析、比较
本设计所选用的是ADPCM,一种针对8bit、16bit (或者更高) 声音波形数据的一种有损压缩算法,它将声音流中每次采样的16bit数据以4bit存储。在本设计中就利用了这个算法,通过判断所要压缩的文件是单声道还是双声道,16bit或者8bit,然后再对其进行压缩。
CCITT的32Kb/s语音编码标准G.721就采用ADPCM编码方式,每个语音样值相当于用4比特进行编码。一般来说,32kb/s ADPCM可以做到与64kb/s ADPCM相媲美的质量。
前面提过,ADPCM是波形编码的一种,是从PCM、DCPM改进而得。DPCM利用差值编码可以降低信号传输速率,但其重建语音的质量却不如PCM,主要原因是其量化是均匀的,即量化阶是固定不变的;预测信号波形是阶梯波或近似阶梯波,与输入信号的逼近较差。
因此,根据差值的大小,随时调整量化阶的大小,使量化的效率最大;提高预测信号精度,使输入信号与预测信号之间的差值最小,使编码精度最高,这就是ADPCM编码。
1.波形编码
ADPCM编码属于波形编码中的一种,波形编码的优点是编解码器简单,延迟时间短,音质高,总的来说比较简单,失真最小,方法简单,但数码率比较高,压缩比不大,对传输通道的错误比较敏感。
之后的在ADPCM之上发展起来的算法有很多,不仅仅有各种波形编码,或者参数编码,还包括发展起来的混合编码,因为混合编码融合了波形编码与参数编码的优点,因此具有很大的优越性。
DCME-ADPCM(Digital Circuit Multiplication Equipment Adaptive Differential Pulse Code Modulation,数字电路倍增设备-自适应差分脉冲编码调制)是CCITT G.723语音编码标准算法,这种算法可以在40Kbps、32Kbps和24Kbps三种速率中动态调整,以达到在给定的信道中增加容量的目的。
E-ADPCM(Embedded Adaptive Differential Pulse Code Modulation,嵌入式自适应差分脉冲编码调制)是CCITT G.727语音编码标准算法。这种算法具有16Kbps、24Kbps、32Kbps、40Kbps四种速率,适用于在分组网络中传输语音,当网络节点的瞬时负荷过重时,这种算法允许丢失样值的次要比特,保留核心比特,以避免语音分组的丢失。
2.参数编码
LPC是最基本的低速率语音编码方法,LPC语音编码的基础是语音产生模型,在这个模型中,语音是由激励信号激励一个自适应滤波器(即LPC滤波器)而产生。LPC滤波器的参数是通过线性预测的方法,即用过去的样值预测当前样值提取的。
LPC算法属于参数编码的一种,初期的参数编码虽然质量较差、自然度较低,但比起波形编码在低速率下语音质量骤降,参数编码可以实现低速率语音编码,还可以保持一定的可懂性。
3.混合编码
码激励线性预测(CELP)编码是采用合成分析法(Analysis-By-Synthesis)的语音编码,是一种典型的混合编码方案【13】。码激励线性预测(CELP)是近10几年来最成功的语音编码算法。CELP语音编码算法用线性预测提取声道参数,用一个包含许多典型的激励矢量的码本作为激励参数,每次编码时都在这个码本中搜索一个最佳的激励矢量,这个激励矢量的编码值就是这个序列的码本中的序号。CELP主要用于高质量的窄带语音保密通信。CELP编码方法提出后,4kbit/~16kbit/s中、低速率语音编码的话音质量有明显提高。但当速率低于4kbit/s时,由于码数容量变得太小,不能很好地代表预测余量信号,性能会很快下降。
16Kbps LD-CELP是CCITT G.728语音编码标准算法,这种方法在CELP算法的基础上,采用后向自适应线性预测、50阶合成滤波、短激励矢量(5个样值)等改进方法,从而达到高质量和低时延的目的,总的编码时延小于2ms。
1989年公布的北美数字移动通信标准(IS-54标准),语音编码就采用了8kbit/s矢量和激励线性预测(VSELP)算法。该算法也属于CELP类型,只不过采用了自适应长时码书以及两个结构化的随即激励码书。比起几个难点的CELP,VSELP运算量减少很多,并能用定点算法实现,有利于硬件的简化。
对于不断发展起来的其它很多标准,其中语音编码所需要的算法也在不断改进。多带激励(MBE)编码和混合激励线性激励(MELP)编码已能实现2.4kbit/s高音质语音编码。2kbit/s以下速率的高音质语音编码是目前语音编码研究的主要课题之一。短时延编码也是目前语音编码的一个趋向,现在已经解决了8kbit/s低时延高质量的课题。更低速率、更高质量及短时延语音编码的算法研究已成为研究者当前的重要课题之一了。
第五章 总结与展望
5.1设计总结
经过一个学期的毕业设计,我对于基于语音预测编码的数据压缩有了更深的了解,对语音ADPCM编码进行了深入的研究,对根据单声道或立体声双声道录制下来的8bit或16bit数据的wav文件等问题进行了研究,完成了一个基于语音预测编码,基于IMA-ADPCM算法的数据压缩系统,取得了很好的效果。
本文主要研究基于语音信号预测编码的数据压缩算法的基本理论、技术标准、评价方法进行研究与分析,还叙述了有关语音信号压缩的发展概况和进行语音压缩的意义。众多的编码压缩技术,在对其大致进行了调查以及分析后,然后设计目标定位为一个语音压缩系统,采用ADPCM编解码的方法来对一段录制下来的语音信号进行数据压缩,在获得一定压缩比的情况下,能很好地保持原语音信号波形的细节特征。
在设计过程中,遇到不少的困难和阻碍,例如对于VC++环境开发的运用,数字通信的原理,语音编码的具体算法,包括抽样、量化、编码的具体实现,还有由于这些不熟悉、不了解所带来的问题。在克服了这些种种困难之后,终于完成了这个设计程序。虽然还有许多不完善的地方仍需改进,但我对于能够实现基本功能的系统程序还是感到万分高兴的。
VC++是C++语音的一种设计开发环境,具有功能强大的集成开发环境,可以提供大量的库函数,例如MFC,可以实现文件存取、数字计算、多媒体处理等功能,可以编写功能强大的Windows应用软件。但正因为VC++的强大功能,其学习、掌握过程也不是轻松容易的。在此前提下,导师、前辈、朋友的指导给了我莫大的帮助和鼓舞。
这个设计基本上实现了对语音进行一定程度上的压缩功能,虽然压缩比不是太高,但在此基础上改进算法之后还是可以不断提高的。不单如此,在程序的功能上还可以再进行扩展,在录音模块还可以继续添加更多的功能,比如说显示语音波形、计时器、进度条等,但由于能力有限,无法在规定时间内完成这部分功能。因为多媒体方面是可以做得很丰富的。在压缩模块同样也可以添加进度条等控件,这样直观上系统就会显得更完善。

5.2工作展望
语音编码的根本目的是用尽可能少的比特表征信号的同时,又能维持更高的感知信号质量【14】,但在现代数字通信中,为提高信道利用率,如何用尽可能少的比特数来对语音信号进行编码受到越来越多的重视。在短短10年中就产生了3个国际标准、2个地区标准和2个国家标准,足见语音压缩编码的研究发展之快,其在国际标准化工作中堪称为最活跃的研究领域。就语音编码的现状而言,64kb/s,32kb/s,16kb/s和8kb/s的技术已经标准化和产品化,已具备比较完善的理论和技术体系,并进入实用阶段。总之,低码率和高质量将是语音编码今后研究的主要方向。
在这一段时间的设计中,我学到了很多以前从来没有接触过的知识。在实践中,网络、书籍不断地翻阅,和别人交流,让我还懂得了很多在书本上学习不到的。遇到的困难更激励我不断地去探索、学习,来自老师、朋友的帮助,在这种时刻显得更加弥足珍贵。这次的设计让我懂得了,只有认清自己的不足与缺点后,通过不断学习,不断汲取知识,向人请教,才能得到更好的进步。这不管是对自己将来的学习还是工作,这都是不可缺少的,是我在大学毕业之际获得的宝贵的精神财富,将受益终生。
参考文献
[1]吴家安.语音编码技术及应用[M].机械工业出版社,2006.56~58,84~96
[2]吴乐南. 数据压缩[M]. 电子工业出版社,2000.76~90
[3]苏桃.浅谈语音压缩编码的发展和应用[J].科技情报开发与经济2006.16(22):
157~158
[4]lx_bupt.语音压缩算法测评及质量评估[EB/OL]. http://blog.csdn.net/
lx_bupt/archive/2006/08/31/1151461.aspx.2007-05-20
[5]鲜继清,张德民.现代通信系统[M].西安电子科技大学出版社.2003.18~24
[6]李文海,毛京丽,石方文.数字通信原理[M].人民邮电出版社.2001.44~47
[7]王晓亚,张建立.G.726语音压缩编码的实现[J].无线电工程,2005,35(3):45~47
[8]ctrlcv.IMA-ADPCM算法[EB/OL]. http://blog.csdn.net/ctrlcv/archive/2007/
02/07/1504737.aspx.2007-05-20
[9]谭德强,姜波.实用软件工具与环境教程——C++高级编程[M].清华大学出版社.2001.54~72
[10]杨晨.VC下音频文件的播放[J]. Playing audio file with visual c++.2005
[11]kindyb.ADPCM WAVE文件的压缩与解压缩[EB/OL].http://blog.csdn.net/
kindyb/archive/2005/10/13/503024.aspx.2007-05-20
[12]lzcx.WAVE文件格式剖析[EB/OL].http://blog.csdn.net/lzcx/archive/2006/
04/26/677796.aspx.2007-05-20
[13]lzhw_lucky.各种音频编码方式的比对[EB/OL]. http://blog.chinaunix.net/
u/16942/showart_136593.html.2007-05-20
[14]S.Sridharan J.Leis K.K.Paliwal.SPEECH CODING[J]. Handbook of Neural Networks for Speech Processing

附录
部分源程序

基于算术编码的数据压缩算法研究与实现

Posted by 天际的荒草 | Posted in Docs | 文档 | Posted on 18-09-2009

标签:, , ,

0

目 录

摘 要 II
ABSTRACT III
第一章 绪论 1
1.1数据压缩 1
1.2数据压缩的现状与发展趋势 2
1.3课题研究的意义 4
第二章 算术编码原理及特点 5
2.1统计编码 5
2.2算术编码原理 6
2.2.1算术编码理论 6
2.2.2算术压缩模式 8
第三章 典型算术编码方案分析 12
3.1 WNC算法算术编码 12
3.2 基于上下文的二进制算术编码 14
3.3自适应算术编码算术及其实现 16
第四章 算术编码系统的实现 20
4.1软件模块设计 20
4.2软件模块的具体实现 21
4.2.1输入输出模块的实现 21
4.2.2压缩模块的实现 24
4.2.3解压模块的实现 27
4.3压缩效率分析 30
4.4 软件设计的优点与不足 31
4.5 软件设计值得改进的地方 31
第五章 算术编码总结 33
参考文献 35
致 谢 36
附 录 37
算法源代码 37

摘 要
在现今的电子信息技术领域,由于需要处理的数字化的信息(尤其是多媒体信息)通常会特别庞大,如果不对其进行有效压缩就难以得到实际应用,数据压缩的目的即是通过有效减少数据文件的冗余信息而使数据文件可以以更快的速度传输或在更少的空间储存。因此数据压缩技术已成为当今数字通信、存储和多媒体娱乐的一项关键的共性技术。
本文由香农熵理论和统计编码的原理开始,逐步展开对基于算术编码的数据压缩的研究与应用的讨论:从算术编码的原理、产生条件、以及研究算术编码的目的意义等,到具体算术编码方案的分析比较以及其C++语言的实现方案,有重点的对算术编码的特点进行了分析和阐述。而针对算术编码在处理二元符号时高压缩比、低复杂度的特点,本文着重探讨了算术编码方法处理二元数据流的过程的特点和效率优势,并将算术编码的不同实现方法进行了分析和比较,特别是对N阶自适应编码的特点和处理文字信息的优势进行了分析,然后将其和与之较为类似的Huffman编码进行了比较,通过比较得出了算术编码具有但Huffman编码不具有的在处理数据流方面的优势,即Huffman编码必须在得到全部数据文件之后才可以对文件进行编码处理,而算术编码方法可以在只得到数据流片段的情况下就开始对数据进行压缩,使得当处理数据流信息时在保证高压缩比的同时具有了很大的灵活性。
本文通过对算术算法特点和应用方向的研究,阐明其在数据压缩领域不可取代的地位及在处理流片段数据所具有的在压缩比和灵活性方面的优势,展示出算术编码的强大生命力和独特优势。
最后,应用文中研究得到的算术编码方法和实现模型,在Windows系统下,使用Visual C++ 作为编程工具,实现了算术编码及其应用程序界面,,对于接近二进制流的文件,本设计具体令人满意的压缩效果,对其他格式的文件也有较好的压缩效果,达到了论文的设计目标。
关键词:算术编码,无损压缩,自适应模式

ABSTRACT

Nowadays, as the digital information (especially the multimedia information) becomes more voluminous in the telegraphy field, the information should be compressed availably. The purpose of data compression is reducing the redundancy of data files effectively for faster transfer and/or smaller space for storage. So the data compression technology becomes a common pivotal technology for digital communication, storage and multimedia entertainment.
From Shannon entropy theory and the statistics coding theory, this paper sets forth the research and application of the data compression which based on Arithmetic Coding, including the arithmetic coding theory, the having conditions and the purpose of arithmetic coding and then the research of the specific implementation plan with C++ language of arithmetic coding. Against the point of arithmetic coding, this paper analysis and expounds its superiority about it . For the characteristic of the superiority of compression ratio and complexity, this paper probe into the process of deal with the binary data streams and the superiority of efficiency. And taking compared between the different implementation plan, especially the characteristic of Order-N adaptive coding and the superiority in dealing with the textual information. Then compares arithmetic coding with the Huffman coding method which is very resembles with it, getting the superiority in dealing with the data stream fragment: arithmetic coding doesn’t need the complete file before need to encode it, but Huffman coding method cannot do it like this. That means arithmetic do not only have the superiority in compression ratio but also in flexibility.
Through the research of the characteristic and the application direction of arithmetic coding, this paper illuminates the unplaced status of Arithmetic Coding, the outstanding compress ratio and agility in deal with data stream fragments and brings forth the life force and its unique superiority.
At last, by the arithmetic coding method and implement model researched in this paper, completed the coding method and its correspondingly application procedure interface using Visual C++ programming tools in the Windows operating system. The test result shows that to the files close to the binary files, this design procures a satisfactory outcome. And to the files in other format, this design also get a preferably results. So, the design achieves the goal required in this paper.
KEY WORDS arithmetic coding, lossless compression, adaptive model

第一章 绪论
1.1数据压缩
数据压缩,用一句话说,就是用最少的数码来表示信号,即将字符串的一种表示方式转换为另一种表示方式,新的表示方式包含相同的信息量,但是长度比原来的方式尽可能的短。其作用是:能较快地传输各种信号,如传真、Modem通信等;在现有的通信干线并行开通更多的多媒体业务,如各种增值业务;紧缩数据存储容量,如CD-ROM、VCD和DVD等;降低发信机功率,这对于多媒体移动通信系统尤为重要。也就是说,通信时间、传输带宽、存储空间甚至发射能量,都可能成为数据压缩的对象。
数据之所以能够被压缩是基于以下几点的考量:
首先,数据中间常存在一些多余成分,既冗余度。如在一份计算机文件中,某些符号会重复出现、某些符号比其他符号出现得更频繁、某些字符总是在各数据块中可预见的位置上出现等,这些冗余部分便可在数据编码中除去或减少。冗余度压缩是一个可逆过程,因此叫做无失真压缩,或称保持型编码。
其次,数据中间尤其是相邻的数据之间,常存在着相关性。如图片中常常有色彩均匀的背影,电视信号的相邻两帧之间可能只有少量的变化影物是不同的,声音信号有时具有一定的规律性和周期性等等。因此,有可能利用某些变换来尽可能地去掉这些相关性。但这种变换有时会带来不可恢复的损失和误差,因此叫做不可逆压缩,或称有失真编码、摘压缩等。
此外,人们在欣赏音像节目时,由于耳、目对信号的时间变化和幅度变化的感受能力都有一定的极限,如人眼对影视节目有视觉暂留效应,人眼或人耳对低于某一极限的幅度变化已无法感知等,故可将信号中这部分感觉不出的分量压缩掉或“掩蔽掉”。这种压缩方法同样是一种不可逆压缩。
数据压缩跟编码技术联系紧密,压缩的实质就是根据数据的内在联系将数据从一种编码映射为另一种编码。压缩前的数据要被划分为一个一个的基本单元。基本单元既可以是单个字符,也可以是多个字符组成的字符串。称这些基本单元为源消息,所有的源消息构成源消息集。源消息集映射的结果为码字集。可见,压缩前的数据是源消息序列,压缩后的数据是码字序列。
若定义块为固定长度的字符或字符串,可变长为长度可变的字符或字符串,则编码可分为块到块编码、块到可变长编码、可变长到块编码、可变长到可变长编码等。应用最广泛的ASCII编码就是块到块编码。对于数据压缩技术而言,最基本的要求就是要尽量降低数字化的在码事,同时仍保持一定的信号质量。不难想象,数据压缩的方法应该是很多的,但本质上不外乎上述完全可逆的冗余度压缩和实际上不可逆的嫡压缩两类。冗余度压缩常用于磁盘文件、数据通信和气象卫星云图等不允许在压缩过程中有丝毫损失的场合中,但它的压缩比通常只有几倍,远远不能满足数字视听应用的要求。在实际的数字视听设备中,差不多都采用压缩比更高但实际有损的媳压缩技术。只要作为最终用户的人觉察不出或能够容忍这些失真,就允许对数字音像信号进一步压缩以换取更高的编码效率。摘压缩主要有特征抽取和量化两种方法,指纹的模式识别是前者的典型例子,后者则是一种更通用的摘压缩技术。
1.2数据压缩的现状与发展趋势
设计具体的压缩算法时,设计者首先要做的是寻找一种能尽量精确地统计或估计信息中符号出现概率的方法,然后还要设计一套用最短的代码描述每个符号的编码规则。统计学知识对于前一项工作相当有效,迄今为止,人们已经陆续实现了静态模型、半静态模型、自适应模型、Markov模型、部分匹配预测模型等概率统计模型。
第一个实用的编码方法是由 D. A. Huffman 在 1952 年的论文“最小冗余度代码的构造方法”[1]中提出的。直到今天,许多“数据结构”教材在讨论二叉树时仍要提及这种被后人称为 Huffman 编码的方法。 Huffman 编码看似简单,但却影响深远,其编码效率高,运算速度快,实现方式灵活,从 20 世纪 60 年代至今,在数据压缩领域得到了广泛的应用。
1968 年前后, P. Elias[2] 发展了 Shannon 和 Fano 的编码方法,构造出从数学角度看来更为完美的 Shannon-Fano-Elias 编码。沿着这一编码方法的思路, 1976 年, J. Rissanen[3] 提出了一种可以成功地逼近信息熵极限的编码方法——算术编码。 1982 年, Rissanen 和 G. G. Langdon[4] 一起改进了算术编码。之后,人们又将算术编码与 J. G. Cleary 和 I. H. Witten[5] 于 1984 年提出的部分匹配预测模型( PPM )相结合,开发出了压缩效果近乎完美的算法。今天,那些名为 PPMC 、 PPMD 或 PPMZ 并号称压缩效果天下第一的通用压缩算法,实际上全都是这一思路的具体实现。
犹太人 J. Ziv 和 A. Lempel脱离 Huffman 及算术编码的设计思路,创造出了一系列比 Huffman 编码更有效,比算术编码更快捷的压缩算法。这些算法统称为 LZ 系列算法,如: LZ77 算法, LZ78 的压缩算法,以及LZW 算法。该系列算法的思路并不新鲜,其中既没有高深的理论背景,也没有复杂的数学公式,它们只是用一种极为巧妙的方式将字典技术应用于通用数据压缩领域。这种基于字典模型的思路在表面上虽然和 Shannon 、 Huffman 等人开创的统计学方法大相径庭,但在效果上一样可以逼近信息熵的极限。而且LZ 系列算法在本质上符合信息熵的基本规律。 LZ 系列算法的优越性使得使用该算法的压缩软件数量呈爆炸式增长。今天,我们熟悉的 PKZIP 、 WinZIP 、 WinRAR 、Gzip 等压缩工具以及 ZIP、GIF、PNG 等文件格式都是 LZ 系列算法的受益者。
在图像压缩领域,著名的 JPEG 标准是有损压缩算法中的经典。 JPEG 标准由静态图像联合专家组( Joint Photographic Experts Group , JPEG )于 1986 年开始制定,1994 年后成为国际标准。 JPEG 以离散余弦变换( DCT )为核心算法,通过调整质量系数控制图像的精度和大小。
CCITT 于 1988 年制定了电视电话和会议电视的 H.261 建议草案。 H.261 的基本思路是使用类似 JPEG 标准的算法压缩视频流中的每一帧图像,同时采用运动补偿的帧间预测来消除视频流在时间维度上的冗余信息。在此基础上, 1993 年, ISO 通过了动态图像专家组( Moving Picture Experts Group , MPEG )提出的 MPEG-1 标准。 MPEG-1 可以对普通质量的视频数据进行有效编码。为了支持更清晰的视频图像,特别是支持数字电视等高端应用, ISO 于 1994 年提出了新的 MPEG-2 标准(相当于 CCITT 的 H.262 标准)。 MPEG-2 对图像质量作了分级处理,可以适应普通电视节目、会议电视、高清晰数字电视等不同质量的视频应用。在我们的生活中,可以提供高清晰画面的 DVD 影碟所采用的正是 MPEG-2 标准。
Internet 的发展对视频压缩提出了更高的要求。ISO 于1999年通过了 MPEG-4 标准(相当于 CCITT 的 H.263 和 H.263+ 标准)。 MPEG-4 标准拥有更高的压缩比率,支持并发数据流的编码、基于内容的交互操作、增强的时间域随机存取、容错、基于内容的尺度可变性等先进特性。音频数据的压缩技术最早是由无线电广播、语音通信等领域里的技术人员发展起来的。这其中又以语音编码和压缩技术的研究最为活跃。自从 1939 年 H. Dudley 发明声码器以来,人们陆续发明了脉冲编码调制( PCM )、线性预测( LPC )、矢量量化( VQ )、自适应变换编码( ATC )、子带编码( SBC )等语音分析与处理技术。这些语音技术在采集语音特征,获取数字信号的同时,通常也可以起到降低信息冗余度的作用。为获得更高的编码效率,大多数语音编码技术都允许一定程度的精度损失。而且,为了更好地用二进制数据存储或传送语音信号,这些语音编码技术在将语音信号转换为数字信息之后又总会用 Huffman 编码、算术编码等通用压缩算法进一步减少数据流中的冗余信息。

很显然,在多媒体信息日益成为主流信息形态的数字化时代里,数据压缩技术特别是专用于图像、音频、视频的数据压缩技术还有相当大的发展空间——毕
竟,人们对信息数量和信息质量的追求是永无止境的。
1994年, M. Burrows 和 D. J. Wheeler 共同提出了一种全新的通用数据压缩算法。这种算法的核心思想是对字符串轮转后得到的字符矩阵进行排序和变换,类似的变换算法被称为 Burrows-Wheeler 变换,简称 BWT 。与 Ziv 和 Lempel 另辟蹊径的做法如出一辙, Burrows 和 Wheeler 设计的 BWT 算法与以往所有通用压缩算法的设计思路都迥然不同。如今, BWT 算法在开放源码的压缩工具 bzip 中获得了巨大的成功, bzip 对于文本文件的压缩效果要远好于使用 LZ 系列算法的工具软件。这至少可以表明,即便在日趋成熟的通用数据压缩领域,只要能在思路和技术上不断创新,我们仍然可以找到新的突破口。
分形压缩技术是图像压缩领域近几年来的一个热点。这一技术起源于 B. Mandelbrot 于 1977 年创建的分形几何学。 M. Barnsley 在 20 世纪 80 年代后期为分形压缩奠定了理论基础。从 20 世纪 90 年代开始, A. Jacquin 等人陆续提出了许多实验性的分形压缩算法。今天,很多人相信,分形压缩是图像压缩领域里最有潜力的一种技术体系,但也有很多人对此不屑一顾。无论其前景如何,分形压缩技术的研究与发展都提示我们,在经过了几十年的高速发展之后,也许,我们需要一种新的理论,或是几种更有效的数学模型,以支撑和推动数据压缩技术继续向前跃进。
人工智能是另一个可能对数据压缩的未来产生重大影响的关键词。既然 Shannon 认为,信息能否被压缩以及能在多大程度上被压缩与信息的不确定性有直接关系,假设人工智能技术在某一天成熟起来,假设计算机可以像人一样根据已知的少量上下文猜测后续的信息,那么,将信息压缩到原大小的万分之一乃至十万分之一,恐怕就不再是天方夜谭了。
人们总喜欢畅想未来,但未来终究是未来,对未来的预测其主要基准还是我们现有的应用技术和思维模式,未来技术的发展存在着诸多的不可预测性,但终究离不开现有的技术基础,所以这就是本文所作对压缩算法进行研究和应用探讨的意义所在。
1.3课题研究的意义
电脑里的数据压缩的主要功用有两个:第一,可以节省存储空间;第二,可以在通信过程中减少对带宽的占用。虽然随着存储技术的快速发展,电脑的主存储器、辅助存储器的容量以及数据通信的带宽都有了很大提高,但如何在相同的空间存储更多的信息以及在已有的带宽情况下,更快捷的传输更多的信息,仍主要取决于数据压缩技术的发展。 如果没有数据压缩技术,那我们每次对数据信息进行提取和操作,与现在相比,将是个漫长复杂的过程,更无法在短时间内对海量信息进行检索,而视频和音频信息也将是人类信息交换的巨大负担。
为方便信息的存储、检索和使用,在进行信息处理时赋予信息元素以代码的过程。编码的目的在于提高信息处理的效率。信息编码必须标准、系统化。设计合理的编码系统是关系信息管理系统生命力的重要因素。信息编码的基本原则是在逻辑上要满足使用者的要求,又要适合于处理的需要;结构易于理解和掌握;要有广泛的适用性,易于扩充。一般应有的代码有两类,一类是有意义的代码,即赋予代码一定的实际意义,便于分类处理;一类是无意义的代码,仅仅是赋予信息元素唯一的代号,便于对信息的操作。在通信理论中,编码是对原始信息符号按一定的数学规则所进行的变换。编码的目的是要使信息能够在保证一定质量的条件下尽可能迅速地传输至信宿。

第二章 算术编码原理及特点
2.1统计编码
数据压缩可以分为可逆的无失真编码和不可逆的有失真编码两大类基本方法[6]。因为大多数计算机文件都不允许在压缩过程中丢失信息,所以对各种信源都通用的可逆压缩方法就显得更为重要,这类方法主要利用消息或消息序列出现的概率的分布特性,注重寻找概率与码字长度间的最优匹配,叫做统计编码或概率匹配编码,统称为熵编码。
计算机文件表现为字符集合(如文本)或二进制符号( 一般为0和1)集合。两者的最终形式都是“0”、“1”代码,只是前者一般用ASCII码编码表示。文本文件包括电报报文、程序指令等,一般由10进制数字0~9、英文字母及$、*、&等特殊符号组成,对其压缩必须“透明”,即恢复后的文件不许有任何失真。一个符号错误就可能产生灾难性的后果,例如数据库中包含有金融交易,或者控制系统的可执行程序。
对于文本文件,有物理压缩和逻辑压缩两种方法,逻辑压缩实际上只是一种由数据自身特点及设计者技巧来决定的“压缩表示法”,并不具有普遍性,而物理压缩方法则是通过减少计算机文件内部冗余度的方法来实现对源文件的压缩,而信源中的冗余度的表现形式包括:字符分布(character distribution)、字符重复(character repetition)、高使用率模式(high-usage patterns)以及位置冗余(positional redundancy)
香农定理[7]描述了有限带宽;有随机热噪声信道的最大传输速率与信道带宽; 信号噪声功率比之间的关系.
在有随机热噪声的信道上传输数据信号时,数据传输率Rmax与信道带宽B,信噪比S/N关系为: Rmax=B×log2(1+S/N) 在信号处理和信息理论的相关领域中,通过研究信号在经过一段距离后如何衰减以及一个给定信号能加载多少数据后得到了一个著名的公式,叫做香农(Shannon)定理。它以比特每秒(bps)的形式给出一个链路速度的上限,表示为链路信噪比的一个函数,链路信噪比用分贝(dB)衡量。因此我们可以用香农定理来检测电话线的数据速率。
香农定理由如下的公式给出: C=Blog2(1+S/N) 其中C是可得到的链路速度,B是链路的带宽,S是平均信号功率,N是平均噪声功率,信噪比(S/N)通
常用分贝(dB)表示,分贝数=10×log10(S/N)。

讨论熵编码就必需要了解熵(entropy)的概念:(1)熵是信息量的度量方法,它表示某一事件出现的消息越多,事件发生的可能性就越小,数字上就是概率越小。(2)某个事件的信息量用 =-logi 表示,其中 为第i个事件的概率,0 按照香农的理论[7],信源S的熵的定义为H(S)= = log(1/其中 是符号 在
S中出现的概率;lo (1/表示包含在 中的信息量,也就是编码 所需要的位数。例如,一幅用256灰度级表示的图像,如果每一个象素点灰度的概率均为 =1/256,编码每一个象素点就需要8位。熵作为理论上的平均信息量,即编码一个信源符号所需的二进制位数,在实际的压缩编码中的码率很难达到熵值,不过熵可以作为衡量一种压缩算法的压缩比好坏的标准,码率越接近熵值,压缩比越高。由于在许多场合,开始不知道要编码数据的统计特性,也不一定允许你事先知道它们的编码特性,因此算术编码在不考虑信源统计特性的情况下,只监视一小段时间内码出现的概率,不管统计是平稳的或非平稳的,编码的码率总能趋近于信源的熵值。实现算术编码首先需要知道信源发出每个符号的概率大小,然后再扫描符号序列,依次分割相应的区间,最终得到符号序列所对应的码字。
2.2算术编码原理
算术编码是一种到目前为止编码效率最高的统计熵编码方法,它比著名的Huffman 编码效率提高10 %左右,但由于其编码复杂性和实现技术的限制以及一些专利权的限制,所以并不像Huffman 编码那样应用广泛。国外对算术编码的研究较多,取得了许多重要的应用,但大多都有专利保护,如JPEG、JBIG和H. 261 中均采用了算术编码;国内的研究相对较少,应用不是很广泛,许多人还不了解。随着算术编码实现技术的改进,必将以其独特的优良性能成为无失真压缩方法的主流。
算术编码的处理过程会产生一个位数逐步增加的实数, 该实数所对应的概率区间对应着编码信息。这个实数的值稍有变化, 其对应的概率区间就会改变, 导致解不出原来的信息, 后面译出的码字全部错误. 这就是算术编码的重要特点: 算术编码是非分组码[6] , 编码器是有记忆的, 编码输出流被看作一个不可分割的整体. 这个特点不仅带来严重的误码扩散问题, 而且给算术编码的灵活应用带来了很大困难. 其他的压缩算法, 像Huffman 算法、LZW 算法等, 是分组码, 各输出码字之间是独立的, 误码不易扩散. 对于算术编码,从对其基本原理的讨论中看到, 它的编码输出流中是不能随意嵌入冗余编码等附加信息的.算术编码的思想可以追溯到1948 年Shannon 的论文[7 ]中,20 世纪60 年代初期,Elias 给出了一个递推公式[2 ] ,使得算术编码向实用化方向前进了一大步。但此时的算术编码需要无限精度的浮点运算,这对于当时的技术和实用化进程是一个无法克服的障碍。70 年代, Rissanen[3 ] 和 Pasco 分别提出了用有限精度逼近的算法,从此算术编码开始进入实用化阶段。进入80 年代,算术编码的研究达到高潮。Rubin、Rissanen 和 Langdon[4] 等人在此期间对算术编码作了大量的理论研究,并给出了一个二进制的算术编码器,Witten 等人给出了一个通用的算术编码器。90 年代以来,算术编码的理论已基本成熟,主要研究工作放在算法的实现技术的改进和应用上。算术编码可以以分数比特逼近信源的熵,统计模
型可以与算法很好地分离,易于实现自适应模式,因此编码算法流畅完美,效率很高。

2.2.1算术编码理论
算术编码(arithmetic coding)是一种无损数据压缩方法,也是一种熵编码的方法[6]。和其它熵编码方法不同的地方在于算术编码跳出了分组编码的范畴,
从全序列出发,采用递推形式的连续编码,它不是将单个的信源符号映射成一个码字,而是将整个输入符号序列映射为实数轴上[0,1)区间内的一个小区间,其长度等于该序列的概率;再在该小区间选择一个代表性的二进制小数,作为实际的编码输出,从而达到了高效编码的目的,不论是否二元信源,也不论数据的概率分布如何,其平均码长均能逼近信源的熵。
早在1948年,香农[7]就提出将信源符号依其概率降序排序,用符号序列累积概率的二进制表示作为对信源的编码,并从理论上谁了它的优越性;1960年后,P.Elias发现无需排序,只要编、解码端使用相同的符号顺序即可。但当时人们仍然认为算术编码需要无限精度的浮点运算,或随着符号的输入,所需的计算精度和时间也相应增加。1976年,R.Pasco和J.Rissanen[3]分别用定长的寄存器实现了有限精度的算术编码,但仍无法实用,因为后者的方法是“后入先出”(LIFO)的,而前者的方法跃然是“先入先出”(FIFO)的,但却没有解决有限精度计算所固有的进位问题,1979 年Rissanen和 G.G.Langdon[4]一起将算术编码系统化,并于1981年实现了二进制编码。1987年Witten[5]等人了一个实用的算术编码程序,即CACM87(后用于ITU-T的H.263视频压缩);同期IBM公司发表了著名的Q-编码器(后用于JPEG、JPEG2000和JBIG 图像压缩标准),从此算术编码迅速得到了广泛的注意。
算术编码的基本原理是[6]:根据信源可能发现的不同符号序列的概率,把 [0,1)区间划分为互不重叠的子区间,子区间的宽度恰好是各符号序列的概率。这样信源发出的不同符号序列将与各子区间一一对应,因此每个子区间内的任意一个实数都可以用来表示对应的符号序列,这个数就是该符号序列所对应的码字。显然,一串符号序列发生的概率越大,对应的子区间就越宽,要表达它所用的比特 数就减少,因而相应的码字就越短。使用算术编码方法进行多元符号编码时,算术编码每次递推都要做乘法,而且必须在一个信源符号周期内完成,有时就难以实时,为此采用了查表等许多近似计算来代替乘法,但若编码对象本身就是二元序列,且其符号概率较小者为p(L)=2-Q形式,其中Q是正整数,称作不对称数(skew number),则乘以2-Q可代之以右移Q位,而乘以符号较大者p(H)=1-2-Q可代之以移位和相关,这样就完全避免了乘法。因此算术编码很适合二元序列,而p(L)常用2-Q来近似。,随着输入序列,长度的增加,编成C(s)的长度也随之不断增加,而实际只能用有限长的寄存器C,这就要求将C中已编码的高位码字及时输出。但又不能输出过早,以免后续运算还需调整已输出的。不难想象,当C中未输出部分各高位均为“1”时,则低位运算略有增量,就可
能进位到已输出部分,特别是当这种连“1”很长时,这就是有限精度算术编码
所固有的进位问题。Rissanen和Langdon利用插入1个额外的“0”(即所谓“填
充位”)来隔断进位的扩展,对编码效率会略有影响。类似地,对于区间宽度A(s),也只能基于有限位数的寄存器A来实现。对于算术的编解码来说,不对称数Q(s)
是一个重要参数,当时假定它是根据信源概率模型已事先确定的一个量,要从一个二进制序列s来确定Q值,有待于根据该序列的统计特性,选择合适的概率模
型,譬如根据符号串s后面出现字符l条件概率 p(L|s)~=2-Q来确定Q值。而当实际上“0”和“1”都有可能成为符号位数值时,应该随着它们在被编码符号串中出现的概率而自适应地改变。算术编码器在每一步都需要知道用于下一个待编码符号的Q(s)值,以及指出哪个符号是L符号,通常串中字符发生的概率与序列的概率模型有关,因此算术编码应用的另一个问题,就是快速自适应地估计条件概率p(L|s),从信源的统计特性出发,建立数据的概率模型。而算术编码
的最大优点之一,就是具有自适应功能,高二进制信源的字母表主(0,1),算术编码在初始化预置一个大概率P和一个小概率Q,随着输入版本号概率的变化,自动修改Q或P的值。一般假定初始值Q=0.5,当后继输入连续为H符号时,Q值渐渐减小,若连续出现L符号时,Q值增加。增加到超过0.5时,Q和P对应的符号相互交换。因此,使用算术编码不必预告定义信源的概率模型,尤其适用于不可能进行概率统计的场合。
Huffman 编码的一个不足是译码复杂度高,由于事先不知道码长,Huffman码表实质上是一棵二进制树,解析每一码字的基本方法就是从树根开始,集资根据面临的每一位是0还是1来决定沿哪一半子树继续译码,直到端节点,这样在运算时就要对码字的每位做出逻辑判决。基要求译码器与一个传输速率为200Mb/s的磁盘驱动器。
要使其相适应而不导致系统瓶颈,则判决逻辑的时钟至少不能低于该速率。这并非不能实现,但却不那么简单。通常对于用变长码压缩的大容量数据,解码系统的性能价格比不会最高。而在实现上,算术编码要比霍夫曼编码更复杂,特别是硬件实现时。
算术编码也是变长码,编码过程中的移位和输出都不均匀,也需要缓存,在误差扩散方面,也比分组码更严重;在分组码中,由于误码而破坏分组,过一会儿常能自动恢复们是不在算术码中却往往会一直延续下去,因为它是从全序列出发来编码的。因而算术码流的传输也要求高质量的信道,或采用检错反馈重发的方式。
各种媒体信息(特别是图像和动态视频)数据量非常之大。例如:一幅640x480分辨率的24位真彩色图像的数据量约力9O0kb;一个1O0Mb的硬盘只能存储约 l00幅静止图像画面。显然,这样大的数据量不仅超出了计算机的存储和处理能力,更是当前通信信道的传输速率所不及的。因此,为了存储、处理和传输这些数据,必须进行压缩。相比之下,语音的数据量较小,且基本压缩方法己经成熟,目前的数据压缩研究主要集中于图像和视频信号的压缩方面。图像压缩技术、视频技术与网络技术相结合的应用前景十分可观,如远程图像传输系统、动态视频传输可视电话、电视会议系统等己经开始商品化,MPEG标准与视频技术相结合的产物一家用数字视盘机和VCD系统等都已进入市场。可以预计,这些
技术和产品的发展将对本世纪末到二十一世纪的社会进步产生重大影响。而算术
编码作为一种高效的数据编码方法在文本,图像,音频等压缩中有广泛的应用,
所以,研究算术编码以更好的利用它是非常必要的。

2.2.2算术压缩模式
算术编码对整条信息(无论信息有多么长),其输出仅仅是一个数,而且是一个介于 0 和 1 之间的二进制小数。例如算术编码对某条信息的输出为 1010001111,那么它表示小数 0.1010001111,也即十进制数 0.64。
下面借助一个简单的例子来阐释算术编码的基本应用原理。为了表示上的清
晰,我们暂时使用十进制表示算法中出现的小数,这丝毫不会影响算法的可行性。
考虑某条信息中可能出现的字符仅有 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,这就是信息被压缩后的结果,我们完成了一次最简单的算术压缩过程。

解压缩是压缩的逆过程解压缩之前我们仍然假定三个字符的概率相等,并得
出上面的第一幅分布图。解压缩时我们面对的是二进制流 1010001111,我们先在前面加上 0 和小数点把它变成小数 0.1010001111,也就是十进制 0.64。这
时我们发现 0.64 在分布图中落入字符 b 的区间内,我们立即输出字符 b,并得出三个字符新的概率分布。类似压缩时采用的方法,我们按照新的概率分布划分字符 b 的区间。在新的划分中,我们发现 0.64 落入了字符 c 的区间,我们
可以输出字符 c。同理,我们可以继续输出所有的字符,完成全部解压缩过程(为
了叙述方便,我们暂时回避了如何判断解压缩结束的问题,实际应用中,这个问题并不难解决)。
对以上论述进行归纳,我们可以得到算术编码的特点是:
1)不必预先定义概率模型,自适应模式具有独特的优点;
2)信源符号概率接近时,此时算术编码效率高于其他编码方法。
3)算术编码绕过了用一个特定的代码替代一个输入符号的想法,用一个浮点输出数值代替一个符号流的输入。
算术编码虽然具有其独特的优点,但我们仍需要注意下面几个问题:
1)由于实际的计算机的精度不可能无限长,运算中出现溢出是一个明显的问题,但多数机器都有16位、32位或者64位的精度,因此这个问题可使用比例缩放方法解决。
2)算术编码器对整个消息只产生一个码字,这个码字是在间隔[0, 1)中的一个实数,因此译码器在接受到表示这个实数的所有位之前不能进行译码。
3)算术编码也是一种对错误很敏感的编码方法,如果有一位发生错误就会导致整个消息译错。

算术编码是一种高效的熵编码方案,其每个符号所对应的码长被认为是分数[8]。由于对每一个符号的编码都与以前编码的结果有关,所以它考虑的是信源符号序列整体的概率特性,而不是单个符号的概率特性,因而它能够更大程度地逼近信源的极限熵,降低码率。

第三章 典型算术编码方案分析
3.1 WNC算法算术编码
WNC算法建立模型的过程是这样的:
(1) 由于英文字符一共有256个,建立两个257个元素的数组 cum_freq[] 和 freq[],其中第257个元素是结束标志。cum_freq[] 是将输入符号按照出现概率的大小进行顺序排列,freq[]用于积累输入符号的出现频率。初始化时由于每个符号的出现概率是一样的,freq[]均为1,cum_freq[]按照从256到0的顺序排列。

(2) 更新模型的时候首先要判断是否积累的频率超出了预定的范围,如果超出了的话,就需要将每个符号的出现频率减少一半;如果没有超出就进行下一步。接下来是重新排序,保证当前输入符号按照出现频率有着正确的顺序,最后就可以增加输入符号的出现概率了,此时不但需要增加对应的 freq[] ,而且需要增加对应的cum_freq[]之前的所有值。因为 cum_freq[] 是最终用来计算输入符号的概率的。
二进制索引树的数据结构,下图所示。

图3.2 二进制索引树结构
根据二进制索引树可以建立这样的一个前后关系,称节点a是节点b的前节点,它们满足:a=forw(b),节点c是节点d的后节点,它们满足 c=back (d) ,其中forw (),back()如下
forw (i)=i+i&(-i)
back (i)=i&(i-1)
下面的算法采用BIT这种数据结构来组织数据,更新模型表。过程是这样的:
(1)按照WNC算法中建立模型的方法一样建立一个关于输入符号的模型,在这里一点不同的是只需要 cum_freq[] 来积累输入符号的出现频率。初始化时由于每个符号的出现概率是一样的, cum_freq[] 按照从最大值到0 的顺序排列。
(2)更新模型中的元素时,由于已经建立的前后关系,只需要更新该元素的积累频率及其之后的元素的积累频率。
(3)判断是否积累的频率超出了预定的范围,如果超出了的话,就需要根
据前后关系,将每个符号的积累频率减少一半。需要注意的是由于更新是按照前后关系进行的,所以减少的过程也需要按照这样的顺序进行。
整个编码器的框图如下:

图3.3 WNC算法编解码流程图

其中install, update_model 的过程如上所述,encode_symbol部分的具体算法流程如下:
(1)计算此时区间的范围和上界、下界。
范围range=high-low+1
新的上界:high=low+range×cum_freq{back(symbol)}/cum_feq[0]-1
新的下界:low=low+range×cum_freq[symbol]/cum_freq[0]
(2)根据(1)计算的上界、下界输出比特,以下的过程在一个循环中反复进行,直到跳出。
i) 如果上界小于初始区间的一半,输出0;
ii) 如果下界大于或等于初始区间的一半,输出1,同时将区间向下移一半,也就是low=low-HALF ; high=high-HALF
iii) 如果下界大于或等于初始区间的1/4并且上界小于初始区间的3/4,输出一个与前一个输出位相反的跟随位,并且将区间向下移1/4,low=low-QUARTER, high=high-QUARTER;
iv) 如果不在上面的情况中,停止输出,跳出循环,否则的话,扩大当前区间的上下界(因为已经输出了表示位),low=2×low, high=2×high+1。
虽然WNC算法可以很好地解决算术编码的概率预定义问题,但是它又不可避
免的带来了新的问题,就是关于模型更新以及查找该符号时所带来的庞大计算量的问题。
3.2 基于上下文的二进制算术编码
基于上下文的自适应二进制算术编码 (CABAC)是一种体现了新思想、具备新特点的新型二进制算术编码方法。它的主要面对视频流的相关统计特性,其特点在于采用了高效的算术编码思想,充分考虑视频流的数据特点,大大提高了编码效率,针对视频数据流处理的H.264/AVC即采用了这种新的二进制算术编码。
CABAC的基本编码步骤可分为三步:1. 二进制化;2. 上下文建模;3. 二进制算术编码。 第一步主要是将非二进制的各语法元素值转换成二进制的比特序列,如果语法元素本身是二进制的,则该步骤可省略;第二步主要是为已二进制化的语法元素的比特序列的每一位提供概率模型,进行概率预测;第三步则进行二进制算术编码,在CABAC 中,有两种编码模式,一种叫做regular coding mode,另一种叫做by pass coding mode,其中regular coding mode采用了上下文建模, 而by pass coding mode为了加快编码速度不采用上下文建模,整个编码过程如下图所示。

图3.4 CABAC编码流程图
CABAC基本步骤简述:
首先是二进制化:为了降低算术编码的复杂度,提高编码速度,CABAC 采用了二进制的算术编码,而非其它多进制的算术编码,为此需要事先将每一语法元素转换成独一无二的二进制序列,在 H.264 中称 BIT STRING,同时为了便于后面的算术编码,尽可能降低编码复杂度,应该尽可能减小二进制序列的大小,CABAC采用了4 种基本二进制转换方式:Unary Binarization, Truncated unary Binarization, kth order Exp-Golomb Binarization 和 Fixed-length Binarization,相应的有4种二进制码Unary code, Truncated unary code, kth order Exp-Golomb code 和 Fixed-length code。
接下来是上下文建模部分:所谓上下文建模,就是建立概率模型,对每一位
待编码的比特值和概率进行预测。这些模型可分为4 种类型. 第1 种类型的模型必须根据它相邻的已编码的语法元素构成。 第2种模型仅局限于对宏块类型和子宏块类型的应用。第3 种和第4 种模型仅用于残余数据的编码。下表给出了H264/AVG 中的所有语法元素和它们所用到的上下文模型索引的对应关系。

语法元素(SE)
片类型(Slice type)
SI I P,SP B
mb_skip_flag -- -- 11~13 24~26
mb_field_decoding_flag 70~72 70~72 70~72 70~72
mb_type 0~10 3~10 14~20 27~35
moded_block_pattern(luma) 73~76 73~76 73~76 73~76
coded_block_pattern(chroma) 77~84 77~84 77~84 77~84
mb_qp_delta 60~63 60~63 60~63 60~63
prev_intra4x4_pred_mode_flag 68 68 68 68
rem_intre4x4_pred_mode 69 69 69 69
intra_chroma_pred_mode 64~67 64~67 64~67 64~67
ref_idx -- -- 54~59 54~59
mvd(horizontal) -- -- 40~46 40~46
mvd(vertical) -- -- 47~53 47~53
sub_mb_type -- -- 21~23 36~39
coded_block_flag 85~104 85~104 85~104 85~104
significant_coeff_flag[] 105~165
277~337 105~165
277~337 105~165
277~337 105~165
277~337
last_significant_coeff_flag[] 166~266
338~398 166~266
338~398 166~266
338~398 166~266
338~398
coeff_abs_level_minus1[] 227~275 227~275 227~275 227~275
表3.3 语法元素索引表
其中r从0~72 是关于宏块类型、子宏块类型、预测模式以及基于片层和宏块层的控制信息等语法元素的上下文模型索引, 对于这种类型的语法元素,其索引值’ 由公式r=Ts+xs计算。式中:Ts代表上下文索引的初值,也就是表中所给出的值,xs代表其增量值。它依赖于待编码比特位的索引值。 r从73~398 是残余数据的编码,其中语法元素coded_block_pattern的上下文模型索引值r 计算公式同上,而其它残余数据语法元素的上下文模型索引值则由公式r=Ts+Qs(ctx_cat)+xs给出。式中:Qs(ctx_cat)值由语法元素及其上下文范畴(con-text category, 简称ctx-cat决定,具体值可见下表。值得一提的是在纯帧或纯场编码中,仅实际乃至个模型中的277个。

语法元素 上下文范畴(ctx-cat)
0 1 2 3 4
coded_block_flag 0 4 8 12 16
significant_coeff_flag 0 15 29 44 47
last_significant_coeff_flag 0 15 29 44 47
coeff_abs_level_minus1 0 10 20 30 39
表3.4 语法元素与上下文范畴对应表
二进制算术编码:在CABAC中$对每一待编码的比特位的值(0 或),用MPS和LPS表示,其中MPS( most probable symbol)表示最可能出现的状态,对应0 和1 中概率大的那一个;LPS(least probable symbol)表示最不可能出现的状态,对应0 和1 中概率小的那一个。 这样只需要一个变量值pσ保存LPS出现的概率大小,对应MPS出现的概率大小可由(1-pσ)表示。同时,它把概率pσ量化成64个等级,每一概率pσ由其对应的索引σ 唯一给出。这样在CABAC中,每一个上下文模型可由两个变量唯一决定,一个是LPS 的概率值pσ,一个是MPS的值用ω表示。 由于CABAC中,pσ值被量化成64 个等级,同时,ω值在二进制编码中只有0 和1 两种取值。因此在CABAC 中一共只有128 种概率状态, 可用7 比特来表示。
在H.264中,片层是自适应编码的基本单元,在一个片层数据编码完,新的片层数据到来时,CABAC要对各概率状态进行重新初始化,初始化的重要依据QP参数,各片层的QP参数不同,则在初始化时各概率状态值是不同的。
虽然基于上下文的自适应二进制算术编码算法可以很好地解决算术编码的自适应问题,但是它也不可避免的带来了新的问题,就是关于符号概率表的储存以及查找该符号概率时所带来的复杂度增加的问题。
3.3自适应算术编码算术及其实现
所谓自适应算术编码是在算术编码基本原理的基础上,根据信源数据来自不同符号集的特性,充分利用信源数据的统计特性,将每种类型的数据分开处理,各自拥有一个独立的统计模型单元,可以得到更高的编码效率。同时利用各种进制数据进行转换的时机,将压缩数据分成不同的数据段,将误码限制在本数据段内,当误码产生时,其影响最多从误码位到本段结束位处[10]。
现在来看一下符号的概率问题:在所有情况下,每种可能的概率都落在区间[0,1)中,而所有概率的和则为1.这个区间包含了所有概率的可能,所以我们可以以此来对序列进行编码。每个概率会落到此区间的一个子区间,对一个序列重复这样编码,就会得到关于这个消息的一个特定区域。这个区间的任何一个数字都可以成为一个有效的编码。设为PM(ai)某序列中ai的概率。因为概率之和总是为1,那现在就让我们用这个数来划分区间[0,1)每个数所划分的区间大小取决于它的概率。
设某序列有四个字符a,b,c,d;其各自概率如下
PM(a)=0.5,PM(b)=0.25,PM(c)=0.125,PM(d)=0.125
我们设变量high和low来表示区间的上下限,之后依照概率的变化,对上
下限进行修正,从上图我们得到如下概率区间:
high 1.0 K(0) 0.0 K(2) 0.75
low 0.0 K(1) 0.5 K(3) 0.875
表3.1 预设字符序列的概率表
我们假设字符是按照一个固定的概率表出现的,这种模式现实中确实存在,我们称之为静态模式。
编码的第一步是初始化区间I:=[low,high)by low=0 and high =1,当读取s1后,区间将被重新划分为I’,而它的上下限还是叫做high和low。
将新的区间I’映射到中[low,high),这完全是按照上表的统计特性来计算的。产生更短代码字的片断数越少,区间I’就越大。然后在新区间重复前面的过程。当接收新符号时,区间I’的划分是以low为新下限的,
以上规则对每一步都适用,都是由第一步 low =0且 high - low =1
得到的。因为我们不再需要旧的high和low的值,所以我们要重写它们:
low := low’
:=high’
设我们要编码的序列为abaabcda第一步如下:

low = 0
high = 0+0.5•1 =0.5
新区间变成了 然后对b编码:
low = 0+0.5•(0.5-0)=0.25
high = 0+0.5•(0.5-0)+0.25•(0.5-0)=0.375
a:
low = 0.25
high = 0.25+0.5•(0.375-0.25)=0.3125
a :
low = 0.25
high = 0.25+0.5•(0.3125-0.25)=0.28125
b:
low = 0.25+0.5•(0.28125-0.25)=0.265625
high = 0.25+0.5•(0.28125-0.25)+0.25•(0.28125-0.25)
c:
low = 0.265625+0.5•(0.2734375-0.265625)+0.25•(0.2734375-0.265625)= 0.271484375
high = 0.265625+0.5•(0.2734375-0.265625)+0.25•(0.2734375-0.265625)+0.125•(0.2734375-0.265625)

d:
low = 0.271484375+(0.5+0.25+0.125)•(0.2724609375-0.271484375)
= 0.2723388672
high = 0.2724609375
最后一个是a:
low = 0.2723388672
high = 0.2723388672+0.5•(0.2724609375-0.2723388672)
= 0.2723999024
这样最后得到的区间是 [0.2723388672, 0.2723999024)接下来是实现编码。我们可以不加处理地存储区间[0.2723388672, 0.2723999024)但这很低效。因为我们知道这个区间是由前面那个序列得到的,所以我们只储存这个区间的任
意一个数就足够了。下面的辅助定理可以说明这个原理
辅助定理1所有等长消息的编码形成的区间构成一个完整的区间I:=[0,1)。
这可以从图2中看出来。这个定理的直接结论就是无限小的区间可以代表一个无限长的序列。实际中,不存在无限长的序列,但一个很长的序列所导致的小区间可能会使一般计算机无法处理。一种解决办法是将长序列分段处理。最后一个例子中我们以处理0.27234为例。虽然实际中常常不会发生已知消息什么时候会结束这样的情况(因为传输距离一般都很长),但这里我们仍旧假设我们已知。
至于解码,要解码就先得知道编码背景是怎样的。给出V:=Code(S)我们就要恢复原序列S。我们假设已知消息长度l已知。第一步中我们先将V与每个区间I’:=[K(ak-1), K(ak)]
进行比较,找出包含V的区间,它取决于序列的第一个符号:s1我们在解码时,要修正概率区间来算出下一个符号:
low’ := low+K(ai-1)•(high-low)
high’ := low+K(ai)•(high-low)
i必须满足:
low <= V <= high
ai是编码序列的下一个符号。这次又是一个一般方程的特例。这种重复与编
码时很像,所以解码应该不成问题。
解码范例:

我们现在来对前面编码序列进行解码,前面得到的值为V=0.27234 ,假设已知长度l=8 可以看出 [0,0.5)之内,我们可以得到一个’a’,然后再设
low =0
high =0.5
再次重复可以看到V在以下区间内:
low = 0+0.5•(0.5-0)=0.25
high = 0+0.75•(0.5-0)=0.3125
解码得到’b’,相应的边界是划线部分。下一轮:
low = 0.25+0•(0.3125-0.25)=0.25
high = 0.25+0.5•(0.3125-0.25)=0.28125
得到的结果是’a’。略去重复部分,可以最后结果是:
low = 0.272338672+0•(0.2724609375-0.2723388672)=0.2723388672
high = 0.272338672+0.5•(0.2724609375-0.2723388672)=0.2723999024
虽然在简单意义上,我们认为所有的符号独立的随机出现的. 然而,它其实通常很大程度上与语言环境有有关,以德文为例,字母' u '的平均概率约为4.35% . 但
如果它的前面是一个' q ' ,这时字母' u '的概率的增幅几乎达到100% 而以前面N个字母的情况为参考的模式称为N阶模型.
最有用的编码方法是为各种不同的数据源共用而开发的方法。这意味着通常数据来源的概率分布是未知的。它也不能简单的去数当前的信号流。只考虑传真文件:当我们开始读第一页时,也许后续几页还正在传输中,也就是说,不能同时处理信号的全部而仅仅是其中的一个片断。所以唯一能作的有用的事就是“估计”。很明显,我们所作的估计要与当前生成的信号相匹配。这就是本设计要采用的自适应模式。先来看下面的例子:
为了便于说明,下面将采取,0阶的意思是认为概率只针对当前符号,而并不考虑符号的前续符号。为实现此目标,先定义一个足够长的K序列。K中每个元素的都是字母表S中的字母。然后以0来初始化该序列中的所有元素。在每次编码前,将元素从输入流中取出,同时使符号计数器中的值和序列的熵增加。然后将此序列中符号的概率重新作分配。
s K(a) K(b) K(c) K(d)
a 1 0 0 0
b 1 1 0 0
c 2 1 0 0
d 2 1 0 1

表3.2 0阶自适应模式符号概率分配表
以下面的字母表为例:

A=a,b,c,d
对序列 abad 编码。上表列出了对其概率的计算结果。该结果证明了在新符号读入后,概率分布正确的反应了符号传输的实际情况。这说明当序列很长时,计算结果与实际情况将会非常的接近。
在对输入符号进行逐字编码后,解码器即可对生成的编码结果进行正确的解码,解码步骤是编码的逆过程。这样编码的优点是只要对数据流所传送的符号进行编解码就可以了,而不用去管它的前续和后续符号是怎样的。
基于模型的自适应算术编码主要存在两个缺点:
(1) 在整个算术编码的过程中会产生一个位数逐步增加的实数,该实数对应的概率区间对应着编码信息。这个实数的值稍有变化,会导致解不出原来的信息,后面译出的码字全部错误。但是由于计算机的精度有限,所以在实际的计算时是不可能无限地划分下去的,也就是说到了一定的时候,计算机已经无法识别两个区间的范围了。这样就给算术编码的最终结果带来误差。
(2) 只有当信源完整地把一段符号序列发送完之后,编码器才能确定一段子区间与之对应,编出相应的码字。这不但要占用相当大的存储空间,还增加了编码延时,这对实时系统是十分不利的,而且也非常不利于解码方的接受。因为编码时是根据所有的这些符号计算出每个符号对应的概率,然后利用这些概率信息进行编码的。所以必须有一种可以增加输出的算法来更好的完成这个要求。为了解决这两个问题,Written,Neal和Cleary提出了一种建立模型的方法(WNC 算法)来改进算术编码的性能。由于在英文中最多只有256个字符,也就是符号所对应的数组最多只需要257个元素。在初始化这个数组后,WNC算法利用输入符号动态更新这个数组,假设数组的积累频率就是它的出现频率,完成编码的操作。虽然这些积累频率是一个局部的频率,但是如果解码方以同样的操作进行,则这个过程是完全可逆的。通过这个模型的建立就可以解决上面的第一个问题。另外由于WNC算法是采用模型的方法,不需要考虑符号的全局概率,而只需要根据该符号现在的积累情况,就可以采用增加传输和接收的方法,完成当前符号的编码,并且将其传输出去,而解码方就可以根据完全类似的过程进行解码,得出这个符号来。这样就可以解决上面的第二个问题。由于解码算法是编码算法的逆过程,有着近似相同的动作,所以在文章后面只介绍编码算法,而不深入讨论解码算法。

第四章 算术编码系统的实现

4.1软件模块设计
本软件主要实现基于算术编码的数据压缩和解压,也就是将第三章对自适应算术编码方法的研究用具体的开发工具—— VC++ 进行实现。
该软件完整的工作过程是:
1)数据文件压缩过程:首先在界面输入文件的压缩路径,然后通过设定的压缩模式(这里设定为0阶模式)对数据文件进行压缩。压缩过程是依照文件在硬件中的存储方式将其完全当作二进制文件来读取并进行压缩的。压缩后生成后缀名为 .ac 的文件,将其存储在预定的输出路径中。
2)数据文件解压过程:根据在界面输入的文件路径,按照其中存储的模式信息对其读取后再通过解压缩模块将其解压。解压的过程完全是压缩的逆过程,因为算术编码是一种无损压缩,并且其压缩处理的模式也决定了它解压生成的将是与压缩前完全一样的数据文件,因此,通过解压最后生成的文件即是与原文件完全一致的文件。
模块设计:本设计是以算术编码的方式实现对数据的压缩,所以系统模块来划分,包括输入模块、压缩模块、解压模块以及输出模块。这样的划分功能明确,下面即从模块划分的内聚性和耦合性方面进行分析比较。
内聚:是信息隐蔽功能的自然扩展。内聚的模块在软件过程中,完成单一的任务,同程序其他部分执行的过程交互很少,简而言之,内聚模块(理想情况下)应该只完成一件事。即争取模块划分的高内聚。
本软件模块划分是从顺序和功能的聚合方式划分,因此本设计模块中各个部分的都是完成一个具体功能的必不可少的组成部分,该模块中的所有部分都是为了完成一项具体功能而协同工作、紧密联系、不可分割。因此本设计的内聚方式为功能内聚,所以内部联系度、清晰性、可重用性、可修改性和可理解性这5个与聚合性有关的属性都达到了良好的标准。
耦合:是程序结构中模块相互关联的度量。耦合取决于各模块间接口的复杂程度、调用模块的方式,以及哪些信息通过接口。
本软件模块划分使得模块之间没有直接关系,其所采用的耦合方式为非直接耦合,即它们之间的联系完全是通过主模块的控制和调用来实现的,并且对数据做何种处理完全由主模块(界面)决定。因此在对修改的敏感性、可重用性、可修改性及可理解性这4个与耦合性相关的模块属性方面也都达到了良好的标准。

图4.1软件模块设计

4.2软件模块的具体实现
按照软件模块的划分,本软件共分为四个模块,分别为输入模块、压缩模块、解压模块、输出模块。输入模块和输出模块主要是用C++类库中的方法执行对文件的确认/建立、读取/写入、以及对文件的相关位置进行标记;而压缩模块和解压模块的主要功能则是用算术编码的方法对指定的文件进行编码和解码的操作,具体实现下面分输入输出、压缩、解压三个部分进行说明。

4.2.1输入输出模块的实现
这一部分是对源文件的读写,功能实现比较便捷,在VC中,采用标准库中的 fstream 类实现对源文件的打开和读取,因为 fstream 类已经包含有对文件按二进制读取等功能,所以可以很容易实现对文件的打开、关闭、读写和(输入、
输出)。

图4.2 输入输出模块流程图
在以对话框为基础的软件界面上添加文本输入框,一个作为源文件路径的输入,另一个作为目标文件路径的输入,在此处文本框接收的路径将直接赋给处理文件打开关闭以及读写的模块,

图4.3 输入输出路径接收的界面

新建文本框后,使用VC++中的类向导功能,对两个文本输入框进行编辑。设置ID和消息影射,以用来将获得的路径信息传递给编码解码的模块进行数据的输入与输出。
调用的方法包括VC++类库中fstream类中 .open, .read和 .write等方法:
下面代码是实现模块流程图的具体方法:
//定义SetFile 类将指定的文件对象转换为ArithmeticCoderC 类的成员变量
void ArithmeticCoderC::SetFile( fstream *file )
{
mFile = file;
}
//将比特数字记录到比特缓冲区 mBitBuffer ,当读取计数变量 mBitCount 满8 //位后,将缓冲区记录写入文件
void ArithmeticCoderC::SetBit( const unsigned char bit )
{
// 向缓冲区增加比特
mBitBuffer = (mBitBuffer << 1) | bit;
//同时计数
mBitCount++;
//如果计数满8位,就将其写入文件
if(mBitCount == 8) // buffer full
{
// 写入操作
mFile->write(reinterpret_cast(&mBitBuffer),sizeof(mBitBuffer));
mBitCount = 0;
}
}
//根据文件是否读完决定是否继续对文件进行读取
unsigned char ArithmeticCoderC::GetBit()
{
//当比特计数为0时
if(mBitCount == 0) // buffer empty
{
if( !( mFile->eof() ) ) //若未读完
mFile->read(reinterpret_cast
(&mBitBuffer),sizeof(mBitBuffer));//继//续读取

else//否则清空比特缓冲区,并置比特计数为满
mBitBuffer = 0;

mBitCount = 8;
}
// 从缓冲区取出比特,继续处理
unsigned char bit = mBitBuffer >> 7;
mBitBuffer < <= 1;
mBitCount--;
return bit;//返回比特值
}
4.2.2压缩模块的实现
对于压缩算法来说 ,最重要的部分是算法的设计与实现,接下来介绍的就是压缩部分的实现。

图4.4 压缩模块功能实现的界面
对于压缩模块来说,最主要的部分就是对数据进行压缩的算法,压缩模块将接收“源文件”和“输出文件”所获得的路径信息,然后将读取的数据进行算术编码,主要步骤为:
1) 读取缓冲数据信息;
2) 对缓冲信息进行编码;
3) 暂存缓冲信息
4) 判断是否读取完全,若是,进行下一步
否则转到第一步;
5) 输出编码内容;
6) 添加编码信息以便解码

压缩模块流程见下图:

图4.5压缩模块流程图
在软件界面中添加“压缩”按钮,使用VC++中的类向导功能,设置Object ID和功能方法,并将其加入类CACodingDlg。增添消息影射方法:BN_CLICKED。双击后,在增添对数据进行压缩的代码,从而实现压缩功能。
//编码实现
void ArithmeticCoderC::Encode( const unsigned int low_count,
const unsigned int high_count,

const unsigned int total )
{
//将下步要进行编码的区间分为total 个区间
mStep = ( mHigh - mLow + 1 ) / total; //
// 更新上界
mHigh = mLow + mStep * high_count - 1; // interval open at the top => -1
// 更新下界
mLow = mLow + mStep * low_count;
//用e2/e3方法
while( ( mHigh < g_Half ) || ( mLow >= g_Half ) )//当上界低于1/2或下界高于1/2时
{
//当上界低于1/2,
if( mHigh < g_Half )
{
SetBit( 0 ); 置比特位为0
mLow = mLow * 2;
mHigh = mHigh * 2 + 1;
// 应用e3方法
for(; mScale > 0; mScale– )
SetBit( 1 );
}
//当下界等于1/2时
else if( mLow >= g_Half )
{
SetBit( 1 );置比特位为1
mLow = 2 * ( mLow – g_Half );
mHigh = 2 * ( mHigh – g_Half ) + 1;
//应用e3方法
for(; mScale > 0; mScale– )
SetBit( 0 );
}
}
while( ( g_FirstQuarter < = mLow ) && ( mHigh < g_ThirdQuarter ) )
{

mScale++;
mLow = 2 * ( mLow - g_FirstQuarter );
mHigh = 2 * ( mHigh - g_FirstQuarter ) + 1;
}
}
//当编码结束时的收尾处理
void ArithmeticCoderC::EncodeFinish()
{

// mLow 和mHigh 的分布情况有两种,所以用两个比特来区分它们,
// which means that two bits are enough to distinguish them.
if( mLow < g_FirstQuarter ) // mLow < FirstQuarter < Half <= mHigh
{
SetBit( 0 );
for( int i=0; i SetBit(1);
}
else // mLow < Half < ThirdQuarter <= mHigh
{
SetBit( 1 ); //解码器自动会在其后加0
}
// 清空输出缓冲区
SetBitFlush();
}

4.2.3解压模块的实现
压缩只是一种中间状态,目的是实现更快地传输或减小存储空间,但处于压缩状态的文件是不可以使用的,所以必需要有解压步骤,实现对压缩文件的解压,恢复文件的原本状态,因为算术编码是无损压缩,所以实现压缩文件无失真的解压是必然的步骤。解压是压缩的逆过程,具体流程如下:

图4.6 解压功能实现的界面
接下来是解压模块,解压模块的解压过程是压缩方式的逆过程,解压模块同样将接收“源文件”和“输出文件”的路径信息,然后将已进行压缩编码的数据进行码处理,主要步骤为:
1) 读取压缩编码信息,以确定解压模式;
2) 读取缓冲信息;
3) 对缓冲信息进行解码;
4) 暂存缓冲信息判断是否读取完全,若是,进行下一步
否则转到第二步;
5) 输出编码内容;

图4.7 解压模块流程图
void ArithmeticCoderC::DecodeStart()//建立解码缓冲区
{
for( int i=0; i<31; i++ ) // 还是只使用31位比特
mBuffer = ( mBuffer << 1 ) | GetBit();
}

unsigned int ArithmeticCoderC::DecodeTarget( const unsigned int total )/*确定解码的开始区间*/

{

mStep = ( mHigh - mLow + 1 ) / total;

return ( mBuffer - mLow ) / mStep;
}

void ArithmeticCoderC::Decode( const unsigned int low_count,
const unsigned int high_count )//解码实现函数
{
//重新确定解码上下界
mHigh = mLow + mStep * high_count - 1;
mLow = mLow + mStep * low_count;
//分情况确定解码模式
while( ( mHigh < g_Half ) || ( mLow >= g_Half ) ) / /mHigh < Half <= mLow
{
if( mHigh < g_Half )
{
mLow = mLow * 2;
mHigh = mHigh * 2 + 1;
mBuffer = 2 * mBuffer + GetBit();
}
else if( mLow >= g_Half )
{
mLow = 2 * ( mLow – g_Half );
mHigh = 2 * ( mHigh – g_Half ) + 1;
mBuffer = 2 * ( mBuffer – g_Half ) + GetBit();
}
mScale = 0;
}

while( ( g_FirstQuarter < = mLow ) && ( mHigh < g_ThirdQuarter ) )
{
mScale++;
mLow = 2 * ( mLow - g_FirstQuarter );
mHigh = 2 * ( mHigh - g_FirstQuarter ) + 1;
mBuffer = 2 * ( mBuffer - g_FirstQuarter ) + GetBit();
}
}
最后,为了方便本设计软件的演示,在操作界面加入了关键代码的显示按键,可以实现对与运行程序在同一文件夹中的名为“ArithmeticCoderC”的 .cpp 文件以文本文件的方式打开。实现界面如下:

图4.8 包含关键代码查看的软件界面

图4.9 关键代码查看
4.3压缩效率分析
按字节对250万字的汉语语料库进行统计, 结果表明, 153 个符号的覆盖率超过 99.99% , 199 个符号的覆盖率达到100%。对数据压缩领域普遍认可的
Calgary 语料库中的英语文本文件及计算机源程序文件做统计, 100 个符号的覆盖率超过99. 99%,104 个符号则实现完全覆盖。因此,探讨数据压缩对不同类型字符文件的压缩做用, 不仅仅是对语言文字文本压缩有意义。
为了更直接的展示出本设计所实现的压缩性能,下面将会使用本设计对一些文件进行压缩,文件类型包括 .bin, .txt, .doc, .mp3 。
参数
类型 压缩前 压缩后 压缩比 压缩时长
.txt文件 462KB 354KB 0.766 2.6s
.doc文件 581KB 497KB 0.855 3.1s
. bin文件 541KB 483KB 0.893 2.9s
.mp3文件 1075KB 1072KB 0.997 4.8s

表5.1

测试环境:
系 统:Windows XP
处理器: AMD Sempron64
内 存:单条512MB
通过以上比较可以看出,使用本设计软件对文件进行压缩时,效率最优的是.txt文件,其次是文件.doc,下来是.bin和 .mp3 文件。.txt 文件的压缩比达到了 0.766,分析其原因,应该是由于本设计软件是针对二进制数据文件设计的,即将目标文件作为二进制数据文件进行处理,而并没有对不同类型的文件进行特别处理,所以对于不同文件,其数据特性越接近二进制数据流,即其中二进制字符“0”与“1”的分布越偏离1:1,本设计软件对其的处理能力就越强。比如前面对.txt文件进行处理时,因为.txt文件是采用ASCII码为主要记录格式的文字信息记录文件,所以其中对各种字符和标记符号的编码特性是依照ASCII码编码特性的,因此其编码中二进制字符“0”与“1”的分布并不十分接近1:1的概率比值,而.doc文件因为与.txt文件相比,采用了较多的控制符号,所以其文件中二进制字符“0”与“1”的分布与.txt相比更靠近1:1,所以可以获得较.txt文件为高的压缩比;对于.bin文件,由于其本身就是二进制文件,所以它自身的二进制字符“0”与“1”的分布在通常情况下已经较为接近1:1的概率比值,所以对其进行多次压缩测试时,压缩比在0.6到接近1.0的范围浮动,而其文件的概率大多分布在0.8左右,所以上表采取了与这一数值相近的一个测试结果来作为不同类型文件压缩效率的比较。但是对一些有特殊用途的应用软件使用的文件如mp3 等文件,加之其本身就是有较大压缩效果的文件,本设计软件的处理能力就不能使人非常满意了。
4.4 软件设计的优点与不足
本软件设计的优点在于:
1)对二进制数据流的高压缩比:在二进制数据“0”、“1”的出现概率接近1:1的时候,它有着非常有优势的压缩比;
2)为了实现日后对其进行改进,本设计在模式设置的时候将压缩解压模块的自适应模式模块设计为独立的,可以选择不同的压缩解压模式进行。当日后要对其扩充或改变其自适应阶数,及相关参数,使其适合于特别的文件类型。
3)使用简单方便的文件流类 fstream 对数据文件进行读写操作,因为 fstream 是由标准C/C++ 类库提供的,所以具有良好的通用性和可移植性。
本软件设计的不足:
1)缺少对进程的控制,在对文件进行压缩解压的时候,由于不能实现进程控制,所以不能及时了解到压缩的进度,而且在压缩解压过程中途也不能对操作进行取消;
2)由于对数据文件操作完全是利用标准C/C++ 类库提供的函数实现的,所以在运行过程中,本设计存在对CPU 的占用问题,当处理较大型文件的时候,会出现CPU 占用率过高的情况,可能影响其他软件的同时运行。

4.5 软件设计值得改进的地方
本软件实现了用自适应模式对二进制数据流/文件进行编解码处理,但还可以
进行一些改进,用于提升性能:
1)可以增加对压缩解压过程的进程控制,使得在压缩和解压过程中,用户可以根据情况随时对编码过程进行操作控制,这可以使软件使用的灵活性大大增加,并且有可能在实际应用过程中,避免一些意外状况的发生;
2)增加对占用CPU 的问题的考虑,使得在软件运行过程中,可以多些对多任务的支持,而不会因为本软件的运行占用CPU 而影响其他软件并行运行。

第五章 算术编码总结
算术编码是一种无失真的编码方法,能有效地压缩信源冗余度,属于熵编码的一种[11]。算术编码的一个重要特点就是可以按分数比特逼信信源熵,突破了Huffman编码每个符号只不过能按整数个数比特逼近信源熵的限制。对信源进行算术编码,往往需要两个过程,第一个过程是建立信源概率表,第二个过程是对信源发出的符号序列进行扫描编码。而自适应算术编码在对符号序列进行扫描的过程中,可一次完成上述两个过程,即根据恰当的概率估计模型和当前符号序列中各符号出现的频率,自适应地调整各符号的概率估计值,同时完成编码。尽管从编码效率上看不如已知概率表的情况,但正是由于自适应算术编码具有实时性好、灵活性高、适应性强等特点,在图像压缩、视频图像编码等领域都得到了广泛的应用。经过算术编码,我们描述了一种高效率的数据压缩的编码方法,并已证明它符合bijective编码的要求。现在我们不仅通过整数实现,而且也通过浮点数实现了该压缩算法。我们看到算术编码可以按输入顺序进行,对每个编码不需得到其全部消息就可将信息的已编码部分输出。这种特性可用三种按比例变化的方式压缩,可以加大工作间隔而不会溢出甚至可以按需要限定其每次处理的码长。我们也看到一般编码的有效限度并注意所增加输入序列长度,即可使其平均码长与熵接近而有此熵值与选择的压缩模式有关。我们注意到在一种模式质量被实际限定后,任何编码器都可以满足这个压缩比。这里,我们同样认识到算术编码的另一优势——因为它的统计模式可以方便切换,故可为输入的数据挑选最适合的模式。
虽然算术编码在过去的几十年开始使用并被看好,但现在和未来却产生了一些变化和新动向。然而有时人们声称已发明更好的算法而且多次测试得出其比以前任何方法都好——但却忽略了算术编码是一种无损编码。因为Shannon定理确定地告诉我们压缩后的熵是不可能比其压缩前的熵更低的。一个人可以把数据的冗余任意删除,但要达到熵值是几乎不可能的。
然而我们可以至少从两方面使我们的算法变得更好存储器使用率和编码速度。如果算术编码使用存储器的话,那这将会是最好的压缩方法。对于简单模式,它一般只用固定容量的存储器。而且它生成了无法被压缩得更小的编码。要注意这种编码的熵极限取决于如下模式:H(S) ≤ HM(S) ≤ |Code(S)|。我们应区分源序列本来的熵值H(S)和我们采用的编码模式所能得到的熵值下限HM(S)。但如果选择了不适当的模式,即使算术编码能达到HM(S),它仍旧离最佳压缩效果很远。
因为输入数据一般不可预测,我们不得不为特别的编码内容找到适当的模式,算术编码允许使用专门设计的标准组件,因此编码器能在不同模式间切换,甚至在编码过程中也可进行切换。现在已经开发出很多模式,最流行的模式系列之一是PPM (Prediction with Partial Match) ——部分匹配预测编码。它对输入长度可能变化的内容进行压缩非常有效,而很多其他高效编码方式则需要更多可靠的正确的条件才行。
随着算术编码器速度的提高,集成编码器变得常见,但现代CPU浮点运算能力的提高可能会改变这种趋势,我们已经知道基于浮点的算术编码的实现是可能的一种非常有效的集成实现是界限编码器它表现出对比特数据按比例压缩的良好特性。因此替换现有的CPU中对比特不敏感的部分就是现在的主要问题。有些
报道说有人将压缩速度提升50%而同时码长只增加0.01%,对于这些数字则须要小心对待,因为它们只反映出了编码器的表现,而不是因为采用了新的有效的模式。可以看出,算术编码的最有趣的研究领域是编码模式。对一个好的编码器来说编码大小、存储器使用率和编码速度作为次要因素都取决于所选择的模式,而算术编码发展的过程本身就是这样的例证。

参考文献
[1] D.A.Huffman. A Method for the Construction of Minimum Redundancy Codes. [J] Proceedings of the Institute of Radio Engineers. 40(9):1098-1101, September 1952.
[2] Elias P. Information theory and coding.[J] NY: New York , Mc2 Graw2Hill , 1963
[3] Rissanen [J] . IBM J . Res. Develop. , 1976 ,20(3) :198
[4] Rissanen J , G.G.Langdon. [J]. IBM J . Res. Develop. , 1979 ,23
(2) :149
[5] Witten I H , Neal R M, Cleary J G. Communications of the ACM . [J]. 1987 ,30(6) :520
[6] 吴乐南. 数据压缩(第二版)[M]. 四川:电子工业出版社
[7] C.E.Shannon. A Mathematical Theory of Communication.[J]. Bell Syst.Tech, 1948,7:398-403
[8] David Salomon. 数据压缩原理与应用[M]. 四川:电子工业出版社
[9] Paul G. Howard. Arithmetic Coding for Data Compression[EB/pdf]. http://www.cs.duke.edu/~jsv/Papers/HoV94.arithmetic_coding.pdf
[10] Amir Said. Introduction to Arithmetic Coding Theory and Practice[R]. Palo Alto, CA: Hewlett-Packard Laboratories,2004
[11] Amir Said. Comparative Analysis of Arithmetic Coding Computational Complexity. [EB/pdf]. http://www.hpl.hp.com/techreports

附 录
算法源代码
#include "stdafx.h"

#include "ArithmeticCoderC.h"

基于矢量量化编码的数据压缩算法的研究与实现

Posted by 天际的荒草 | Posted in Docs | 文档 | Posted on 18-09-2009

标签:, ,

0

目 录

摘 要 I
ABSTRACT II
第一章 绪论 1
1.1 课题的研究背景及意义 1
1.2课题研究现状 2
1.3 课题研究内容 3
第二章 矢量量化技术简介 4
2.1 数据压缩技术 4
2.2 矢量量化的定义及理论基础 8
2.3 矢量量化的相关概念 10
2.4 矢量量化的关键技术及技术指标 13
第三章 矢量量化的算法研究 16
3.1 矢量量化码书设计算法的研究 16
3.1.1 经典的LBG算法 16
3.1.2 MD算法 18
3.1.3 码书设计算法比较 19
3.2 码字搜索算法 20
3.2.1 基于不等式的快速码字搜索算法 20
3.2.2 等均值等方差最近邻搜索算法 21
3.3 码字索引分配算法 23
3.3.1 BSA算法 23
3.3.2 禁止搜索码字索引算法 25
第四章 矢量量化算法的实现 26
4.1 需求分析与整体设计 26
4.1.1需求分析 26
4.1.2 整体设计 26
4.2 矢量量化算法的实现过程及说明 27
4.2.1 初始码书的生成 27
4.2.2 LBG矢量量化 28
4.2.3 矢量量化码字索引与恢复 31
4.3 实验结果及评价 31
第五章 结论与展望 34
参考文献 35
致 谢 36
附录 37

摘 要

伴随着通讯与信息科技的迅猛发展,数据压缩技术己经成为信息时代人们工作与科研的有力工具。数据压缩技术,作为信息论研究中的一个重要课题,一直受到人们的广泛关注。矢量量化技术作为数据压缩领域里的一个重要分支,以它压缩比高、编码速度快、算法简单清晰等良好的特性,在图像压缩等领域都已成为有力的手段和方法。
本文以矢量量化在静止图像方面的应用为研究目标,介绍了矢量量化的定义,基本理论、相关概念及发展现状,重点讨论研究了矢量量化的三大关键技术——码书生成和码字搜索和码字索引分配。详细阐述了码书设计算法中的LBG算法和最大下降MD算法;快速码字搜索中的基于不等式快速码字搜所和码字索引分配中的BAS算法和禁止搜索码字索引算法等。
最后总结分析了现有典型的算法和改进算法并提出了自己的基于矢量量化算法的实现方法,编程实现了一个完整的数据压缩软件,取得了较好的效果。

关键词: 数据压缩,矢量量化,LBG

ABSTRACT

As the rapid development of communications and information technology, data compression technology has become a powerful tool for people to work or do the scientific research on this information age. As a study of important issues on information research, data compression technology has been pay much attention to. Vector Quantization Technology, as an important branch in the field of data compression, with its excellent characteristics: high compression, encoding speed, clear and simple algorithm, has become powerful tools and methodologies in the area of image compression.
Aimed to the application with the way to Vector Quantization in the Static image of research goals, this thesis show you the detailed explanation of the basic Vector Quantization principle, related concepts and development status, the discussion the three technology key of Vector Quantization — code book design algorithm, code searching and code distribution. In detail elaborated LBG algorithm and most greatly drops which we can called MD algorithm in the code book design algorithm, based on inequality quick code-search in quick code-search and BAS algorithm and Prohibition search symbol index distribution algorithm in symbol index distribution. Finally, I analyzed the existing typical algorithm and improving algorithm, come up with my own realization based on the method of Vector Quantization and achieve good results.

KEYWORDS:data compression Vector Quantization LBG

第一章 绪论
1.1 课题的研究背景及意义
1.1.1 研究背景
随着计算机和大规模集成电路的飞速发展,数字信号分析和处理技术得到很大发展,并已经广泛应用于通信、雷达和自动化等领域。数字信号的突出优点是便于传输、存储、交换、加密和处理等。一个模拟信号f(t),只要它的频带有限并允许一定的失真,往往可以经过采样变成时间离散但幅值连续的采样信号f(n)。对于数字系统来说,f(n)还需经过量化变成时间和幅值均离散的数字信号x(n)。
通信系统有两大类:一类是传输模拟信号f(t)的模拟通信系统;另一类是传输数字信号x(n)的数字通信系统。在任何数据传输系统中,人们总希望只传输所需要的信息并以最小失真或者零失真来接收这些信息。人们常用有效性(传输效率)和可靠性(抗干扰能力)来描述传输系统的性能。与模拟通信系统相比,数字通信系统具有抗干扰能力强,保密性好,可靠性高,便于传输、存储、交换和处理等优点。在数字通信中,码速率高不仅影响传输效率,而且增加了存储和处理的负担。
上个世纪八、九十年代,计算机技术和网络技术取得了飞速的发展,人类社会进入到了前所未有的信息化时代。随着信息时代的来临人们对通信业务的要求不断增长,在日常生活中,大量的信息数据需要传输、存储和处理。科学实验表明,人类从外界获取的知识之中,有80%以上都是通过视觉感知获取的【1】。眼睛获取的是图像信息,和语音、文字等信息相比,图像包含的信息量更大、更直观、更确切,因而具有更高的使用效率和更广泛的适应性,一幅图胜过千言万语, 图像信息是人类认识世界、自身的重要源泉。所以在信息数据中,绝大部分数据都是图像数据,而图像数据的传输常常要占用很大的带宽,需要很大的存储空间,因而怎样对图像数据进行行之有效地传输是一个极具挑战性的课题。
数字图像中包含的数据量十分巨大,例如,800 x 600分辩率的真彩色图像,其数据量为800 x 600 x 3=1440000字节,约1.4MB;而一分钟CD音质的音频文件一般需要l OMB左右的存储空间。在视频传输中PAL制式(25帧/秒)下,画面分辨率为640 x 480下,真彩色(24位)的图像序列,播放1秒钟的视频画面数据量为:640 x 480 x 3 x 25 = 23,040,000字节,相当于存贮一千多万个汉字所占用的空间。如此庞大的数据量,给图像的传输、存贮、传输线的传输率(带宽)以及计算机的处理速度等增加巨大的压力。由此可见,对降低传输成本,增加数据传输的可靠性,不断满足人们对信息传输的需求,图像压缩都具有十分重要的作用。为了解决好这个问题,我们就必须对图像进行编码压缩,在保证一定图像质量的前提下,有效地减少传输时所需的数据量和占用的频带。
1.1.2 研究意义
图像压缩就是在没有明显失真的前提下,将图像的位图信息转变成另外一种能将数据量缩减的表达形式,即去处冗余信息。首先,尽管图像中数据量很大,但其行、列以及帧间都具有极强的相关性或冗余信息。即一个象素的灰度值,总是和它周围的象素的灰度值有着某种关系,可以由它们推算表示出来,应用某种方法提取或减少它们之间的这种相关性,即可实现图像压缩。其次,大部分图像视频信号的最终接收者都是人眼,而人类的视觉系统是一种高度复杂的系统,它能从极为杂乱的图像中抽象出有意义的信息,并以非常精练的形式反映给大脑。人眼对图像中的不同部分的敏感程度是不同的,如果去除图像中对人眼不敏感或意义不大的部分,对图像的主观质量是不会有很大影响的,也实现了图像压缩。正由于图像压缩的必要性和可能性,图像压缩编码研究成为一个越来越活跃的领域。在诸如基于Internet的多媒体通信、可视电话、数字电视,多媒体计算机等领域得到了广泛的应用。
1.2课题研究现状
矢量量化的基本理论早在二十世纪六七十年代已有人关注,而在二十世纪八十年代开始逐步完善起来。矢量量化是分组量化的一种,受到广泛注意和使用的分组量化方法是由黄和舒尔泰斯于1963年首先提出来的【2】,他们指出分组量化的实现方法:首先与正交矩阵相乘将相关的采样变换为不相关的采样,然后再在每组固定的总比特数限制下,将不同的量化比特数目分配给每个不相关的采样值。1979年,格尔肖在他的论文【3】中详细阐述了分组量化的一般性理论,它将贝内特早年关于均方误差准则的量化模型推广到分组量化中。
将矢量量化技术推向研究高潮和推广应用应归功于1980年由Linde. Buzo和Gray提出来的一种有效的LBG矢量量化码书设计方法【4】,该文献己经成为矢量量化的经典文献,是矢量量化技术发展的基石。
在20多年历程中,学者们在以下五个方面对矢量量化技术展开研究:
1. 针对基本矢量量化器复杂度大和比特率固定的缺点,开发其它类型的矢量量化器;
2. 针对基本矢量量化器的LBG码书设计算法容易陷入局部极小、初始码书影响优化结果和计算量大的缺点,学者们引入了神经网络、优化理论、模糊集合等技术,提出了各种各样的码书设计算法;
3.在矢量量化编码场合中,针对基本矢量量化器的穷尽搜索编码算法的计算量大和比特率固定的缺点,提出各种各样的快速码字搜索算法和变比特率码字搜索算法;
4. 矢量量化技术的应用;
5. 考虑到信道噪声将会在矢量量化解码端引入额外失真,学者们开始研究码字索引分配算法以减少由于信道噪声引起的失真。
1.3 课题研究内容
1. 研究内容
1)对数据压缩的基本理论、技术标准、评价方法进行研究和分析
2)对基于矢量量化的数据压缩算法及其衍生算法进行逻辑上的分析和比较
3)选择矢量量化算法中的一种算法进行实现,完成一个完整的数据压缩软件
2. 本文结构安排
第一章为绪论,主要介绍了课题的研究背景,简要地阐述课题的研究意义最后,总结了本论文的研究内容。
第二章中,首先对数据压缩作了简要的综述;然后介绍了矢量量化数据压缩算法的起源,发展和相关的数学模型及理论基础;最后写了矢量量化的关键技术和矢量量化技术指标。
第三章是对矢量量化算法的研究,首先分别论述了矢量量化的三大关键技术的算法,介绍了码书设计中的LBG算法和最大下降算法;码字搜索算法中的基于不等式的快速码字搜索算法和等均值等方差最近邻搜索算法;码字索引分配算法中的BSA算法和禁止搜索码字索引算法。
第四章是矢量量化算法的实现。详细介绍了矢量量化算法的实现过程,并对实验结果进行了分析和评价。

第二章 矢量量化技术简介
2.1 数据压缩技术
2.1.1数据压缩技术的发展
数据压缩的研究过程一直有两个发展方向【5】:一个是许多数学家所致力于的建立信源和数据压缩的数学模型,并从中找出衡量数据压缩质量的技术指标及最优压缩性能指标;另一个则是众多的工程技术人员所进行的工作,他们的研究重点为建立一个能实现数据压缩功能的系统,以服务于工程应用,或者对这些数据压缩系统进行分析或模拟,以确定它们的性能指标。
不论是理论研究还是工程实践,1977年以前,数据压缩作为信息论研究中的一项内容,主要是有关信息嫡,数据压缩比和各种编码方法的研究,即按某种方法对源数据流进行编码,使得经过编码的数据流比原数据流占用较少的空间。其中基于符号频率统计的霍夫曼编码具有良好的压缩性能,一直占据重要的地位,不断有基于霍夫曼编码的改进算法提出。
随着计算机技术的飞速发展,数据压缩作为解决海量信息存储和传输的支撑技术受到人们的极大关注。1977年,两位以色列科学家Jacob Ziv和Abraham Lempel发表了论文“A universal algorithm for sequential data compression”,提出了不同于以往的基于字典的压缩算法LZ77【5】。1978年,又推出了改进算法LZ78。他们的研究把无失真压缩的研究推向了一个全新的阶段。
随着信号处理研究的不断的发展,数字图像信号、语音信号等都被大量的引入到有关的领域中。由于图像信息占用较多的存储空间,而图像通信又是目前非话业务的主流,因此数据压缩技术在图像通信中得到了最广泛的应用。
在图像编码中,最早研究的是预测编码,曾作为经典理论而登载于各种专著,并得到广泛的应用。近年来,随着神经网络理论的兴起,有人采用BP网进行非线性预测的尝试,并取得了较好的效果。
1969年,在美国举行首届“图形编码会议”,表明图像编码以独立的学科挤身于学术界。而变换编码在五年左右的时间内成为研究热点。变换编码中的DCT编码由于编码效果较好,运算复杂度适中等优点,已经发展成为目前国际图像编码标准的核心算法。
80年代中后期,众多研究者相继提出了在多个分辨率下表示图像的方案,主要的方法有:子代编码,金字塔编码,小波变换编码等。基于小波变换的方法具有较高的压缩性能,己发展为JPEG 2000的核心算法。在近年来的甚低码率的编码研究中,有一种称之为模型基的编码方法颇引人注意,这种方法压缩比高,但适用于场景比较简单的特定场合。
在1988年左右,有人提出了一种分形图像编码的压缩方案。这种方案思路新颖、压缩潜力大、并具有解码分辨率无关性等优点,是一种很有潜力的编码方法。
尽管用软件压缩方法可以较好地实现数据压缩的目的,但由于压缩算法的运算量较大,需要很高的运算速度和存储空间,这对现有系统来说是很大的负担。为了解决这个问题,人们在继续探索数据压缩技术的同时,着手研制生产高性能的芯片和系统。一般在对时间要求不高的场合采用软件压缩,而对运行速度有特殊要求的情况下,可使用硬件压缩。不过,目前硬件压缩的开销远远大于软件压缩的开销。
2.1.2 数据压缩技术的分类
数据压缩的研究已有几十年的历史,其间,人们提出了各种各样的压缩算法。在分类上,也存在几种不同的方法,有人按编码失真程度或者说按压缩过程的可逆性将数据压缩编码分为两种类型:无失真压缩编码 (Noiseless Coding)与有失真压缩编码 (Noise Coding);有人按编码基建模的不同将数据压缩分成模型基编码和波形基编码;又有人将它分为第一代压缩编码和第二代压缩编码;还可按压缩技术所使用的方法进行分类,可分为预测编码(Predictive Coding)、变换编码(Transform Coding)和统计编码(Statistical Coding)三大类。目前,较为认可的是第一种分类方法【6】。
1.无失真压缩
无失真压缩也可称之为冗余度压缩(Redundancy Compression),在数字图象压缩中,有3种基本的数据冗余:编码冗余、像素间冗余以及心理视觉冗余。而无失真压缩就是利用数据的统计冗余进行压缩,除去或尽量除去数据中重复和冗余部分,而不丢失其中的任何信息,可完全恢复原始数据而不引入任何失真,但压缩率受到数据统计冗余度的理论限制,一般为2:1到5: 1这类方法广泛用于文本数据、程序和特殊应用场合的图像数据(如医学图像等)的压缩.由于压缩比的限制,仅使用无损压缩方法不可能解决图像和数字视频的存储和传输问题。
常用的无失真压缩技术有:哈夫曼编码,算术编码,游程编码,LZ编码等。
1)行程长度编码(RLE)  
行程长度编码(run-length encoding)是压缩一个文件最简单的方法之一。它的做法就是把一系列的重复值(例如图象像素的灰度值)用一个单独的值再加上一个计数值来取代。比如有这样一个字母序列aabbbccccccccdddddd它的行程长度编码就是2a3b8c6d。这种方法实现起来很容易,而且对于具有长重复值的串的压缩编码很有效。例如对于有大面积的连续阴影或者颜色相同的图象,使用这种方法压缩效果很好。很多位图文件格式都用行程长度编码,例如TIFF,PCX,GEM等。
2)LZW编码  
这是三个发明人名字的缩写(Lempel,Ziv,Welch),其原理是将每一个字节的值都要与下一个字节的值配成一个字符对,并为每个字符对设定一个代码。当同样的一个字符对再度出现时,就用代号代替这一字符对,然后再以这个代号与下个字符配对。LZW编码原理的一个重要特征是,代码不仅仅能取代一串同值的数据,也能够代替一串不同值的数据。在图像数据中若有某些不同值的数据经常重复出现,也能找到一个代号来取代这些数据串。在此方面,LZW压缩原理是优于RLE的。
3)霍夫曼编码  
霍夫曼编码(Huffman encoding)是通过用不固定长度的编码代替原始数据来实现的。霍夫曼编码最初是为了对文本文件进行压缩而建立的,迄今已经有很多变体。它的基本思路是出现频率越高的值,其对应的编码长度越短,反之出现频率越低的值,其对应的编码长度越长。
2.有失真压缩
有失真压缩也可称为嫡压缩(Entropy Compression),这是一种不可逆压缩。他利用了人类视觉对图像中的某些频率成分不敏感的特性,在压缩过程中会损失掉一部分信息,这样,其原始数据不能由压缩数据完全恢复出来。他是以丢失部分信息为代价而获得较高的压缩率。当然,为了确保恢复后的数据能基本保持原数据的特征,这种失真应该限制在某个规定的范围之内。无失真压缩主要有两大类型:特征抽取和量化方法,特征抽取的典型例子如指纹、汉字的模式识别,一旦抽取出足以有效表征与区分不同模式的特征参数,便可用它取代原始的图像数据,这一类方法一般是用于特定的环境。量化则是更为通用的熵压缩技术,除了直接对无记忆信源的单个样本做所谓的零记忆量化外,还可以对有记忆信源的多个相关样本映射到不同的空间,去除了原始数据中相关性后再做量化处理,由此又引出了预测编码和变换编码。
1)矢量量化编码
矢量量化编码利用相邻图象数据间的高度相关性,将输入图象数据序列分组,每一组m个数据构成一个m维矢量,一起进行编码,即一次量化多个点。根据仙农率失真理论,对于无记忆信源,矢量量化编码总是优于标量量化编码。
2)预测及内插编码
一般在图象中局部区域的象素是高度相关的,因此可以用先前的象素的有关灰度知识来对当前象素的灰度进行预计,这就是预测。而所谓内插就是根据先前的和后来的象素的灰度知识来推断当前象素的灰度情况。如果预测和内插是正确的,则不必对每一个象素的灰度都进行压缩,而是把预测值与实际象素值之间的差值经过熵编码后发送到接收端。在接收端通过预测值加差值信号来重建原象素。
3)变换编码
变换编码就是将图象光强矩阵(时域信号)变换到系数空间(频域信号)上进行处理的方法。在空间上具有强相关的信号,反映在频域上是某些特定的区域内能量常常被集中在一起,或者是系数矩阵的分布具有某些规律。我们可以利用这些规律在频域上减少量化比特数,达到压缩的目的。由于正交变换的变换矩阵是可逆的且逆矩阵与转置矩阵相等,这就使解码运算是有解的且运算方便,因此运算矩阵总是选用正交变换来做。

图2.1 数据压缩技术的分类
2.1.3 数据压缩算法的度量标准
对于一种数据压缩算法的性能,有一定的衡量标准,为了后面几章描述的方便,也为不至于产生歧义,对这些标准作以简单的介绍【7】。
1.算法性能评价
1)压缩比(CR:Compression Ratio):
压缩比定义为原始数据量与压缩后量的比值,即
压缩比 = 原始数据量/压缩后量
2)计算复杂度:
计算复杂度可以用算法处理一定量数据所需的基本运算次数来度量。如处理一帧有确定的分辨率和颜色数的图像所需的加法次数和乘法次数。
压缩算法分为编码部分和解码部分,如果两者的计算复杂度大至相当,则算法称为对称的,反之称为非对称的。
2.图像质量评价
1)均方误差(MSE)
对于模拟信号,设原始数据为x(t),编码、解码后的数据为y(t),二者之差为e(t),即e(t) = x(t) – y(t)。则e(t)的方差如公式2.1所示:
(2.1)
通常误差均值μe=0, 又称为均方误差(Mean Squared Error)。
2)信噪比(SNR):
对于离散信号,设原始数据为 ,编码、解码后的数据为 ,它们的差值为 的均方误差为 ,信噪比(Signal to Noise Ratio)定义为原始数据方差 与重建数据误差方差 的比值如公式2.2所示:
(2.2)
3)峰值信噪比(PSNR):
对于离散图像数据,在信噪比的计算中常用图像数据中的最大值xmax来代替均方根值бx,得到峰值信噪比如公式2.3所示
(2.3)
2.2 矢量量化的定义及理论基础
2.2.1 矢量量化的起源及发展
矢量量化基本理论早在20世纪六七十年代己有人关注,八十年代开始逐步发展完善起来。1956年,Steinhaus第一次系统阐述了最佳矢量量化问题【8】;1978年,Buzo第一个提出实际的矢量量化器。1980年,Linde, Buzo和Gray将Loyd-Max算法推广,提出了一种有效的矢量量化码书设计算法一一LBG【4】算法,将矢量量化技术的研究和推广应用推向了高潮,成为矢量量化技术发展的里程碑。
在20多年的发展历程中,人们全面研究了矢量量化的理论和应用,开发了多种类型的矢量量化器。虽然矢量量化技术研究已经日趋成熟,但仍存在很多有待解决的问题,如矢量量化码书标准与编码对象密切相关,不同应用场合下码书结构、尺寸以及矢量维数都不相同。矢量量化的压缩标准也一直没有提出。目前的研究大多停留在理论方面,各种优化的矢量量化器的硬件实现还有待于进一步的研究。因此,有关矢量量化技术的研究还有很多工作要做。
矢量量化在20多年的发展历程中,主要是从以下几方面得到了发展:
(1) 矢量量化器的研究,对基本矢量量化器复杂度大和比特率固定的缺点,开发其它类型的矢量量化器;
(2) 矢量量化码书设计算法研究:针对基本矢量量化器的LBG码书设计算法 容易陷入局部极小、初始码书影响优化结果和计算量大的缺点,学者们引入神经 网络、优化理论、模糊集合等技术,提出了各种各样的码书设计算法;
(3) 矢量量化码字搜索算法研究:在矢量量化编码场合中,针对基木矢量量 化器的穷尽搜索编码算法的计算量大和比特率固定的缺点提出各种各样的快速 码字搜索算法和变化特率码字搜索算法;
(4) 矢量量化码字索引分配算法研究:考虑到信道噪声将会在矢量量化解码端引入额外失真,学者们开始研究码字索引分配算法以减少信道引起的失真。
2.2.2 矢量量化的定义及理论基础
1. 定义
一个维数为k,尺寸为N的矢量量化器可以定义为从k维欧儿里得空间 到一个包含N个输出(重构)点的有限集合C的映射Q【9】,表示为公式(2.4):
(2.4)
其中, 。
C是重构码字矢量集合,称为码书,其尺寸(大小)为N。码书的N个元素Yi称为码字或者码矢量,它们均为k维欧几里得空间 中的矢量。输入矢量空间 通过尺寸为N的矢量量化器Q后,被分割成N个互不重叠的区域又称为胞腔,这个过程称为输入矢量空间的划分。对 胞腔 定义为公式(2.5):
(2.5)
2. 理论基础
矢量量化的理论基础是香农的率失真理论。1948年,香农定义了信道容量,并证明只要编码速率不超过信道容量,符号就能以任意小的差错概率在该信道中传输。1959年,香农定义了率失真函数R(D),并证明只要R(D)不超过信道容量就能保证接收端的失真不超过给定阈值D。在数学上,R (D)定义为在给定失真D的条件下,系统所能够达到的最小码速率。对于幅值离散的信源, R(D)定义如下公式(2.6)所示:
(2.6)
其中, ,平均失真满足公式2.7:
(2.7)
式中d(X,Y)是失真测度,它表示输出采样值Y再现原始采样值X所引入的失真, P(Y/X)表示在己发送X的情况下接收到Y的概率。R(D)的单位为比特/采样。同样,也可以定义失真率函数D(R),它是率失真函数的逆函数,其含义为在定速率不超过R的条件下,系统所能够达到的最小失真,它是在维数k趋向无穷大时Dk(R)的极限,即 。
香农理论表明在速率受限的条件下或在平均失真受限的情况下,通信系统所能达到的最优性能。率失真函数通常又被作为理论最优值,如果一个系统的性能低于理论最优值,则一定可用更好的编码技术获得系统性能的改善;如果一个系统的性能接近理论最优值,则此系统已接近最优,无法再做太多改善;一个系统的性能不可能优于理论最优值。由香农理沦可知,理论上,矢量量化技术只要不断的增加矢量的维数k,编码的性能就可任意接近率失真函数,使系统性能达到最优。因此,香农的率失真理论指出了矢量量化技术的优越性,是矢量量化技术的理论基础。
2.3 矢量量化的相关概念
2.3.1 数学模型
设有一个信源采样数据序列,我们把每K个数据分成一组,每组数据都记录成矢量形式 (i =1,2 ,…,N ),称x为输入矢量。设 为一个K维输入矢量的集合。
再把T划分成M( (2.8)
通常,我们把这M个子空间称为Voronoi胞腔(Cells),或者简称胞腔,有时也把它称为一个分类或分区。在每个胞腔R,中我们再找到一个代表元Yi,我们称所有这些代表元组成的集合C=( )为码书(Codebook)。这些代表元也称为码字(Codeword)集合1= (1,2,…, M}称为码字的索引集合。一个矢量量化器包括编码器和解码器两部分。编码器主要包括一个码书和一个量化器。
量化器Q(X)定义如式(2.9):
Q: T C;
当X 时,Q (X)= Yi (i=1 ,2,...,M). (2.9)
其中,Q(X)是一个多对一的函数,因此它是不可逆的。解码器主要包括一个与编码器相同的码书和一个码字检索器 (i)。
码字检索器 (i)定义如式(2.10):
: I C;
(i) = Yi,i=1,2,...,M. (2.10)
矢量量化的模型如下图2.2所示:
编码时:对任意一个输入的K维矢量X,计算Q(X)的值Yi,通过传输信道发送码字Yi的索引i到解码器端。
解码时:对输入的一个索引号i,查找码书中对应的码字Yi,输出Yi作为整个系统对矢量X的压缩恢复值。
图2.2矢量量化器结构示意图
2.3.2 量化器Q(x)相关问题
我们可以看出矢量量化可以等价于一个聚类问题。但如何聚类却有很多种方法。在上文我们说当 时,Q(X)= Yi;(i=1 ,2,...,M)。这是用胞腔来定义Q(X)。反过来,也可以用Q(X)和码字Yi来定义胞腔Ri,如式(2.11)所示:
(2.11)
当然,最初必须有一个明确的Q{X〕的定义。
如何判断 昵?通常定义一个失真测度函数 (实数域),d (X,Yi)表示用Yi来代表X时产生的误差。我们用它来判断一个矢量X到底属于那个胞腔:
当d (X,Y
因此,在这里量化器的主要工作就是利用失真测度函数d进行最近邻码字收索。有时候我们也把d(X,Yi)称作X与Yi之NJ的距离。
2.3.3 失真测度函数
我们要求失真测度函数满足以下两个条件:
(1)正定性: 当且仅当 X=Y时d( X,Y)=0;
(2)对称性: ;
有时候我们也加上第三个条件:
(3)三角不等式: ;
失真测度函数通常选择线性赋范空间中的范数,根据范数的定义,它们都满足上面三个条件。在本文中若无特殊声明,我们的d(X,Y)就取最常用的2范数的平方,即K维欧几里德空间中的距离的平方: ,我们把这个测度又称为平方误差测度。它虽然不满足三角不等式但是 却是满足全部这三个条件的。
事实上,判断一个矢量X属于哪个胞腔可以有很多种标准,在本文中,我们仅仅依据最近邻(NN: Nearest Neighbor)准则为判断标准。利用矢量失真函数d,我们再定义一个胞腔失真函数:
D: Voronoi Cells R (实数域);
X为处理矢量。
因为我们通常处理的数据量都是有限的,所以有限个实数之和也是有限的,从而D(Ri)是有限的。那么我们系统的总失真就如式(2.12)所示:
(2.12)
有时为方便起见,我们也把Er记为Er(C),C为码书,把D(Ri)记为D(Ri, Yi), Yi为Ri的代表元。显而易见的,Er是越小越好。
2.4 矢量量化的关键技术及技术指标
2.4.1 矢量量化的关键技术
矢量量化的三大关键技术是【8】:码书设计、码字搜索和码字索引分配。其中前两项最关键。
1. 码书设计
矢量量化的首要问题是设计出性能好的码书。如果没有码书,那么编码将成为无米之炊。假设采用平方误差测度作为失真测度,训练矢量数为M,目的是生成含N (N< M)个码字的码书,则码书设计过程就是寻求把M个训练矢量分成N类的一种最佳方案(如:使得均方误差最小),而把各类的质心矢量作为码书的码字。可以证明在这种条件下各种可能的码书个数为Num C,Num C满足公式2.13:
(2.13) 其中C为组合数。通过测试所有码书的性能可以得到全局最优码书。
然而,在N和M比较大的情况下,搜索全部码书是根本不可能的。为了克服这个困难,文献中各种码书设计方法都采取搜索部分码书的方法得到局部最优或接近全局最优的码书。所以研究码书设计算法的目的就是寻求有效的算法尽可能找到全局最优或接近全局最优的码书以提高码书的性能,并且尽可能减少计算复杂度。
2. 码字搜索
矢量量化码字搜索算法是指在码书已经存在的情况下,对于给定的输入矢量,在码书中搜索与输入矢量之间失真最小的码字。给定大小为N的码书C,如果矢量x与码字A之间的失真测度为d(x,y),则码字搜索算法的目的就是找到码字Y,使得失真测度满足公式2.14:
(2.14)
如果采用平方误差测度,对于k维矢量,每次失真计算需要k次乘法,2k一1次加法,从而为了对矢量x进行穷尽搜索编码需要Nk次乘法,N(2k -1)次加法和N-1次比较。可以看出,计算复杂度由码书尺寸和矢量维数决定。对于大尺寸码书和高维矢量,计算复杂程度将很大。研究码字搜索算法的主要目的就是寻求快速有效的算法以减少计算复杂程度,并且尽量使得算法易于用硬件实现。
3. 码字索引分配
在图示的矢量量化编码和解码系统中,如果信道有噪声,则信道左端的索引i经过信道传输可能输出索引J而不是索引i,从而将在解码端引入额外失真。为了减少这种失真,可以对码字的索引进行重新分配。如果书大小为N,则码字索引分配方案一共有N!种。码字索引分配算法就是在N!种码字索引分配方案中寻求一种最佳的码字索引分配使由信道噪声引起的失真最小。然而,当N较大时,测试N!种码字索引分配方案是不可能的。为了克服这个困难,各种码字索引分配方法都采用局部搜索算法,往往只能得到局部最优解。所以研究码字索引分配算法的目的就是寻求有效的算法尽可能找到全局最优或接近全局最优的码字索引分配方案以减少由信道噪声引起的失真,并尽可能减少计算复杂度和搜索时间。
2.4.2 矢量量化技术指标
1. 矢量量化压缩率
从矢量量化器的工作原理我们看出,码书确定之后,传输或者存储的压缩数据只是一系列码字的索引,这些索引本身并不包含原始数据的任何信息。因此矢量量化的压缩率很大,其比特率 bit/采样,也就是说压缩倍数为 B为原始采样数据所用比特(bit)数。
举例来说,当E=8, M= 256, K=64时,压缩率r=0.015625 bits/采样。压缩倍数为64。这样的压缩倍数显然很可观了从压 缩 率 与压缩倍数的计算公式我们看出,M一般是2的幂次。再例如,码书大小为150,码字索引要用8bits码书大小为256,码字索引也要用8bits.两种码书大小得到的数据压缩率相同,但后者压缩性能显然更好,所以一般我们用256而非150个码字,大小为2a的码书又称为q比特码书。
2. 信号恢复性能指标
通常信号质量有均方误差(MSE),信噪比(SNR),峰值信噪比(PSNR) 【11】等。在本文的讨论中,我们主要是灰度图像作为测试数据来源。我们的矢量量化技术的应用也主要是针对灰度图像的,因此以L级灰度图像为例,我们给出个指标的定义:设一副L级灰度图像有WXH个像亲,Xij为原始图像像素值,Yij为恢复图像像素值,那么
结过如下公式所示:
(2.15)
(2.16)
(2.17)

第三章 矢量量化的算法研究
3.1 矢量量化码书设计算法的研究
3.1.1 经典的LBG算法
如前所述,在矢量量化器的构造过程中,码本设计是最初的也是最重要的部分,根据各种码本设计算法的思想和迭代过程,我们可以将码本设计问题归结为Lloyd算法的两条基本准则【12】:
1. 最佳划分准则(Optimal Partition)
对于给定的码本 利用最近邻条件对训练矢量集进行重新划分。将每个训练矢量映射到与它之间失真最小的码字,最后形成一组以现有码本中的码字为中心的最佳划分。设训练矢量集为:
则训练矢量集的最佳分类 满足公式(3.1):
式中,i,j= 1,2,...,N (3.1)
如果存在D(x,yi )= D (x,yj ), 则将训练矢量归入码字yi的集合。
通常把这种最佳划分称为Voronoi划分,对应的子集凡称为Voronoi胞腔。设训练矢量x为k维的 ,如果用平方误差测度用来表征训练矢量x和码字yi之间的失真,即:
(3.2)

2. 质心条件 (CentroidC ondition)
利用由上面步骤得到的训练矢量划分集 重新计算它们各自的质心,得到新的码本:
(3.3)
(3.4)
式中, 代表子集Si中训练矢量的个数。
各种矢量量化码本设计算法基本都是上面两个步骤的交替迭代的基础上得到最后的码本。不难看出,码本生成过程中的计算量是随着码本矢量的维数k和码本尺寸N的增大而急剧增长的,对于需要高维大码本的矢量量化器来说,测试所有可能的码本来寻求全局最优码本将是十分困难的。为了克服这个困难,Linde . Buzo和Gray提出了经典的LBG算法。
1980年Linde,Buzo和Gray将Lloyd算法推广到矢量空间【8】, 算法的步骤简单描述如下:
Step 1 :给定初始码本 ,令迭代次数m=0,平均失真初始值为 ,给定失真下降阈值 ;
Step 2:用码本 中的码字作为质心,根据最佳划分原则将训练矢量集x划分为对应于每个码字的N个聚类,
满足: ;
Step 3:计算本次迭代的平均失真 判断相对误差是否满足 ,若满足,则停止算法,码本C(m)就是所求的码本;
否则,转Step 4;
Step 4:根据质心条件,计算各聚类的质心,即公式(3.5):
(3.5)
产生新码本 并置m=m+1,转Step 2
END:算法结束。

对于 LBG算法来说,初始码本选择的好坏将直接影响到后面的迭代计算结果,一个不好的初始码本会降低算法的收敛速度和最终码本的性能。因此在LBG算法中要对初始码本的选择作一定的处理。如果初始码本随机产生,即直接从训练序列中随机选择N个训练矢量作为初始码字,构成初始码本,可能会选到一些非典型的训练矢量作码字,因而该胞腔可能含有少数几个矢量甚至只有1个。另外,有可能把某些空间分得过疏。这可能会导致码本中的有些码字得不到充分利用,设计出来的码本性能就可能较差。
3.1.2 MD算法
最大下降(MD)【13】码本设计算法与经典的LBG算法不同,它是一种分裂算法,而没有初始码本。在MD算法中,首先将训练矢量集 作为一个原始包腔,然后该包腔被它的最优分割超平面分成两个子包腔。依此类推,每次分裂产生一个包腔,直到生成最后的N个包腔,计算它们的质心,就可以得到设计的码本C={y}i=1,2,...,N)。与LBG算法相比,MD算法的计算量少并且所产生的码本性能好。另一方面,MD算法倾向于分割元素较多的胞腔,而不会去分割只有一个元素的胞腔,避免了非典型码字的形成,提高了码本的整体性能。在MD算法中,从L个包腔向(L+ l )个包腔扩展时,先要找出每个现有包腔的最优分割超平面,并计算它们各自带来的失真下降幅度,然后依据失真下降最大准则来选择究竟对哪一个包腔进行分裂。这在k维空间里是比较困难的事,需要大量的计算和比较。图3.2所示为MD算法的分裂过程示意图,图中每一步骤中有阴影的包腔 是当前符合失真下降最大准则的包腔,它被最优分割超平面分成下面的两个子包腔 和 。从L个包腔生成(L+ 1)个包腔的具体实现描述如下:
设超平面 将某胞腔 分成两个非空胞腔如式(3.6)所示:

(3.6)
式中 , , , T表示转置。
当 中的矢量被质心 量化时,胞腔的失真D(Si)定义为公式(3.7): (3.7)
则由分割超平面H,划分胞腔S,所引起的失真下降可表示为式(3.8):
(3.8)
若采用平方误差测度,则式(3.8)可以化简为式(3.9):
或 (3.9)
式中, 分别为 的元素个数, 。分别为 的质心。
从式(3.9)中可以看出,若胞腔 、 非空,则失真下降函数满足 。
我们将胞腔Si的最优分割超平面 定义为使胞腔 具有最大失真下降 的超平面。MD算法先计算出所有胞腔的最大失真下降值 , ,然后找出最大的最大失真下降值 ,即 ,最后将胞腔Sp分割成两个新胞腔。所以,L+l个胞腔是通过划分L个胞腔中具有最大失真下降的胞腔并保持其余胞腔不变而得到的。值得注意的是,每次分裂包腔时,并不需要重新计算所有包腔的失真函数,而只需找到新增加的两个包腔的最优分割超平面,计算它们各自的失真函数,再与其它包腔的失真函数值进行比较即可找出新的满足失真下降最大准则的包腔。产生最后的N个胞腔,一共需计算(2N-3)次最大失真下降函数。
3.1.3 码书设计算法比较
LBG算法是一种迭代算法,其迭代操作是标量量化劳埃德迭代操作的直接推广。LBG算法他具有如下的优点:
1. 不用初始化计算,可大大减少计算时间
2. 初始码字选自训练序列,无空胞腔问题
LBG算法在具有如上的优点的同时也有一些缺点和不足:
1. 在每次迭代的最佳划分阶段,从码书中搜索训练矢量的最近码字需要大量的存储空间和繁琐的计算;
2. 初始码书的选择影响码书训练的收敛速度和最终码书的性能;
码书设计的第一个缺点可采用各种快速码字搜索算法来解决,但这些算法无法改善码书的性能,第2个缺点产生的原因是:LBG算法是一种下降算法,每次迭代总能减少(至少保持不变)平均失真,而且每次迭代通常只能产生码书的局部变化,即每次迭代后,与旧码书相比,新码书不可能有非常大的变化。因此,一旦选定初始码书,该算法只能得到局部最优的码书,即LBG算法一般不能得到全局最优的码书。
与LBG算法相比,MD算法的计算量少且所产生的码书性能好。另一方面, MD算法倾向于分割元素较多的胞腔,而不会去分割只有一个元素的胞腔,而这种情况在LBG算法中却常常出现。然而,在MD算法中,多维胞腔的最优分割超平面的搜索是一个非常困难的问题。为减少计算量,这些算法的搜索范围被限制在与矢量空间的基本矢量正交的超平面上,这个矢量空间可由离散余弦变换(DCT)得到。但是,在这种限制条件下,算法常常搜索不到最优超平面。
3.2 码字搜索算法
3.2.1 基于不等式的快速码字搜索算法
1. 部分失真不等式排除法
部分失真搜索(Partial Distortion Search,PDS)算法【12】是一种较简单有效的最近邻搜索算法。它的基本思想是:在计算某个码字与输入矢量之间失真测度的过程中,始终判断累加的部分失真是否已经超过目前的最小失真,如果一旦超出则终止该码字与输入矢量之间的失真计算,转而开始计算另一个码字与输入矢量的失真测度。PDS常被用来与其他快速搜索算法结合起来运用,来排除其它快速算法最后无法排除的码字。
在编码过程中计算前面部分维数的失真距离,若其超出当前最小距离,则排除此码字为最匹配码字,否则继续搜索其它码字。
据如下(3.10)所示的柯西一许瓦尔兹不等式【14】:
(3.10)
可得一个不等式判据 若 ,则能保证 ,yi可被排除。因为|yi|可离线计算,所以节省了计算量。
首先判断 是否成立,若成立,则排除码字Yi否则,再判断是否满足 ,若满足,yi也可被排除。这缩小了搜索范围,他们还融入部分距离失真法节省计算量。双测试法的缺陷在于要求矢量的所有分量都为正值,而图像变换域编码中产生的变换系数有正有负,必须对这些系数进行正补偿,使所有矢量分量均大于零。
2. 整数投影法
整数投影法是一种适用于图像矢量量化的快速码字搜索算法。他们为每个m×m图像块 ,定义三种整数投影【14】,如下公式(3.11)(3.12)(3.13)所示:
块状投影: (3.11)
垂直投影: (3.12)
水平投影: (3.13)
在这三种投影的基础上定义了三个不等式条件,公式(3.14)(3.15)(3.16)所示:
(3.14)
(3.15)
(3.16)
可以证明,只要不满足上述任何一个条件,可排除yi是最匹配码字。
3. 三角不等式法
基于三角不等式d(Y i,yj) < d (x ,Yi)+ d (x ,yj)提出三种改进算法【14】。第一种算法先计算码书中每两个码字之间的距离,以当前匹配码字yi为中心,2hi(h i为输入矢量与当前匹配码字之间的欧氏距离)为半径划定搜索范围,即只搜索满足d(yj,yi)< 2hi的码字yj,j= 1,2,...,N;
第二种算法是将搜索范围定为满足:x-hi 其中rx为输入矢量的范数,rk为码字的范数,hi为输入矢量与当前匹配码字之间的欧氏距离,此种算法不同于第一种算法,无须计算码字之间的距离;
第三种算法取前两种算法搜索区域的交集作为搜索区域。
这三种算法都涉及如何确定初始匹配码字的问题,一般取范数与输入矢量范数最相近的码字。第一、三种算法比第二种算法要多耗费存储空间来存储码字之间的距离。最小均方误差编码算法,取一长训练矢量序列,计算每个Voronoi区域内的训练矢量与该区域质心矢量(码字) 的最大距离di,求平方根后得ri,按其升序排列。编码时,从最小的ri开始,排除对任意 ,满足 .的码字;那些对所有j,满足 的码字,则采用部分失真排除判定法,确定此码字为最佳匹配码字或者在以该码字为开始的剩余码字中搜索最佳匹配码字。
3.2.2 等均值等方差最近邻搜索算法
均值等方差最近邻码字搜索算法是将均值不等式判据和用方差不等式判据相结合,进一步缩小了码字搜索范围。k维输入矢量x的方差定义公式(3.17)【9】为
(3.17)
其中:Mx为输入矢量x的均值。
等均值等方差最近邻搜索算法所用到的方差判别准则为:
设码字 为输入矢量x的当前最近邻码字, ,输入矢量x和码字Y,的方差分别为Vx和Vyi,如果公式(3.18)成立,
(3.18)
则有d(x,yi) >d( x,yp),码字yi,可以被排除是输入矢量x的最近邻码字。对式(3.12)作适当变形,可得公式(3.19)和(3.20)
(3.19)
(3.20)
即码字Yi的方差满足以上两式时,码字Yi可以被排除是输入矢量x的最近邻码字。
由几何知识可知,在欧几里得空间 中以空间中心线L为轴心的超圆柱面上,各点的方差相等,该超圆柱面称为等方差超圆柱面。由式(3.13)和(3.14)可知,等方差判别准则将码字搜索范围限制在方差分别为Vmax和V min的两个超圆柱面内。则等均值判别准则与等方差判别准则相结合的等均值等方差最近邻搜索算法将码字的搜索范围限制在了如图3.2所示的阴影部分内。

图3.1 等均值等方差最近邻搜索算法搜索范围二维示意图

图3.1 所示是EENNS算法搜索范围的二维示意图,图中以中心线L为轴心的超圆柱面分别是方差为Vmin和Vmax的等方差超圆柱面,与中心线L垂直的超平面分别是均值为Mmax和Mmin的等均值超圆柱面。等均值等方差最近邻搜索算法将码字的搜索范围限制在超圆柱面V1, V2和超平面Ll,L2所夹的范围内,即图中的阴影区域。EENNS算法减少了码字搜索范围,从而可以提高码字搜索速度。EENNS算法具体步骤如下:
(A)预处理:计算并存储码书C中的均值和方差,按均值的大小对码书进行排序。
(B)在线处理:
Step l:计算输入矢量x的均值Mx和方差Vx,在已排序码书中找到均值与Mx 最 接近的码字 作为输入矢量X的初始匹配码字。计算当前最小失真 d min = d (x ,yp )。使集合
Step 2:如果集合G为空,转Step 7;
Step 3:往返搜索法搜索初始匹配码字yp两侧的码字yj;
Step 4:如果码字满足 或者 ,则执行
下列步骤的(a)或者(b)。否则,转步骤5;
(C)如果Myj> Mx,则从集合G中删除所有码字yi,i (D)否则,则从集合G中删除所有码字yi i>j,转Step2。
Step 5:判断码字Yi的方差是否满足 或者 如果 满足, 则从删除集合G中删除码字Yi,否则,转Step6;
Step 6:用部分失真排除算法搜索码字Yi,如果d(x, Yi) Step7:确定输入矢量x的最匹配码字为Yp。
3.3 码字索引分配算法
3.3.1 BSA算法
BSA算法是在1990年提出基于二元对称信道模型的码字索引分配算法【16】。该算法对于任何索引映射函数 ,选择码字y,作为输入矢量x的最近码字后将产生索引 的传输,该过程与首先将码书中的码字进行位置交换等价,即对每一索i,码字y最终移动到码书中索引为 的位置。
基于这个事实,很自然地想到一种最简单的码字索引分配方法:首先在给定码书基础上随机产生一个初始码字排列,然后将所有码字的排列位置以特定方式进行交换,使信道失真不断减少。因此,这种算法的输入是一个码书,输出仍是一个码书,只不过码字存放在不同的位置。这带来一个附加优点:除了存储码书所需的空间以外,不需要任何额外信息来详细描述索引映射函数n,从而不需要信道编码和信道解码。
BSA算法的主要思想是通过不断交换码字的位置,使得信道噪声失真的目标函数场获得局部最优值.随着交换的进行 不断下降,而且索引映射函数 也跟着不断变化。在每次迭代中,码字的交换对是按一定的顺序选择的。所有的码字y,都对应一个函数 ,用来描述当该码字的索引(在当前码书中)在噪声信道中传输时可能产生的失真,其定义为公式(3.21):
(3.21)
BSA算法每次按 从大到小的顺序对码字进行排序。拥有最大函数值 的码字被选为首先交换的候选对象。首先进行试验性的交换, 与其他每一个码字分别进行交换,并计算每次交换后 的下降值。选择能使 出现最大下降的那一个码字与 进行真正地交换,然后进入下一次迭代。如果不存在这样的码字,则对yi作相同的交换试验。如果每一个码字按这种方法与其他码字进行交换后。不再下降,则终止算法,从而获得一个局部最优的码字索引分配方案。算法的具体步骤如下:
Step 1:初始化。随机打乱码字的排序;
Step 2:整理排序。根据 从大到小的顺序对码字yi进行排序。令n=-1;
Step 3:试验性交换。令n=n+1从j=n+1到N一1,分别计算索引n和索弓!j交换后所能引起的失真减少量,比较这些失真减少量,获得最大的失真下降量 ;
Step 4:如果 >0,则交换索引n和引起最大失真下降的索引j,并转Step 2;
Step 5:终止算法。如果n=N一1,则终止算法,否则,转Step 3。
可以看出,BSA算法根据函数值 将码字进行排列而选择出哪一个码字最先进行交换,从而在运算上给出了一个方向性引导。如果由于程序运行时间的限制而使算法的迭代次数有限,则这种方向性引导将显得尤为重要。每一次成功交换的完成,代表一次迭代的结束。若一次迭代中的所有试验性交换产生的失真下降都不大于O,则说明算法已经达到一个局部最优解.应该指出的是:从不同的初始码字排序出发,可获得不同的局部最优解,从而保证BSA算法对于码字交换的限制不会影响它获得全局最优码字索引分配方案的可能性。实验证明,该算法获得的码字索引分配方案的失真比随机码字索引分配方案的失真有较大改进。
3.3.2 禁止搜索码字索引算法
禁止搜索的基本思想是通过一系列移动来搜寻所有可行解的搜索空间,并且在当前迭代中禁止某些搜索方向以避免死循环和跳入局部极小。由当前解到其邻域解的移动被部分地或完全地记录在禁止表中,目的是为了禁止以后迭代中的重复操作。
令 为测试解的集合,其中元素si可以被表示为式【8】(3.22):
(3.22)
其中,N为码书的尺寸,Si(j)表示在解si中分配给码字Yj的索引, 令 和 分别表示当前解和最优解。中码字Yj的索引,Sb(j)仍表示分配给解Sb中码字Yi的索引。
令 , 和 分别代表测试解组的目标函数值集合,当前解的目标函数值和最优解的目标函数值,其中 是测试解 的目标函数值,0 Step 1:设置禁止表大小Ts测试解个数N,以及迭代次数Im。令迭代计数器i=1,禁止表插入点t=1。随机产生当前解 ,计算其相应的目标函数值V}。令Sb=Sc以及Vb=Vc
Step 2:把当前解Sc拷贝给每一个测试解si, 0 Step 3:如果最优测试解的目标函数值比最优解的目标函数值Vb还小,则把它作为新的当前解,并令其目标函数值作为当前解的目标函数值Vc,转Step 3。否则,选出测试解中最好的非禁止解。如果能选到,则把它作为新的当前解Sc并令其目标函数值作为当前解的目标函数值Vc,转Step 3;否则,转Step 1。
Step 4: 如果vb>vc,令Sb=Sc,Vb=Vc,把从旧当前解到新当前解所交换过的索引插入禁止表中。禁止表的插入点设为ti=ti+1;如果ti>Ts,令ti=l,如果i

第四章 矢量量化算法的实现
4.1 需求分析与整体设计
4.1.1需求分析
随着数字技术的飞速发展,越来越多的信息(文本、图形、图像、动画、音频及视频影像等)采用数字化的形式存储、传输和检索。由于网络上的数据流量飞速增长,而且网络的带宽总是满足不了需求,数据压缩编码技术的迅猛发展,要求在尽量不损伤多媒体质量的情况下压缩数据量。
正是由于这种需求的存在,要求开发一套完整的数据压缩软件,利用矢量量化的数据压缩算法,能够调用BMP格式的图像,对载入的图像进行压缩并显示解压后的图像效果,能够选择路径保存解压后的图像实现SNR信噪比的计算,便于对压缩软件性能的评价。
4.1.2 整体设计
软件的设计在Eclipse开发工具下编译Java应用程序。利用Java语言的面向对象的特点,充分利用他的可封装性,重用性和多态性等特点,开发一整套完整的基于矢量量化数据压缩算法的压缩软件。
将这个数据压缩软件从整体上分五个模块来实现的。Bmp格式图像的调入和保存模块,图像矢量块的划分模块,初始码书生成模块,LBG量化模块,图像解压模块。如图4.1所示:

图4.1程序模块框图
软件界面的设计。在JAVA的运行环境下要实现基于矢量量化数据压缩算法对BMP格式的静止图像进行压缩与解压。软件界面的设计,在图像界面的左侧可以显示调入的图像,右侧显示图像信息。在浏览按钮上可以调入待压缩的图像,并且可以选择解压后的图像的保存位置。选择好解压图像后点击压缩按钮即可开始对图像进行矢量量化的压缩。最后显示压缩的结果,包括原始图像的大小,压缩后的大小,压缩比,压缩时间及PSNR值等信息。软件运行的初始界面如图4.2所示:

图4.2程序运行初始界面
4.2 矢量量化算法的实现过程及说明
4.2.1 初始码书的生成
这个程序利用了随机编码生成码书的方法,即根据输入信源分布直接从训练序列中随机选择N个训练矢量作为初始码字以构成初始码书。该方法的优点是计算量低,初始码书的生成较为容易。虽然可能出现码书的分布不均匀的现象,但是配合LBG算法的多次迭代可以得到补偿。需要注意,这里所说的随机编码是说初始码书的选择方式是随机的,而一旦码书选定,编码器的工作方式则是按着最近邻方式进行的。随机码书的生成代码如下:
codebook=new MyBlock[N];
for(int i=0;i { codebook[i]=new MyBlock();
} codebook[0]=tv.randomselect();
for(int j=1;j int t=0;
do{ t++;
n=0;
codebook[j]=tv.randomselect();
for(int l=0;l { if(codebook[j].vcmp(codebook[l])==0)
{ n=1; break; }
}
}while(n!=0&&t<100);}

4.2.2 LBG矢量量化

图4.2 LBG码书设计流程图

如图4.2所示的流程图,对随机生成初始码书,码书大小N,训练矢量序列,停止计算门限和起始平均失真的初始码书进行劳埃德迭代。用初始码书为已知的心形,把训练序列重新划分为N个胞腔。计算新的平均失真和相对失真,判断新的失真是否满足门限条件,如果满足则退出劳埃德迭代否则继续进行劳埃德迭代直到满足门限条件,生成码书。LBG算法的关键代码如下:
flag=0;//循环标识
tcb(s,tv);//训练集和码本建立关系
for(int i=0;i { for(int j=0;j {if(s[j]==i) n++;
yn[i]=n;
} }dsum=0;
for(int i=0;i {dsum=dsum+(long)min1(tv.train[i],1);
}d1=(double)(dsum/tv.M);
d=Math.abs(((double)(d0-d1)/(double)d1));
if(d1e)
{for(int i=0;i {if(yn[i]!=0)
{o=core(tv,i,s);
codebook[i].vcopy(o);
}d0=d1;
flag=1;
}while(flag==1);
在这段代码中,首先建立码本与训练矢量的关系,并经过多次的劳埃德迭代直到满足门限条件,生成新的码书。这里应用了LBG算法他具有如下的优点:
1.不用初始化计算,可大大减少计算时间
2.初始码字选自训练序列,无空胞腔问题
虽然LBG算法有如上的优点,但是他本身也存在一些缺点和不足的地方,比如在计算的过程中可能会选到一些非典型矢量作码字,因而该胞腔中只有很少矢量,甚至只有一个初始码字,而且每次迭代又都保留了这些非典型矢量的形心;还可能会造成在某些空间把胞腔分得过细,而有些空间分得太大。这些缺点都会导致码书中有限个码字得不到充分利用,还需要进一步的改进算法。
程序整体流程图如图4.3所示:

图4.3 软件流程图
4.2.3 矢量量化码字索引与恢复
在这个程序中没有考虑快速码字搜索的算法,应用了最佳码字搜索的方法,使输入矢量与所有的码字进行比较,选出距离最小的那个码字成为匹配码字,生成索引。这种算法虽然增加了计算量,但是减少了图像数据压缩过程中的失真。
在输出端,将编码过后生成的索引对照码书,将图像数据进行还原。
4.3 实验结果及评价
在初始界面点击浏览按钮调入.BMP图像。图像就会显示在程序运行初始界面的左侧,如图4.3所示:

图4.4 压缩前的程序界面
点击“压缩”按钮,程序就会自动进行矢量量化的压缩,下面的进度条会显示压缩的百分比,当进度达到100%时,程序就会将解压好的图像显示在程序界面的左侧。并显示一系列的压缩信息,包括压缩源文件的大小,压缩后的码本大小,压缩比,压缩过程所需要的时间以及峰信噪比PSNR等信息。压缩后的界面如图4.5所示:

图4.5 恢复后的程序界面
程序显示的压缩结果的压缩比和压缩时间上可以看出,这个利用矢量量化编码算法的压缩软件可以达到16:1的高压缩比,并且压缩时间比较短。所以矢量量化压缩编码是一种非常有效的压缩算法。
从压缩图像的效果来看,实验测试的图像均采用的512×512,8比特/象素的women图像作为训练图像产生各种大小的码书,矢量维数均为16,对压缩程序进行测试。通过变换码书的大小,运行程序得到不同的信噪比。测试结果如下表4.1所示:
表4.1 不同码书的信噪比
序号 码书大小 PSNR
1 64 27.36
2 128 27.74
3 256 28.54
4 512 29.28

如上表所示,随着码书的加大,系统的信噪比在升高,当码书大小为512时,PSNR可以达到29.28。图像虽然有一定程度上的失真,但是并不是十分明显,基本上保持了图像原有的图像质量。
这个程序采用的是矢量量化码书生成算法中的LBG算法,通过运行程序以及对运行结果的分析可以看出这种从标量量化劳埃德迭代操作推广出来的迭代算法具有以下两个优点:
1.不用初始化计算,可大大减少计算时间
2.初始码字选自训练序列,无空胞腔问题
虽然LBG算法在具有如上的优点,但是因为LBG算法是一种下降算法,每次迭代总能减少(至少保持不变)平均失真,而且每次迭代通常只能产生码书的局部变化,即每次迭代后,与旧码书相比,新码书不可能有非常大的变化。所以初始码书的选择影响码书训练的收敛速度和最终码书的性能,一旦选定初始码书,该算法只能得到局部最优的码书,即LBG算法一般不能得到全局最优的码书。
在每次迭代的最佳划分阶段,从码书中搜索训练矢量的最近码字需要大量的存储空间和繁琐的计算;这对软件大的运行要求比较高的运行环境。这个可以通过快速码字搜索的算法来解决这个问题。

第五章 结论与展望
本文主要针对矢量量化的算法和实现研究与探讨,本章主要对本文内容与研究工作进行一下总结。最后对矢量量化技术在今后发展方向上作了一些展望。
矢量量化技术作为数据压缩领域里的一个分支,主要优点是压缩比大以及解码简单,在图像压缩方面已经得到成功地应用。目前, 矢量量化技术的研究主要集中在三个方面:矢量量化器的码本设计,矢量量化码字快速搜索算法设计,矢量量化码字索引分配问题。本文主要研究了矢量量化码本设计算法和码字快速搜索算法,并讨论了矢量量化技术的应用问题。全文主要工作可以总结如下:
首先,介绍了数据压缩算法的基本理论和发展现状,讨论了数据压缩算法的分类体系和发展历程。
其次,介绍了矢量量化技术的来源和发展历程,重点介绍了关于矢量量化技术的技术基础和矢量量化算法中的关键技术。
再次,研究了经典的矢量量化的设计算法,分别研究讨论了矢量量化中的LBG算法,最大下降算法;快速搜索算法中的基于不等式的快速搜索算法和码字索引分配中的BSA算法等,并讨论了现有各种矢量量化算法。
最后,介绍了一种LBG矢量量化算法的实现方法,并对实验结果进行了性能评价。
以上是本文内容的总结。还有许多问题没有涉足或研究的深度不够。矢量量化技术领域虽然已经取得了长足的进步,但总体上来说还有许多问题需要进一步研究。下面对矢量量化未来发展的展望:
(1) 矢量量化是一种信源编码技术,在矢量量化器设计的过程中,考虑如何降低信道传输中可能造成的噪声干扰的影响,可以提高矢量量化系统的整体性能。归结起来,可以用矢量量化码书索引分配问题来描绘,即研究如何合理的安排码书中码字的排序,使得编码系统在信道传输中的容错能力增强。
(2) 矢量量化作为一种数据压缩技术,如何更好地应用到实际的数据压缩和传输系统中去,在实际应用中体现编码算法的优越性,是一个很实际的问题,在设计算法的同时,要考虑应用的实际情况。
(3) 本文中在图像的编码方面对矢量量化进行研究,矢量量化技术并不仅仅用在图像编码中,可以根据实际需要,可以深入对其进行深入研究,如可以在语音压缩编解码、音视频压缩和远程会议等方面,还可以将这些成果应用到其方面一数字水印、语音识别、语音合成以及文字合成以及文字的识别等。

参考文献
[1] 吴乐南. 数据压缩[M]. 北京:电子工业出版社,2000.3-8
[2] J.Y.Huang and P.M.Schultheiss.Block Quantization of Correlated Gaussian Random Variables[J].IEEE Transactions on Communication Systems,1963,11:289~296
[3] A.Gersho.Asymptotically Optimal Block Quantization.[J]IEEE Transactions on Information Theory.1979,25:373~380
[4] Y.Linde,A.Buzo and R.M.Gray. An Algorithm for Vector Quantizer Design[J]. IEEE Transactions on Communications. 1980,28(1):84~95
[6] 王志明. 微机屏幕图象实时传输的研究与实现[D]:[硕士学位论文] 北京:北京交通大学 2000
[7] 何小川. 图像通信[M]。西安:西安电子科技大学出版社 2005.47~69
[8] 孙圣和,陆哲明. 矢量量化技术及应用[M]。北京:科技出版社,2002 .31~307
[9] 郑巍. 基于矢量量化的图像压缩技术研究[D]: [硕士学位论文] 合肥:合肥工业大学 2003
[10] 傅祖芸. 信息论——基础理论与应用[M]. 北京:电子科技出版社,2001.8~15
[11] 戴善荣. 数据压缩[M]. 西安:西安电子科技大学出版社,2005.23~25
[12] C.D.Bei,and R.M.Gray.An Improvement of the Minimum Distortion Encoding Algorithm for Vector Quantization .IEEE Transactionson Communications
.1985,33(10):1132~1133
[13] 马勇,邵凌,徐海. 自适应补偿矢量量化[J]计算机工程与应用,2000,2: 7 1-74
[14] 陆哲明,潘正祥,孙圣和. 一种矢量量化码书搜索的快速算法[J]. 电子学报2000,28(2):133一13
[15] K,Zeger,A.Gersho.Pseudo-Gray Coding[J]. IEEE Transactionson Communications 1990,38(12):2147-2158

附录
附录一:程序清单

基于离散正交变换编码的数据压缩算法的研究与实现

Posted by 天际的荒草 | Posted in Docs | 文档 | Posted on 18-09-2009

标签:, ,

0

摘要 III
ABSTRACT IV
第一章 绪论 1
1.1 课题研究的目的和意义 1
1.2 课题的研究现状 2
1.3 课题的总体要求和规划 3
1.4 本章小结 4
第二章 数据压缩 5
2.1数据压缩的概述 5
2.1.1 数据压缩的概念 5
2.1.2 数据压缩的评价标准 6
2.2 图像压缩 6
2.3 本章小结 7
第三章 离散正交变换编码 8
3.1 概述 8
3.2 离散余弦变换编码 10
3.2.1 概述 10
3.2.2 算法 11
3.2.3 应用 12
3.3 离散正交变换编码的其它方法的算法 13
3.3.1 K-L变换 13
3.3.2 离散傅立叶变换 14
3.3.3 沃尔什—哈达玛变换(WHT) 15
3.3.4 几种离散正交变换编码算法的比较 16
3.3.5 几种离散正交变换编码算法的编程实现 17
3.4 本章小结 20
第四章 系统的设计及其实现 21
4.1 设计思路及其系统构架 21
4.1.1 总体设计 21
4.1.2 详细设计 22
4.1.3 系统流程图 25
4.2 系统的实现 25
4.2.1 系统的具体实现 25
4.2.2 系统的调试过程 27
4.2.3 调试结果的分析 30
4.3 本章小结 30
总结 31
参考文献 32
致谢 33
附录 34

摘要
数据压缩已经成为信息时代必不可少的一项技术。正交变换技术已在数字信号的各个领域中得到了多方面的应用,尤其在数据压缩压缩领域。
论文首先讲述了数据压缩的目的和意义,以及它的发展现状。介绍了数据压缩的基本概念,对数据压缩的方法、技术标准和评价方法进行了分析和研究。然后介绍了图像压缩的有关知识,讲述了离散正交变换的几种方法。对基于离散正交变换编码的几种方法的算法进行了研究和比较,并用MATLAB进行了实现,在实践中对这几种算法进行了分析和比较。
研究表明,选择基于离散余弦变换编码的数据压缩算法来进行图像压缩时的性能比较好。因此选用了基于离散余弦变换的数据压缩的算法来进行bmp图像文件的压缩。软件是在Visual C++ 6.0环境下设计和实现的。先读入bmp文件,对它进行DCT变换,量化和编码,就得到压缩后的图像。
关键词: 数据压缩,离散正交变换编码,离散余弦变换编码

ABSTRACT
Data compression has been a technique of indispensability in times of information. Quartered transform technique has been applied in many fields of digital signal especially in the field of data compression.
First of all, it narrates the purpose and significance of data compression. It introduces the status of its development. Here presents the basic conception of data compression. It researches and analyzes the methods, technique standard and estimate methods of data compression coding. Then it tells the knowledge of image compression. It introduces some methods of discrete quartered transform. It researches and compares the algorithms of some methods of discrete quartered transform. It achieves in the MATLAB. It analyzes and compares the algorithms in practice.
It researches that it’s better to choose the algorithm based on discrete cosine transform coding in the image compression. So I choose the algorithm of data compression based on discrete cosine transform coding to compress bmp image. Software is designed and implemented in the environment of Visual C++ 6.0. First of all, it reads the bmp image, then it makes the discrete cosine transform, quantization and coding, then we get the compressed image.
KEY WORDS data compress, discrete quartered transform coding, discrete cosine transform coding

第一章 绪论
1.1 课题研究的目的和意义
21世纪,被称为信息时代,数据压缩技术已经不知不觉的进入了人们的日常生活,与人们的物质文化生活息息相关。打开电脑,接通手机,或者看电视,看VCD、DVD…,都有数据压缩技术在为我们服务着。数据压缩也是现代社会信息处理的基础课题之一数据压缩是通过减少计算机中所存储数据或者通信传播中数据的冗余度,达到增大数据密度,最终使数据的存储空间减少的技术 。
因为现在数据压缩的很多技术已经比较成熟,加上硬器件技术的深入发展,以至于有人认为已经没有继续研究的必要性。但现代信息爆炸,全球网络的兴起,以及多媒体技术的全面发展,各种高新技术不断涌现,使人们对信息的数量和质量的要求越来越高。由于人类的愿望没有止境,基于图形/图象、声音的信息越来越多,加上很多领域对实时性的要求,人们对处理这些信息所占的时间和空间日益不能忍受,这就要求人们为更好、更快地处理多媒体信息开发出更好、更实用的数据压缩方法来。尤其在图像领域,图像信息的数量是非常庞大的。例如,地球资源卫星的一张图像就要2340×3240×7×4 212Mbit。卫星每天要获得很多这样的图片,如果不压缩直接传到地球是非常费时的。又如,一张A4(210mm×297mm)幅面的图片,若用中等分辨率(300dpi)的扫描仪指真彩扫描,其数据量为:(300×210 25.4)×(300×297 25.4)×3 26MB,这也不是一个小数目。大数据量的图像信息会给存储器的存储容量、通信干线信道的带宽,以及计算机的处理速度增加极大的压力。单纯靠增加存储容量,提高信道带宽以及计算机的处理速度等方法来解决这个问题是跟不上要求的,因此就需要对图像进行压缩处理。图形数据压缩的可能性是因为图像中像素之间,行或帧之间都存在着较强的相关性,从统计观点看,压缩就是指信息冗余。即,保留不确定的信息,去除确定的信息,也就是用一种更接近的信息本质的描述来代替原有冗余的描述 。数据压缩的目的是节省图像压缩空间,减少传输信道的容量,缩短图像加工处理时间。所以在信息时代数据压缩技术必不可少。
众所周知,原始数字图像在计算机中会占用大量的存储空间。例如,一副1024*1024的24位真彩色图像要占用3MB存储空间,这对许多需要大量存储视频图像信息的应用领域会造成很大困难。因而图像压缩算法,特别是解压缩算法,对于许多以图像数据位基础的应用场合具有非常重要的意义。
数字图像传输是图像编码与压缩技术的另一个重要应用领域。随着现代社会对通信业务要求的不断增长,图像通信和通信网容量的矛盾日益突出。特别是具有庞大数据量的数字图像信息更是难以传输和存储,极大地制约了图像通信的发展,已经成为图像通信发展中的瓶颈。图像压缩技术的应用为传真、视频点播、电视会议、医用图像传输等领域带来了巨大经济效益。快速压缩解压缩算法及其硬件结构在实时视频系统中起着关键的作用。

1.2 课题的研究现状
科学家在研究中发现,大多数信息的表达都存在着一定的冗余度,通过采用一定的模型和编码方法,可以降低这种冗余度。贝尔实验室的 Claude Shannon 和 MIT 的 R.M.Fano 几乎同时提出了最早的对符号进行有效编码从而实现数据压缩的 Shannon-Fano 编码方法。
D.A.Huffman 于 1952 年第一次发表了他的论文“最小冗余度代码的构造方法”(A Method for the Construction of Minimum Redundancy Codes)。从此,数据压缩开始在商业程序中实现并被应用在许多技术领域。 60 年代、70 年代乃至 80 年代的早期,数据压缩领域几乎一直被 Huffman 编码及其分支所垄断。
80 年代,数学家们不满足于 Huffman 编码中的某些致命弱点,他们从新的角度入手,遵循 Huffman 编码的主导思想,设计出另一种更为精确,更能接近信息论中“熵”极限的编码方法——算术编码。凭借算术编码的精妙设计和卓越表现,人们终于可以向着数据压缩的极限前进了。可以证明,算术编码得到的压缩效果可以最大地减小信息的冗余度,用最少量的符号精确表达原始信息内容。当然,算术编码同时也给程序员和计算机带来了新的挑战:要实现和运行算术编码,需要更为艰苦的编程劳动和更加快速的计算机系统。也就是说,在同样的计算机系统上,算术编码虽然可以得到最好的压缩效果,但却要消耗也许几十倍的计算时间。
1977 年,数据压缩的研究工作主要集中于熵、字符和单词频率以及统计模型等方面,研究者们一直在绞尽脑汁为使用 Huffman 编码的程序找出更快、更好的改进方法。以色列人 Jacob Ziv 和 Abraham Lempel 发表了论文“顺序数据压缩的一个通用算法”(A Universal Algorithm for Sequential Data Compression)。
1978 年,他们发表了该论文的续篇“通过可变比率编码的独立序列的压缩”(Compression of Individual Sequences via Variable-Rate Coding)。在这两篇论文中提出的两个压缩技术被称为 LZ77 和 LZ78 。简单地说,这两种压缩方法的思路完全不同于从 Shannon 到 Huffman 到算术压缩的传统思路。人们将基于这一思路的编码方法称作“字典”式编码。字典式编码不但在压缩效果上大大超过了 Huffman,而且,对于好的实现,其压缩和解压缩的速度也异常惊人。1984 年,Terry Welch 发表了名为“高性能数据压缩技术”(A Technique for High-Performance Data Compression)的论文,描述了他在 Sperry Research Center(现在是 Unisys 的一部分)的研究成果。他实现了 LZ78 算法的一个变种 — LZW。LZW 继承了 LZ77 和 LZ78 压缩效果好、速度快的优点,而且在算法描述上更容易被人们接受(有的研究者认为是由于 Welch 的论文比 Ziv 和 Lempel 的更容易理解),实现也比较简单。不久,UNIX 上出现了使用 LZW 算法的 Compress 程序,该程序性能优良,并有高水平的文档,很快成为了 UNIX 世界的压缩程序标准。
正交变换图像编码始于1968年。当时H.C.Andrews等人基于大多数自然图像的高频分量相对幅度可能较低,可完全舍弃或者只用少数码字编码而失真不大的认识,提出不对图像本身编码,而对其二维离散傅立叶系数进行编码和传输,但这是一种复变换,运算量大,不易实时处理。
1969年他们用Walsh-Hadamard变换(WHT)变换取代DFT,可使计算量明显减少。此后,又出现了更快的Haar变换(HRT)、以及能匹配图像亮度线性变化的斜变换(SLT)等。
1974年,N.Ahmed等人提出了离散余弦变换(DCT),DCT常常被认为是图像信号的准最佳变换。DCT是一种空间变换,DCT变换的最大特点是对于一般的图像都能够将像块的能量集中于少数低频DCT系数上,这样就可能只编码和传输少数系数而不严重影响图像质量 。DCT不能直接对图像产生压缩作用,但对图像的能量具有很好的集中效果,为压缩打下了基础。例如:一帧图像内容以不同的亮度和色度像素分布体现出来,而这些像素的分布依图像内容而变,毫无规律可言。但是通过离散余弦变换(DCT),像素分布就有了规律。代表低频成份的量分布于左上角,而越高频率成份越向右下角分布。然后根据人眼视觉特性,去掉一些不影响图像基本内容的细节(高频分量),从而达到压缩码率加大的目的。离散余弦变换与其他方式结合进行压缩编码,已广泛应用于各种图像压缩编码标准中。

1.3 课题的总体要求和规划
本课题的总体要求如下:
1. 对数据压缩的基本理论、技术标准、评价方法进行研究和分析;
2. 对基于离散正交变换编码的数据压缩算法及其衍生算法进行逻辑上的分析和比较;
3. 对这些算法进行编程实现,并在实践中进行分析比较;
4. 从这些算法中选择一个较优算法,并以此算法实现一个完整的压缩软件。
规划如下:
根据课题的总体要求,介绍一下数据压缩的基本理论、它的技术标准和评价方法。离散正交变换编码的方法很多,有离散傅立叶变换(Discrete Fourier Transform,简称DFT)、离散余弦变换(Discrete Cosine Transform,简称DCT)、沃尔什—哈达玛变换(Walsh—Hadamard Transform,简称WHT)、Karhunen—Loeve变换(KL变换)。对这些方法的算法进行逻辑上的分析和比较。再对这些方法进行编程实现,并在实践中进行分析和比较。从这些算法中选择基于离散余弦变换编码的算法来实现数据压缩的一个完整的压缩软件。这个压缩软件是对静止图像进行压缩的,输入一个bmp格式的图片,经过这个软件的压缩就得到一个压缩后的图片。

1.4 本章小结
本论文的课题是基于离散正交变换编码的数据压缩算法的研究与实现。本章介绍了课题研究的目的和意义,以及课题的发展现状。最后介绍了这个课题的总体要求和规划。从大致上说明了论文的格式。

第二章 数据压缩
2.1数据压缩的概述
2.1.1 数据压缩的概念
所谓数据压缩,就是以最少的数码表示信源所发的信号,以减少容纳给定消息集合或数据采样集合的信号空间 。信号空间,是指物理空间、时间区间、与电磁频谱区间,也就是为存储、传输给定信号集合所占用的空域、时域与频域空间。存储空间的减小意味着传输效率的提高和占用频带的节省 。也可以说数据压缩就是将字符串的一种表示方式转换为另一种表示方式,新的表示方式包含相同的信息量,但是长度比原来的方式尽可能的短。
数据压缩的种类很多,并没有统一。但数据压缩有一般的方法,所谓“数据”,是指信源所发信号的数字化表示或记录 。数据压缩则是一更少的数码来表式原始数据。因此任何的压缩方法都可以抽象以下三个主要步骤。
1.建立一个数学模型,以便能够更紧凑的更有效地重新表达规律性比那么明显的原始数据;
2.设法更简洁地表达利用该模型对原始建模所得到的模型参数。
3.对模型参数的量化表示或消息流进行码字分配,以得到尽可能紧凑的压缩码流。此时的编码要求能“忠实”地再现模型参数的量化符号,故称之为熵编码。
根据解码后数据与原始数据是否完全一致进行分类,数据压缩方法一般划分为两类:
无损压缩:解码图像与原始图像严格相同。压缩比大约在 2:1~5:1之间。如Huffman编码、算术编码、行程长度编码等。
有损压缩:还原图像与原始图像存在一定的误差,但视觉效果一般可以接受, 压缩比可以从几倍到上百倍。如脉冲编码调制 PCM、预测编码、变换编码(主要是离散余弦变换方法)、插值和外推法(空域亚采样、时域亚采样、自适应)等等。新一代的数据压缩方法,如矢量量化和子带编码、基于模型的压缩。分形压缩和小波变换压缩等等。
2. 根据数据压缩的原理进行划分,可以有以下几类:
预测编码: 它是利用空间中相邻数据的相关性,利用过去和现在出现过的点数据情况来预测未来点的数据。通常用的方法是差分脉冲编码调制DPCM和自适应差分脉冲编码调制ADPCM。
变换编码: 该方法将图像光强矩阵(时域信号)变换到频域空间上进行处理 。在时域空间上具有强相关的信号,反映在频域上是某些特定的区域内能量常常被集中在一起,我们只需将主要注意力放在相对小的区域上,从而实现压缩。一般采用正交变换, 如离散余弦变换DCT、离散傅立叶变换 DFT、Walsh-Hadamard变换WHT和小波变换WT,来实现压缩算法。
量化编码: (向量量化)对模拟信号进行数字化时,要经历一个量化的过程。为了使整体量化失真最小,就必须依照统计的概率分布设计最优的量化器。最优量化器一般是非线性的,已知最优量化器是 Max量化器。我们对像元点进行量化时, 除了每次仅量化一个点的做法外,也可以考虑一次量化多个点的做法,这种方法称为向量量化。例如我们每次量化相邻的两个点,将两个点用一个量化码字表示。向量量化的数据压缩能力实际上与预测方法相近。
统计编码: (信息熵编码)是根据信息熵原理,让出现概率大的符号用短的码字表达, 反之用长的码字表示。最常见的方法如 Huffman 编码、Shannon 编码以及算术编码。
子带编码: (子带sub band)将图像数据变换到频域后, 按频域分带, 然后用不同的量化器进行量化,从而达到最优的组合。或者分步渐近编码,在初始时,对某一频带的信号进行解码,然后逐渐扩展到所有频带。随着解码数据的增加,解码图像也逐渐变得清晰。
模型编码: 编码时首先将图像中的边界、轮廓、纹理等结构特征找出来, 然后保存这些参数信息。解码时根据结构和参数信息进行合成,恢复原图像。具体方法有轮廓编码、域分割编码、分析合成编码、识别合成编码、基于知识的编码和分形编码等。
2.1.2 数据压缩的评价标准
数据压缩的评价标准:从实际应用来说,数据压缩可从两方面来衡量:数据压缩速度和数据压缩率。当数据压缩应用于网络传输时,主要考虑速度快慢;当数据压缩应用于数据存储中,主要考虑压缩率,即压缩后数据的大小。当然这两方面是相辅相成的。常用的评价标准有冗余度、平均源信息长度、压缩率压缩所需的软硬件开销,还原效果等。对于一种编码方式是否为较好的编码,主要看该编码的冗余度是否最小。

2.2 图像压缩
图象压缩是关于用最少的数据量来表示尽可能多的原图象的信息的一个过程 。
压缩编码的方法有很多,主要分成以下四大类:(1)象素编码;(2)预测编码;(3)变换编码;(4)其它方法。
所谓象素编码是指,编码时对每个象素单独处理,不考虑象素之间的相关性。在象素编码中常用的几种方法有:(1)脉冲编码调制(Pulse Code Modulation,简称PCM);(2)熵编码(Entropy Coding);(3)行程编码(Run Length Coding);(4)位平面编码(Bit Plane Coding)。其中我们要介绍的是熵编码中的哈夫曼(Huffman)编码和行程编码(以读取.PCX文件为例)。
所谓预测编码是指,去除相邻象素之间的相关性和冗余性,只对新的信息进行编码。举个简单的例子,因为象素的灰度是连续的,所以在一片区域中,相邻象素之间灰度值的差别可能很小。如果我们只记录第一个象素的灰度,其它象素的灰度都用它与前一个象素灰度之差来表示,就能起到压缩的目的。如248,2,1,0,1,3,实际上这6个象素的灰度是248,250,251,251,252,255。表示250需要8个比特,而表示2只需要两个比特,这样就实现了压缩。
常用的预测编码有:Δ调制(Delta Modulation,简称DM),微分预测编码(Differential Pulse Code Modulation,DPCM),具体的细节在此就不详述了。
所谓变换编码是指,将给定的图象变换到另一个数据域(如频域)上,使得大量的信息能用较少的数据来表示,从而达到压缩的目的 。变换编码有很多,如(1)离散傅立叶变换(Discrete Fourier Transform,简称DFT);(2)离散余弦变换(Discrete Cosine Transform,简称DCT);(3)离散哈达玛变换(Discrete Hadamard Transform,简称DHT)。(4)小波变换(Wavelet Transform,简称WT)。
其它的编码方法也有很多,如混合编码(Hybrid Coding)、矢量量化(Vector .0Quantize,VQ) 、LZW算法。

2.3 本章小结
本章介绍了数据压缩的基本概念,数据压缩的分类。数据压缩有很多种分类方法,本章主要介绍了两种,一种是根据解码后数据与原始数据是否完全一致进行分类,另一种是根据数据压缩的原理进行分类。接着介绍了数据压缩的评价标准。最后介绍了有关图像压缩方面的知识。

第三章 离散正交变换编码
3.1概述
变换域编码就是将通常在时间域描写的信号(如语言信号)或空域描写的信号(如图像信号),变换到另外的一些正交矢量空间(即变换域)中进行描写,并使变换域中描写的各信号分量之间的相关性很小或互不相关 。
离散正交变换编码有很多,如(1)离散傅立叶变换(Discrete Fourier Transform,简称DFT);(2)离散余弦变换(Discrete Cosine Transform,简称DCT);(3)沃尔什—哈达玛变换(Walsh—Hadamard Transform,简称WHT);(4)KL变换。
一般说,在变换域中描述要比在空间域中简单,而且图像的相关性明显下降。正交变换改变了图像数据的表现形式,本身能够实现编码率的压缩,若再对变换域图像进行处理,以及熵编码,可进一步压缩图像的编码比特率。变换编码还一般结合采用统计编码和视觉心理编码。
变换编码通过正交变换将原始信号中的各个样值从一个域变换到另一个域,然后针对变换后的数据再进行量化(二次量化)与编码操作。接收端首先对收到的信号进行解码和反量化,然后再通过反变换来恢复原来信号(在一定保真度下)。映射变换的关键在于能够产生一系列更加有效的系数,对这些系数进行编码所需总比特数要比对原始数据直接编码所需的总比特数少得多。之所以变换后得到的系数更有效是因为,通过正交变换,使变换后的数据点之间独立性增大,从而减小编码数据量。如对一个正弦信号,可以通过对其波形采样数据进行描述,也可以通过振幅、频率、初相角“三要素”来描述,但波形数据相互之间相关性高,所以采用波形表述所用比特数多,而振幅、频率、初相角三个量之间相互独立,以使用很少的比特数来表述。
正交变换压缩编码的几何意义与实质 :
假定把一个 像素的子图像看成为 维坐标系中的一个坐标点,也就是说,在这个坐标系中的何一个坐标点对应于 个像素,这个坐标点数值是其对应的 个像素的亮度结合。以相邻两个像素构成的子图为例,若取样值采用3位编码(每个样本有 =8个幅度等级),则两个相邻数据样本 与 的联合事件,共有8 X 8=64种可能性,可用图3.1的二维(2D)平面坐标表示。其中 轴与 轴分别表示相邻两样木可能的幅度等级。由于信号变化缓慢, 与 同时一出现相近幅度等级的可能性较大,故图3.1阴影区内45度斜线( = )附近的联合事件出现的概率也就较大。不妨将此阴影区之边界称为相关圈;信源的相关性越强,相关圈就越加扁长, 与 ,呈现出紧密的关联特性,此时欲编码圈内各点的位置,就要对两个差不多大的坐标值分别进行编码;信源的相关性越弱,此相关圈就越加“方圆”,说明 处于某一幅度等级时, 可能出现在不相同的任意幅度等级上。对信源相关性强的情况,可以看出,虽然 , 的幅值都很大,也就是说都需要用比较多的比特数,但有些组合情况是不会出现或出现可能性极小的(比如 =0, =7; =1, =7;; =7, =0等情况)。也就是说这种比特分配是不经济的,但在这样的坐标系下是没有办法的。

图3.1 正交变换的几何意义
数据压缩的策略就是使那些信号出现概率为0或很小的位置分配尽量少或不分配量化因子;而对信号出现概率高的位置,分配多的量化因子。对应图3.1所述情况就是需要找到一种方法来重新分配量化比特。
可以采用下述方法:对该数据对进行正交变换,从几何上相当于把图3.1所示的( , )坐标系旋转45度,变成( , )坐标系。那么此时该相关圈正好处在 坐标轴上下,且该圈越扁长,它在 上的投影就越大,而在 上的投影则越小。因而从 , 坐标来看,任凭 在较大范围内变化,而 却基本不动或仅仅微动。这就意味着变量 和 之间的联系,在统计上更加相互独立。因此,通过这种坐标系的旋转变换,就能得到一组去
除掉大部分甚至全部统计相关性的另一种输出样本。而样本方差也将重新分布;在原坐标系中两相邻样本常具有相同的方差。 ;但在新坐标系中却有 ,表明样本能量向 轴相对地集中了。虽然样本的方差总和并未因坐标旋转而变,即保持 ,变换后各坐标轴上方差的这种不均匀分布,为数据的重新量化和比特分配创造了条件,因此有利于压缩编码。比如,如图所示按原始的量化方法,对 , 都要进行8级量化,则所需比特数为6bits ;而经过正交变换以后,只在 方向进行8级量化(或更多级量化),而在 方向进行3级或4级量化就可以了,这样所需比特数为4或5bits。
由此可知,图像正交变换实现数据压缩的本质在于经过多维坐标系中的适当的坐标旋转和变换,能够把散布在各个坐标轴上的原始图像数据,在新的坐标系中,集中到少数坐标轴上,这样可以采用较少的编码比特来表示一幅子图像,实现压缩编码。
正交变换编码特性评价:
1)残余相关准则:变换域内变换系数具有的相关性称之为残余相关性,已代表经过正交变换后,帧内图像相关性被削弱的程度。如果变换方法及有关参数选择恰当则变换系数矩阵所对应的相关系数会很小,原图像的相关性得到充分的消除,冗余度得到很好的压缩。
2>均方差准则:图像 经过变换后,编码单个对变换系数进行编码,接收端对 作逆变换,得到 。 与 之间的均方误差作为准则,在允许失真度下进行编码。
3)主观评价准则:人眼对图像失真的感受和均方误差不完全一致,主观评价以人的眼睛感觉来作为评价指标。

3.2 离散余弦变换编码
3.2.1 概述
离散余弦变换(DCT for Discrete Cosine Transform)是图像压缩处理中应用较多的一种变换。它利用傅立叶变换的对称性,采用图像边界折叠操作将图像变换为偶函数形式,然后对这样的图像进行二维傅立叶变换,变换的结果将仅包含余弦项,故称为离散余弦变换。离散余弦变换(DCT)可以将图像描述为不同幅值和频率的正弦之和的形式,定义为:
(3.1)

其中, 称为图像变换的DCT系数。
DCT是先将整体图像分成N×N像素块,然后对N×N像素块逐一进行DCT变换。由于大多数图像的高频分量较小,相应于图像高频成分的系数经常为零,加上人眼对高频成分的失真不太敏感,所以可用更粗的量化,因此传送变换系数所用的数码率要大大小于传送图像像素所用的数码率。到达接收端后再通过反离散余弦变换回到样值,虽然会有一定的失真 ,但人眼是可以接受的。
N代表像素数,一般N=8,8×8的二维数据块经DCT后变成8×8个变换系数,这些系数都有明确的物理意义:U代表水平像素号,V代表垂直像素号。如当U=0,V=0时,F(0,0)是原 64个样值的平均,相当于直流分量,随着U、V值增加,相应系数分别代表逐步增加的水平空间频率分量和垂直空间频率分量的大小。
由图3.2可见图像信号被分解成为直流成分;以及从低频到高频的各种余弦成分;而DCT系数只是表示了该种成分所占原图像信号的份额大小;显然,恢复图像信息可以表示为这样一个矩阵形式:F(n)=C(n)*E(n)
  式中E(n)是一个基底 ,C(n)是DCT系数,F(n)则是图像信号。

图 3.2 DCT在图像压缩中的应用图
如果再考虑垂直方向上的变化,那么,就需要一个二维的基底,即该基底不仅要反映水平方向频率的变化,而且要反映垂直空间频率的变化。对应于8*8的像素块,其空间基底如图3.3所示:它是由64个像素值所组成的图像,通常也称之为基本图像。

图 3.3 8×8像素块的空间基底
3.2.2 算法
DCT变换的快速算法有以下两种方式:
1. 由于FFT算法的普便采用,直接利用FFT来实现DCT变换的快速算法相比来说就相对容易。但是此种方法也有不足:计算过程会涉及到复数的运算。由于DCT变换前后的数据都是实数,计算过程中引入复数,而一对复数的加法相当于两对实数的加法,一对复数的乘法相当于四对实数的乘法和两对实数的加法,显然是增加了运算量,也给硬件存储提出了更高的要求。
2.直接在实数域进行DCT快速变换。显然,这种方法相比于前一种而言,计算量和硬件要求都要优于前者。在1988年有人提出了一种快速算法叫AAN,它也是将二维的DCT分解成一维的形式,但是二维计算量已减少到只有600来次了,JPEG和MPEG编码中的DCT就是使用AAN算法实现的。 DCT还有一个缺点,就是不能无损变换,因为DCT系数都是一些无理数,目前为止,依然无法解决。
首先让我们来看看AAN算法的第一阶级变换代码:
For I = 0 To 3
J = 7 – I
Y(I) = X(I) + X(J)
Y(J) = X(I) – X(J)
Next I
设X={10,20,30,40,50,60,70,80}
那么Y={90,90,90,90,-10,-30,-50,-70}
可以看出,这一阶级的低频部分(相加得出的数据)全部相等,而高频部分则呈线性或者是有规律的。DCT 之所以能以较少的数据大致还原图像,就是因为通过预测高频部分而达到的。那么为何高频部分可以预测呢?请仔细看上面的代码,可以看出DCT 是由外到内来进行处理的,由于像素与像素间有一定的关联性,所以靠的越近的像素之间的差就应该越小,越远就应该越大,但也并不是说所有的数据都具有这种规律,因此DCT 预测出来的高频数据就会和原高频数据不大相同,它们之间的差便是第二节提出的修正数据。第二阶级变换则是在第一阶级变换的基础上再次分解出低、高频,和预测高频,得出修正值。第三阶级……。最后,再将DCT系数按照重要程度由大到小,由左到右,重排列即可。
例:X={10, 20, 30, 40, 50, 60, 70, 80}
经过DCT后:Y={127,-64,0,-7,-0,-2,0,-1}
其中127是最最重要的,而-64次之,以此类推。可以发现,-7,-2,-1的能量都很小,说明这三个修正值可以忽略,当忽略后,
得Y={127,-64,0,0,0,0,0,0}
经过IDCT后:X={ 14, 18, 27, 39, 51, 63, 72,76}
这与原始数据:X={10, 20, 30, 40, 50, 60, 70, 80}
是非常接近的,肉眼很难发觉。
3.2.3 应用
离散余弦变换,经常用于对信号和图像(包括静止图像和运动图像)进行有损数据压缩。这是由于离散余弦变换具有很强的”能量集中”特性:大多数的自然信号(包括声音和图像)的能量都集中在离散余弦变换后的低频部分,而且当信号具有接近马尔科夫过程(Markov processes)的统计特性时,离散余弦变换的去相关性接近于K-L变换(Karhunen-Loève 变换–它具有最优的去相关性)的性能。DCT在数据压缩中仅仅起到辅助的作用,给它n个数据,经变换后仍然会得出n个数据。DCT只不过消除了这n个数据的冗余性和相关性, 即用很少的数据就能大致还原出这n个数据,其他的一些DCT系数只起到修正的作用,可有可无。
例如,在静止图像编码标准JPEG中,在运动图像编码标准MJPEG和MPEG的各个标准中都使用了离散余弦变换。在这些标准制中都使用了二维的离散余弦变换,并将结果进行量化之后进行熵编码。这时离散余弦变换中的N通常是8,并用该公式对每个8×8块的每行进行变换,然后每列进行变换。得到的是一个8×8的变换系数矩阵。其中(0,0)位置的元素就是直流分量,矩阵中的其他元素根据其位置表示不同频率的交流分类。MPEG文件中的视频信息是存储于频域而非空间域(即我们看到的图象)中的。信息通过这种方式得到压缩从而减少了信道中传播的信息量。MPEG通过离散余弦变换DCT(Discrete Cosine Transform)把空间域的信息变换到频域的信息。从MPEG流中提取出空间域的信息时,我们需要使用反离散余弦变换(IDCT)来抵消编码时做的离散余弦变换。

3.3 离散正交变换编码的其它方法的算法
在这一小节中,研究一下离散正交变换编码的其它方法的算法,并且比较一下它们的性能。
3.3.1 K-L变换
对于一个离散信号序列,若每一个信号有n个样点组成,那么就可以将该信号视作一个n维信号空间矢量信号的一个分量,记作 。向量X的斜方差矩阵可表示为
(3.2)
其中定义 。显然, 是一个是对称矩阵。它反映了信号X个分量之间的相关性。若个分量之间互不相关,则只有对角线元素不为0,且它代表了个分量方差,即能量。
由式(3.2)可知,比存在一个与协方差矩阵 相对应的正交矩阵Q,它的行矢量就是 的特征矢量的转置。
用正交矩阵Q对信号X作正交变换得
(3.3)
这个变换的基本思想是由Karhunen与Loeve分别提出来得,故称为K-L变换。Q为K-L变换矩阵。
K-L变换有如下的性质:
1.去相关性
K-L变换是变换后的矢量信号Y的个分量互不相关。
2.能量集中特性
对n维矢量信号进行K-L变换后,最大的方差将集中在前m个分量之中。
3.最佳性
K-L变换是在均方误差测量下,失真最小的一种变换。其失真量为被略去各分量的方差之和。
4.尚无快速算法
至今尚无K-L变换的快速算法,且变换矩阵随不同的数据集而不同。K-L变换在图像编码中的应用:
图像数据通常由被称作像素的灰度级组成L×L阶矩阵给出,而K-L变换却是一维变换。为了适应一维变换的形式,也要将图像数据变成一维矢量的形式。变换方法之一是将图像数据一行接一行连接成一个长的矢量形式。
在数据压缩方面最佳的变换是K-L 变换,但实际系统中一般不用它。原因有两点:
1. KLT 得到的基与输入数据相关,意味着除了需要把系数传给解码器,还需要把基传给解码器。而且每个分块的基往往是不同的!这使得压缩效果大打折扣。
2. KLT 需要计算协方差矩阵的特征向量,计算量相当大。DFT、WHT、DCT 的基是固定的,与输入无关。在与输入无关的各种变换中,非正弦变换(如WHT)最容易实现。
3.3.2 离散傅立叶变换
离散傅立叶变换其实质是有限长序列傅立叶变换的有限点离散采样,从而开辟了频域离散化的道路,使数字信号处理可以在频域采用数字运算的方法进行,这样就大大增加了数字信号处理的灵活性 。更重要的是离散傅立叶变换有多种快速算法,从而使信号的实时处理和设备的简化得以实现。
DFT之所以能用于数据压缩,是基于这样的事实:实际信号的傅里叶变换系数 总是随着k的增加而衰减。或者说,大部分信息量集中在低频区。因而可将k大于某一数值的系数略去而不影响信号的原有信息,从而达到了压缩目的 。
快速傅立叶变换(FFT)是离散傅立叶变换的快速算法,它是根据离散傅立叶变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。它对傅立叶变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。
设x(n)为 项的复数序列,由DFT变换,任一X(m)的计算都需要 次复数乘法和 -1次复数加法,而一次复数乘法等于四次实数乘法和两次实数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和一次复数加法定义成一次“运算”(四次实数乘法和四次实数加法),那么求出 项复数序列的X(m),即 点DFT变换大约就需要 次运算。当 =1024点甚至更多的时候,需要 =1048576次运算,在FFT中,利用 的周期性和对称性,把一个 项序列(设 =2k,k为正整数),分为两个 /2项的子序列,每个 /2点DFT变换需要 次运算,再用 次运算把两个 /2点的DFT变换组合成一个 点的DFT变换。这样变换以后,总的运算次数就变成 + = 。继续上面的例子, =1024时,总的运算次数就变成了525312次,节省了大约50%的运算量。而如果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的DFT运算单元,那么 点的DFT变换就只需要 次的运算, 在1024点时,运算量仅有10240次,是先前的直接算法的1%,点数越多,运算量的节约就越大,这就是FFT的优越性。
3.3.3 沃尔什—哈达玛变换(WHT)
沃尔什函数是1923年由美国数学家沃尔什提出的。沃尔什函数系是一个完备正交函数系,其值只能取+1和-1。从排列次序上可将沃尔什函数分为三种定义方法:一种是按照沃尔什排列来定义(按列率排序);另一种是按照佩利排列来定义(按自然排序);第三种是按照哈达玛排列来定义 。由于哈达玛排序的沃尔什函数是由2n(n=0,1,2,…)阶哈达玛矩阵(Hadamard Matrix)得到的,而哈达玛矩阵的最大优点在于它具有简单的递推关系, 即高阶矩阵可用两个低阶矩阵的克罗内克积求得,因此介绍一下哈达玛排列定义的沃尔什变换。
(n=0, 1, 2, …)阶哈达玛矩阵每一行的符号变化规律对应于某一个沃尔什函数的符号变化规律,即 (n=0, 1, 2, …)阶哈达玛矩阵的每一行对应于一个离散沃尔什函数,哈达玛矩阵与沃尔什函数系不同之处仅仅是行的次序不同。
一维离散沃尔什变换定义为
(3.4)

一维离散沃尔什逆变换定义为
(3.5)

式中,Walsh(u, x)为沃尔什函数。若将Walsh(u, x)用哈达玛矩阵表示,并将变换表达式写成矩阵形式,则上式分别为

(3.6)

(3.7)

式中,[ ]为N阶哈达玛矩阵。
由哈达玛矩阵的特点可知,沃尔什-哈达玛变换的本质上是将离散序列f(x)的各项值的符号按一定规律改变后,进行加减运算,因此,它比采用复数运算的DFT和采用余弦运算的DCT要简单得多。
很容易将一维WHT的定义推广到二维WHT。二维WHT的正变换核和逆变换核分别为:
(3.8)


(3.9)

式中:x, u=0, 1, 2, …, M-1; y, v=0, 1, 2, …, N-1。
类似于FFT,WHT也有快速算法FWHT,也可将输入序列f(x)按奇偶进行分组,分别进行WHT。FWHT的基本关系为

(3.10)

WHT的变换核是可分离和对称的,因此二维WHT也可分为两个一维的WHT分别用FWHT进行变换而得到最终结果,由此便可实现二维的FWHT。
综上所述,WHT是将一个函数变换成取值为+1或-1的基本函数构成的级数,用它来逼近数字脉冲信号时要比FFT有利。同时,WHT只需要进行实数运算,存储量比FFT要少得多,运算速度也快得多。因此,WHT在图像传输、通信技术和数据压缩中被广泛使用。
3.3.4 几种离散正交变换编码算法的比较
正交变换具有如下性质:
1.熵保持性。
2.能量保持性。
3.去相关性。
4.能量重新分配与集中性。
上述4个性质中,3、4最重要,但不同的归一化正交变换却差别很大。若数据广义平稳,经过KLT后个系数互不相关,能量的集中性最为集中。由于舍弃数值小的系数所造成的均方误差最小,故KLT是在MSE意义下的最佳变换,可以作为研究变换方式对压缩性能影响的比较标准,但是KLT是最困难的一种变换。
如果图像信号为Markov模型,则典型正交变换的大致性能如下:
按正交变换性能集中性能从好到差的排序:
KLT DCT DFT WHT
按正交变换运算量从小到大的排序:
WHT DCT DFT KLT
图3.4为几种正交变换的性能比较:

图3.4 几种正交变换性能比较曲线图
综合上述,图像压缩选DCT为变换矩阵性能较好。
3.3.5 几种离散正交变换编码算法的编程实现
在MATLAB的环境中实现这几种算法。MATLAB是一种很好的仿真软件 。在这里,都用一幅256×256像素、灰度级为256的标准图像Lena来作为压缩软件的图像输入。
1.基于离散傅立叶变换编码的数据压缩的算法的实现
首先将图像分割成 个8×8个子图像,对每个子图像进行快速傅立叶变换,这样每个子图像有64个傅立叶系数。按照每个系数的方差来排序,由于图像是实值的,其64个复系数只有一半是有差别的,舍去小的变换系数,就可以实现数据压缩 。在MATLAB程序中的重要语句如下:
fftcoe=blkproc(I1,[8 8],’fft2(x)’);%将图像分割成8×8的子图象进行FFT
coevar=im2col(fftcoe,[8 8],’distinct’);%将变换系数矩阵重新排列
snum=64-64*cr;% 根据压缩比确定要变0的个数
B2=col2im(coe,[8 8],[256 256],’distinct’);%重新排列系数矩阵
I2=blkproc(B2,[8 8],’ifft2(x)’);%对截取后的变换系数进行FFT逆变换。
程序的运行结果如下:
当cr=0.5时,即实现的图像压缩比为2:1时,其压缩图像如图3.6所示,此时的均方根误差erms=0.0324。
当cr=0.125时,即实现的图像压缩比为8:1时,其压缩图像如图3.7所示,此时的均方根误差erms=0.0512。

图 3.5 原始图像 图3.6 压缩比为2:1的图像 图 3.7压缩比为8:1的图像

2.基于离散余弦变换编码的数据压缩的算法的实现
首先将图像分割成 个8×8个子图像,对每个子图像进行DCT,这样每个子图像有64个傅立叶系数。舍去50%小的变换系数,就可以实现数据压缩。在MATLAB程序中的重要语句如下:
dctcoe=blkproc(I1,[8 8],’P1*x*P2′,t,t’);
coevar=im2col(dctcoe,[8 8],’distinct’);%将变换系数矩阵重新排列
b2=col2im(coe,[8 8],[256 256],’distinct’);%重新排列系数矩阵
I2=blkproc(b2,[8 8],’P1*x*P2′,t’,t);
程序的运行结果如下:
当cr=0.5时,即实现的图像压缩比为2:1时,其压缩图像如图3.8所示,此时的均方根误差erms=0.0432。
当cr=0.125时,即实现的图像压缩比为8:1时,其压缩图像如图3.9所示,此时的均方根误差erms=0.0482。

图3.8 压缩比为2:1的图像 图3.9 压缩比为8:1的图像
3.基于WHT的数据压缩的算法的实现
首先将图像分割成 个8×8个子图像,对每个子图像进行哈达玛变换,这样每个子图像有64个傅立叶系数。舍去50%小的变换系数,就可以实现2:1的数据压缩。在MATLAB程序中的重要语句如下:
T=hadamard(8);
htCoe=blkproc(I1,[8 8],’P1*x*P2′,T,T);
CoeVar=im2col(htCoe,[8,8],’distinct’);%将变换系数矩阵重新排列
B2=col2im(Coe,[8,8],[256 256],’distinct’);%重新排列系数矩阵
I2=blkproc(B2,[8,8],’P1*x*P2′,T,T);
当cr=0.5时,即实现的图像压缩比为2:1时,其压缩图像如图3.10所示,此时的均方根误差erms=0.0422。
当cr=0.125时,即实现的图像压缩比为8:1时,其压缩图像如图3.11所示,此时的均方根误差erms=0.0731。

图 3.10 压缩比为2:1的图像 图 3.11 压缩比为8:1的图像
由于K-L变换很难实现,在这里只实现了其它三种方法的算法。从上面三个运行结果可以看出,上面三种变换在丢弃32个系数时对重建图像品质在视觉上影响都很小。在压缩比为8:1时,对图像品质在视觉上有点影响,它们的均方根误差因为变换不同而有所不同,对与DFT、DCT和WHT,它们的均方根误差erms分别为0.0512、0.0482和0.0731。由此可见,DCT比DFT和WHT有更强的信息集中能力。从理论上讲,K-L变换是所有变换中信息集中能力最优的变换。但是K-L变换所需的计算量非常大,所以在图像压缩中不太实用。
DCT在压缩率方面与K-L变换差不多,而且能够用类似FFT的算法来实现快速变换,因此,DCT在信息压缩能力和计算复杂性之间提供了一种很好的平衡,它已经成为CCITT建议的一种图像压缩技术。

3.4 本章小结
本章是本论文的重点,首先讲述了离散正交变换的概念。通过离散正交变换,使变换后的数据点之间独立性增大,从而减小编码数据量。还介绍了它的几何意义和实质、正交变换编码的特性评价。
本章重点讲述了离散余弦变换编码。介绍了离散余弦变换的基本理论、它的快速算法和应用,离散余弦变换已经广泛地应用在数据压缩领域,尤其在图像压缩领域。再分别讲述了离散正交变换编码的其它几种方法的概念和算法,并从理论上对它们进行了分析和比较。离散余弦变换编码是一种较佳的变换编码方法。再在MATLAB的环境下,对离散正交变换编码的各种方法的算法进行了实现。计算了它们的均方根误差,并且比较了压缩后的图像,在实践中证明离散余弦变换编码是比较好的编码方法。

第四章 系统的设计及其实现
4.1 设计思路及其系统构架
4.1.1 总体设计
按照毕业设计的要求,在上一章中对离散正交变换的几种变换方法的算法在逻辑上进行了分析和比较,并对这几种算法在MATLAB中进行了实现,并在实践中进行了分析和比较,离散余弦变换是一种较优的算法,因此选择了基于离散余弦变换编码做一个图像压缩的完整软件。
完成这个软件设计需要以下几个步骤:
1.将图像进行离散余弦变换。将空间域上的图像经过变换映射到另一边变换域上。但是这个过程并不能压缩数据。离散正交变换编码并不是一次对整幅图进行变换和编码,而是将图像分成n×n个子图像后分别进行处理。这是因为:
1)小块图像的变换计算容易。
2)距离较远的像素之间的相关性比距离较近的像素之间的相关性小。变换编码首先将一幅N×N大小的图像分割成 个子图像。然后对子图像进行变换操作,解除子图像像素之间的相关性,达到用少量的变换系数包含尽可能多的图像信息的目的。
2.将变换后的数据进行量化。采用均匀量化就可以了。量化步骤是有选择地消除或粗量化带有很少的信息的变换系数,因为它们对重建图像的质量影响很小。用均匀量化表进行标量量化。
3.将DCT系数量化后,块中的系数再根据Z形扫描方式排序。
4.使用差分脉冲编码调制对直流系数进行编码,使用行程编码对交流系数进行编码。
5.再进行熵编码,一般用变长码对量化后系数进行编码。解码是编码的逆操作,由于量化是不可逆的,所以在解码中没有对应的模块,其实压缩并不是在变换步骤中取得的,而是在量化变换系数和编码时取得的。这里用的是Huffman编码。
正交变换压缩编码过程如图4.1:

图4.1 正交变换压缩编码过程
4.1.2 详细设计
首先,将bmp图像文件读入数据空间中。
将图像分割成子图像,实践证明,子图像数据块尺寸取4×4,8×8,16×16适合图像的压缩,这是因为:
1.如果子图像尺寸取得太小,虽然计算速度快,实现简单,但压缩能力有限。
2.如果子图像尺寸取得太大,虽然去相关效果好,因为DCT等正弦类变换均渐最佳性,若尺寸太大,由于图像本身的相关性很小,反而使其压缩效果不明显,而且增加了计算的复杂性 。
这里的子图像块尺寸取8×8,取一个8×8的子图像块,如下所示:

图 4.2 8×8的子图像块
原图像为256级灰度,L=8,每个像素减 (即减128)得

图 4.3 每个像素减128后的矩阵图
N=8时,进行DCT,得变换系数矩阵为:
图4.4 变换系数矩阵
对矩阵进行DCT变换之后,在变换域中保留哪些系数进行量化和编码,略去哪些系数不予传输(解码时直接补零),对变换法压缩编码的性能有很大影响。原则上,应是保留能量集中的、方差大的系数。系数选择有两种方法。
1.区域编码
即只对规定区域内的变换系数进行量化编码,略去区域外的系数。该区域的的形状和大小取决于图像预滤波器的频响、所需压缩比的大小等。这种方法的关键在于选出能量相对集中的区域,以便保留大部分图像能量,使得恢复图像的质量劣化不那么明显。
2.阈值编码
不限编码区域,而是对整个变换块预设一个门限:如果某系数方差超过该阈值,就保留下来编码传输,否则舍弃。这样就有自适应能力,可得到较区域编码更好的图像质量 。
所以,在这里采用阈值编码 。
图4.5为量化步长矩阵:

图4.5 量化步长矩阵
很明显可以看出,能量集中在少数低频系数上。然后用图4.5所示的量化步长矩阵对变换系数进行量化,量化后的输出为:

图4.6 量化后的输出矩阵
然后将二维频域矩阵中的频域系数排列成一维矢量的形式,以保证低频图像分量在一维排序中首先出现。用Z形扫描方法对其进行排序。
下图4.7为Z形扫描的矩阵序列:

图4.7 Z形扫描的矩阵序列
对DCT进行Z形扫描之后,出现一维矢量:-26,-3,1,-3,-2,-6,2,-4,1,-3,1,1,5,0,2,0,0,0,0,0,0,-1,EOB,这里的EOB表示块结束;第一个数据为直流系数,之后的都为交流系数。由于相邻块之间的直流系数相差很小,所以用脉冲编码调制对直流系数进行编码,从而提高压缩比。在量化之后的矩阵中,大多数的系数都被截取为0了,因此用行程编码对交流系数进行编码。再进行熵编码。这里用Huffman编码。
Huffman编码为一种无失真编码,它是非续长代码,因此为一种单义码。其编码方法按如下三步进行:
1.将灰度级按概率大小进行排序,大在前,小在后;
2.取两个最小概率相加,之后构成一个新的概率集合。(新的概率集合的概率个数总是比执行此步前的概率集合少一个)。新的概率在新的概率集合中仍遵循降序规则确定所处位置。被相加的两个最小概率值所对应的灰度级成为Huffman树的一个叶子节点。如此重复,直到只有两个概率为止。
3.设所有节点左后代为“0”,右后代为“1″,从根开始,经各中间节点到叶子节点的路径代码即为该叶子节点的Huffman编码。
熵编码分为两步进行,首先将DC码和行程码转换为中间符号序列,然后给这些符号赋以变长码字。
对差分DC系数用两个符号进行编码,即符号1和符号2。符号1表示的信息称为“长度”,即为DC系数的幅度进行编码所用的位数,符号2表示DC系数的幅度。对每个AC系数也用两个符号进行编码,符号1和符号2。符号1表示两条信息,称为“行程”和“长度”。行程是在之字形矩阵中位于非零AC系数前的连续零值AC系数的个数,长度是对AC系数的幅度进行编码所用的位数 。符号2表示了AC系数的幅度。
对DC系数的符号1用Huffman表中的可变长度进行编码,符号2用可变长度整数代码进行编码,若为负值,则采用二进制的补码形式。首先从表中找出差分DC系数需要多少位来表示。然后,位的数目用以四位二进制编码的十进制位数表示。接着就用可变长度整数来表示系数的幅度。
对AC系数采用Huffman表中的变长码编码对符号1进行编码,随着对DC系数进行编码,用可变长代码对符号2进行编码。这样就得到了压缩后的数据流。
将压缩的数据流存数据缓冲区中,然后再读出,显示出压缩后的图像。
4.1.3 系统流程图

图 4.8 系统流程图

4.2 系统的实现
4.2.1 系统的具体实现
本系统是用Visual C++来实现的,Visual C++提供了一个由许多组件组成的完整的开发环境,这些组件协同工作,从而简化了软件开发过程。是一种充分利用具有面向对象特性的C++能开发出专业级的Windows应用程序 。Visual C++软件除包括一个编译器以外,它还包括所有的库、例子和为Windows创建应用程序所需要的文档 。
打开Visual C++的运行环境,从File菜单选择New,显示New对话框。选择Projects标签,创建一个MFC基本项目,选择MFC AppWizard(exe)作为项目类型。名字为JPEG,创建一个基于单文档的项目。之后系统会自动生成一些类,并会生成相应的文件,包括头文件和应用文件,在相应的文件上添加代码就可以了。然后再插入所需要的类。在头文件中声明函数和变量。在应用文件中定义函数和使用各种变量,并调用函数。
在JPEGDoc.cpp 文件的开使部分添加了标准色度量化表、标准亮度量化表、直流系数的亮度和色度Huffman表、交流系数的亮度和色度Huffman表、Z形扫描的顺序矩阵。打开一个bmp图像文件,将图像数据存在缓冲区中,并将它显示在文档上。BOOL CDib::Load(const char *pszFilename)函数的主要语句如下:
if(!cf.Open(pszFilename,CFile::modeRead))
return(FALSE); DWORD dwDibSize;
BmpFileLength=cf.GetLength();
dwDibSize=BmpFileLength-sizeof(BITMAPFILEHEADER);
unsigned char *pDib;
pDib=new unsigned char [dwDibSize];
if(pDib==NULL)
return(FALSE);
BITMAPFILEHEADER BFH;
在CDib类中定义了Pre_DCT(double * sourcedata)函数对输入的图像数据进行快速DCT变换。用CDib::DCT(double * x,int n,unsigned char * QuantTable)函数对8×8的图像块进行DCT变换,量化之后进行Z型扫描。用函数CDib::RLEProg()对AC系数进行游程编码。
再用函数CDib::HuffmanTable(unsigned char *bit,unsigned char*val)对直流分量和交流分量进行Huffman编码。
接着用函数CDib::WriteHuffmanData()将Huffman码依次存入文件中。用函数 CDib::Write32bit()把一个四字节的数由高字节到低字节的顺序写入文件。重要语句如下:
unsigned char buf[4],insert=0×00;
int i;
buf[0]=(EncodeJpeg&0xff000000)>>24;
//把32位的JPEG编码整数由高位到低位存入buf数组中
buf[1]=(EncodeJpeg&0xff0000)>>16;
buf[2]=(EncodeJpeg&0xff00)>>8;
//将由低位到高位写入文件。
buf[3]=EncodeJpeg&0xff;
for(i=0;i<4;i++)
//EncodeJpeg的32位已满,写入文件
{file.Write(buf+i,1);
if(buf[i]==0xff)
//如果某一字节为0xFF,则需插入一个数0×00
file.Write(&insert,1);
//已定义insert为0×00}
还定义了一个CPicture类来显示压缩后的图像,和压缩前的图像显示在同一个画面上。主要函数为CPicture::Render(CDC* pDC, CRect rc, LPCRECT prcMFBounds) const。
重要语句如下:
{ASSERT(pDC);
if (rc.IsRectNull()) {
CSize sz = GetImageSize(pDC);
rc.right = sz.cx;
rc.bottom = sz.cy;}
long hmWidth,hmHeight; // HIMETRIC units
GetHIMETRICSize(hmWidth, hmHeight);
m_spIPicture->Render(*pDC, rc.left, rc.top, rc.Width(), rc.Height(),0, hmHeight, hmWidth, -hmHeight, prcMFBounds);
return TRUE;}
以上就是系统的具体实现过程。
4.2.2 系统的调试过程
将所有的程序都编好之后,将程序全部组建,没有错误,也没有警告。再进行调试,出现如下所示画面:

图 4.9 调试后的界面
单击“文件”,按“打开”按钮,结果如下图4.10所示

图 4.10 按“打开”按钮后的界面

选择一个bmp图像文件打开,运行的画面如下:

图 4.11 显示原始图像
上面还显示了文件名,文件的尺寸和大小。
单击“压缩”按钮,出现如下画面:

图 4.12 保存压缩后图像的界面
写入文件名之后,按“保存”,运行结果如下图4.13

图 4.13 显示编码所用时间图
点“确定”之后,运行结果如下图4.14所示:

图4.14 原始图像和压缩后图像的对比图
上图中上面的图像为压缩前的图像,下面的图像为压缩后的图像。这个软件既可以对彩色图像进行压缩,也可以对灰度图像进行压缩。
4.2.3 调试结果的分析
图像的编码质量评价准则有两种。一种是客观的评价准则:1.均方差:图像 经过变换后,编码单个对变换系数进行编码,接收端对 作逆变换,得到 。 与 之间的均方误差作为准则,在允许失真度下进行编码。2. 输入图像和输出图像的均方信噪比。另一种是主观的评价准则:人眼对图像失真的感受和均方误差不完全一致,主观评价以人的眼睛感觉来作为评价指标。将压缩前后的图像的大小进行比较,压缩前的图像为126KB,压缩后的图像为5.96KB。压缩比为21:1。压缩后图像的容量小了很多。而且压缩后的图像的清晰程度也很高,基本上没有失真的感觉。程序运行的速度也比较快。这些都说明了基于离散余弦变换编码的数据压缩的效果很好。

4.3 本章小结
本章是本论文的核心部分,重点讲述了系统的设计和实现。系统的设计部分首先讲了总体设计,再讲了详细设计,还说明了软件模块图。本系统是用Visual C++来实现的,简要介绍了里面的几种类和重要的函数语句。将程序进行了调试,并对调试后的结果进行了分析。

总结
论文中讲述了数据压缩的目的和意义,和它的发展现状。介绍了数据压缩的基本概念,对数据压缩的方法、技术标准和评价方法进行了分析和研究。然后介绍了图像压缩的相关知识。讲述了离散正交变换的几种方法,对基于离散正交变换编码的几种方法的算法进行了研究和比较,并用MATLAB进行了实现,在实践中对这几种算法进行了分析和比较。重点对基于离散余弦变换的数据压缩算法进行了分析和研究。用基于离散余弦变换编码的数据压缩的算法来进行bmp图像文件的压缩。
本文中实现数据压缩的关键技术就是对图像进行了DCT变换,将时间域变换到频域,从而在频域中只需要少量的数据点就可以表示信号,而在时间域中表示则需要大量的数据点。论文中对各种离散正交变换从各方面进行了比较,综合考虑,DCT是最佳的图像变换。最后对系统进行了实现,压缩之后的图像很清晰,能够满足需要,压缩比也比较大。结果也说明了DCT是最佳的图像变换。
本系统是用Visual C++来实现的。由于接触Visual C++这门语言不是很久,对它不是特别地了解,在编写程序的时候遇到过很多困难,因此借了很多有关方面的书来解决问题,并且向懂这门语言的同学请教,终于把这个系统实现了。经过这段时间的学习,对Visual C++有了进一步的了解,但要精通这门语言,需要很长一段时间。
虽然基于DCT的压缩效果比较好,但是数据压缩领域正在飞速发展,有很多压缩技术在性能上已经超越了DCT,通过这段时间的学习,对数据压缩也产生了浓厚的兴趣,以后可能会继续在这个领域研究,研究出一个性能更好的压缩技术。

参考文献
[1] 戴善荣.数据压缩[M].西安:西安电子科技大学出版社,2005,94~165
[2] 吴乐南.数据压缩[M].北京:电子工业出版社,2000,108~126
[3] mao yao bin .图像处理[Z].2004,21~96
[4] 何斌、马天予、王运坚、朱红莲.Visual C++ 数字图像处理[M].北京:人民邮电出版社,2001,128~192
[5] 姚敏.数字图像处理[M].北京:机械工业出版社,2006,138~189
[6] 陈桂明、张明照、戚红雨.应用MATLAB语言处理数字信号与数字图像[M].北京:科学出版社,2000,225~258
[7] 何强、何英.MATLAB扩展编程[M].北京:清华大学出版社,2002,159~195
[8] 刘志宇、傅宇旭.Visual C++6.0程序设计[M].北京:中国铁道出版社,2000,15~94
[9] G.K.Wallace.The JPEG Still Picture Compression Standard.IEEE Trans.Consumer Eletronics,1992,1546~1556
[10] 张益贞、刘滔. Visual C++实现MPEG/JPEG编解码技术[M].北京:人民邮电出版社,2002,1~168
[11] Mickey Williams. Visual C++6[M].北京:机械工业出版社 西蒙与舒斯特国际出版公司,1999,1~142
[12] 刘禾.数字图像处理及应用[M].北京:中国电力出版社,2005,173~226

附录
#include “StdAfx.h”
#include “Picture.h”
#include
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// CPicture implementation

基于二值图像游程编码的数据压缩算法的研究与实现

Posted by 天际的荒草 | Posted in Docs | 文档 | Posted on 18-09-2009

标签:, , , ,

0

中南大学

目录

摘 要 I
ABSTRACT II
第一章 绪 论 1
1.1研究现状 1
1.2数据压缩的理论基础: 5
1.2.1数据压缩的必要性 5
1.2.2数据压缩的可行性 6
1.3二值图像游程编码数据压缩研究的目的和意义 8
1.4本文研究的主要内容 9
第二章 二值图像游程编码的基本原理 10
2.1二值图像游程编码的算法思想 10
2.2二值图像游程压缩的基本模型和过程 12
2.2.1二值图象游程压缩的模型 12
2.2.2确定压缩指示符 13
2.2.3二值图像游程编码过程 14
2.2.4游程解码过程 15
第三章 二值图像游程编码算法的研究与改进 17
3.1 RLE编码算法分析 17
3.2 RLE算法的改进 19
3.2.1图像特性分析 19
3.2.2数据膨胀现象的研究 21
3.3二值图像算法的分析比较 23
3.3.1二值图像游程编码的特点 23
3.3.2二值图像分析与扫描算法比较 24
第四章 二值图像游程编码的算法实现与系统功能 28
4.1算法实现 28
4.1.1文本压缩部分 28
4.1.2文本解压部分 28
4.1.3 图象压缩部分 28
4.1.4 图象解压部分 29
4.2系统的功能实现 29
4.2.1 程序运行主界面 29
4.2.2 文本游程压缩的界面与程序 30
4.2.3 图象压缩的界面和程序 35
第五章 总结与展望 39
5.1 总结 39
5.2 展望 39
参考文献 41
致谢 42
附录 43

摘 要

随着互联网的飞速发展,我们已进入数字信息时代,如果这些数字信息不用有效的方法加以处理的话,将难以得到有效的保存或转移。因此数据压缩技术已成为当今通信、广播、存储和多媒体娱乐等领域的一项必不可少的关键技术。但在安全、医药等几个特殊领域,由于对图像数据要求苛刻,压缩、解压缩过程不能有丝毫损失。因为基于无损压缩的压缩率不高,因此通过对普通的无损压缩技术的研究与分析,一些更好的无损压缩方法和观点有望提出。
本文所研究的二值图像游程编码数据压缩,就是一种具有高压缩比的无损数据压缩技术,它是应用游程编码的原理对二值图像进行数据压缩的编码技术,其编码非常简单,编码和解码速度快,因此其应用范围广泛。文章首先介绍了数据压缩的发展历程和研究现状,然后对二值图像游程编码压缩的基本方法作了简要的概述,并介绍了其压缩模型和编码流程。通过对图像特征的深入分析和统计,利用有效性思想解决了位图文件中使用RLE8游程编码算法时经常出现数据膨胀的现象。最后,通过对几种二值图像扫描算法的分析比较,选出了最适合于本程序的逐行扫描算法,实现了基于二值图像游程编码的数据压缩软件。

关键词:二值图像,游程编码,数据压缩,解压缩,数据膨胀

ABSTRACT
With the explosive development of the internet, we live in an age of digital information. A large number of data need be processed, if these digital data couldn’t be processed with an efficient method, it is difficult for them to be stored or transferd. So data compression is becoming one of enabling key technologies for communication, broadcast, storage and multimedia amusements. But in some domains, such as medicine and security, the application cannot tolerate any difference between the original and reconstructed data. Because of the lower compression ratio while using fundamental lossless compression techniques, some better lossless compression methods or opinions are expected to put forward through the research and analysis of the common lossless technologies.
Two values picture of run-length coding data compression is a kind of lossless compression technology which has a high compression ratio. It is a new data compression coding technology which applies the run-length coding theory to two values picture. Its code is very simple, coding and decoding speed are very quickly, therefore its application scope is widespread. Firstly, this paper introduces data compression course of development and research status. and then outlines the two values pictures of run-length coding compression methods briefly, introduces the compression model and coding process. After analyzing the image pixel distribution, the writer introduces the RLE method and resolves the negative compression using the RLE8 methods in BMP file format .Lastly, through analyzing and comparing on several kinds of two values picture scanning algorithm, the writer chooses a most suitable algorithm to achieve the two values pictures of run-length coding data compression software.
KEY WORDS: two values picture,run-length coding,data compression,Decompression,negative compression

第一章 绪 论
1.1研究现状
1.1.1数据压缩的发展历程
信息论之父C.E.Shannon 第一次用数学语言阐明了概率与信息冗余度的关系。在1948年发表的论文“通信的数学理论”中,Shannon 指出,任何信息都存在冗余,冗余大小与信息中每个符号(数字、字母或单词)的出现概率或者说不确定性有关。Shannon 借鉴了热力学的概念,把信息中排除了冗余后的平均信息量称为“信息熵”,并给出了计算信息熵的数学表达式。这篇伟大的论文后来被誉为信息论的开山之作,信息熵也奠定了所有数据压缩算法的理论基础。从本质上讲,数据压缩的目的就是要消除信息中的冗余,而信息熵及相关的定理恰恰用数学手段精确地描述了信息冗余的程度。利用信息熵公式,人们可以计算出信息编码的极限,即在一定的概率模型下,无损压缩的编码长度不可能小于信息熵公式给出的结果。第一个实用的编码方法是由D.A.Huffman在1952年的论文“最小冗余度代码的构造方法”中提出的。直到今天,许多《数据结构》教材在讨论二叉树时仍要提及这种被后人称为Huffman编码的方法。1968 年前后,P.Elias发展了Shannon和Fano的编码方法,构造出从数学角度看来更为完美的Shannon-Fano-Elias编码。沿着这一编码方法的思路,1976 年,J.Rissanen 提出了一种可以成功地逼近信息熵极限的编码方法——算术编码。1982 年,Rissanen和G.G.Langdon一起改进了算术编码。之后,人们又将算术编码与J.G.Cleary和I.H.Witten于1984年提出的部分匹配预测模型相结合,开发出了压缩效果近乎完美的算法。今天,那些号称压缩效果天下第一的通用压缩算法,实际上全都是这一思路的具体实现。字典系列算法基本解决了通用数据压缩中兼顾速度与压缩效果的难题。
1.1.2数据压缩的分类
通常所说的图像可以被分为二值图像、灰度图像、彩色图像等不同的类型。每一类图像的压缩方法也不尽相同。图像编码压缩方法有许多种从不同的角度出发不同的分类方法,比如从信息论角度出发可分为两大类【1】【2】:
图1-1图象编码分类
1.1.3图像数据压缩标准的概况
图像数据编码技术的发展与进步,为制定通用规范化的图像数据压缩标准奠定了基础。为了在全世界范围内促进数据压缩技术的应用,自上个世纪80年代起,国际标准化组织、国际电工委员会和国际电信联盟下属的国际电报电话咨询委员会陆续完成了一系列数据压缩与通信的建议和标准,包括二值图像压缩编码标准JBIG (Joint Bi-level Image experts Group)、静止图像压缩编码标准JPEG(Joint Picture Expert Group)和JPEG2000、序列图像压缩编码标准如H.261, H.263, MPEG-I(Moving Picture Experts Group)及MPEG-II,MPEG-IV。这些国际标准吸收、集成了五十年来图像编码的优秀研究成果,进一步规范、完善了图像数据算法,推动了数据压缩技术的实用化、产业化,同时也在一定意义上刺激了信源理论研究的进一步拓展,部分图像数据压缩国际标准如图1-2所示【3】。

图像编码国际建议和标准
标准名称(时间) 应用领域 特点
CCITT T.4(1980,1984,1988) 三类传真机文件压缩 采用一维MH和二维MR码
CCITT T.6(1992) 四类传真机文件压缩 无噪声编码,采用MMR编码
JPEG T.81/ISO 10918(1991) 彩色或灰度静止图象压缩 采用DCT块变换、自适应量化、游程编码和熵编码:基于DPCM预测的无失真压缩
JPIG T.82/ISO 11544(1992) 二值和灰度图象(比特面)和传真文件压缩 无失真压缩,多分辨率结构和自适应预测,压缩比高于T.4和t.6,适应累进压缩
CCITT H.261(1990) 数字基群传输会议、电视和可视电话 图象尺寸为CIF或QCIF,p 64Kbits速率,编码方法为帧间预测运动补偿+DCT
MPEG-Ι(1991) 视频、数字存储 定义了I、P和B帧进行预测以适应随机存取的要求,速率小于1.5Mbit/s
MPEG-II(1994) 视频、HDTV和数字存储 比特率扩大到60Mbit/s,支持HDTV格式,分级编码,分辨率和信噪比可谓
H.263(1996) 低比特率视频传输 综合使用帧内、帧间和变换编码,采用重叠的方块运动补偿,图像尺寸为CIF或QCIF等,速率 64Kbps,半像素精度运动补偿

MPEG-IV(1998) 声音-视频通信、多媒体图像传输 基于内容的交互性,低比特率,压缩比高,通用的存取,用灵活性和可扩充性
JPEG2000(2000) 彩色或灰度静止图像压缩 小波变换,EBCOT内嵌编码,支持图像的渐进传输和随机码流访问,是目前静止图像压缩的最新国际标准
图1-2 图像数据压缩的国际标准一览表
1.1.4 图像压编编码中的传统技术和新方法
表示图像需要大量的数据,但一幅图像内部以及视频序列中相邻图像之间由大量的冗余信息,主要表现为以下几种形式:信息熵冗余、结构冗余、知识冗余、视觉冗余。这些形式的冗余是编码压缩图像数据的出发点。图像编码方法就是要尽可能地消除这些冗余信息,以降低表示图像所需的数据量。
图像编码自1948年提出以来,迄今己有50多年的历史。传统的编码的方法主要有:(1)熵编码(entropy coding),常用的熵编码方法有游程编码、Hufman编码和算术编码。熵编码是纯粹基于信号统计特性的编码技术,是一种无损编码,解码后能无失真地恢复原图像。(2)空间和时间子抽样编码。在电视电话等某些应用中,全分辨率不是必需的。此时,可以使用空间和时间子抽样来降低数据速率。在编码器中,从每几个像素中选择一个像素,从每几帧中选择一帧,然后再加以传输。(3)预测编码(Predictive coding)。可以在一幅图像中进行(帧内预测编码),也可以在多幅图像间进行(帧间预测编码)。预测编码基于图像数据的空间和时间冗余特性,容相邻的已知像素(或图像块)来预测当前像素(或图像块)的取值,然后再对预测误差进行量化和编码。预测编码建立在信源的平稳性与局部相关性基础上,其去相关能力有限,容易产生误码扩散,使图像质量大大下降。(4)变换编码(Transform coding)。与预测编码相比,消除图像数据空间相关性的一种更有效的方法使进行信号变换,使图像数据在变换域上最大限度地不相关。尽管图像变换本身并不带来数据压缩,但由于变换后系数间相关性明显降低,图像地大部分能量只集中到少数几个变换系数上,采用适当地量化和嫡编码可以有效地压缩图像的数据量。(5)矢量量化(VQ, Vector Quantization)。香农率失真理论指出,矢量编码总是优于标量编码。基于VQ的图像压缩方法是利用相邻图像数据之间的高度相关性,将输入的图像数据序列分组。每一组m个数据被描述成一个有m个元素的矢量。编码器根据特定的距离规则(代价函数)在码本中对输入图像进行矢量匹配,然后对匹配码的码本序号进行编码,从而实现了由一个矢量所需要的比特数到一个码字序号所需比特数的压缩。80年代以来,人们对VQ在图像编码中的应用进行了广泛的研究,取得了很多成就。但VQ复杂度较高及其它缺陷,限制了它的实际应用,在JPEG方案中落选。
以上这些压缩方法都是在传统香农信息论及数字信号处理技术的指导下进行的,即随机变量的信息是由其熵表征的,无损压缩方法(Human编码、算术编码)的压缩能力都以此为限。有失真的压缩方法,如变换编码、VQ等也受香农率失真理论约束。这些方法只能去除图像的线性相关性和统计相关性,压缩比不高,压缩比高于30或40时,编码图像质量严重减退,说明这些方法去除信息冗余的能力己接近极限。图像有损压缩应在满足一定重构图像质量的基础上进行。以上这些压缩方法都以信噪比和均方误差作为衡量图像质量的标准。但人眼视觉和感受与均方误差并不一致,均方误差难以反映重建图像的实际主观质量。尤其是在低码率(高压缩比)时,均方误差准则与主观质量相脱节的情况尤为严重。并且人的视觉感知特点与统计意义上的信息分布并不一致,即统计上需更多信息量才能表征的特征对视觉感知可能并不重要,从感知的角度无需表征这部分特征。因此,M.Kunt于1985年提出了利用人眼视觉特性的第二代图像编码技术【4】。第二代图像编码技术不局限于香农信息论的框架,要求充分利用人眼的视觉生理心理特性和图像信源的各种特性,以期获得更高压缩比。
1.1.5图像压缩编码的新发展
在通信技术发展的初期,不同的业务通过组建不同的通信网来实现,如电话交换网、数据通信网等。随着人们信息活动的丰富,越来越迫切地要求通信网络能够把话音、数据及图像结合起米,并以一种统一地接入方式提供综合地多媒体服务。于是,人们开发了分组交换、帧中继、光纤分布数据接口(FDDI:Fiber Distributed Data Interface)FDDI-I、FDDI-II、专用地信元交换、SS7.N-ISDN (ISDN: Integrated Services DigitalNetwork), ATM( Asynchronous Transfer Mode), SMDS(Switched Multimegabit Data Service)以及B-ISDN等。随着科学技术及经济文化的发展,人们对各种以视频业务、图像信号为中心的高速宽带通信业务的需要日益迫切。发展宽带ISDN(B- ISDN) 势在必行。实现B-ISDN的关键技术使宽带交换技术。1988年,国际电信联盟指出“异步传输模式(ATM)”是实现B-ISDN的转移模式。ATM综合了电路交换和分组交换的优点,以其高速灵活的交换结构使B-ISDN能够实现从窄带话音、数据业务到宽带图像通信的综合传输。也为可视电话、会议电视、HDTV(High Definition Television)等各类视频业务的迅猛发展创造了条件。但是,以往发展起来的压缩编码技术都是面向同步网络的,不适于ATM网络。ATM网络采用统一的交换结构,动态分配带宽,支持图像信元的可变比特率编码和传输,但它也带来了一些新问题,其中信元丢失是最主要的一个。显然,ATM网络的发展,对视频信号的压缩编码提出了新的要求。ATM网络的视频编码作为ATM网络的一项关键技术,目前已受到世界电信界的广泛关注。
1.2数据压缩的理论基础
1.2.1数据压缩的必要性
在多媒体计算机中,输入的各种媒体信息,都是数字化信息,我们通常称之为“数据”。多媒体计算机要实时地综合处理声、文、图信息,关键是如何存储和传送海量数据。数字化的图像和声音信号的数据量是非常大的。存贮一幅标准VGA模式的图像(640色 480色 256色),约需0.3MB的存贮容量。若要达到25帧/秒的全动态显示要求,每秒所需的存贮容量为7.5MB。也就是说,640MB的光盘只能存放1分25秒的图像数据。而且光盘的数据读出速率也必须达到7.5M B/秒以上,才能满足要求。另外,对于音频信号,以普通的激光唱盘CD-DA(Compact Disc-Digital Audio)声音数据为例,如果采样频率为44.1KHz,16bit两通道立体声,那么640MB的光盘只能存放约一小时的数据。因此,多媒体计算机所面临的首要问题,是减少存储容量和降低传输率,使得现有PC(personal computer)机的指标与性能能够达到处理声音与图像信息的要求。这就需要我们对数据进行压缩处理,使之达到一定的要求。
1.2.2数据压缩的可行性
数字化技术,使得图像可以非常容易进行各种各样的图像处理技术,满足各种各样的要求。人们研究发现在图像数据中存在大量的冗余数据,通过去除那些多余的冗余数据,可以将用于表示一幅图像的数据量大大减少,从而一定程度上解决图像数据量大的问题。图像数据压缩技术正是基于此才得到蓬勃发展。
冗余数据:即指那些代表了无用信息或者是重复表示了其它数据已经表示了的信息的数据。通过消除或减少冗余数据,可以达到用较少的数据表示同样的信息。数据冗余可以用一个简单的数学式子进行描述,如果用 和 分别表示用于描述同一信息的2个数据集合中信息载体单位的个数,那么第1个数据集相对于第2个数据集的相对冗余度RD为:
(1-1)
其中CR为压缩率,定义为:
(1-2)
在数字图像处理中,有2种基本的数据冗余:统计冗余和心理视觉冗余。采用不同的方法消除这些冗余,可以使得静止图像和视频图像得到压缩。
统计冗余包含编码冗余和像素间冗余。编码冗余是一种和代码技术相关的冗余,像素间冗余,是指一幅图像或者多幅连续图像的像素之间的相关性,这种相关性是由于像素之间的各种相互关系而产生的。像素间冗余又可分为空间冗余和时间冗余2种【5】。
1.编码冗余
对于图像,在编码前需要建立一个码本,编码时通过码本来表示图像数据,这里码本是指用来表示一定量的信息或一组事件所需的一系列的符号〔如字母、数字等)。其中对每个信息或事件所赋的码符号序列成为码字,而每个码字中符号个数称为码字的长度。当使用不同的编码方法时,得到的码字及其长度一般都不会相等。
设一幅灰度级数为L的灰度图像,由n个像素组成, 表示具有灰度值为k的像素个数,则图像中出现灰度值为k的概率p(k)为
(1-3)
设用于表示灰度值k的比特数为 ,那么为表示每个像素的平均比特Lavg为
(1-4)
根据公式(1-4)可知用于表示该幅图像需要n Lavg比特的数据。通常我们在使用自然码直接编码时,没有考虑灰度值k的概率 特性,故用于表示灰度值k的比特数 没有接近Lavg,从而产生编码冗余。
2.空间冗余
空间冗余是指一帧或一幅图像内部像素之间的统计相关性,有时也称为帧内像素冗余或几何冗余。
一幅图像,显而易见一般说都是在某一特定的场景下的一些物体或目标组成,而同一物体或同一背景的像素具有相同或相似的颜色,即在像素之间存在一定的相关性。早在20世纪50年代,许多学者就研究表明在一幅图像内部,无论是按行、列,还是按其他方式,像素与像素之间有很大的相关性,即图像内一点的像素可以在一定的误差范围内从周围的其他像素预测出来。换句话说,单个像素所携带的信息相对很少,它对图像的视觉贡献可能是多余的,这是因为它常可以用其邻近的像素值来判断。
3.时间冗余
时间冗余是像素间冗余的另一种相关统计冗余,这里的像素是指连续图像或视频图像相邻两图像或两帧之间的统计相关性,有时也被称为帧间像素冗余。序列图 像一般为位于一时间轴区间内的一组连续画面、其中的相邻帧往往包含相同的背景和移动物体,只不过移动物体所在的空间位置略有不同,所以后一帧的数据与前一帧的数据有许多相同的地方。这种共同性是自于相邻帧记录了相邻时刻的同一场景画面,所以此类冗余也称为时间冗余。
4.心理视觉冗余
心理视觉冗余是不同于统计冗余的一种特殊的冗余,它跟人的感觉器官眼睛有关。眼睛作为感知外界世界的一个重要器官,不仅因人而异,而且所感受的区域亮度与区域和背景的反射光的强度都有关。如在灰度值为常数的区域也能感觉到灰度值的变化,这种现象的产生是由于眼睛并不是对所有视觉信息有相同的敏感度。有些信息在通常的视感觉过程中与另外一些信息相比来说不那么重要,这些信息可认为是心理视觉冗余的,去除这些信息并不会明显地降低所感受到的图像的质量。许多称之为“第二代编码技术”的有损方法就是基于这个原理的。另外,心理视觉冗余的存在与人观察图像的方式、思维等也有关系。人在观察图像时主要是寻找那些比较明显的感兴趣的目标特征,而不是定量地分析图像中每个象素的亮度,至少不是对每个像素等同地分析。人通过在脑子里分析这些特征并与先验知识结合以完成对图像的解释过程。由于每个人所具有的先验知识不同,对同一幅图像的心理视觉冗余也就因人而异。
心理视觉冗余从本质上说与前面几种冗余不同,它是与实在的视觉信息联系着的。只有在这些信息对正常的视觉过程来说并不是必不可少时才会被去除。去除心理视觉冗余数据能导致定量信息的损失,所以这个过程也常称为量化(也是一种由多到少的映射)。考虑到这里视觉信息有损失,所以量化是不可逆转操作,它被用于数据的有损压缩。根据心理视觉冗余的特点,可以采取一些有效的措施来压缩数据量。如电视广播中的隔行扫描就是1个常见的例子。
1.3二值图像游程编码数据压缩研究的目的和意义
飞速发展的数据压缩和图像编码技术,给多媒体数据传输和数据存储带来极大的快捷和便利。但在某些数据安全性要求比较苛刻的领域,现在比较流行和压缩效果好的压缩算法几乎都属于有损范畴,对原始数据压缩处理后有不同程度的损伤,无法完全恢复,以至于不能满足技术要求。现有的无损压缩方法,如Huffman、LZ 系列、算术编码等压缩方法尽管在某些方面各有优点,但压缩效果比较差或者算法实现比较困难。
如今各种信息的数据量非常大,特别是多媒体技术的飞速发展,因此数据压缩越来越重要。据媒体特性量身定制的压缩方法中,游程编码 (RLE: Run-Length Encoding)是最为简单、最容易被想到的一种。大多数计算机中产生的图像(和现实世界的图像例如照片不同)都具有着大面积重复的颜色块,为什么非要用无数个完全相同的颜色值来表示某块图像呢?我们完全可以用一个颜色值加一个重复次数来表示这一块图像,冗余度由此减小了,这就是 RLE 方法的基本思路。显然,它不适于用来压缩照片、声音等很少连续重复信息的数据。RLE 方法最有代表性的实现有 PCX 和 Targa 图形格式。如果分别考察的话,只有黑白两种颜色的二值图像以及只有 256 级灰度变化的图像具有一些独特的地方,可以被压缩算法加以利用。我们知道,传真图像是一种典型的二值图像。国际电报电话咨询委员会为此建立了一系列的压缩标准,专门用于压缩传递二值图像(可以是无损的或有损的)。
1.4本文研究的主要内容
在数据编码领域,高性能的压缩算法一直是人们不懈追求的目标,特别是在低比特率压缩时具有低存储量、低功耗、实时的高性能编码算法是近几年的研究热点;随着数字化技术的普及,各种应用对数据压缩编码提出了不同要求。本文针对这种要求,对二值图像游程编码技术进行了研究。
论文的章节和主要内容安排如下:
第一章“绪论”对数据压缩的历史和现状及其分类作了简单的回顾,对编码的国际标准进行了必要的总结。从理论上阐述了数据压缩的必要性和可能性,同时介绍二值图像游程编码数据压缩研究的目的和意义。
第二章“二值图像游程编码的基本原理”介绍了二值图像游程编码的基本算法思想,并对二值图像数据压缩的模型和流程作了初步的研究。
第三章“二值图像游程编码算法的研究与改进”对二值图像游程编码的算法进行了深入的分析,通过对图像特征的分析,提出了对数据膨胀现象的避免改进。对二值图像的几种算法的进行对比和分析,得出本设计软件开发的最佳算法方案。
第四章“二值图像游程编码的算法实现与系统功能”详细介绍了二值图像游程编码数据压缩的实现算法并详细介绍了本程序的系统原理及其功能。
第五章“总结与展望”为整个论文的总结,在简要回顾论文工作的基础上,对图像编码技术的未来发展提出了一些个人的看法。

第二章 二值图像游程编码的基本原理
2.1二值图像游程编码的算法思想
游程长度(RL:Run-Length,简称游程或游长)是指由字符(或信号采样值)构成的数据流中各字符重复出现而形成的字符串的长度。如果给出了形成串的字符、串的长度及串的位置,就能恢复出原来的数据流。游程编码(RLE:Run Length Encoding)就是用二进制码字给出上述信息的一类方法。
基本的游程编码压缩方法最初出现在IBM3780BISYNC(Binary Synchronous Communications)【6】的通信协议中,就是在数据流中直接用3个字符来给出上述3种信息(如图2-1 )。

X SC RL
图2-1 基本的游程编码数据结构
其中 代表数据字符; 是一个在数据集合{X}中不要的字符,即 ,表示有一个字符串在此位置,起“异字头”作用; 则代表串(游程)的长度,也即字符重复出现的次数。由此结构可知,当RL>3,才有数据压缩效益。于是编码时要先判断RL值,再决定是否做RLE;而解码时则需要根据紧跟每一X后的码字是否为 ,再决定其下一个字的含义。
游程编码的压缩效能取决于整个数据流中重复字符出现次数,平均游程长度及所采用的编码结构。图(2-2)给出了基本游程编码方法以1000个字符为处理对象的数据压缩比,以建立一个数据概念。

平均重复长度 重复出现10次的压缩比 重复出现20次的压缩比 重复出现30次的压缩比 重复出现40次的压缩比 重复出现50次的压缩比
4 1.010 1.020 1.031 1.042 1.053
5 1.020 1.042 1.064 1.073 1.111
6 1.031 1.064 1.099 1.136 1.176
7 1.042 1.087 1.136 1.190 1.250
8 1.053 1.111 1.176 1.250 1.333
9 1.064 1.136 1.220 1.316 1.429
10 1.075 1.163 1.266 1.384 1.538
图2-2 基本的游程编码压缩比
二值图像是指仅用黑(国际建议规定用“1”代表)、白(用“0”代表)两个亮度值的图像,例如,经扫描仪(Scanner)得到的气象图、工程图、地图、线路图以及由文字组成的文件图像等。灰度图经位平面分解或抖动(Dither)处理后也成为二值图像,二值图像只是灰度图像的一个特例。故从传输角度考虑,可借助于各种图像通信方式传输,但目前最常用最典型的通信方式是传真。因此,二值图像压缩也往往指数字传真编码,即对数字传真机扫描二值图像的编码。此外,二值图像压缩近年来还特别大量地用于图文的光盘存储;而且传真本身也已经从图形、文字等二值图像发展到了多灰度和彩色图片(Photograph)的传输。
在前面所讲的基本的游程编码中如果取X={白,黑},就可用作二值图像的游程编码。事实上,二值图像的每一扫描行均有交替出现的像素游程(称作白长)和黒像素游程(称作黑长)组成,对不同长度的白长和黑长按其出现概率不同分配以不同长度的码字,就是二值图像的RLE。由于RLE实际上利用了多个像素之间的相关性,故可得到较低的码率下限,以成为数字传真机压缩标准的一个重要组成。
二值图像的游程编码有两种方式:一种是不分白长和黑长,只根据长度进行编码。由于实际图像中,白长和黑长的概率分布各异,因此这种编码方法不是很有效。前CCITT(International Telephone and Telegraph Consultative Committee)建议的是对白长和黑长分别编码,可以证明其最低比特率 :
(2-1)
其中 和 分别为白像素和黑像素出现的概率; 和 分别为白长和黑长的平均像素数(平均长度); 则为每个像素的熵值。
在理想情况下,先对图像进行统计分别得出白长为i的概率 和黑长为i的概率 ,然后根据霍夫曼编码原则按RL出现概率来分配码字,即可使 逼近 ,因此二值图像的RLE实为霍夫曼码的一种具体应用。但困难的是各种RL的出现概率在行间、页间都不相同,且为求得该概率,需要存储数据并做统计计算,难以实时编码。为此,CCITT的 建议推荐以8幅标准传真样张为统计依据,根据各种RL的出现概率编出霍夫曼码表,称之为改进型霍夫曼编码(MHC:Modified Huffman Coding),作为文件传真三类机一维编码的国际标准。实际编码过程只是查表,可以实时处理。MH(Modified Huffman)码的平均编码效率可达86.9%,差错灵敏度低,容易扩展且基本上适合中文文件传真的样张【7】。
2.2二值图像游程压缩的基本模型和过程
2.2.1二值图象游程压缩的模型
对于二值图像,原始数据为零一矩阵,压缩时逐行处理该矩阵:
(1) 连续n个1,表示为+n;
(2) 连续n个0,表示为-n。
在游程长度编码(RLE)中用3个字节表示一个字符申:第一个字节是压缩指示字符,第二个字节记录连续出现的字符,第三个字节记录重复字符出现的次数。可见,只有当RL>3时进行数据压缩才有意义,因此,编码时首先要判断RL值,然后再决定是否进行游程长度编码(RLE);解码时则需根据每一字符后是否为,再决定其下一字符的含义,如图2-3所示:
源数据流:
A A A B B B C C D
RLC数据流
Sr A 3 Sr B 3 C C D
图2-3 数据流
例如:设一幅二维黑白图像F(i,j)的各像素的灰度值如下所示,规定沿水平方向从左到右扫描,则扫描后得到的游程为右边的13个二元数组。

像素值 像素灰度与其重复次数散对二元组


值 8 8 8 8 8 8 8 8 (8,8)
8 8 8 8 7 7 7 7 (8,4)(7,4)
7 7 7 7 7 7 7 7 (7, 8) 6 6 6 6 5 5 5 5 (6, 4) (5, 4)
5 5 5 5 5 3 3 3 (5, 5) (3, 3)
3 3 3 3 3 3 3 3 (3, 8) 3 3 3 2 2 2 2 2 (3, 3) (2, 5)
1 1 1 1 0 0 0 0 (1, 4) (0,4)
注:二元组中的第一个散为像素灰度值 第二个数是其重复次数
图2-4 游程编码描述
由上例可见:
(1)该图像是由8行、8列共64个像素组成;
(2)像素的灰度值变化范围是:0~8;
由于是黑白图,颜色过渡只是黑一灰一白,按人眼分辨率,用8 bit即得 。
(3)第一行8个像素灰度值相同,只传(8,8);第二行只传(8,4) (7,4);第三行只传(7,8);第四行只传(6,4)(5,4);第五行时只传(5,5) (3,3);第六行只传(3,8);第七行只传(3,3) (2,5);第八行只传(1,4)(0,4)。这样,64个像素只需传13个数据对即可, 比一个个像素传送要节省很多时间。一般情况下,编码时间为2–4倍的解码时间。
2.2.2确定压缩指示符
根据游程编码的原理,在编码之前必须设定压缩指示符S,在编码的时候将指示符S,写入压缩文件中,用以表示紧随的两个字节依次为游程长度和重复的字符。然而,如果在数据源中存在与指示符相同的字符,那么在解码的时候,就无法将真实的数据与指示符区分开来,进而造成解码的混乱。因此,为了避免出现这种情况,在编码的时候,如果发现数据源中存在与指示符相同的字符,可以在该字符的后面加一个字符0。这样在解码的时候,也会将该0字符看成是游程长度为0,不会将0字符后的字符重复写入恢复文件中,避免影响解码的正确性。当然,也可以选择一个数据源中不可能出现的字符来作为指示符。果前一个边距大于或等于后一个边距,那么标志位则置0;否则置1。当前后两个边距相等时,差值为零,后一个边距差值的轮廓编码为(0000)。两个边距之间的大小关系只有三种情况:大于、等于和小于。由于编码时将大于和等于这两种情况划归成同一类,当两个边距相等时,标志位必然为0,不会是1。这样就不会出现(1000):的码流情况,当然更不会连续出现(10001000),的码流串。本文的游程编码是以字节为单位的,因此以两个单位组成一个字节进行游程编码。根据前面的分析,把标志位设为(10001000)、 e(136)、a。这样,在编码的时候就不必考虑在与指示符相同的数据后面插入0字符的问题。解码的时候也不必判断指示符后面的游程长度是否为0,以区分指示符和真正的数据。
2.2.3二值图像游程编码过程
游程长度编码数据压缩算法流程,如图2-5所示。具体的实现如下【7】:
(1) 打开数据源和编码后的压缩数据文件;
(2) 从源数据中读取字符,并把它放入一个寄存器中,然后再循环读取后面的字符,并与寄存器中的字符相比较。如果新出现的字符与寄存器中的相等,则计数器加1,否则,判断计数器中的数值,即游程。如果游程长度大于3,则把指示字符S、计数器中的游程长度和寄存器中的字符依次写入压缩数据文件中;如果游程长度不大于3,则按照字符出现的个数把字符一个一个地写入到压缩数据文件中。然后再把新出现的字符放入寄存器中,最后把计数器置1。接着重复(2)的步骤,直到所有的码流全部读取。
(3) 关闭数据源和压缩数据文件。

图2-5 RLC数据压缩算法流程图
2.2.4游程解码过程
游程长度编码数据解压缩算法流程,如图2-6所示。解码过程是编码过程的反向操作,算法比编码要简单得多,解码的时间也短一些。过程如下:
(1) 打开压缩数据文件和恢复文件;
(2) 从压缩文件中读取字符并判断其是否为指示符,如果是,则读出游程长度和重复的字符,在恢复文件中连续写入该字符,写的次数等于该字符重复出现的个数;如果不是,则将该字符直接写入恢复文件中。然后重复(2)的步骤,直所有的码流全部读取;
(3) 关闭数据源和压缩数据文件。

图2-6 RLC数据解压缩算法流程图

第三章 二值图像游程编码算法的研究与改进
3.1 RLE编码算法分析
RLE早在1949年就有使用。RLE曾经用于IBM3780BISYNC协议,在其中RLE作为一种用于压缩无效字符(空格)【9】的子系统。在图像编码中,RLE是一种被广泛应用的压缩编码技术,如RLE是PCX图像文件的唯一使用的压缩方法,另外在BMP, TGA, GEM, TIFF, MacPaint等图像文件格式中,RLE压缩算法还是可选的数据压缩方法。由于该方法受连续数据的重复次数、结构体标志位的影响,某种程度上限制了RLE方法的广泛应用,但RLE算法简单、易行等优点使得RLE算法常常是结合其它编码算法一起联合使用。如在二值图像传真编码、JPEG编码等标准中,将RLE的压缩思想揉入变长Hufman编码的使用情况。RLE编码可以适用任何类型的数据。根据被压缩图像数据的基本单元数据的类型,可分bit,byte和pixel-lever RLE三种常见的使用方法,三者之间没有本质区别,唯一不同的是在RLE数据结构体中第三部分所表示的意思不同而己,分别表示是一位(1bit)、一个字节(8 bits)或者一个像素(如32 bits)。从 RLE编码流程图(图2-5)可知RLE编码的过程,是不停地搜索以寻找相同字符的过程。因此,在图像RLE压缩过程中根据人们对图像的不同认识和研究,出现了许多种基于不同搜索过程的RLE压缩方法。为了描述和使用方便通常将一幅二维的图像表示成一维的数字序列,根据描述图像的不同过程产生了按行压缩(图 3-1a )和按列压缩(图3-1b )两种压缩过程。对于图像的两维压缩过程比较常见的是按Z字型进行压缩的过程(图3-1c)。
在RLE的实际使用情况中,如一幅图像、一篇文档或其他文件中,标志位S并不容易寻找,因为在进行压缩前并不知道那个字符不使用,因此在使用中经常是通过一定的技巧处理。如在BMP文件中,通过引入了4种特殊的识别码对压缩文件的结构和不重复的数据进行控制,而对于相同的数据采用两个字节进行表示,即第一个字节表示重复的个数,第二个字节表示重复的数据;在PCX文件中,对一串重复的字节同样利用两个字节来表示,但必须将第一个字节的高两位设为11, 剩余的六位来表示重复的个数,而对于不同的数据,当遇到的字节的值困)大于OXCO (192)时,为避免同压缩数据发生冲突,需要用OXC1N两个字节来表示,其余数据不作处理,按原样复制【10】。因此,所使用技巧的好坏将在一定程度上影响最终的压缩结果。
图3-1 图像压缩方式
RLE压缩编码,虽然适用于任何类型的数据,并且算法简单、易于实现等有利特点,但其压缩比较低。这是由于在该压缩算法中,其压缩比关键取决于被压缩的数据流中重复出现数据的次数、平均游程的长度及所采用的编码结构。因此在采用RLE压缩方法时,必须处理以下几个制约压缩比的问题【11】。
(1)在原始图像数据中,除部分背景图像的像素值相同外,没有更多连续相同的像素。因此如何提高图像中相同数据的问题是提高数据压缩比的关键。
(2 )在原始图像数据中,如何寻找一个特殊的字符,使它在我们的图像中不用或很少使用的问题。
(3)在有重复字节的情况下,如何提高重复字节数(最多为255)受限的问题。
在计算机中图像的显示采用RGB三原色模型,每一种颜色都可通过这三种基色进行组合来得到。这三种基色中的每一种都有一个从(l到255的取值范围,故组合能够得到的大约1.67千万(256 X256 X 256)种颜色。但在现实世界中,由于人眼视觉的分辨能力所限,经常使用其中的一小部分即可满足要求,在256色图像中,由于最多使用其中的256种颜色,故称之为256色图像。256色图像是一种通过调色板来进行压缩的一种方法。图像中每一个像素点用一个字节来表示,该字节的值并非颜色值,而是调色板的索引值,通过索引值在调色板中查找颜色值的方法。由此可以看出,从0到255这256值在图像数据中都经常出现,并且随着图像的不同,每个数的取值情况也不尽相同,因此无法解决第二个问题,即不可能找到一个特殊的字符,用它来做我们必须的标志位。由于第二个问题不能解决,故在使用时,必须采取一定的数据结构,这又直接造成了第三个问题不能解决。因此只能通过解决第一个问题来提高RLE数据压缩方法的压缩比。在此设A表示一幅长m宽n的图像数据矩阵,该矩阵的元素值为某一颜色分量的颜色值(或该图像的索引值),则对A,作线性变换:
(其中K,为一非0的整数,B为一m*n矩阵) (3-1)
变换结果仅是在xy平面的平移和尺度变换,变换后矩阵的元素值之间的相关性没有发生改变。如果假使让k,为一小数(或分数)或者采用高等数学方法,如Fourier变换、DCT(Discrete Cosine Transform)变换等,则变换后矩阵的元素值的二进制表示位数一般将会增大,可能造成图像信息的损失,经过压缩后的数据无法完全恢复,不符合RLE无损图像压缩的定义。因此,目前也无法通过现有的数学方法来提高图像中相同数据值的问题。
总之 ,通过上面的研究分析可知,在现有RLE编码数据结构下,很难实现RLE编码的质的飞跃,只能从其他途径着手研究以期得到新的发现。
3.2 RLE算法的改进
3.2.1图像特性分析
随机取一幅图分析,可以发现在这幅图像中,图像像素值并非随机排列,而呈现一定的规律:除图像景物的边界以外,在图像的任意一个局部内图像像素值是渐变的,即每一点像素的值同它周围的其他像素的值大小相同或相近。这一现象 ,实际上就是在第一章讨论的一种数据冗余—空间冗余。这种冗余是由于像素间存在的相关性产生的,利用这一相关性图像内一点的像素可以在一定程度上从周围的其他像素预测出来。预测编码正是基于这一原理应用而生的,但是由于不同图像有不同的像素分布,使得预测编码无法寻找一个固定的预测算法,并且如果使用的参考范围很大的话,预测算法的复杂度也将迅速增大。但是在预测编码中解决了图像像素之间的相关性问题,而在RLE编码中主要是利用图像像素相同的一种特殊的相关性,那么图像像素之间的相关性对RLE编码有没有其它的促进作用呢?
在一幅灰度图像中,这种空间冗余表现在数据上的一种情况就是具有相同的高位,即高位表示图像的相似性,低位表示图像的局部细节。图3-2中的三幅图为三幅经典的256级灰度图,表3-1是对三幅图像原始数据在具有高1—8位二进制比特位相同的所有相邻图像像素的统计,例如表中第4列表示三幅图像中高3位比特数相同的相邻图像像素的bytes数为30455,61630和57997,图3-3为在不同二进制比特位的位数下的百分含量图【12】。

图3-2 256级灰度图像
表3-1灰度图像在不同二进制比特位的位数的统计数据

高位相同的位数
图3-3 灰度图像在不同二进制比特位的位数下的百分比含量图
从图3-3中可以直观的发现在灰度图像中相邻像素出现完全相同的概率降低,三幅图像均不超过30%,并且均随着相同位数的降低,出现相同情况的概率逐渐增大,在仅考虑最高位时,概率几乎达到100%,由此可见在灰度图像中相邻图像像素具有极大的相似性。
现在分析一下彩色图像,图3-4是二幅256彩色图像,表3-2和图3-5分别是对图3-4进行统计得到的在不同二进制比特位的位数下相邻像素的相同数据统计表和百分含量图,从中也体现出相似的特点。

图3-4 256色彩色图像

表3-2 256色彩色图像在不同二进制比特位的位数的统计数据

高位相同的位数
图3-5 256色图像在不同二进制比特位的位数下的百分含量图
由此可以得出如下结论:
1. 在大多数位图文件中,完全相同的相邻的图像像素出现的几率很小。
2. 随着将用于表示图像像素的数据相同的位数由高降低,高位相同的数据出现的几率也逐渐增大,也即图像表现出更多的相关性。
3.2.2数据膨胀现象的研究
在上节图像特性统计中,相邻的两个像素只要出现相同便进行了统计。但由RLE算法定义可知在RLE中只有当相同像素的个数大于3时才有压缩效果。因此需要对图像中相邻像素的分布情况进一步分析。图3-6是对图3-3a图像相邻像素分布情况的统计,图中区域1为图像中仅有2个相邻像素相同的像素个数占全体像素个数的百分含量,区域2为图像中大于2个相邻像素相同的像素个数占全体像素个数的百分含量,区域3为图像中相邻像素不同的像素个数占全体像素个数的百分含量。

图3-6 相邻像素分布统计情况
从图中可知:在一幅图像中相邻像素相同的概率很小,大于2个像素相同的情况则更少,这样就使得在采用RLE算法进行编码时压缩比较低。更为严重的是由于大量2个像素相同的情况的出现,将大片的图像数据分割成许多小的不连续的字符串S(相邻数据不相同),从而在使用RLE算法时不得不加入许多识别码,这就使得使用RLE压缩算法编码时经常出现数据膨胀的现象。例如字符串”abbcdeefbb acddefgaa……”将会被“bb,ee ,bb ,dd ”分割成”,a,c d,f ,a c,e fg,aa,…… ,”许多小的字符串,编码时显然必须加入许多识别码,结果使得被压缩字符串发生膨胀。由于在R LE8编码中,1个字符、2个不同字符、及3个不同字符出现的次数对数据膨胀现象的影响作用较大,因此,如果在编程实现算法时将压缩的有效性考虑进去,将很大程度上避免数据膨胀的现象。图3-7是对图3-3a进行压缩时在是否优化(即考虑相邻2个像素相同情况与否)情况下3种长度的字符串出现情况的柱状图。图中横轴表示字符串S的长度,纵轴表示图像中出现的次数。

图3-7 3种长度的字符出现情况图
从图中可以直观地看出,优化后,比较短小的字符串5出现的情况可以得到很好的抑制,因此在编码时可以较少的引入识别码,从而避免出像图像膨胀的现象。表3-3为对图3-2c和图3-3a采用RLE8的压缩比数据。
表3-3 采用RLE8的压缩比数据

3.3二值图像算法的分析比较
3.3.1二值图像游程编码的特点
二值图像的特点:
a. 假定二值图像大小为m*n,其中物体像素值为1,背景像素值为0;
b. 二值图像处理的算法简单,易于理解和实现,计算速度快;
c. 二值视觉所需的内存小,对计算设备要求低;
d.二值视觉系统技术可用于灰度图像视觉系统 。
游程长度编码是用图像像素值连续为1的个数来描述图像两种方法【13】:
1、用1的起始位置和1的游程长度。
2、用游程长度,从1的游程长度开始描述。
例:
表3-4 图像原始数据

1的游程:(2,2)(6,3)(13,6)(20,1)
(4,6)(11,10)
(1,5 )(11,1)(17,4)
1和0的游程长度:-1, 2,-2,3,-4,6, -1,1;
-3,6,-1,10 ;
5,-5,1,-5,4。
3.3.2二值图像分析与扫描算法比较
1二值图像的几个概念
(1)近邻
4邻点(4-neighbors):有公共边关系的两个像素。
8邻点(8-neighbors):两个像素至少共享一个顶角。
4连通(4-connected):一像素与其4邻点的关系。
8连通(4-connected):一个像素与其8邻点的关系。

图3-8 4-路径和8—路径示意图
(2)路径:
路径:从像素到像素的一个像素序列。
4路径:像素与其近邻像素是4连通关系。
8路径:像素与其近邻像素是8连通关系。
(3)前景:图像中值为1的全部像素的集合,用S表示。
(4)连通性:已知像素,如果存在一条从p到q的路径,且路径上的全部像素都包含在S中,则称p与q是连通的。
(5)连通成份:一个像素集合S ,如果S 内的每一个像素与集合内其它像素连通,则称该集合为一个连通成份。
(6) 背景 (S的补集)中包含图像边界点的所有连通成份的集合。
洞:S中所有非背景其它元。
对物体和背景应使用不同的连通.如果对S 使用8连通, 则对S 应使用4连通。

图3-9 背景和洞
(7) 边界:S的边界是S中与 中有4连通关系的像素集合 。
(8) 内部:S中不属于它的边界的像素集合,S的内部等于S – 。
(9) 包围:如果从S中任意一点到图像边界的4路径必须与区域T相交,则区域 T 包围区域 S(或S在T内)。

图3-10 一幅二值图像与它的边界
2二值图像游程编码几种常见的图像扫描算法【15】
算法1:递归算法,递归算法在串行处理器上的计算效率低,主要用于并行机算法,连通成份递归算法步骤如下:
(1).扫描图像,找到无标记的1点,给它分配一个标记 L;
(2).递归分配标记L给1点的邻点;
(3).如果不存在没标记的点,则停止;
(4).返回第一步。

图3-11 一副图像及其连通成分图像
算法2:序贯算法,4连通成份序贯法:
(1).从左至右、从上到下扫描图像。
(2).如果像素点为1,则:
(a) 如果上面点和左面点有一个标记,则复制这一标记。
(b) 如果两点有相同的标记,复制这一标记。
(c) 如果两点有不同的标记,则复制上点的标记且将两个标记输入等价表中作为等价标记。
(d) 否则给这一个像素点分配一新的标记并将这一标记输入等价表。
(3).如考虑更多的点,则回到第二步。
(4).在等价表的每一等价集中找到最低的标记。
(5).扫描图像,用等价表中的最低标记取代每一标记。
算法3 边界跟踪算法:
(1)从左到右、从上到下扫描图像,求区域S的起始点s(k)=(x(k),y(k)),k=0..。
(2)用c表示当前边界上被跟踪的像素点。置c=s(k),记c左4-邻点为b,b不属于S。
(3)按逆时针方向从b开始将c的8个8-邻点分别记为n(1),n(2)……n(8),k=k+1。
(4)从b开始,沿逆时针方向找到第一个n(i)属于S。
(5)置c=s(k)=n(i),b=n(i-1)。
(6)重复步骤(3)(4)(5)直到s(k)=s(0)。
算法4,逐行扫描算法:
(1)从左到右逐行扫描图像。
(2)用负数记录0的个数(即背景颜色),用正数记录1的个数。
在一幅图像中找出连通成份是机器视觉中最常见的运算之一。连通区域内的点构成表示物体的候选区域。机器视觉中的大多数物体都有表面,显然,物体表面点投影到图像平面上会形成空间上密集的点集.这里应该指出,连通成份算法常常会在二值视觉系统中形成瓶颈效应,原因是连通成份运算是一个全局性的运算,这种算法在本质上是序贯的。如果图像中仅有一个物体,那么找连通成份就没有必要;如果图像中有许多物体,且需要求出物体的特性与位置,则必须确定连通成份,在这种情况下一般采用连通成份递归算法或4连通成份序贯法。当一幅二值图像边界比较明显且其图像内部的像素值基本都是1,这种情况下我们优先采用边界跟踪算法进行图像扫描,这样有利于提高计算机扫描速度。由于本次进行的程序设计的二值图像比较小,经综合考虑,本人采用了算法4,即逐行扫描算法,这种算法在编程时思路清晰,且不易出错或失真,得出的结果简单明了。

第四章 二值图像游程编码的算法实现与系统功能
4.1算法实现
4.1.1文本压缩部分
初始化计数变量(已读字符数C,重复字符数R);
如果待压缩文本m_cOriginalText没有结束{
读取当前字符CH;
如果当前字符是第一个字符,将比较字符SH设为当前字符,continue;
如果当前字符等于比较字符,重复次数加一,continue;
如果重复次数小于3,将比较字符写入压缩流m_cCompressText:重复R次;
重复次数置零,将比较字符设为当前字符,continue;
将重复字符,以三字节格式写入压缩流m_cCompressText;
重复次数置零,将比较字符设为当前字符,continue;
}
注:continue表示结束本次循环,并转下次循环的入口点。
4.1.2文本解压部分
如果压缩文本m_cCompressText中还有字符{
读取当前字符cCur;
如果当前字符等于’@',读取重复字符cR以及重复次数iNum,将重复字符写入解压流m_cUncompressText:iNum次,continue;
将当前字符写入解压流m_cUncompressText;
}
4.1.3 图象压缩部分
对于二值矩阵Original的每一行{
重复计数iNum赋值为1;
对于该行的第一列~倒数第二列中的每一列{
如果当前列的值=下一列的值{
重复计数iNum加一;
如果当前列是倒数第二列{
如果当前列的值=1,将iNum写入压缩数据链pCompress,否则将-iNum写入压缩数据链pCompress;
}
}
否则{ //如果当前列的值不等于下一列的值
如果当前列的值=1,将iNum写入压缩数据链pCompress,否则将-iNum写入压缩数据链pCompress;
置重复计数iNum为1;
如果当前列是倒数第二列{
如果下一列的值=1,将+1写入压缩数据链pCompress,否则将-1写入压缩数据链pCompress;
}
}
}
}
4.1.4 图象解压部分
如果解压的结果数组Uncompress没有填满{
如果压缩数据链pCompress上的数据已处理完,结束解压;
从压缩数据链上取一个数据;
如果数据值val>0,则向解压结果数组Uncompress中写入val个1,否则写入-val个0(也可写-1);
准备取下一个数据;
}
4.2系统的功能实现
4.2.1 程序运行主界面
本实验的程序采用VC6.0编制【16】,程序类型为MFC,实验的主界面如图4-1。点击菜单“RLEText”,将弹出“文本的游程压缩”对话框,如图。点击菜单“RLEBmp”,将弹出“图像的游程压缩”对话框,如图4-1。

图4-1 程序主界面
4.2.2 文本游程压缩的界面与程序
点击“压缩”按钮,压缩结果将出现在相应的文本框中,如图4-2。压缩代码如下。
//【获取原文本】
CString sOriginalText,s;
this->GetDlgItemText(IDC_EDIT_Original,sOriginalText);
strcpy( m_cOriginalText,(LPSTR)(LPCTSTR)sOriginalText );
//【压缩文本】
//初始化计数变量
int R=0; //重复字符数
int C=0; //已读字符数
int CC=0;
char CH; //当前字符
char SH; //比较字符

//如果文本没有结束{
do{
//读取当前字符
CH=m_cOriginalText[C];
C++;
//如果当前字符是第一个字符,将比较字符设为当前字符,continue
if (C==1){
SH=CH;
Continue;
}
//如果当前字符等于比较字符,重复次数加一,continue
if (CH==SH){
R++;
Continue;
}
//如果重复次数小于3,将比较字符写入压缩流:R+1次; 重复次数置零,将比较字符设为当前字符,continue
if (R<3){
for(int i=0; i< =R; i++){
m_cCompressText[CC]=SH;
CC++;
}
R=0;
SH=CH;
Continue;
}
//将重复字符,以三字节格式写入压缩流;重复次数置零,将比较字符设为当前字符,continue
m_cCompressText[CC++]='@';
char cNum=(char)(R+1);
m_cCompressText[CC++]=cNum;
m_cCompressText[CC++]=SH;
R=0;
SH=CH;
//}
} while( CH!='\0' );
C--;
m_cCompressText[CC]='\0';
s.Format("原字符数=%d\n 压缩字符数=%d\n 压缩比=%f",C,CC,(C+0.0)/CC);
::AfxMessageBox(s);

//【设置压缩文本,激活解压按钮】
this->SetDlgItemText(IDC_EDIT_Compress,CString(this->m_cCompressText));
CButton *pBtn;
pBtn=(CButton*)GetDlgItem(IDC_BUTTON_Uncompress);
pBtn->EnableWindow(TRUE);
pBtn=(CButton*)GetDlgItem(IDC_BUTTON_Compress2);
pBtn->EnableWindow(TRUE);

图表 4-2 文本压缩界面

图表 4-3文本的游程压缩结果(将字节计数转换为字符串)
我们发现压缩结果中,重复因子的第二个字符,即用于计数的字符无法显示。要显示计数,需获取重复因子的第二个字符的ASCII码对应的字符串,处理结果如图4-3。代码如下。
//将压缩文本中的@后的一字节计数用数字串替换
int iAt,iStart=0;
char cNum;
CString csCompressText,csNum;
csCompressText.Format(“%s”,m_cCompressText);
while( (iAt=csCompressText.Find(‘@’,iStart))>=0 ){
cNum=csCompressText.GetAt(iAt+1);
csNum.Format(“[%d]“,int(cNum));
csCompressText.Delete(iAt+1);
csCompressText.Insert(iAt+1,csNum);
iStart=iAt+1;
}
this->SetDlgItemText(IDC_EDIT_Compress,csCompressText);
我们对压缩的文本进行解压,得到的还原文本与原文本一样,处理结果如图4-4。代码如下。
int iC=0/*压缩文本字符计数*/,iU=0/*解压结果文本字符计数*/;
int iNum/*重复次数*/;
char cCur/*当前字符*/,cR/*重复字符*/;

//如果压缩文本中还有字符{
while( m_cCompressText[iC]!=’\0′ ){
//读取当前字符;
cCur=m_cCompressText[iC];
iC++;
//如果当前字符等于’@',读取重复字符cR以及计数iNum,将重复字符写入解压流:iNum次,continue;
if (cCur==’@'){
cR=m_cCompressText[iC+1];
iNum=(int)m_cCompressText[iC];
for(int i=0; i m_cUncompressText[iU++]=cR;
}
iC+=2;
continue;
}
//将当前字符写入解压流;
m_cUncompressText[iU++]=cCur;
//}
}
m_cUncompressText[iU]='\0';
this->SetDlgItemText(IDC_EDIT_Uncompress,CString(this->m_cUncompressText));

图表 4-4文本的游程压缩-解压
4.2.3 图象压缩的界面和程序
图像游程压缩的原始数据为二值数组,我们用方格阵列来模拟该二值数组,方格填充对应的数值为1,否则为-1。通过绘制方格阵列,我们可获得原始数据,如图4-5。

图表 4-5图像的游程压缩-绘制图像
点击“压缩”按钮,得到的压缩结果如图4-6,代码如下。
//对于二值矩阵Original的每一行{
for(int i=0; i //重复计数iNum赋值为1;
iNum=1;
//对于该行的第一列~倒数第二列中的每一列{
for(int j=0;j< (PANES_Col-1);j++){
//如果当前列的值=下一列的值{
if( Original[PANES_Col*i+j]==Original[PANES_Col*i+j+1] ){
//重复计数iNum加一;
iNum++;
//如果当前列是倒数第二列{
if( j==(PANES_Col-2) ){
pNext=new CompressNode;
//如果当前列的值=1,将iNum写入压缩数据链pCompress,否则将-iNum写入压缩数据链pCompress;
pNext->val=(Original[PANES_Col*i+j]==1)? iNum:(-iNum);
pNext->next=NULL;
pPre->next=pNext;
pPre=pNext;
iNum=1;
}
}
//否则{ //如果当前列的值不等于下一列的值
else{
pNext=new CompressNode;
//如果当前列的值=1,将iNum写入压缩数据链pCompress,否则将-iNum写入压缩数据链pCompress;
pNext->val=(Original[PANES_Col*i+j]==1)? iNum:(-iNum);
pNext->next=NULL;
pPre->next=pNext;
pPre=pNext;
//置重复计数iNum为1;
iNum=1;
//如果当前列是倒数第二列{
if( j==(PANES_Col-2) ){
pNext=new CompressNode;
//如果下一列的值=1,将+1写入压缩数据链pCompress,否则将-1写入压缩数据链pCompress;
pNext->val=(Original[PANES_Col*i+j+1]==1)? 1:(-1);
pNext->next=NULL;
pPre->next=pNext;
pPre=pNext;
iNum=1;
//}
}
//}
}
//}
}
//}
}
//显示压缩结果,激活解压按钮
pPre=pCompress->next;
CString csCompress=”",cs;
int iSum=0;
while(pPre!=NULL){
cs.Format(“%6d”,pPre->val);
csCompress+=cs;
if(pPre->val>0)
iSum+=pPre->val;
else
iSum-=pPre->val;
if(iSum%PANES_Col==0)
csCompress+=”\r\n”;
pPre=pPre->next;
}
this->SetDlgItemText(IDC_EDIT_Compress,csCompress);
CButton *pBtn;
pBtn=(CButton*)GetDlgItem(IDC_BUTTON_Uncompress);
pBtn->EnableWindow(TRUE);

图表 4-6图像的游程压缩-压缩
点击“解压”,将在还原图像区显示解压结果,如图4-6,代码如下。
//如果解压的结果数组Uncompress没有填满{
while( k< (PANES_Row*PANES_Col) ){
//如果压缩数据链pCompress上的数据已处理完,结束解压;
if(p==NULL)
break;
//从压缩数据链上取一个数据;如果数据值val>0,则向解压结果数组Uncompress中写入val个1,
if(p->val>0){
for(int i=0; i

val; i++)
Uncompress[k++]=1;
}
//否则写入val个-1;
else{
for(int i=0; i< (-p->val); i++)
Uncompress[k++]=-1;
}
//准备取下一个数据;
p=p->next;
}
pTable2->Fill(Uncompress);

第五章 总结与展望
5.1 总结
二值图像是一种广泛应用的图像之一,如气象图、工程图、地图、线路图等,因此对于二值图像数据编码的研究变得尤为重要。为此,本人对游程编码数据压缩原理作了深入研究并把其应用于二值图像的数据压缩。本文的主要工作如下:
1.介绍了数据压缩的研究现状和理论基础。主要包括数据压缩的发展历程、分类、标准、新方法和新技术。并通过对数据压缩理论基础的研究得出数据压缩的必要性和可能性。
2.对游程编码数据压缩原理进行了深入的研究,得出了二值图像游程编码数据压缩的基本算法思想,然后讨论了二值图像游程压缩算法的初步模型和流程,初步得出了本课题的实现方案。
3.对二值图像游程编码进行了更加深入的研究,对图像特性和数据膨胀现象进行了分析和研究,通过对几种二值图像游程编码算法的研究与比较,选出最简单最实用的算法实现了一个符合本课题的压缩软件。
经过这段时间的学习与实践,我对二值图像游程编码与信号编码的发展及现状有了更深刻的认识,意识到数据压缩与解压对社会生活的巨大影响及其潜在经济效益,并对Microsoft Visual C++ 6.0软件有了一定程度的了解,学习了信源编码的相关知识及如何利用Microsoft Visual C++ 6.0编译程序。经过这段短暂时间的学习,我想我对于知识的猎取是有限的,关键是我学会了如何用认真、严谨的学习态度去面对工作,如何用自学的方法来处理问题,如何以积极的团队协作精神去相处同组同学。
5.2 展望
二值图像游程编码一般不直接应用于多灰度图像,但是比较适台于二值图像的编码,例如传真图像的编码等。为了达到较好的压缩效果,有时二值图像游程编码和其它一些编码方法混台使用。例如,在JPEG中,二值游程编码和离散余弦变换DCT(Discrete Cosine Transform)及霍夫曼(Huffman)编码一起使用,对分块做完DCT及量化后的频域图像数据做z形扫描,然后做游程长度编码,对游程长度编码的结果再做霍夫曼编码。
二值图像游程压缩作为数据压缩技术的一个分支,理论浅显,压缩比之高已经让人刮目相看,这不由令人对数据压缩技术肃然起敬。走过半个多世纪的离散余弦变换理论在数据压缩领域至今不衰;新兴的神经网络理论将数据压缩推向了一个新的高度;近来,小波变换理论更使数据压缩技术登峰造极,图像压缩的JPEG2000标准使小波理论傲视群雄。可以预见,新的数学理论将不断为数据压缩技术输入新鲜血液,因此数学理论决不可偏废。
最后,给出一点使用无损压缩算法的建议。由于每种无损压缩都有自己的适用范围,压缩比受不失真要求的限制,真正意义上高压缩比的通用无损压缩算法目前还有待继续研究。因此在选用算法之前需要对图像数据进行分析,使用时根据数据表现出的特点,利用算法的思想,灵活使用算法是提高压缩比的有效手段。

参考文献

[1] 肖自美.图像信息理论与压缩编码技术[M].广州:中山大学出版社,2000:5~12.
[2] Yun Q.Shi,Huifang Sun,Image and video compression for multimedia engineering fundamentals[J].algorithms and standards,CRCPress,1999.
[3] 邓家先.遥感图像编码技术研究[D]:[博士学位论文].西安:西安电子科技大学,2004.
[4] KuntM,etal.Second-generation image-coding techniques[N],ProcIEEE,1985,73(4):549~574.
[5] 毓晋.图像处理和分析[M].北京:清华大学出版社,1996:43~52.
[6] 吴乐南.数据压缩[M].北京:电子工业出版社,2000:54~57.
[7] 刘冰.游程长度编码算法的研究[J]. 天津理工学院学报, 10(6): 77~81.
[8] G.held,T.R.Marshall,Date and Image compression[M].4th ed,JOHN WILEY&SONS LTD.1996.231~241.
[9] Rubin, Experiments in text file compression[M].Communications of the ACM,1998.617~623.
[10] 晶晨工作室编著,最流行图像格式使用参考手册[M].北京:电子工业出版社,1998:75~84.
[11] David Salomon, Data Compression[M]. The Complete Reference, Springer-Verlag New York Inc, 2000:56~70.
[12] 籍俊伟,林小竹,图像编码中的RLE方法研究[J].石油化工高等学校学报,2004,17 ( 1 ),83~87.
[13] 张琳. 数字图像编码方法研究.[D]:[硕士学位论文].吉林:吉林大学,2003.
[14] 阮秋琦.数字图象处理学[M].北京:电子工业出版社,2003:154~168.
[15] Steve Rimmer,木杉. Windows图象处理实用技术和范例[M].北京:学苑出版社,1994:105~112.
[16] 周长发.精通Visual C++图象编程[M].北京:电子工业出版社,2003:110~129.

附录
1.图像压缩主干代码清单(Visual C++ 6.0):

}
2 文本压缩主干代码清单: