在AAC编码器内部,使用huffman coding用于进一步减少scalefactor和量化频谱系数的冗余。

从individual_channel_stream层提取码流进行huffman解码,码流信息包括解码量化频谱数据部分(global_gain,section_data(),section_scalefactor(),spectra_data())和解码脉冲数据部分(pulse_data_present, pulse_data())。

global_gain编码成一个8位的无符号整数,第一个scalefactor与global_gain进行差分编码后再使用scalfactor codebook进行huffman编码。后续的各scalefactor都与前一个scalfactor进行差分编码。

量化频谱系数来自码流中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编码的4个一组的量化频谱系数和2个一组量化频谱系数的传送顺序是从低频系数到高频系数. 对于每个frame有多个windows的情况,要注意有分组和交织情况,系数的集合需要解交织,

量化频谱系数存储在数组x_quant[g][win][sfb][bin]。

对于4个一组的量化频谱系数(w,x,y,z):

x_quant[g][win][sfb][bin]=w;

x_quant[g][win][sfb][bin + 1]=x;

x_quant[g][win][sfb][bin + 2]=y

x_quant[g][win][sfb][bin + 3]=z;

AAC的huffman解码一共有15个码本(codebook),除了一个码本专用于scalefactor解码.11个码本用于量化频谱系数的解码.1个码本表示传输的系数全位零,是0码本,不需解码.2个码本是intensity码本,也是0码本.在为量化频谱系数解码的11个码本中,每个码本有自己可以编码的最大量化量化频谱系数的绝对值,用LAV表示. 用于量化频谱系数的解码的11个码本中最后一个码本可以解码出谱线系数的最大值是16.但当解码出谱线系数的值大于0小于16的时候.解码出的值就是实际的量化频谱系数的绝对值,当解码锄地谱线系数是16时,表示退出huffman解码,使用其他方式解码.所以在该码本中解码出的值16被定义成ESC_FLAG.unsigned_cb[i]标志位表示该码本是有符号码本还是无符号码本,unsigned_cb[i]=0时表示该码本是有符号码本, unsigned_cb[i]=1时表示该码本是无符号码本.解码有符号数时,先按照无符号解码再从输入的解码比特流中提取符号位,若解码出的量化频谱系数非零,则其符号位紧跟在被该量化频谱系数的码字(codeword)的后面。

Codebook Number,i:码本的索引,即码流中sect_cb值。

unsigned_cb[i]:表示码本i是有符号码本还是无符号码本。

Dimension of Codebook:即4个一组量化频谱系数还是2个一组。

Table A.1~12为huffman codebook,下面只给出TableA.2示例:(length为codeword的bit数)

Huffman解码就是从spectral_data中读出huffman codeword,然后在对应的huffman codebook中查找出codeword所对应的index,根据index计算出4/2个量化频谱系数。每个量化频谱系数对应一个频率,最后通过量化频谱数据查找出对应的频率,最终乘以scalefactor得到真正的频率数据。

index到4个量化频谱系数的计算方法如下:

如果huffman codebook是unsigned的,那么需要huffman解码完成index到量化频谱系数的映射后,根据spectral_data()查找到codeword的紧接着的0~2个bit,来加上符号。

例如,hcod[7][y][z]表示第7个codebook的频谱系数(y,z)对应的codeword

紧接着的为0~2bits为pair_sign_bits,

那完成index到(y,z)的映射后,做如下处理:

huffman 解码流程图如下:

参考:

http://www.cnblogs.com/gaozehua/archive/2012/05/15/2500864.html

;

AAC huffman decoding的更多相关文章

  1. AAC Joint coding

    1. M/S stereo M/S stereo 作用于channel pair. channel pair对于listener来说通常具有对称性,即第一个channel和第二个channel相似性较 ...

  2. FFmpeg 2.1 发布

    FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它包括了目前领先的音/视频编码库 libavcodec. FFmpeg是在Linux下开发出来的,但它可以在包括W ...

  3. FFmpeg 2.1 试用(新版支持HEVC,VP9)

    前两天帮一位老师转码图像的时候,无意间发现新版FFmpeg竟然支持了下一代编码标准HEVC,以及Google提出的下一代编码标准VP9.真心没想到FFmpeg对下一代的编码标准支持的是如此之快.我还以 ...

  4. CUDA JPEG编码

    基于英伟达的jpegNPP工程,分离实现独立的JPEG压缩. 由于原工程是直接把解码时的jpeg图片的信息直接作为编码时的信息,所以在做独立的JPEG编码时,需要自己来填充各种信息. 1.JPEG编码 ...

  5. 手把手实现andriod应用增量升级

    近期研究了android应用增量升级的应用.当中用到了android NDK编程,先说下为什么要使用增量升级.当我们的应用达到一定大小的时候,比方眼下有30M.假设新版本号35M仅仅是添加了几个功能, ...

  6. NVIDIA A100 GPUs上硬件JPEG解码器和NVIDIA nvJPEG库

    NVIDIA A100 GPUs上硬件JPEG解码器和NVIDIA nvJPEG库 Leveraging the Hardware JPEG Decoder and NVIDIA nvJPEG Lib ...

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

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

  8. (转) 解密H264、AAC硬件解码的关键扩展数据处理

    出自:http://blog.itpub.net/30168498/viewspace-1576794/       通过上一篇文章,我们用ffmpeg分离出一个多媒体容器中的音视频数据,但是很可能这 ...

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

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

随机推荐

  1. c#判断字符串是否可以转日期格式

    在C#中,对格式的判断有一类专门函数,那就是TryParse.TryParse在各个不同的类型类(如int,string,DateTime)中,都是存在的.在TryParse中一般有两个参数,一个是待 ...

  2. NumPy迭代数组

    numpy.nditer是NumPy的一个迭代器对象,提供能够灵活的访问一个或者多个属猪元素的方式. # 迭代 z=np.arange(6).reshape(3,2) for x in np.ndit ...

  3. phpstorm安装bootstrap插件

    一个插件可以很好的让我们工作节约时间 Bootstrap,来自 Twitter,是目前最受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,它简洁灵活,使得 We ...

  4. JS 动态改变浏览器title标题

    onfocus 和 onblur 事件,监听离开页面和进入页面 <script> window.onfocus = function () { document.title = '要走的人 ...

  5. 1、微服务--为什么有consul,consul注册,心跳检测,服务发现

    一.为什么有consul? 在微服务,每1个服务都是集群式的,订单服务在10台服务器上都有,那么用户的请求到达,获取哪台服务器的订单服务呢?如果10台中的有的订单服务挂了怎么办?10台服务器扛不住了, ...

  6. css实现聊天气泡效果

      --------------------------------------- css功能强大,能实现很多炫 酷的效果,今天给大家分享 用css3绘制聊天气泡的方法: -------------- ...

  7. 消息队列和Kafka

    ------20191211闪

  8. CPPU OJ | 开发日志

    2019.12.18 ~ 2019.12.22 用腾讯云的学生服务器测试搭建OJ(踩了无数的坑) 2019.12.25 ~ 2019.12.28 在模管中心办理申请虚拟服务器的手续 2019.12.3 ...

  9. Luogu4316 | 绿豆蛙的归宿 (期望DP)

    题目背景 随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 题目描述 给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够到达所有的点,所有的点也都 ...

  10. 【Python】画一个心形

    #!/usr/bin/env python # -*- coding:utf-8 -*- import turtle import time # 画心形圆弧 def hart_arc(): for i ...