转自:http://www.cnblogs.com/gaozehua/archive/2012/05/03/2479960.html

编码概述

其整体AAC 编解码系统,如图所示,其编码流程概述如下:

1.为当一音频信号送至编码端时,会分别送至听觉心理模型(Psychoacoustic Model)以求得编码所需之相关参数及增益控制(gain control)模块中,将信号做某个程度的衰减,以降低其峰值大小,如此可减少Pre-echo 的发生。

2.之后,再以MDCT 将时域信号转换至频率域,而送入至TNS(Temporal Noise Shaping Module)模块中,来判断是否需要启动TNS,此模块系利用开回路预测(open-loop prediction) 来修饰其量化噪声,如此可将其量化噪声的分布,修饰到原始信号能量所能含盖的范围之下,进一步的减少Pre-echo 的发生,若TNS 被启动,则传出其预测差值;反之,则传出原始频谱值。

3.AAC 为了提升其压缩效率,则使用了Joint Stereo Coding与预测(Prediction)模块来进一步消除信号间的冗余成份。在Joint Stereo Coding中又可分为Intensity Stereo Coding 与M/S Stereo Coding。在Intensity Stereo Coding模块中,是利用信号在高频时,人耳只对能量较敏感,对于其相位不敏感之特性,将其左右声道之频谱系数合并,以节省使用之位;在M/S Stereo Coding 模块中,利用左右声道之和与差,做进一步地压缩,若其差值能量很小,如此便可以用较少之位编码此一声道,将剩余之位应用于另一声道上的编码,如此来提升其压缩率。

4.而预测模块的主要架构是使用Backward Adaptive Predictors,利用前两个音频帧来预测现在的音频帧,若决定启动此模块,则传出其预测差值,如此一来可以减少其数据量,达数据压缩之目的。

5.经过上述处理频谱信号上的压缩tools程序后,则将其数据予以量化与编码,为了达到量化编码的最佳化,最后则将bitstream送至解码端,而完成整个编码程序。

解码过程如下图所示:

主要技术

1   Filter Bank and Block Switching

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

1.1 MDCT 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 ),如图所示为AAC Filter bank 的框图表示,对一个输入音频信号的目前音频帧,是取前一个音频帧的后面50%与目前输入的音频帧音频值前50%做为此次处理的音频。MPEG2 AAC规定1024个sample数据为一个frame,一个frame的sample从时域通过MDCT映射到频域时由于引入50%overlap,所以变成2048个频率。

MDCT 与IMDCT 的数学式子可分别:

MDCT公式

IMDCT公式

1.2 Windowing 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)才切换到长块。下图则显示其块切换方式。

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

人耳时间上的masking effect:

人耳频域上的masking effect:

在编码端,首先将经过 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   Joint Stereo Coding

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

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.2  Intensity Stereo

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

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

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

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 。

5  无损解码

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是否是由预测器

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

-

5.3解码section_data()

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

5.4解码scale_factor_data()

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

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

6 知觉噪声替换(PNS)

知觉噪声替换模块是一种以参数编码的方式模拟噪声的模块。在判别出音频值中的噪 声后,将些噪声不进行量化编码,而是采用一些参数告诉解码器端这是某种噪声,然后解 码器端将会对这些噪声用一些随机的编码来制造出这一类型的噪声。

在具体操作上,PNS模块对每个尺度因子带侦测频率4kHz以下的信号成分。如果这个信号既不是音调,在时间上也无强烈的能量变动,就被认为是噪声信号。其信号的音调及能量变化都在心理声学模型中算出。

在解码中,如果发现使用了哈夫曼表13(NOISE_HCB),则表明使用了PNS。

转载:AAC编解码概述的更多相关文章

  1. 转载:Base64编解码介绍

    https://www.liaoxuefeng.com/wiki/897692888725344/949441536192576 Base64是一种用64个字符来表示任意二进制数据的方法. 用记事本打 ...

  2. jpeg编解码概述

    本博文为概览性介绍.后面有空了再分几篇博文分别介绍所用到的技术细节. 1.编解码目标 编码和解码是个逆过程.jpeg编码的目的在于图形去冗余,进行数据压缩,解码的目的在于还原图像,使能够进行预览. 2 ...

  3. AAC编解码

    AAC编码可以使用faac /** 初始化 @param sampleRate 音频采样率 @param channels 通道数 @param bitSize 音频采样精度 16 */ - (voi ...

  4. [转载] FFMPEG视音频编解码零基础学习方法

    在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的“大神”,有的是刚开始学习的初学者.在和大家探讨的过程中,我忽然发现了一个问题:在“ ...

  5. 各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式

    编解码学习笔记(一):基本概念 媒体业务是网络的主要业务之间.尤其移动互联网业务的兴起,在运营商和应用开发商中,媒体业务份量极重,其中媒体的编解码服务涉及需求分析.应用开发.释放 license收费等 ...

  6. 视音频编解码学习工程:AAC格式分析器

    =====================================================视音频编解码学习工程系列文章列表: 视音频编解码学习工程:H.264分析器 视音频编解码学习工 ...

  7. 【FFMPEG】各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式

    目录(?)[-] 编解码学习笔记二codec类型 编解码学习笔记三Mpeg系列Mpeg 1和Mpeg 2 编解码学习笔记四Mpeg系列Mpeg 4 编解码学习笔记五Mpeg系列AAC音频 编解码学习笔 ...

  8. ffmpeg编解码音频AAC

    本次项目的需求:手机端和PC端共享同一个音视频网络源. 所以编解码需要满足手机上编码和解码原来PC端的音视频流. 这里先封装安卓手机端音频的编解码. 编译工作依然是在linux下 ubuntu 12. ...

  9. [总结]FFMPEG视音频编解码零基础学习方法【转】

    本文转载自:http://blog.csdn.net/leixiaohua1020/article/details/15811977 在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFM ...

随机推荐

  1. google tensorflow guide

    # For CPU-only version $ pip install https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow- ...

  2. RHEL7.2和RHEL6.5的配置网络yum源和本地yum源

    RHEL7.2配置本地yum源 [root@localhost ~]#monut /dev/sr0 /mnt      #挂载光盘 [root@localhost ~]# rm -rf /etc/yu ...

  3. POJ 1177 Picture(求周长并)

    题目链接 看的HH的题解..周长有两部分组成,横着和竖着的,横着通过,sum[1] - last来计算,竖着的通过标记,记录有多少段. #include <cstdio> #include ...

  4. opencv实现图片缩放

    源码 #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/imgproc/img ...

  5. CG&amp;Game资源(转)

    cg教程下载: http://cgpeers.com http://cgpersia.com http://bbs.ideasr.com/forum-328-1.html http://bbs.ide ...

  6. js 匿名函数 json

    <script type="text/javascript"> var My_func = function(name){   this.obj_name=name; ...

  7. CRS-2800 CRS-4000

    I was installing Clusterware using ASM on VMware shared disks.  When I created the independent persi ...

  8. MySQL慢查询优化 EXPLAIN详解

            我们平台过一段时间就会把生产数据库的慢查询导出来分析,要嘛修改写法,要嘛新增索引.以下是一些笔记.总结整理 慢查询排查         show status;  // 查询mysql ...

  9. Python量化库大全

    https://zhuanlan.zhihu.com/p/26983703?utm_source=wechat_session&utm_medium=social 这个网址上详细介绍了,做量化 ...

  10. JSON_FORCE_OBJECT 数字索引数组 强转对象

    $abc = array('a','b','c','d','e','f','g'); echo '<pre>'; var_dump($abc); echo json_encode($abc ...