基于软硬件协同设计的Huffman解码模块
2011-03-28刘华刘卫东邢文峰
刘华,刘卫东,2,邢文峰
(1.中国海洋大学信息科学与工程学院,山东青岛266100;2.海信电器股份有限公司山东青岛266071;3.青岛海信信芯科技有限公司山东青岛266071)
MP3全称是MPEG-1 Audio Layer-3,是一种音频文件的压缩标准,是有损压缩。MPEG音频层根据压缩质量和编码复杂程度划分为3层,即Layer1、Layer2、Layer3,分别对应MP1、MP2、MP3这3种音频文件,并根据不同的用途,使用不同层次的编码。MPEG音频编码的层次越高,编码器越复杂,压缩率也越高,在音质没有明显损失的情况下,MP1和MP2的压缩率分别为4:1和6:1-8:1,而MP3的压缩率则高达10:1-12:1。MP3是根据心理声学模型,利用人耳听觉特性进行音频压缩[1-2]。对音频文件尽量压缩同时尽量保持好的音质。
1 MP3解码简介
1.1 MP3解码帧的格式
MP3的编码格式是以一帧为单位的,每帧的数据是独立的。压缩后MP3数据也是以一帧为单位的。每帧分为两个颗粒度,每一颗粒度在解码时也是相对独立的,每一颗粒度由576个PCM采样数据组成,即每帧由1 152个PCM采样数据组成。每一帧的比特数是不一定的,每一帧的比特数=(采样数×比特率)/采样率。采样率有44.1 kHz,48 kHz,32 kHz 3种情况,比特率的范围是从32 kb/s到320 kb/s[3]。
每一帧数据包括4部分:帧头(4个字节)、冗余校验数据(2个字节)、音频数据、辅助数据。
帧头信息包括同步信息、版本、层、CRC校验、位率索引、采样率索引、空白字、私有标志、立体声模式、保留位、版权标志、原始媒体和强调方式等。音频数据包括帧边数据和主数据。
帧边信息主要用来为解码当前帧的比特流和为频点数据转换到时域数据提供信息,包括主数据的开始位置,私有位,两个颗粒度共有选择信息,主数据位数,大值,全局增益,比例因子压缩,窗切换标志,块类型,混合块标志,表选择,子块增益,预标志,区域0计数,区域1计数等。
Mpeg1 layer 3的流的主数据格式如图1所示:
图1 主数据结构图Fig.1 Diagram of MP3 data
小值区是量化后频点的绝对值不超过1的区域,即只有-1,0,+1共3种量化系数,剩下的为大值区。
1.2 MP3解码原理
1.2.1 MP3解码流程图
图2 MP3解码一帧数据的流程图Fig.2 Flow chart of decoding one frame of MP3
1.2.2 MP3解码过程
由图2可知,MP3解码过程主要包括找同步头、解头边信息和CRC校验、解码缩放因子、解码Huffman数据、反量化、重排序、立体声解码、混淆缩减、IMDCT变换、频率反转、合成多相滤波器,最后输出PCM采样数据。以下简述MP3解码的步骤[4]。
找同步头即找出帧头在比特流中的位置,帧头为12比特的“1111 1111 1111”即0xfff。头、边信息和缩放因子信息都是用于以后的解码过程,包括一帧的特征信息(采样率、比特率等)各个参数等,缩放因子主要用于Huffman数据进行反量化的过程。Huffman解码过程是通过边信息得到Huffman码表,从而查到Huffman数据,此时的Huffman数据是576个频率线。反量化过程根据缩放的公式和帧边信息,对于不同的块类型用不同的缩放公式以恢复576个频率线量化前的值,此时还是频域范围内的数值。重排序是针对短块进行的,经反量化后得到的频率值不是按时间顺序排列的,重排序就是将频率值按时间顺序重新排列,重排序按窗、子带、频带顺序进行排序。立体声解码是根据帧边信息和立体声解码公式将每一声道的真实的频率值恢复出来。混淆缩减是对于长块和混合块的长块部分来说的,用迭代运算去除两个子带频带之间的混迭现象。IMDCT变换经过IMDCT、加窗、叠加运算变换成时域内的值。频率反转是将频率反转的数值乘以-1进行反转补偿。合成多相滤波器是将32个子带的样值通过矩阵运算得出64个中间值,然后将这64个中间值放入一个长度为1024的FIFO缓冲区,经过抽取、加窗等运算得到最终的32个时域的信号值。
2 MP3解码优化
MP3音频解码可以分为软件实现和硬件实现两种方式,软件实现的优点是灵活,修改方便,研发速度快,缺点是解码速度慢;硬件实现则刚好相反,优点是解码速度快,缺点是成本高并且不够灵活,设计好后不能再进行修改。软硬件协同设计可以充分利用软硬件各自的优点,使系统既有很高的运算能力,又不失灵活性[5-7]。
Huffman解码模块在MP3解码整个过程占有较大的运算量,目前针对这一部分的优化思路较少,本文采用了软硬件协同设计的方法来实现MP3的Huffman解码模块,采用新的硬件架构,增加一些特殊的寄存器,实现一些针对MP3Huffman解码的特殊指令来优化Huffman解码过程[8-9]。
2.1 寄存器介绍
增加的寄存器有MP3_HEAD,MP3_PTR,MP3_OFFSET,MP3_TS。下面说明一下各寄存器的作用。
MP3_HEAD输入比特流寄存器,32比特,分为高低位两部分,每部分16比特。解码时从MP3_HEAD的高位读取数据,当读取的数据超过16比特时,就将低16位比特数据移动到高16位,然后从码流里面再读取16比特存入低16位。
MP3_PTR消耗比特流寄存器,存放MP3_HEAD中消耗的比特数目。
MP3_OFFSET偏移量寄存器,一是第一级table元素的偏移量,为得到表中所找的元素,二是下一级table的首地址,即table的偏移量。
MP3_TS取比特数目寄存器,第一级table元素的偏移量的比特数目。
2.2 结构体介绍
对Huffman的解码是通过查Huffman表进行的,Huffman表是由分级的table组成,每一级table中元素的个数由编程者自己确定,如果在当前级的表(table)中没有查到对应的Huffman码值,就到下级表(table)中继续查,直到查到Huffman码值。每个Huffman表项有16 bit,共有3种情况:
1)find=1,且是大值
3个表项分别对应着下面huff联合体中的3个结构体:
union huff{
struct{
unsigned short find:1;
unsigned short bits:4;
unsigned short x:5;
unsigned short y:5;
}big_value;
struct{
unsigned short find:1;
unsigned short bits:4;
unsigned short t:2;
unsigned short u:2;
unsigned short v:2;
unsigned short w:2;
}small_value;
struct{
unsigned short find:1;
unsigned short size:4;
unsigned short offset:11;
}not_find;
unsigned short find:1;
};
find是标志位,表示是否查找到Huffman码值,find为1,即查找到Huffman码值,find为零,即没查到Huffman码值;size表示从寄存器MP3_HEAD中取的比特数目;offset表示table的偏移量,指在table的首地址;bits表示在某一级table中查找到Huffman码值,在这一级table中实际消耗的比特数目;x,y,t,u,v,w为Huffman码值。
2.3 解码程序
Huffman解码的程序:
void huffdecode(unsigned short*input,unsigned short*output)
{
……
do
{
VLDdec(unsigned short&find,unsigned short*decode_table);
VLDin(unsigned short*input);
}while(!find);
……
if(是大值)
{
Output[i++]=x;
Output[i++]=y;
}
else
{
Output[i++]=t;
Output[i++]=u;
Output[i++]=v;
Output[i++]=w;
}
}
VLDdec是查表指令。decode_table是Huffman码表的指针,指在第1级table的首地址。
VLDin负责向MP3_HEAD装入新的码流数据,input是1指针,指向码流消耗的数据位置。
2.4 解码流程图
Huffman解码流程图如图3所示。
图3 Huffman解码流程图Fig.3 Flow chart of Huffman decoding
2.5 解码过程分析
Huffman解码过程分为两部分,如下分析:
a)VLDdec(unsigned short&find,unsigned short*decode_table);
首先,要进行初始化,对应图3中的初始化。
寄存器MP3_PTR,MP3_OFFSET分别置零,Huffman码表确定第1级table的元素偏移量的比特数目是寄存器MP3_TS的初始化值,其值只有在查找第1级table的元素用到。从码流中取32 bit的数据存入寄存器MP3_HEAD中,此时指针input移动32 bit。
其次,开始解码。VLDdec的解码如图4所示:
图4 VLDdec解码图Fig.4 Decoding diagram of VLDdec
decode_table指向Huffman码表的首地址且指针是不移动的,从寄存器MP3_TS中得到需要从寄存器MP3_HEAD中取的比特数目,取得的比特数据存放在寄存器MP3_OFFSET中,用来求得元素的偏移量。首地址加上存放在寄存器MP3_OFFSET中的数据,得到所需查找的第1级table中的元素。
在该元素中,当find=1,即查找到Huffman码值,若查找到的是大值,则为两个值,分别为x,y;若查找到的是小值,则为4个值,分别为t,u,v,w。bits是在这一级table中实际消耗的比特数目,其值存放到寄存器MP3_PTR中。
在该元素中,当find=0,即在这一级table中没找到Huffman码值,则下一级table的首地址,由该元素中的offset给出,其首地址值存放到寄存器MP3_OFFSET中,再根据size给出的值,从寄存器MP3_HEAD中得到table中元素的偏移量值,首地址加上偏移量得到这一级table中要查找的元素,再看find的值依次循环下去直到查找到Huffman码值,并且把消耗的MP3_HEAD的比特数目累加存在寄存器MP3_PTR中。
b)VLDin(unsigned short*input);
VLDin的解码如图5所示:
图5 VLDin解码图Fig.5 Decoding diagram of VLDin
当解出一组Huffman码值时,需要判断是否要向寄存器MP3_HEAD中输入新的码流,当寄存器MP3_HEAD中消耗的比特数目大于等于16时,即寄存器MP3_PTR中的值大于等于16,则将寄存器MP3_HEAD中的低16位数据移动到高16位,然后从码流中再读取16比特数据存入MP3_HEAD中的低16位,使寄存器MP3_HEAD中始终保持大于等于16比特的有效数据,以便继续解Huffman码值。
上述的硬件架构同样适用于WMA和AAC音频格式的Huffman的解码模块。下面以WMA为例来说明。
WMA和MP3的Huffman解码过程是一样的,只是对应的编码的码字不一样,MP3的Huffman的编码过程是2个数一组或4个数一组编码,WMA的Huffman的编码过程是编码成run、level。level是Huffman码值,run是Huffman码值是零的个数,在level之前。所以对本方案而言,WMA和MP3的不同在于Huffman码表的table元素的不同。
3 实验结果
Huffman查表过程中,一般最多会在第3级table中查找到。两种实现方法运行对比结果如表1所示。表1中的纯软件运行周期是在ARM7软件仿真平台上进行并假定存储器访问延迟为零的情况下得出的结果。从表1可知,用软硬件协同设计实现的Huffman解码过程所用的系统周期大约是纯软件实现的五分之一,大大提高了解码效率。
表1 运行结果Tab.1 The operation results
4 结束语
本文使用软硬件协同设计方法,设计了音频解码模块。结果表明不仅性能优于纯软件解码,且设计过程较为简化,对今后的数字音频解码优化设计具有一定的应用价值。
[1] 陆安江,张正平,岳忠义.一种基于ARM的MP3解码优化设计[J].电子测量技术,2006,29(4):1-3.LU An-jiang,ZHANG Zheng-ping,YUE Zhong-yi.Optimizing design of MPEG-1 layer 3 decoding based on ARM[J].Electronic Measurement Technology,2006,29(4):1-3.
[2] [s.n.]ISO/IEC JTC1/SC29/WG11 MPEG,IS11172-3"Informati on Technology-Coding of Moving Pictures and Associated Audio for Digital Storage Media at up to About 1.5Mbit/s,Part 3:Audio"[EB/OL].(2011-05-12)[2011-06-01].http://dwanfangdata.com.cn/Extenal Resource-shdxx be2001z 10163.aspx.
[3] Andrew N.ARM嵌入式系统开发之软件设计与优化[M].沈建华,译.北京:北京航空航天大学出版社,2005.
[4] Patterson D A,Hennessy J L.计算机组成和设计[M].郑纬民,译.北京:清华大学出版社,2003.
[5] Heinrich M,Mark A D O.Horowitz.hardware/software codesign of the stanford Flash multiprocessor[J].Proceedings of the IEEE,1997,85(3):455-466.
[6] 刘晌,李东晓,姚庆栋,等.面向、HDTV解码应用的RISC核的软硬件协同设计[C]//中国电子学会电路与系统年会第16届年会(ICCAS2001),宁波,2001:352-356.
[7] 戴杰.基于软硬件协同的音频解码器研究与设计[M].天津:天津大学,2008:12-20.
[8] [s.n.]MP3解码原理[EB/OL].(2010-12-10)[2011-06-03].http://wenku.baidu.com/view/649547 ec102d e2bd960588a5.html.
[9] 吴明晖.基于ARM的嵌入式系统开发与应用[M].北京:人民邮电出版社,2004.