AAC解码算法原理详解

写在前面

如果大家对音视频相关知识感兴趣,可以订阅我的专题 视频播放器和音视频基础知识

正文

1:AAC解码整体流程简述

AAC解码流程图

在主控模块开始运行后,主控模块将AAC比特流的一部分放入输入缓冲区,通过查找同步字得到一帧的起始,找到后,根据ISO/IEC 13818-7所述的语法开始进行Noisless Decoding(无噪解码),无噪解码实际上就是哈夫曼解码,通过反量化(Dequantize)、联合立体声(Joint Stereo),知觉噪声替换(PNS),瞬时噪声整形(TNS),反离散余弦变换(IMDCT),频段复制(SBR)这几个模块之后,得出左右声道的PCM码流,再由主控模块将其放入输出缓冲区输出到声音播放设备。

2:主控模块

主控模块的主要任务是操作输入输出缓冲区,调用其它各模块协同工作。其中,输入输出缓冲区均由DSP控制模块提供接口。输出缓冲区中将存放的数据为解码出来的PCM数据,代表了声音的振幅。它由一块固定长度的缓冲区构成,通过调用DSP控制模块的接口函数,得到头指针,在完成输出缓冲区的填充后,调用中断处理输出至I2S接口所连接的音频ADC芯片(立体声音频DAC和DirectDrive耳机放大器)输出模拟声音。

3. 同步及元素解码

同步及元素解码模块主要用于找出格式信息,并进行头信息解码,以及对元素信息进行解码。这些解码的结果用于后续的无噪解码和尺度因子解码模块。

AAC的音频文件格式有以下两种:

ADIF:Audio Data Interchange Format 音频数据交换格式。这种格式的特征是可以确定的找到这个音频数据的开始,不需进行在音频数据流中间开始的解码,即它的解码必须在明确定义的开始处进行。故这种格式常用在磁盘文件中。

ADTS:Audio Data Transport Stream 音频数据传输流。这种格式的特征是它是一个有同步字的比特流,解码可以在这个流中任何位置开始。它的特征类似于mp3数据流格式。

AAC的ADIF格式见下图:


ADIF格式

3.1 ADIF的组织结构

AAC的ADTS的一般格式见下图:
ADTS一般格式

3.2 ADTS的组织结构

图中表示出了ADTS一帧的简明结构,其两边的空白矩形表示一帧前后的数据。ADIF和ADTS的header是不同的。它们分别如下所示:


ADTS一帧的结构

3.3 ADIF的头信息

ADIF头信息

3.4 ADTS的固定头信息

ADTS固定头信息

3.5 帧同步

帧同步目的在于找出帧头在比特流中的位置,13818-7规定,aac ADTS格式的帧头为12比特的“1111 1111 1111”.

3.6 头信息解码

ADTS的头信息为两部分组成,其一为固定头信息,紧接着是可变头信息。固定头信息中的数据每一帧都相同,而可变头信息则在帧与帧之间可变。

3.7 元素信息解码

在AAC中,原始数据块的组成可能有六种不同的元素。它们分别是

  • SCE: Single Channel Element单通道元素。单通道元素基本上只由一个ICS组成。一个原始数据块最可能由16个SCE组成。

  • CPE: Channel Pair Element 双通道元素,由两个可能共享边信息的ICS和一些联合立体声编码信息组成。一个原始数据块最多可能由16个SCE组成。

  • CCE: Coupling Channel Element 藕合通道元素。代表一个块的多通道联合立体声信息或者多语种程序的对话信息。

  • LFE: Low Frequency Element 低频元素。包含了一个加强低采样频率的通道。

  • DSE: Data Stream Element 数据流元素,包含了一些并不属于音频的附加信息。

  • PCE: Program Config Element 程序配置元素。包含了声道的配置信息。它可能出现在ADIF 头部信息中。

  • FIL: Fill Element 填充元素。包含了一些扩展信息。如SBR,动态范围控制信息等。

3.8 处理流程

(1). 判断文件格式,确定为ADIF或ADTS

(2). 若为ADIF,解ADIF头信息,跳至第6步。

(3). 若为ADTS,寻找同步头。

(4). 解ADTS帧头信息。

(5). 若有错误检测,进行错误检测。

(6). 解块信息。

(7). 解元素信息。

4.无噪声解码

无噪编码就是哈夫曼编码,它的作用在于进一步减少尺度因子和量化后频谱的冗余,即将尺度因子和量化后的频谱信息进行哈夫曼编码。

全局增益编码成一个8位的无符号整数,第一个尺度因子与全局增益值进行差分编码后再使用尺度因子编码表进行哈夫曼编码。后续的各尺度因子都与前一个尺度因子进行差分编码。

量化频谱的无噪编码有两个频谱系数的划分。其一为4元组和2元组的划分,另一个为节划分。对前一个划分来说,确定了一次哈夫曼表查找出的数值是4个还是2个。对后一个划分来说,确定了应该用哪一个哈夫曼表,一节中含有若干的尺度因子带并且每节只用一个哈夫曼表。

