AAC 系统算法分析

  1. 云栖社区>
  2. 博客>
  3. 正文

AAC 系统算法分析

杨粼波 2017-10-09 14:52:00 浏览1566

英语Advanced Audio CodingAAC出现于1997年基于 MPEG-2的音讯编码技术。由Fraunhofer IIS、杜比实验室、AT&T、Sony新力等公司共同开发目的是取代MP3格式。

背景

1997年制订不兼容MPEG-1的音频标准MPEG-2 NBC即MPEG-2 AAC
1999年MPEG-2 AAC增加LTP和PNS工具形成MPEG-4 AAC v1
2002年MPEG-4 AAC v1增加了SBR和错误鲁棒性工具形成MPEG-4 HE-AAC
2004年MPEG-4 HE-AAC引入PS模块提升低码率性能形成EAAC+

技术指标

采样率8kHz – 96kHz
码率 8kbps – 576kbps
声道最多支持48个主声道16个低频增强声道

 

1.1 系统框图

编码框图

  49 AAC 系统算法分析

 

解码框图

2012021421335992 AAC 系统算法分析

1.2 编码概述    

其整体AAC 编解码系统如图所示其编码流程概述如下 为当一音频信号送至编码端时会分别送至听觉心里模型(Psychoacoustic Model)以求得编码所需之相关参数及增益控制(gain control)模块中将信号做某个程度的衰减以降低其峰值大小如此可减少Pre-echo 的发生。之后再以MDCT 将时域信号转换至频率域而送入至TNS(Temporal Noise Shaping Module)模块中来判断是否需要启动TNS此模块系利用开回路预测(open-loop prediction) 来修饰其量化噪声如此可将其量化噪声的分布修饰到原始信号能量所能含盖的范围之下进一步的减少Pre-echo 的发生若TNS 被启动则传出其预测差值反之则传出原始频谱值。AAC 为了提升其压缩效率则使用了Joint Stereo Coding与预测(Prediction)模块来进一步消除信号间的冗余成份。在Joint Stereo Coding中又可分为Intensity Stereo Coding 与M/S Stereo Coding。在Intensity Stereo Coding模块中是利用信号在高频时人耳只对能量较敏感对于其相位不敏感之特性将其左右声道之频谱系数合并以节省使用之位在M/S Stereo Coding 模块中利用左右声道之和与差做进一步地压缩若其差值能量很小如此便可以用较少之位编码此一声道将剩余之位应用于另一声道上的编码如此来提升其压缩率。而预测模块的主要架构是使用Backward Adaptive Predictors利用前两个音频帧来预测现在的音频帧若决定启动此模块则传出其预测差值如此一来可以减少其数据量达数据压缩之目的。经过上述处理频谱信号上的压缩tools程序后则将其数据予以量化与编码为了达到量化编码的最佳化AAC 使用了双巢状式循环(two nested loop)的量化编码结构以得最佳的压缩质量最后则将其位串送至解码端而完成整个编码程序。

    为了允许其系统可对音频质量与内存/处理功率要求之间做一舍取因此AAC 系统提供了三种profilesMain profile、Low Complexity(LC) profile、Scaleable Sampling Rate(SSR) profile。且每一种profile所使用的tools皆不同下表表示其三种不同profile所需使用的tools。

 

Took Name Main LC SSR
Noiseless coding Used Used
Quantizer Used Used Used
M/S Used Used Used
Prediction Used Not Use
Intersity/Coupling Used Not Use
TNS Used Limited Limited
Filter Bank Used Used
Gain Control Not Use

2. MPEG2 AAC码流格式与解析

MPEG2 AAC规定了2种码流格式ADIF和ADTS前者用于属于文件格式用于存储后者属于流格式用于传输。如图

50 AAC 系统算法分析

 

 

 

511 AAC 系统算法分析

其中Raw_data_block为基本码流组件其他部分为格式信息。Raw_data_block格式如下id_syn_ele:3位标志位指示后面所跟着的数据流的类型。

 

id_syn_ele 数据流
ID_SCE(0×0) single_channel_element()
ID_CPE(0×1) channel_pair_element()
ID_CCE(0×2) coupling_channel_element()
ID_LFE(0×3) lfe_channel_element()
ID_DSE(0×4) data_stream_element()
ID_PCE(0×5) program_config_element()
ID_FIL(0×6) fill_element()

