zoukankan      html  css  js  c++  java
  • [原创]桓泽学音频编解码(2):AC3/Dolby Digital 系统算法分析

    (这个文档也是07年做项目时总结的,今天共享出来)

    1         AC3标准概述

    AC-3技术起源于为高清晰度电视HDTV提供高质量声音。由于电影业对声音技术的要求越来越高,AC-3系统被要求具有5.1声道来替代已经使用了很久的4-2-4矩阵模拟声音系统;同时为了可靠地记录数字声音数据,并且不干扰原有的图像和模拟声音,确定压缩码率为320

    kbps. AC-3在1993年被美国HDTV大联盟及ACATS采用,国际电信联盟ITU-R也采纳了5.1声道的方案。AC-3系统在设计时考虑了不同听觉、不同地点、不同条件下的不同要求,以求能得到广泛应用。AC-3技术包含着灵活性,它可以重现从一到五个通道的各种播放配置,再加上一个任选的低频增强通道。AC-3方案可使用32和640kbit/s之间的可调数据率,提供优良的声音质量,AC-3数据格式用来在已经采用了高度误码校正的环境中操作。欧洲MUSICAM环绕声虽然是ISO MPEG-2的声音标准.但从实际测试情况看,杜比AC-3的效果要强于MUSICAM,所以多数HDTV系统采用AC-3作为声音标准。

    1.1   编码概述

                              编码框图

    AC-3编码器接受PCM音频并产生符合本标准的数码流。AC-3算法通过对音频信号的频域表达式进行粗量化,达到高的编码增益。在编码过程中的第一步是把音频表达式从一个PCM时间样本的序列变换为一个频率系数样本块的序列。这在分析滤波器组中完成.512个时间样本的互相重受样本块被乘以时间窗而变换到频域。由于是相互重叠的样本块,每个PCM输入样本将表达在相继的变换样本块中。频域表达式则可以二取一,使每个样本块包含256个频率系数。这些单独的频率系数用二进制指数记数法表达为一个二进制指数和一个尾数。这个指数的集合被编码成信号频谱的粗略表达式,称为频谱包络。核心的比特指派例行程序用这个频谱包络,确定每个单独尾数需要用多少比特进行编码。将频谱包络和6个音频样本块粗略量化的尾数,格式化成一个AC-3数据帧.人C-3数码流是一个AC-3数据帧的序列。实际的AC-3编码器比上图中所表示的更为复杂。

    1.2 解码概述

                                     解码框图

    解码过程基本上是编码过程的逆过程。解码器如上图,必须同解码数码流同步,检查误码,以及将不同类型的数据(例如编码的频谱包络和量化的尾数)进行解格式化。运行比特指派例行程序,将其结果用于解数据打包和尾数的逆量化.将频谱包络进行解码而产生各个指数。各个指数和尾数被变换回到时域成为解码的PCM时间样本。

    2.AC3 码流结构

      

        

    每个AC-3帧分为三部分,即帧头、音频块和帧尾。在每个同步帧开始是同步信息和比特流信息。每个同步帧包含6个编码的音频样本块,其中每个代表256个新的音频信息。这样,在每帧中每个声道就包含有1536个PCM样本信息。编码的音频样本块之后接着是一个辅助数据(AUX)字段。在每帧中有两个CRC校验字,分别位于帧的开头和结尾,提供校验信息。

    2.1 帧头

    同步帧以一个16比特的同步字开始,同步字总是OxOB77,同步字的传输,同其他比特字段元素一样,是左位比特在先。在帧头中有16比特的CRC循环冗余校验,用于校验数据帧的前5/8。为了满足各种业务的需要,在每帧的比特流信息中都有3比特用于指示数码流运送的业务类型,称为数码流模式位(bsmod) o另有3比特表明哪些主要业务声道正在使用中,范围自3/2至1/0,称为音频编码模式(acmod)位。声道总数nchans在Ife声道断开时,等于nfchans;而在)lfe声道接通时,等于1+nfchans。

    在帧头中另有两比特码用于指示Dolby环绕声模式,即指示某节目是否按照“Dolby环绕声”进行了编码.该信息AC-3解码器本身并不采用,但可用于音频重放设备的其他部分。表中“保留”的意思是“未做指示”,解码器将仍然重放音频。

    2.2 audblk音频块

    每个AC-3帧中有六个音频块,每一个音频块每声道包含256个音频样点,在音频块中包含有块切换标志、耦合坐标、指数、比特分配参数、尾数等信息。数据在一帧内部具有共享性,例如在块0中出现的信息可能会被该帧中后续音频块所利用。这样,在后续音频块中若要用到之前音频块中已经出现的数据,可设置重复使用以前的参数标志,就可不必重传这些数据,以达到减少数据量的目的。但对解码器而言,带来的后果是必须保存一帧中出现的数据,以备为后续音频块解码所需,从而增加了缓冲区的开销,

    动态范围控制字用于使码流符合不同回放场合的需要。在AC-3编码中、引入了声道耦合的概念。所谓声道耦合,指的是一些声道在高频可以耦合在一起,以便工作在较低比特率时,可以得到更高的编码增益。如能做到,在编码中通过将变换系数在包含于耦合声道中各声道之间取平均,来实现藕合。各被耦合声道有一套唯一的耦合坐标,用于保存原始声道的高频包络。

    音频块中的主要部分是指数和尾数值。这里的指数包括耦合指数、声道指数以及低频效果声道指数,同样,尾数值包括耦合尾数、声道尾数以及低频效果声道尾数。

    2.3 帧尾

    帧尾包括辅助数据字段和帧误码校验字段。

    不论何时编码器从不将全部可获得的数据用于音频信号的编码,在帧的最后总存在一些未用的数据。这种情况出现在假使最后的比特指派没有用全部可获得的比特,或假使输入音频信号仅仅是不需要把全部可获得的比特都进行编码。或者,指令编码器有意留出一些比特不用于音频,让它们能用于辅助数据。因辅助数据需要的比特数少于在任一特指帧中可获得的比特数(它们随时间变化),提供了一种方法通过信号告知在各帧中实际辅助数据的比特数。

    各AC-3数据帧包含两个16比特CRC字,CRC1处在帧头,紧随在同步字之后。CRC2处在帧尾,是数据帧的最后一个16比特字,恰在下一个帧同步字之前。CRCI用于前5/8帧,不包括同步字。CRC2覆盖后3/8帧以及全帧(不包括同步字)。

    3.AC3解码算法描述

    3.1 BSI解包和辅助信息

    该过程主要对比特流中不同类型的信息进行解复用,在AC3解码函数中对应于取比特流信息和取音频块信息函数。该操作根据AC3标准规定的结构取出各种码流信息,并将其复制到寄存器或专用工作存储单元中。

    3.2 指数解码

    AC3码流传送的实际音频信息由量化的频谱系数组成。而每个系数由一个指数和尾数组成。指数指示频率系数二进制表达式中前导零的个数如图3-5所示,AC3码流的指数信息包含各种类型声道的指数策略及编码指数组,指数信息在一个数据帧内的各个音频块之间可以共享,即根据不同指数共享策略数据块1到数据块5可以重复使用以前数据块的指数信息。AC3指数的传输采用差分编码,其中声道的第一个指数以4比特的绝对值发送,剩余相继的指数用差分值发送,差分值必须加到上一个指数的绝对值上形成该指数的绝对值。在AC3码流中,差分指数根据不同的指数策略(D15, D25, D45)被映射成相应的映射值,再将相邻的三个映射值根据下面的公式组合成数据组,对于三种指数策略每个数据组的大小都固定为7比特。

    编码的7比特数据组值=(25x Ml)+(5x M2)+M3;

    3.3 比特指派

    比特指派对音频信号从掩蔽效应分析它的频谱包络,以确定分配给各频谱系数的尾数所需要的比特数。比特指派包含一个由频率函数表示的人耳听觉的参数模型,用来估算噪声域值。在编码器中,根据输入信号的特性确定听觉模型的各种参数,将模型参数同其它附带信息传送到解码器。解码器先计算出细颗粒均匀频率标度上的输入信号功率谱密度(PSD),再根据传送的模型参数计算出粗颗粒频率标度上的噪声域值,将两者差值用来查比特指派指针(BAP)表格的索引,查表得到比特指派指针信息。

    3.4  尾数的量化和解码

    尾数的量化和解码根据比特指派计算出的BAP值将所有尾数量化到同一等级精度上。该步骤先从码流中取出尾数信息,再将尾数信息和指数解码解出的频谱指数信息组合成频谱系数,它在AC3解码程序中对应于取尾数信息和尾数解码两个子函数。在编码器中,为压缩音频信息多个量化的尾数值被组合编码成一个码字:在解码时,先将BAP值作为索引在量化表格中查出尾数占用的比特数,再根据该比特数将尾数从码流中取出,由于小于等于15的尾数量化级使用对称量化,15级以上使用非对称量化,则两者的量化和解码公式分别如下公式所示:

    3.5 双声道处理(stereo process)

    在这里利用一些 stereo 的特性和听觉的特性来消除双声道之间的冗余(redundancy)及不需要(irrelevance)的讯号。AC-3 里的stereo process指的就是coupling algorithm 和rematrix algorithm。Coupling algorithm 是根据听觉特性来消除两讯号间不需要的讯号,而rematrix algorithm 则是以stereo的特性来消除两讯号间的冗余讯号。以下将介绍这两种方法。

    3.5.1耦合(coupling)

    人类对高频的 stereo 讯号较不敏感,所以对高频的 stereo 讯号使用coupling策略会有相当显著的效果。Coupling声到的产生方式是结合两个声道变成一个声道。适用的频率范围从3.14KHz 到21.75KHz。 coupling algorithm 主要的组件有 coupling band structure,coupling channel,coordinate,以及phase modifier。如图所示。coupling band structure是将高频的频率成分切割成一些具有不同性质且不能再分割的部分。coupling channel 是由 joint 算法产生出来的 spectral envelope。Coordinate是把 coupling channel 重建回 stereo讯号的scale factor。Phase modifier是把第二个欲重建的声道的相位转180度,如果需要的话。

    3.5.2rematrix

    rematrix algorithm利用了统计上的特性,消除stereo redundancy。从统计的观点来看,rematrix algorithm 把原本的左声道讯号及右声道的讯号转换成这两个讯号的和及这两个讯号的差。根据讯息理论,若这新的讯号对的能量或变异数比原先的讯号对较小的话,就能以较少的位数来编码。 Rematrix 的主要组成组件是 rematrix trigger,用来决定是否要启动rematrix。

    3.6 逆变换及加窗交叠:

    逆变换即完成频域系数到时域系数的转换。在编码中,从以上比特指派的分析可知,声音的掩蔽作用与频率子带有关,所以有必要将输入声音信号分成多个子带,分别对多个子带进行压缩,然后加以合成。AC3采用分析/综合滤波器组对信号进行分割和重建。此外,编码时输入信号在频域变换前先要进行加窗操作,以降低块边界效应对谱分析的影响;而且正弦变换在块边界处有固有的不连续性,会产生很大的噪声,通过将相邻块的采样值重叠50%,然后通过时域混迭消除技术(TDAC)在合成阶段消除边界效应。因此解码过程是上述过程的逆过程,先将多个子带的系数综合成时域系数,将进行加窗交叠操作恢复出音频信号。在逆变换时可选择进行一个512点的变换或两个256点的变换,512点的变换提供较高的频率分辨率而256点的变换提供较高的时间分辨率,因此前者适合于对缓慢地随时间变化的信号进行变换,后者适于对随时间快速变换信号的转换。编码时,根据输入信号的频谱特性和时间特性自适应地选择变换块的长度并将其编码在码流中。解码时,根据码流的块切换标志选择512或256点逆变换,以X[k]表示输入的频谱系数,x[n]表示输出的时间系数,则逆变换的公式如下所示。

    其中0<n<K;对于512点变换K=512,对于256点变换K=256。且对于第一个短块变换a=-1;对于长块变换a=0;对于第二个短块变换a=1。

    3.7 向下混合:

    若在重放系统中,解码器输出所需要的声道数小于比特流中编码的声道数,则需进行向下混合。向下混合采用线性变换,即将多个声道用标准化的系数进行线性变换后得到所需声道数目的PCM样本。

    4 C参考代码分析

       参考Aaron Holtzman写的libac3dec解码代码。系统解析简单清晰。

       流程图如下

      

    在int AC3_SampleConvert(sint_16 *pPcmData, uint_32 *pnPcmDataLen, uint_8* pAc3Buf, uint_32 nAc3DataLen)内部完成AC3解码各种算法。

  • 相关阅读:
    Get distinct count of rows in the DataSet
    单引号双引号的html转义符
    PETS Public English Test System
    Code 39 basics (39条形码原理)
    Index was outside the bounds of the array ,LocalReport.Render
    Thread was being aborted Errors
    Reportviewer Error: ASP.NET session has expired
    ReportDataSource 值不在预期的范围内
    .NET/FCL 2.0在Serialization方面的增强
    Perl像C一样强大,像awk、sed等脚本描述语言一样方便。
  • 原文地址:https://www.cnblogs.com/gaozehua/p/2478452.html
Copyright © 2011-2022 走看看