4.1 分段

无噪声编码将输入的1024个量化频谱系数分为几个段(section),段内的各点均使用同一个哈夫曼表,考虑到编码效率,每一段的边界最好同尺度因子带的边界重合。所以每一段必段传送信息应该有:段长度,所在的尺度因子带,使用的哈夫曼表。

4.2 分组和交替

分组是指忽略频谱系数所在窗,将连续的,具有相同尺度因子带的频谱系数分为一组放在一起,共享一个尺度因子从而得到更好的编码效率。这样做必然会引起交替,即本来是以
c[组][窗][尺度因子带][ 系数索引]

为顺序的系数排列,变为将尺度因子带同的系数放在一起:c[组][尺度因子带][窗][ 系数索引]这样就引起了相同窗的系数的交替。

4.3大量化值的处理

大量化值在AAC中有两种处理方法:在哈夫曼编码表中使用escape标志或使用脉冲escape方法。前者跟mp3编码方法相似,在许多大量化值出现时采用专门的哈夫曼表,这个表暗示了它的使用将会在哈夫曼编码后面跟跟一对escape值及对值的符号。在用脉冲escape方法时,大数值被减去一个差值变为小数值,然后使用哈夫曼表编码,后面会跟一个脉冲结构来帮助差值的还原。

无噪解码的流程图如下:

无噪解码的流程图

5.尺度因子解码及逆量化

在aac编码中,逆量化频谱系数是由一个非均匀量化器来实现的,在解码中需进行其逆运算。即保持符号并进行4/3次幂运算。

在频域调整量化噪声的基本方法就是用尺度因子来进行噪声整形。尺度因子就是一个用来改变在一个尺度因子带的所有的频谱系数的振幅增益值。使用尺度因子这种机制是为了使用非均匀量化器在频域中改变量化噪声的比特分配。

5.1 尺度因子带(scalefactor-band)

频率线根据人耳的听觉特性被分成多个组,每个组对应若干个尺度因子,这些组就叫做尺度因子带。为了减少信息含有短窗的边信息,连续的短窗可能会被分为一组,即将若干个短窗当成一个窗口一起传送,然后尺度因子将会作用到所有分组后的窗口去。

5.2 反量化公式

 x_invquant = sign(x_quant) * | x_quant| ^(4/3)

其中:

x_invquant 表示反量化的结果
sign (x) 表示反量化的结果
^ 标识幂运算

5.3 应用尺度因子公式:

x_rescal = x_invquant * gain
gain = 2 ^ (0.25 * (sf – SF_OFFSET))
x_rescal 为应用了尺度因子公式之后的值
gain 为一个增益
sf 为尺度因子值
SF_OFFSET 为一个常数,设为100

其中:

x_rescal 为应用了尺度因子公式之后的值
gain 为一个增益
sf 为尺度因子值
SF_OFFSET 为一个常数,设为100

6、联合立体声解码

联合立体声有两种,M/S stereo(中间旁道立体声)和intensity stereo(强度立体声)

6.1 M/S stereo

在M_S立体声模式中,传送的是规格化的中间/旁边声道的信息,计算公式如下:

l, r 表示转换后的左右声道值
m 表示中间声道值
s 表示旁边声道值

6.2 Intensity stereo

在强度立体声模式中,左声道传的是幅值,右声道的scalefactor传的是立体声的位置is_pos。如果仅在一个指定了common_window为1的CPE中的右通道中指定哈夫曼表为INTENSITY_HCB或INTENSITY_HCB2,则解码时使用强度立体声模式。其计算公式如下:

is_pos += dpcm_is_pos
scale = invert_intensity * 0.5 ^(0.25 * ispos)
r_spec = scale * l_spec
is_po 是右声道传送的scalefactor
dpcm_is_pos 是上一个is_pos,初值为0
scale 为强度因子
invert_intensity 为是否反转哈夫曼表(表14和表15)这个变量由ms_used指定,关系为:
invert_intensity = 1 – 2 * ms_used,
另外,当ms_mask_present为0时,invert_intensity恒为1。

从完全备份中还原,从完全备份中还原数据库非常简单

is_po 是右声道传送的scalefactor
dpcm_is_pos 是上一个is_pos,初值为0
scale 为强度因子
invert_intensity 为是否反转哈夫曼表(表14和表15)这个变量由ms_used指定,关系为:
invert_intensity = 1 – 2 * ms_used,
另外,当ms_mask_present为0时,invert_intensity恒为1。

6.3 处理流程

联合立体声解码流程图

7、PNS

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

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

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

由于M/S立体声解码与PNS解码互斥,故可以用参数ms_used来表明是否两个声道都用同样的PNS。如果ms_used参数为1,则两个声道会用同样的随机向量来生成噪声信号。

PNS的能量信号用noise_nrg来表示,如果使用了PNS,则能量信号将会代替各自的尺度因子来传送。