ID_DSEID_PCEID_FIL所指示的流为扩展流或用户数据流非核心算法区故暂不提及。而single_channel_element()channel_pair_element()coupling_channel_element()

lfe_channel_element()有如下类似的结构

521 AAC 系统算法分析

 

individual_channel_stream的核心数据格式如下

531 AAC 系统算法分析

2.3 MPEG2 AAC 码流数据结构层次图

 

 

 

注1虚线表示可能存在。

注2section层只在huffman解码时存在。

注3短窗时windows和scalefactor band 有交织

注4长窗含开始窗和结束窗windows个数和windows_group的个数都是1。

MPEG2 AAC规定1024个sample数据为一个frame一个frame的sample从时域通过MDCT映射到频域时由于引入50交叠所以变成2048个谱线。如果是长块变换则一个frame只有一个window group每个window group有一个window每个window 有2048个谱线。如果是短块变换则可能有若个window group每个window group可能有若干个window但是所有window group的window个数加一起一定为8个此时每个windows 有256个谱线。注意分window group的意义在于同一个window group的谱线数据使用一个scalefactor。而每个windows又可以分为n个section1≤n≤max_sfb(一个frame内最多的scalefactor band的个数)每个section有若干个谱线数据(spectral data)但注意section的边界必须和scalefactor band的边界重合所以也可以说每个section有若干个scalefactor band。提出section的意义在于统一个section的谱线数据(spectral data)使用同一个huffman table编码。

MPEG2 AAC提出的window group和section的个数都是不定的所以编码端要在比特流中加入相关的side info用来指示window group和section分割方法。在isc_info()中的scale_factor_grouping和section_data()中的sect_len_incr就是起到这样的作用.

2.2 码流解析

码流可以分为side info的解析和压缩数据的解析side info解析出的状态信息和控制信息。都使用定长码。解码只要按照格式解析出来即可。由于解码简单和篇幅限制这里就不予提及请查阅13818-7标准语法部分。其次是对压缩数据的解析压缩数据属于无损编码主要是变长码。使用熵编码算法后面会直接在无损编码部分提及。查阅本文档主要技术中无损编码部分。

3 主要技术

3.1   Filter Bank and Block Switching

滤波器组(Filter Bank)是MPEG-2 AAC 中一个基本的组件扮演着将音频信号从时间域转换至频谱域之表示其在解码端则反向处理。对Filter bank而言它必需具备对音频编码有着完美的重建的特性然而有时其音频还原似乎不是如此完美其主要因素在于处理时间域转换至频谱域时的音频信号是以frame by frame 的方式送至Filter bank也就是将目前的音频信号切割成多个音频帧来处理因而会造成音频帧间的边缘信号给予不同精确度的编码并造成信号的不连续性都将造成日后还原时所发生的质量影响其这种效应称之为块效应(Blocking effect)为了解决此一问题其块间的信号在送入filter bank 之前一个overlapping windowing 的方式将被采用来减少其信号不连续性。

 

3.1.1MDCT and IMDCT

    在AAC 或是其它音频信号的编解码器上最普遍解决上述问题的filter bank设计即为在编码端上的MDCT(Modified Discrete Cosine Transform)及解码端上的IMDCT (Inverse Modified Discrete Cosine Transform)。MDCT/IMDCT 使用了一种技术称为TDAC(Time Domain Aliasing Cancellation)它是使用了一种winow-overlape-add 的处理方式来消除时间域上的交迭(aliasing )如图2.10所示为AAC Filter bank 的框图表示对一个输入音频信号的目前音频帧是取前一个音频帧的后面50%与目前输入的音频帧音频值前50%做为此次处理的音频。

 

 55 AAC 系统算法分析

MDCT 与IMDCT 的数学式子可分别表示如(2.20)、(2.21)式

MDCT公式

 56 AAC 系统算法分析

 

IMDCT公式

 

 57 AAC 系统算法分析

