AAC在对PCM数据进行编码时,使用window取出1024或128个数据进行MDCT转换到频域。

Window的相关信息记录在ics_info中:

关于ics_info中各个字段的含义如下

window sequence的类别如Table 44,long_sequence/start_sequence/stop_sequence包含1个window,short_sequence包含8个short window。

在一个window中包含的scalefactor band 依赖于fs.

对于48k来说long_window/long_start_window/long_stop_window中包含49个scalfactor band.window中的 频谱系数个数为1024.

而short window中包含14个scalefactor band,short window中的频谱系数个数为128.

Table 45为long_window的scalefactor band信息。

Scalefactor:Factor by which a set of values is scaled before quantization.
Scalefactor band:A set of spectral coefficients which are scaled by one scalefactor.

The basic method to adjust the quantization noise in the frequency domain is the noise shaping using scalefactors. For this purpose the spectrum is divided in several groups of spectral coefficients called scalefactor bands which share one scalefactor (see subclause 8.3.4). A scalefactor represents a gain value which is used to change the amplitude of all spectral coefficients in that scalefactor band. This mechanism is used to change the allocation of the quantization noise in the spectral domain generated by the non uniform
quantizer.

The width of the scalefactor bands is built in imitation of the critical bands of the human auditory system. For that reason the number of scalefactor bands in a spectrum and their width depend on the transform length and the sampling frequency.

The spectral coefficients are divided into scalefactor bands that contain a multiple of 4 quantized spectral coefficients. Each scalefactor band has a scalefactor.

num_swb_long_window:long window中scalefactor band的个数。

swb:window中scalefactor band的index.

swb_offset_long_window:long window中,scalefactor band中最小频谱系数的index。比如第0个scalefactor band包含4个频谱系数,最小频谱系数的index为0,那第一个scalefactor band的最小频谱系数的index为4.

window信息相关的字段含义如下:

对于long_sequence而言,window group为1,window group中只包含一个window.

对于short_sequence而言,可能包含多个window group,但所有window group中包含的window总数为8,window group信息和每个window group包含的window个数信息由scale factor_grouping算出。

下面是short window grouping的example.

包含4个window group, group划分由grouping_bits决定,当bit为1时,当前window在同一个window group中,window_group_length 加1,如果bit为0,当前window是在一个新的window group中,num_window_groups 加1,window_group_length等于1.

为进一步提高压缩率,AAC将一个window group中的所有的scalefactor band划分为几个section,每个section使用同一个huffman codebook.

Note that the length of a section is given in scalefactor bands rather than scalefactor window bands

section的划分使得原本码流的层次结构[g][win][sfb][coeff]变成[g][sect][sfb][coeff]

section划分信息包含在section_data()中:

sect_cb[g][i]: group g的第i个huffman table.

sect_len:section中包含的scalefactor个数。

sect_len_incr:用于计算sect_len的字段,short window为3 bit, long_window为5bit。当sect_len_incr==sect_esc_val时,sect_len加sect_esc_val.

sect_start/sect_end:表示当前section的起始和结束的scalfactor的index。sect_start和sect_end之间的scalefactor使用同一个huffman table.

num_sec[g]:group中section的个数。

scalefactor是在频域调节量化后带来的noise最基本的方法。为了这个目的,频谱被分为几个scalefactor band,每一个scalefactor band使用一个scalefactor.

scalefactor 是scalefactor band中频谱系数的gain value。

scalefactor的信息在scale_factor_data()中获取。

hcod_sf为scalefactor的codeword.

dpcm_sf为差分后的scalefactor.

scalefactor是采用差分方式进行编码的,即第一个scalefactor减去global_gain后编码,其后的scalefactor减去前一个scalefactor后编码。

scalefactor解码过程如下:

在码流信息中获取到scalfactor的codeword后,查找huffman codebook,获取到codeword的index,差分后的scalefactor为index-index_offset. index_offset固定为-60.

频谱系数信息包含在spectral_data()中:

hcod为编码4/2元组频谱系数的codeword。

在码流中读出频谱系数的codeword后,查huffman codebook,获取到codeword对应的index, 通过index可以计算出量化后的频谱系数(w,x,y,z),最大的量化频谱系数为8192

huffman解码出来的量化的频谱系数,需要进行反量化:

反量化的过程如下:

反量化的频谱系数为通过scalefactor进行scale后的频谱系数,在解码时,需要rescale还原真正的频谱系数x_rescale。

