原作者:龙帅 (loppp138@hotmail.com) 

此文章为便携式多媒体技术中心提供,未经站长授权,严禁转载,但欢迎链接到此地址。

本文详细介绍了符合ISO/IEC 13818-7(MPEG2 AAC audio codec) , ISO/IEC 14496-3(MPEG4 Audio Codec AAC Low Complexity)进行压缩的的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格式见下图:

 

 3.1 ADIF的组织结构 

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

 

3.2 ADTS的组织结构 

图中表示出了ADTS一帧的简明结构,其两边的空白矩形表示一帧前后的数据。

ADIF和ADTS的header是不同的。它们分别如下所示:

 

 3.3 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)表示取x的符号

^ 表示幂运算

5.3 应用尺度因子公式:

x_rescal = x_invquant * gain

gain = 2 ^ (0.25 * (sf – SF_OFFSET))

其中

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

从完全备份中还原

从完全备份中还原数据库非常简单,在9.3.2节中会详细地

is_pos是右声道传送的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公式

 

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窗如下所示:

 

其定义为:

 

     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 通道

AAC解码算法原理详解的更多相关文章

  1. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  2. 2. EM算法-原理详解

    1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-高斯混合模型GMM详细代码实现 5. EM算法-高斯混合模型GMM+Lasso 1. 前言 概率 ...

  3. [置顶] Isolation Forest算法原理详解

    本文只介绍原论文中的 Isolation Forest 孤立点检测算法的原理,实际的代码实现详解请参照我的另一篇博客:Isolation Forest算法实现详解. 或者读者可以到我的GitHub上去 ...

  4. DQN算法原理详解

    一. 概述 强化学习算法可以分为三大类:value based, policy based 和 actor critic. 常见的是以DQN为代表的value based算法,这种算法中只有一个值函数 ...

  5. 网络最大流问题之Ford-Fulkerson算法原理详解

    前言 最大流问题是网络优化中典型的问题,用形象的语言来描述就是在满足容量约束的前提下将尽可能多的流从源节点(始点)到汇节点(终点).解决此问题的经典方法很多,本文介绍广为人熟知的Ford-Fulker ...

  6. hash算法原理详解

    转载出处http://blog.csdn.net/tanggao1314/article/details/51457585 一.概念 哈希表就是一种以 键-值(key-indexed) 存储数据的结构 ...

  7. EM算法原理详解

    1.引言 以前我们讨论的概率模型都是只含观测变量(observable variable), 即这些变量都是可以观测出来的,那么给定数据,可以直接使用极大似然估计的方法或者贝叶斯估计的方法:但是当模型 ...

  8. [置顶] Isolation Forest算法实现详解

    本文算法完整实现源码已开源至本人的GitHub(如果对你有帮助,请给一个 star ),参看其中的 iforest 包下的 IForest 和 ITree 两个类: https://github.co ...

  9. Isolation Forest算法实现详解

    本文介绍的 Isolation Forest 算法原理请参看我的博客:Isolation Forest异常检测算法原理详解,本文中我们只介绍详细的代码实现过程. 1.ITree的设计与实现 首先,我们 ...

随机推荐

  1. sortable实现拖拽功能

    使用sortable这个强力插件就很容易实现拖拽功能,它是目前比较牛逼的拖拽插件,无需jquery,就可以全面支持pc和移动,参考以下github文档就有很详细的说明,也给了很多 demo,插件就用我 ...

  2. 112. Path Sum (判断路径和是否等于某值)

      Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up a ...

  3. Kattis - amsterdamdistance【数学】

    Kattis - amsterdamdistance[数学] 题意 给出两个点 算出从第一个点到第二个点的最短距离,只不过这里不是直角坐标系, 是雷达图 思路 因为内圈的圆的路径要比外圈的小,所以我们 ...

  4. VMWare 安装时报错 tools-windows.msi failed报错解决办法

    1.我用的是7.1.3版本的,到官方网站上下载这个版本的tools安装包 http://softwareupdate.vmware.com/cds/vmw-desktop/ws/7.1.3/32428 ...

  5. C# 异步同步调用

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: /*添加的命名空间 u ...

  6. Windows10安装mysql数据库

    安装以及配置,参考下面链接 https://www.cnblogs.com/qjoanven/p/7898006.html 碰到的问题: 1. 安装的时候出现 mysql Install/Remove ...

  7. 如何用纯 CSS 创作一个小球上台阶的动画

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/PBGJwL 可交互视频 ...

  8. 转一篇Git代码回滚技巧

    转 https://github.com/geeeeeeeeek/git-recipes/wiki/5.2-代码回滚:Reset.Checkout.Revert的选择

  9. NOIP 数字游戏

    描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m ...

  10. jz2440存储管理实验【学习笔记】

    平台:jz2440 作者:庄泽彬(欢迎转载,请注明作者) 说明:韦东山一期视频学习笔记 简介:先来简单的说明一下这次的实验,看看下图,我们的程序通过烧录器下载到nandflash当中去,之后在启动的时 ...