3.1.2Windowing and Block Switching

  对一个MDCT filter bank 的频率响应的分辨率改善进来的音频信号在经MDCT 转换前需经过一个window function相乘后才送至MDCT。AAC 支持两种window shapes即sin window 及KBD(Kaiser-Bessel Derived) windowKBD window 可以比sine window 更准确的重建出原始的时间域的信号。在MPEG-2 AAC 系统中可以允许其KBD 及sin window 的切换来达到最好的来接受输入信号的状态而得到更好的音质重建结果。

    另外MPEG-AAC 编码器中为了在声音特性、编码效率与声音压缩质量上取得适合的块长度总共提供N=256(短块)与N=2048(长块)两种块长度作为选择。其块的选择是根据听觉心理模型(Psychoacoustic Model)的PE值来决定。通常长块的使用可以被选择来减少其信号的冗余部份并得到较高的频率分辨率来改善编码质量但是也可能对某些瞬时信号而产生问题。 一般当音频信号在时间域上有变化较大的瞬时信号(Transient signal)时则以连续的8个短块来处理可以提升在音频压缩时的精确度并减少pre-echo的发生相对的当音乐数据属于稳态的信号(Stationary signal)则使用长块来处理。而在长短块转换中还存在着两种缓冲块长块切换到短块必须经过起始块(start block)才切换到短块从短块切换到长块也必须经过停止块(stop block)才切换到长块。下图则显示其块切换方式。

58 AAC 系统算法分析

 

3.2   Temporal Noise Shaping

由于MPEG-2 AAC 的块大小比MPEG-1 layer3的还要大因此一般在处理单一长块信号时假如在时间上有一急遽的信号变化时经由在时间域与频率域上的信号转换再经量化后转回其时间域时有可能会增加造成 pre-echo的现象发生。而pre-echo的发生从时间域上的遮蔽效应可发现若一较高的能量是在转换长块的前半部时其经由量化所产生的噪声可能被postmasking 所遮蔽但是若较高的能量是在长块的后半部时则散布到前半部的噪声将无法被 premasking 所遮蔽这就是由于对长块而言其在时间域上的分辨率较低因此噪声分布范围超过 premasking 的遮蔽范围而造成量化的噪声将被人耳所听到此一现象就是称为 pre-echo。下图所示为pre-echo现象发生所造成时间域上信号的失真。减少 Pre-echo 现象有许多种方式如经由动态地切换块大小可解决此一问题另外在MPEG-2 AAC 中加入了TNS也是用来减少pre-echo的现象。而TNS 概念是使每个单一块再经过TNS编解码后将量化噪声的分布能被原信号所遮蔽。

59 AAC 系统算法分析

 

在编码端首先将经过 MDCT 模块的频域信号送入利用 Levinson- Durbin recursion 方法取得此音频块的反射系数(reflection  coefficients)与预测增益(prediction gain)当求得的预测增益大于MPEG2-AAC 标准中所设定的常数值则使用TNS模块首先为了减少反射系数传送所需的bit rate将反射系数作量化然后再经过Truncate coefficients 来调整TNS 系数的阶数开始会根据不同profile所定义的系数阶数将后面系数小于0.1的系数值舍去来调整系数阶数使得产生的 LPC 预测系数阶数少于 profile 定义的阶数最后将反射系数经过计算求出TNS 的预测系数送入TNS filter (MA)中。如果没有启动TNS则将原始的频域谱线送出。 在编码端只需要传送量化后所需要的反射系数阶数以及整数的索引值而不必传出所有反射系数的信息。给Index 及TNS order的信息将使用在解码端用来还原量化后的反射系数。当解码端所接收到的反射系数阶数大于 0代表有使用TNS 编码在解码端就会启动 TNS 解码模块求得编码时的预测系数送入 TNS filter(AR)中解码出频率域上信号的数据 。  加入TNS 模块后其也有一些side information的项目需加入至位串(bitstream)里以提供解码端使用如表所示。由于 TNS 预测级数对LONG window 而言最多为20对SHORT window最多为7因此TNS 在编码中对side information最多增加的位数目为

LONG window1+1*(2+1+6+5+1+1+4) = 97 bits

SHORT window1+8*(1+1+4+3+1+1+7*4) = 313 bits

 

