[原创]桓泽学音频编解码(3):AAC 系统算法分析

wikipeida链接

http://zh.wikipedia.org/wiki/AAC

摘录:

进阶音讯编码英语Advanced Audio CodingAAC),出现于1997年,基于 MPEG-2音讯编码技术。由Fraunhofer IIS杜比实验室AT&TSony(新力)等公司共同开发,目的是取代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 系统框图

编码框图

  

解码框图

   

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 系统提供了三种profiles:Main 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,前者用于属于文件格式用于存储,后者属于流格式,用于传输。如图

 

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

 

id_syn_ele

数据流

ID_SCE(0x0)

single_channel_element()

ID_CPE(0x1)

channel_pair_element()

ID_CCE(0x2)

coupling_channel_element()

ID_LFE(0x3)

lfe_channel_element()

ID_DSE(0x4)

data_stream_element()

ID_PCE(0x5)

program_config_element()

ID_FIL(0x6)

fill_element()

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

lfe_channel_element()有如下类似的结构,

individual_channel_stream的核心数据格式如下:

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

注1:虚线表示可能存在。

注2:section层只在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个section(1≤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%做为此次处理的音频。

 

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

MDCT公式

 

IMDCT公式

 

3.1.2Windowing and Block Switching

  对一个MDCT filter bank 的频率响应的分辨率改善,进来的音频信号在经MDCT 转换前,需经过一个window function相乘后才送至MDCT。AAC 支持两种window shapes,即sin window 及KBD(Kaiser-Bessel Derived) window,KBD 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)才切换到长块。下图则显示其块切换方式。

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编解码后,将量化噪声的分布能被原信号所遮蔽。

在编码端,首先将经过 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 window:1+1*(2+1+6+5+1+1+4) = 97 bits

SHORT window:1+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)将被设定与否而传送至解码端上。

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 中,因为左右声道只传出一组合并后的频谱系数,其位置放置于左声道,右声道中频谱系数将会被设成零,以此来降低编码所需之位数。

3.4   量化编码

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

  非均匀量化器被用在 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:正弦窗 1:KBD窗

max_sfb

4/6

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

scale_factor_grouping

7

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

即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]。

posted @ 2012-05-03 07:40  杭州桓泽  阅读(5182)  评论(4编辑  收藏  举报