刘品
学以致用---博主简介:专注语音、视频数字信号处理方面的研究以及算法在手机平台上面的移植和优化。涉及语音/音频编解码,语音增强,语音识别,语音音质客观评估,VOIP语音引擎 Qos算法模块和声音变速不变调和变调不变速等功能实现。熟悉ARM 各个系列的CPU,用ARMv4,ARMv5,ARMv6 and Cortex Neon 汇编优化相关算法代码,争取perforamance 最优。目前主要Windows mobile and Android platform上做相关speech/audio算法以及应用开发, HEVC 编解码器PC 和手机上的开发与应用。(交流Email:liupin.2008@gmail.com)

                                                     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;

 

posted on 2009-11-18 10:05  liupin  阅读(2753)  评论(1编辑  收藏  举报

-->