Monkey's Audio --- APE 编码原理
APE 的压缩三大理论:
(1) Mid/Side Coding
Mid/Side Coding 是2channel audio编码中常用方法,通过对R, L 数据进行变换,使得相关数值变小,这样就减少了量化位数。
The mid(X) is the midpoint between the L and R channels and the side(Y) is the difference in the Channels
X = (L + R)/2;
Y = (L - R);
Decompress Code for 2channels:
if(nChannels == 2)
{
if(nBitsSample == 16)
{
int nR = X - (Y/2);
int nL = NR + Y;
//error check for overflow
if((nR < -32768) || (nR > 32767) || (nL < -32768) || (nL > 32767))
return ERROR_ID;
*(int16 *) pOutput = (int16) nR;
CALCULATE_CRC_BYTE //APE frame have CRC Check.
CALCULATE_CRC_BYTE
*(int16 *) pOutput = (int16) nL;
CALCULATE_CRC_BYTE
CALCULATE_CRC_BYTE
}
else if
{
.......
}
}
(2) Predictor
在时域上的音频信号彼此的correlation很大
利用adapting 的 predictor(adapting Wiener filter)将信号中可预测的部分取出
APE 采用自适应预测,原理是:用过去几个samples 值来预测当前的值,过去的值用得越多,预测得到的值更接近真实值。
然后对真实值-预测值的差值进行编码,这样又进一步减少了量化的bits数。
对时间序列当前值预测有三种模型: MA 模型---滑动平均模型, AR模型---自回归模型, ARMA模型---自回归滑动平均模型。
关于这三个模型可以参考<随机过程>这本教材
在下一篇文章,我会用整篇来详细探讨APE Codec 如何应用这一理论,实现lossless编码。
(3) Rice Coding
预测编码所需要的位元数
没有overflow 的信号就用这几个位元编码
Overflow的信号再外加特殊的识别码表示之。
Rice Coding, 属于熵编码一种,相当于Huffman子类,由于不是很常用,所以大家可以不是很熟悉。
Rice Coding 对小值数据进行lossless压缩效果很明显,上次(1)(2)二步都是使samples值变得尽量的小,为Rice Coding做好准备
Rice Coding 由基本序列FS --- Foundamental Sequence, 和劈分(sample splitting) 二部分组成。FS 是一种逗号码。数值m 对应
由m个0接一个1构成的码。码字唯一不需要码本。劈分技术是假定一个块中每个输入的k个最低有效位都是随机。因而不能压缩,给定编码
参数k, 对于一个N位数据,编码时,首先对N-K个最有效位使用FS进行编码,接着直接用二进制编码随机的k位,然后使用FS编码后的结果
与k位LSB相连接形成Rice 码。
Rice编码需要对参数k进行估计,不同的编码方法都给出了有效的估计方法(在接下的系列文章中,会对APE Codec采用的方法进行分析)
所有的Rice 码都扩展成非负值n
每个码字都分为高阶(unary)和低阶(binary)二部分,具体编码如下:若编码参数为k, 待编码的非负数整数为n,则
unary = n/2^k;
binary = n%2^k;