APE和FLAC压缩原理
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.APE压缩原理
数字音频:
声音简单的说是一种波,而数字化音频是声波的数字化形式。
这是通过对大量的模拟信号在每秒钟
“采样”很多次而达到的。
这个过程在概念上可以理解为在每秒钟内对声波波形的最高点进行多次记录。
现在市面上的音乐CD储存的就是对声音的每秒钟进行44100次的采样。
自从CD都以立体声方式
来压制时,对声音的采样也变为每秒钟同时对左右声道采样44100次,采样得到的数值用16位的二进制整数来表示。
基本上,一个WAV(波形)文件都有一个文件头,后面跟随一系列的右(声道信号),左(声道信号),右,左......而当每个采样数值占用32位二进制数位(16位左声道,16位右声道),每秒钟44100的采样频率时,记录一秒钟的声音就要使用1,411,200个二进制位,或者说是176,400字节(176.4KB)。
无损压缩:
1)转化至X,Y
无损压缩的第一步就是更有效的将左右声道的模型化为X,Y值。
通常在左右声道之间存在着大量的相关性,可以通过好几种方式来处理,最常用的是通过使用“中/ 边值编码”。
在这种情况下,编码时
采用的是一个中点值(X)和一个边值(Y),而不是左右声道数值。
中点值(X)是左右声道数值的中间值,边值(Y)是两声道数值的差值。
这可由以下的公式得到:
X = (L + R) / 2
Y = (L - R)
2)预测器
下一步,X和Y数据流经一个预测器来去除冗余。
基本上,这一步的目的是使得X Y序列中包含尽可
能小的可解压的数值。
从这一步里,一个压缩进程和另一个压缩进程相互隔开。
实际上,有无数种方
法可以实现这一步。
这里举一个使用简单线形代数的例子:
PX和PY是预测的X,Y值;X1是最初的X值,X2是经过二次预测的返回值;
PX = 2 * X1 - X2
PY = 2 * Y1 - Y2
例如:当X = (2,8,24,?);PX = (2 * X1) - X2 = (2 * 24) - 8 = 40
那样,将预测值和实际值相减,差值(错误)被传送到下一步编码。
多数好的预测器都是具有适应性的,它们能调整到处理当前数据所需的“可预测”程度。
举个例子,
当我们使用一个在0到1024之间的数m作为因子(0是无法预测,1024是全预测),每次预测后,m
会根据预测是否有用来向上或者向下调整。
这样,在前面的例子中,留给预测器的是:
X = (2, 8, 24, ?)
PX = (2 * X1) - X2 = (2 * 24) - 8 = 40
如果 ? = 45 并且 m = 512, 那么 [最终值] = ? - (PX * m / 1024) = 45 - (40 * m / 1024) = 45 - (40 * 512 / 1024) = 45 - 20 = 25
在这以后,m将向上调整,因为更高的m数值将会更有效。
使用不同的预测等式和在预测器里使用乘法处理,将会给压缩级别带来细微的不同。
这里有份技术文
档里的对应于不同需求的预测等式简表:
P0 = 0
P1 = X1
P2 = (2 * X1) - X2
P3 = (3 * X1) - (3 *X2) + X3
3)数据编码/赖斯编码
音频压缩的目的是要让所有的数尽可能地小,通过去除它们之间存在的冗余。
一旦这个目的达到之后,结果数据必须要写入到磁盘里。
诸多(可能并不是)最有效途径中的一种,就是采用赖斯(Rise)编码。
为什么越小的数值越好?因为它们能用更少的二进制位来表达。
例如,我们要对一个数列(32位字长)进行编码:
十进制:10,14,15,46
转成二进制为:1010,1110,1111,101110
现在,如果我们要用最可能少的数位来表示这些数字的话,对于每个数我们都要用32位二进制来表示,显然是很没效率的。
那样要占用128个数位,而且仅从二进制表达的数字看来,它们有相同部分,一
定有更好的办法来表示。
理想的方法就是使用最少的并且必须的数位,直接把四个数拍到一起,那么1010,1110, 1111,101110在去掉逗号的时候就是101011101111101110。
这里的问题就是,我们不
知道一个数从哪里开始,而下一个又是从哪里开始。
这个时候就该是赖斯(Rise)编码上场了。
赖斯(Rise)编码是一种使用较少的数位来表示小的数目,同时能保持对数字进行区分的能力的方法。
基本上它是这样工作的:
1)对于表达一个数目需要多少数位,你做了你最好的猜测,把它记做k;
2)取数目中的右边k位数并且记住;
3)想象没有右边k位数的二进制数,观察它的新值(不符合k位时溢出);
4)使用这些新值对数目进行编码。
编码值用与第3步对应的一组0来表示,0后面以1来终结,用于告知“发出溢出信号完成”,之后跟随第2步得到的k位数。
让我们用我们刚才的例子,对我们的数列10,14,15,46中的第四个数进行编码。
1)既然前面的三个数都占用4个二进制位,那么对于第四个数所占用的数位做个合理的猜测,我们设k=4;
2)取46(101110)中的右边4位1110;
3)当你把101110右边4位去掉后就剩下10(二进制);
4)这样,我们在编码值里先放两个0,然后用1截止,再接上k位数1110,最后我们得到0011110。
现在来逆向进行这个操作,我们只需要有数值0011110和k=4。
首先我们发现溢出为2(在终止数位1前面有两个0),我们还看到数的最后4位1110。
所以,我们只要对溢出值10和数值1110作简单移位就得到原先的数目。
以下是对相同过程更技术化数学化的描述:
假设一个整数n是被编码的数字,k是这个整数直接编码的数位数。
1)标志(1为正,0为负)
2)n / 2^k个0
3)终止数位1
4)余下的k位数
例如,n=578D=100101000010B,k=8,
1)标志:[1](578为正数)
2)n / 2^k = 578 / 2^8 = 578 / 256 = 2 = [00]
3)终止数位:[1]
4)余下的8位:[01000010]
5)把1~4的结果放到一起:[1][00][1][01000010]=[100101000010]
在编码过程中,最合适的k值视乎前面所有值的平均值而定(取16~128的值为佳)。
(基本上是猜测下一个值是什么,然后在此基础上尽量取一个最有效的k值)最适合的k值可以用以下式子来计算:
[log(n) / log(2)]
2.FLAC原理及工作过程
FLAC代表 Free Lossless Audio Codec - 免费的无损音频压缩。
简而言之,FLAC与MP3相仿,但是是无损压缩的,也就是说音频以FLAC方式压缩不会丢失任何信息。
这种压缩与Zip的方式类似,但是FLAC将给你更大的压缩比率,因为FLAC是专门针对音频的特点设计的压缩方式,并且你可以使用播放器播放FLAC压缩的文件,就象通常播放你的MP3文件一样(现在已经有许多汽车播放器和家用音响设备支持FLAC,在FLAC的网站上你可以找到这些设备厂家的连接)。
FLAC项目包括以下几个方面:数据流的格式以库的形式提供的参考编码器和解码器 flac, 一个以命令行方式工作的可以编解码FLAC文件的程序(译注:有些象Lame吧?) metaflac, 以命令行方式工作的FLAC文件的metadata编辑器不同音频播放器的输入插件
FLAC
无损失压缩:被编码的音频(PCM)数据没有任何信息损失,解码输出的音频与编码器的输入的每一个字节都是一样的。
每个数据帧都有一个当前帧的 16-bit CRC 校验码,用于监测数据传输错误。
对整段音频数据,在文件头中还保存有一个针对原始未压缩音频数据的MD5标记,用于在解码和测试时对数据进行校验。
快速:FLAC更看重解码的速度。
解码只需要整数运算,并且相对于大多数编码方式而言,对计算速度要求很低。
在很普通的硬件上就可以轻松实现实时解码。
硬件支持:由于FLAC提供了免费的解码范例,而且解码的复杂程度低,所以FLAC是目前唯一获得硬件支持的无损压缩编码。
可以流化:FLAC的每个数据帧都包含了解码所需的全部信息。
解码当前帧无需参照它前面或后面的数据帧。
FLAC使用了同步代码和CRC(类似于MPEG等编码格式),这样解码器在数据流中跳跃定位时可以有最小的时间延迟。
可以定位:FLAC支持快速采样精确定位。
这不仅对于播放有益,更使得FLAC文件便于编辑。
富于弹性的metadata:可以定义和实现新类型的metadata数据块,而不会影响旧的数据流和解码器的使用。
目前已有的metadata类型包括tag,cue表,和定位表。
已经注册的应用程序可以定义自己专用的metadata类型(译注:这一点与MIDI标准相似)。
FLAC只支持定点取样,并不支持浮点取样,这是因为它要确保没有任何约数错误以致影响音质。
它能支持任何PCMbit resolution,由4 至 32 bits per sample皆有。
它亦支持任何取样频率,由 1 Hz 至 655,350 Hz不等,并可逐1 Hz微调。
应用示例
平台的支持决定普及度
FLAC是免费的并且支持大多数的操作系统,包括Windows, " unix" (Linux, *BSD, Solaris, OS X, IRIX), BeOS, OS/2, 和Amiga。
并且FLAC提供了在开发工具autotools, MSVC, Watcom C, 和Project Builder上的build系统。
非常适合于存档应用:FLAC是一个开放的编码格式,并且没有任何数据的损失,你可以将它转换为你需要的任何其他格式。
除了每个数据帧的CRC和MD5标记对数据完整性的保障,flac(译注:FLAC项目提供的命令行方式编码工具)还提供了一个verify(校验)选项,当使用该选项进行编码的时候,编码的同时就会立即对已编码数据进行解码并与原始输入数据进行比较,一旦发现不同就会退出并且报警提示。
(译者:怎么样,这样压缩出来的东西还有什么不放心的?)
便于对CD进行备份:FLAC有一个“cue表”metadata数据块用于保存CD的内容列表和所有音轨的索引点。
你可以将一张CD保存到一个单一文件,并导入CD的cue表格,这样一个FLAC文件就可以完整地记录整张CD的全部信息。
当你的原来的CD损坏的时候,你就可以用这个文件恢复出与原来一模一样的CD副本。
抗损伤:由于FLAC的帧结构,使得一旦发生数据流的损坏,损失会被限制在受损伤的数据帧之内。
一
般只是会丢失很短的一个片段。
而很多其他无损音频压缩格式在遇到损伤的时候,一个损伤就会造成
后面所有数据的丢失。
FLAC同时亦是保存音乐光盘于电脑中的最佳方法之一,因为其不会破坏音频原始资料,
所以FLAC 案是可以再转回音乐光盘并保留原来的音质。
採用Free Lossless Audio Codec〔FLAC〕的无折损性压缩〔lossless compression〕格式。
FLAC档体积平均为wave档的55%,解压后即可取回原wave档。
FLAC是开放式免费
软件,在Windows、Linux、Macintosh等一切平台皆可操作。
其界面与解压程序如下图所示:
个人评价
作为一种开放源代码并且完全免费的无损音频压缩格式,所以你永远不必担心惹上版权官司。
受益于此,目前有很多音频处理软件都可以输入、输出FLAC格式文件,这给音频的后期处理带来了方便。
另外,FLAC的解码复杂程度相对较低,可以在很简单的硬件(例如汽车音响等等)上实现实时解码播放。
而且FLAC的容错很强,即使有小段音乐损坏,也不会影响后面的音乐播放。
世界知名数码产品如:Rio公司的硬盘随身听Karma,建伍的车载音响MusicKeg以及PhatBox公司的
数码播放机都能支持FLAC格式。
国内知名厂商台电科技的TL-T19第二代双核心电影MP3,已经宣布
对FLAC无损压缩格式的支持。
FLAC是第一个开源的且被世界公认的无损压缩格式,有来自世界各地的顶尖级开发高手对FLAC进行免费的开发与技术完善,同时,FLAC有广泛的硬件平台的支持,几乎所有采用便携式设计的高端解码芯片都能够支持FLAC格式的音乐,FLAC第三个优势在于:优秀的编码使得硬件在解码时只
需采用简单的整数运算即可,这将大大降低所占用的硬件资源!
自我纠错能力,人性化的编码设计,以静音方式代替有损部分。
优化的编码结构,通常FLAC的解码速
度比其它同类编码快30%, FLAC只需执行整数运算,而无需执行占用系统更高频率和更大数据处理量
的浮点运算。
基于这一点,一般硬件均可完美实现实时解码。
方便的资源获取,意味着能够得到更广泛的应用与支持,在资源获取上,可以通过网络搜索轻松获得!是一种平民级的音乐编码。