Side information 位宽 注释
TNS Present or not 1  
Number of filters 2/1 长/短 窗
TNS coefficients resolution 1  
TNS filter length in band 6/4 长/短 窗
TNS filter order 5/3 长/短 窗
TNS filter direction 1  
Coefficient compress or not 1  
Bit per coefficient 4  

3.3   Joint Stereo Coding

MPEG AAC 的系统为了提升其编码效率及压缩质量Joint Stereo Coding 利用了左右声道的特性对立体音编码引进了两种技术即M/S Stereo与Intensity Stereo。

 

3.3.1  M/S Stereo

在MPEG-2 AAC 系统中M/S(Mid/Side) Stereo coding被提供在多声道信号中每个声道对(channel pair)的组合也就是每个通道对是对称地排列在人耳听觉的左右两边其方式简单且对位串不会引起较显著的负担。 一般其在左右声道数据相似度大时常被用到并需记载每一频带的四种能量临界组合分别为左、右、左右声道音频合并(L+R)及相减(L-R)的两种新的能量其表示式如(2.34)式所示。然后再利用上面章节所提到听觉心理学模型与滤波器来处理。一般若所转换的Sid声道的能量较小时M/S Stereo coding 可以节省此通道的位数而将多余的位应用于另一个所转换的声道即Mid 声道进而可提高此编码效率。对M/S Stereo coding可以选择性地切换其在时间域上块与块间是否使用

的时机其切换的旗标(ms_used)将被设定与否而传送至解码端上。

60 AAC 系统算法分析

 

3.3.2  Intensity Stereo

  人类听觉系统一般对低频信号而言其对信号的能量与相位皆较敏感 相对于在高频信号人耳只对其能量较为敏感而相位较不敏感。Intensity Stereo coding就是利用此一人耳的特性被使用在高频区域里声道对之间的不相关性条件下这个方式在过去对立体声或多声道编码中已广范地被使用又可被称为dynamic crosstalk 或是channel coupling 等等。其编码是利用一因素来完成也就是在高频声音组件的接收感觉主要是依赖在他们的能量分析上即时间封包(time envelopes)因此它对某些型式的信号就有可能仅需传送单一频谱值来达到其它音频的声道在不遗失质量下可以虚拟地由此一频谱值被表示出来。而原始编码声道的能量即time envelopes对每一个scalefactor band经由一个调整(scaling)大小的运算因子近似地被表示而储存使得在解码端对每一个声道的信号可藉由此一因子来重建。

  如(2.35)式所示经由相加通道对(channel pair)的频谱信号再乘上一个能量调整因子来求得其每一个scalefactor band 的Intensity Stereo 信号的频谱系数

在AAC 中因为左右声道只传出一组合并后的频谱系数其位置放置于左声道右声道中频谱系数将会被设成零以此来降低编码所需之位数。

612 AAC 系统算法分析

 

3.4   量化编码

  在完成之前的频谱处理的工具后实际位率减少是在量化处理中来达到这个模块主要的目的是量化频谱上的数据使得量化噪声能够满足声音心理模式的要求。迭代循环(Iteration loop)模块被用来决定量化的step size并保证其允许的失真不会超过并在满足迭代循环后非线性的量化函数被执行。另外对每一个音频帧被量化的有效位数也需在某个临界之下一般其值与取样率及所要求的位率有关依据(2.36)式来定义每个音频帧可以使用的位数。在每个音频帧开始计算时先将一些所需的变量初始化如果此音频帧里所有的频域数据皆为0则可以跳过此音频帧不作处理如果有频域数据则将进入outer iteration loop开始进行频域数据的量化与位计算最后将未使用的位数保留到下一个音频帧时继续使用。

622 AAC 系统算法分析

 

  非均匀量化器被用在 AAC 里其量化方式如下式所示。

631 AAC 系统算法分析

 

在公式中MAGIC_NUM被定义为0.4054且common_scalfac 是对所有的scalefactor bands 的通用量化步阶大小(global quantizer step size)。因此量化器可能被改变1.5dB 的步长大小且量化范围被限制在±8191 。

3.5  无损解码

3.5.1解码ics_info()

  位宽 作用
ics_reserved_bit

1

一定为‘0’
window_sequence

