Lossless Codec---APE代码解读系列(一)

                                                     Monkey's Audio --- APE 编码原理

APE代码解读系列(二)

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;

 

转载于:https://www.cnblogs.com/huaping-audio/archive/2009/11/18/1605158.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值