gain和scalefactor之间的关系为:

AAC 码流信息分析的更多相关文章

  1. 【雷神源码解析】无基础看懂AAC码流解析,看不懂你打我

    一 前言 最近在尝试学习一些视频相关的知识,随便一搜才知道原来国内有雷神这么一个真正神级的人物存在,尤其是在这里(传送门)看到他的感言更是对他膜拜不已,雷神这种无私奉献的精神应当被我辈发扬光大.那写这 ...

  2. H264码流打包分析(精华)

    H264码流打包分析 SODB 数据比特串-->最原始的编码数据 RBSP 原始字节序列载荷-->在SODB的后面填加了结尾比特(RBSP trailing bits 一个bit“1”)若 ...

  3. (转)MPEG4码流简单分析

    把MPEG4码流的分析和它的I,P,B Frame的判定方法在这里简要记录一下吧,供日后的翻看和大家的参考.   测试解码器测试了很久,由于需要将H264和MPEG4的码流进行分析和判断,并逐帧输入解 ...

  4. 【转】打包AAC码流到FLV文件

    AAC编码后数据打包到FLV很简单.1. FLV音频Tag格式                              字节位置    意义0x08,                         ...

  5. H264码流打包分析

    转自:http://www.360doc.com/content/13/0124/08/9008018_262076786.shtml   SODB 数据比特串-->最原始的编码数据 RBSP ...

  6. 将h264和aac码流合成flv文件

    在视频应用中,经常需要将接收到h264和aac数据保存成文件. 本来想用mp4格式,但是mp4在没有正常关闭的情况下会导致文件打不开,而在实际应用中经常会出现设备直接拔电,程序不是正常结束的情况.于是 ...

  7. 打包AAC码流到FLV文件

    AAC编码后数据打包到FLV很简单. 1. FLV音频Tag格式                              字节位置    意义0x08,                       ...

  8. aac adts & LATM封装码流分析

    本文继续上一篇文章的内容,介绍一个音频码流处理程序.音频码流在视频播放器中的位置如下所示. 本文中的程序是一个AAC码流解析程序.该程序可以从AAC码流中分析得到它的基本单元ADTS frame,并且 ...

  9. 视音频数据处理入门:AAC音频码流解析

    ===================================================== 视音频数据处理入门系列文章: 视音频数据处理入门:RGB.YUV像素数据处理 视音频数据处理 ...

随机推荐

  1. Net项目添加 WebAPI

    1.新建一个  WebApiConfig.cs public static void Register(HttpConfiguration config) { // Web API 配置和服务 // ...

  2. 链表问题----删除链表的中间节点和a/b处的节点

    删除链表的中间节点和a/b处的节点 对于给定一个链表的头节点head,实现删除链表的中间节点的函数. 例如 不删除任何节点: 1->2,删除节点1 1->2->3,删除节点2 1-& ...

  3. 《深入理解java虚拟机》读书笔记四——第五章

    第五章 调优案例分析与实战

  4. SSH、telnet配置以及它们之间区别

    命令: SSH ip domain-name www.baidu.com --配置主机名(用来远程访问) user privilege secret --配置账户名和密码 line vty --配置端 ...

  5. uabntu命令行

    1.命令行    命令行中令字体大小变大:ctrl+shift+"+"    命令行中令字体大小变小:ctrl+'-'    不执行:ctrl+c    下一页:f    上一页: ...

  6. 机器学习作业(六)支持向量机——Matlab实现

    题目下载[传送门] 第1题 简述:支持向量机的实现 (1)线性的情况: 第1步:读取数据文件,可视化数据: % Load from ex6data1: % You will have X, y in ...

  7. 未安装Oracle数据库,使用PL\SQL Developer连接远程数据库解决方案

    使用PL/SQL远程连接Oracle服务器 背景:本地未安装oracle数据库服务器,希望远程连接Oracle服务器 1.下载oracle数据库客户端 下载64位windows的instantclie ...

  8. HttpRequestException encountered解决方法

    每次pull代码的时候,总是要输入账号,密码,百度了一下HttpRequestException encountered错误 发现是Github 禁用了TLS v1.0 and v1.1,必须更新Wi ...

  9. Spring与RestHighLevelClient

    Elasticsearch连接方式有两种:分别为TCP协议与HTTP协议 最近使用es比较多,之前使用一直是使用spring封装的spring-data-elasticsearch:关于spring- ...

  10. mybatis(六):设计模式 - 策略模式