噪声能量编码同尺度因子一样,采用差分编码的方式。第一个值同样为全局增益值。它同强度立体声位置值及尺度因子交替地放在一起,但对差分解码来说又彼此忽略。即下一个噪声能量值以上一个噪声能量值而不是强度立体声位置或尺度因子为标准差分解码。

随机能量将会在一个尺度因子带内产生noise_nrg所计算出的平均能量分布。

7.1 处理流程

PNS解码流程图

8、TNS

TNS瞬态噪声整形用于控制一个转换窗口内的瞬时噪声形态。它是用一个对单个通道的滤波过程来实现的。

传统的变换编码方案常常遇到信号在时域变化非常剧烈的问题,特别是语音信号,这个问题是因为量化后的噪声分布虽然在频率域上得到控制,但在时域上却以一个常数分布在一个转换块内。如果这种块中信号变化得很剧烈却又不转向一个短块去,那这个常数分布的噪声将会被听到。

TNS的原理利用了时域和频域的二元性和LPC(线性预测编码)的时频对称性,即在其中的任意一个域上做编码与在另一域上做预测编码等效,也就是说,在一个域内做预测编码可以在另一域内增加其解析度。量化噪声产生是在频域产生的,降低了时域的解析度,故在这里是在频域上做预测编码。

在AACplus中,由于基于AAC profile LC,故TNS的滤波器阶数被限制在12阶以内。

8.1 处理流程

TNS解码流程图

9. IMDCT

将音频数据从频域转换到时域的过程主要是由将频域数据填入一组IMDCT滤波器来实现的。在进行IMDCT变换后,输出数值经过加窗,叠加,最后得到时域数值。

9.1 IMDCT公式

IMDCT公式
    for 0<= n <N
n 采样点索引值
i 窗索引值
k 频谱系数索引值
N 窗函数长度,全为短窗N = 256,其余情况为2048
 n0=(N/2 +1)/2

9.2 块型

由于长块的频域分辨率较高而短块的时域分辨率较高,故长块较适合相对平稳的时域信号,而短块较适合变化相对较快的时域信号。

长块长度为2048个点,短块长度为256个点。

9.3 加窗

AAC用到两种窗函数,分别为Kaiser-Bessel 类(KBD)窗和正弦窗。

KBD窗如下所示:

KBD窗

定义为:
   for 0 <= n <= N/2

使用KBD窗时,window_shape 为1

正弦窗如下所示:



定义如下图:



使用正弦窗时,window_shape 为0

另定义:


对应于四种不同的窗序列分别进行不同的加窗变换:
1.) 仅有长块:
window_shape 为 1:



window_shape 为0:



加窗后,时域信号可用w(n)表示为:

2.) 长开始块:

window_shape 为 1:


window_shape 为0:



加窗后,时域信号可用w(n)表示为:



3.) 只有短块:
window_shape 为 1:

window_shape 为0:



加窗后,时域信号可用w(n)表示为:

2.) 长结束块:
window_shape 为 1:



window_shape 为0



加窗后,时域信号可用w(n)表示为:

9.4 覆盖叠加

在加窗完成后得到的时域信号值z经过前后窗相互叠加计算,得出最后的PCM值:

术语说明

AAC Advanced Audio Coding 高级音频编码
AAC LC AAC with Low Complexity AAC的低复杂度配置
AAC plus HE-AAC, AAC+,MPEG4 AAC LC加入SBR模块后形成的一个aac版本
MPEG Motion Picture Expert Group
IMDCT 反离散余弦变换
ADIF Audio Data Interchange Format 音频数据交换格式
ADTS Audio Data Transport Stream 音频数据传输流
SCE Single Channel Element单通道元素
CPE Channel Pair Element 双通道元素
CCE Coupling Channel Element 藕合通道元素
DSE Data Stream Element 数据流元素
PCE Program Config Element 程序配置元素
FIL Fill Element 填充元素
ICS Individual Channel Stream 独立通道流
PNS Perceptual Noise Substitution 知觉噪声替换
SBR Spectral Band Replication 频段复制
TNS Temporal Noise Shaping 瞬时噪声整形
ch channel 通道
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 声音 如何将现实生活中的声音转换成数字信号? 脉冲编码调制(PCM) 脉冲编码调制示意图 图3-2(a),是一个以...
    LvyCode阅读 810评论 0 1
  • 摘要 该配置文件定义了支持高质量音频分发所需的Bluetooth®设备的要求。这些要求以终端用户服务的方式表达,并...
    公子小水阅读 8,703评论 0 4
  • OpusEncoder 1:获得 OpusEncoder结构的大小 2:分配和初始化 encoder状态.一个编码...
    今忆Zoe阅读 6,070评论 0 3
  • 介绍 AAC(Advanced Audio Coding),中文称为“高级音频编码”,出现于1997年,基于 MP...
    sxyxsp123阅读 6,663评论 0 7
  • 在保证视频图像质量的前提下,HEVC通过增加一定的计算复杂度,可以实现码流在H.264/AVC的基础上降低50%。...
    加刘景长阅读 7,595评论 0 6