2

窗类型

00长窗 01起始窗
10短窗 11结束窗

 

window_shape

1

决定使用正弦窗还是KBD窗

0正弦窗 1KBD窗

max_sfb

4/6

短窗下4位其他时6位表示每个窗组内的scalefactor band的个数
scale_factor_grouping

7

在短窗时有效。指明window group的分割方式。7个bit表示8个窗中的17窗的分组情况。

即bit(8-n)表示window(n)的分组属性当bit(8-n)‘1’表示window(n)和window(n-1)是同一个组若bit(8-n)‘0’表示window(n)和window(n-1)是不是同一个组。

如下图

predictor_data_present

1

指示码流中是否出现预测数据
predictor_reset

1

指示预测器是否全部复位
predictor_reset_group_number

5

指示预测器组是否复位
prediction_used

1

指示每个scalefactor band是否是由预测器

 

3.5.2huffman解码算法

 AAC使用huffman编码算法对scalefactor和量化谱线数据进行编码AAC标准一共有12个有效码本,一个码本专用于scalefactor解码.11个码本用于谱线系数的解码.有4个无效码本其中1个码本表示传输的系数全位零,是0码本,不需解码.2个码本是intensity码本,也是0码本.在为谱线系数解码的11个码本中,每个码本有自己可以编码的最大系数值LAV表示.如表2, 用于谱线系数的解码的11个码本中最后一个码本可以解码出谱线系数的最大值是16.但当解码出谱线系数的值大于0小于16的时候.解码出的值就是实际的谱线系数的绝对值,当解码锄地谱线系数是16时,表示退出huffman解码,使用其他方式解码.所以在该码本中解码出的值16被定义成ESC_FLAG.表2中的unsigned_cb[i]标志位表示该码本是有符号码本还是无符号码本, unsigned_cb[i]=0时表示该码本是有符号码本, unsigned_cb[i]=1时表示该码本是无符号码本.解码有符号数时,先按照无符号解码再从输入的解码比特流中提取符号位,若解码出的谱线系数非零,则其符号位紧跟在被该谱线系数的码字的后面.

 

Codebook Number, i unsigned_cb[i] Dimension of Codebook LAV for codebook Codebook listed 
in
0 - - 0 -
1 0 4 1 Table A.2
2 0 4 1 Table A.3
3 1 4 2 Table A.4
4 1 4 2 Table A.5
5 0 2 4 Table A.6
6 0 2 4 Table A.7
7 1 2 7 Table A.8
8 1 2 7 Table A.9
9 1 2 12 Table A.10
10 1 2 12 Table A.11
11 1 2 (16) ESC Table A.12
12 - - (reserved) -
13 - - (reserved) -
14 - - intensity out-of-phase -
15 - - intensity in-phase -

 

3.5.3解码section_data()

    Section data部分的内容是每个section的分割方式和每个section选择的码本。

3.5.4解码scale_factor_data()

    scale_factor_data的内容是解码每个scalefactor band中的差分scale factor值。

3.5.5解码spectral_data()

这部分内容主要解码量化谱线信息spectral_data(). AAC的huffman编码算法对量化谱线有两步分组处理.如上所述第一步分组是分出scalefactor band中的谱线个数是4的倍数.目的是进行4个谱线一起编码.第二步分割是标准中把1个或几个scalefactor band合并成一个section.同一个section内的所有scalefactor band的谱线使用同一个huffman码表.所以,如果要进行huffman解码,section的宽度信息和码本号作为side information附加在section data中传输.解码端要先解出这些信息才能进行huffman解码.而section的长度小于scalefactor band的个数而大于scalefactor windows band的个数. 为了最大限度的匹配量化谱线的统计特性,Huffman为了使量化谱线的统计特性最大化的匹配huffman码本,section的数量允许和scalefactor band的数量一样大. Section个数的最大值是max_sfb.但注意section的边界要与scalefactor band的边界重合. 用huffman编码的量化解码系数的Four-tuple 或2-tuples的传送顺序是从低频系数到高频系数. 对于每个块有多个windows的情况,要注意有分组和交织情况,系数的集合需要解交织,系数存储在数组x_quant[g][win][sfb][bin]。