适用于Jpeg2000标准的高速比特平面解码方法及电路
技术领域
本发明提出了一种针对JPEG2000标准的位平面解码方法及电路实现,该电路是高速EBCOT解码器的一部分,广泛应用于计算机网络应用、数码相机、摄像机等领域。
背景技术
随着多媒体技术的发展,现在的图像压缩技术不仅要求具有较高的压缩性能,而且还要求有新的特征来满足一些特殊的需求,如在达到较低比特率的同时保留较高的压缩品质,能够同时具备有损和无损压缩方式,能够支持图像局部编解码处理,支持图像质量渐进传输等,这些需求使得JPEG2000标准应运而生。JPEG2000是以离散小波变换为主的多解析编码方式。
自JPEG2000标准公布以来,诸多文献对其编码原理及其电路实现进行了分析,尤其体现在EBCOT(Embedded Block Coding Optimized Truncation)方面。EBCOT,即所谓具有优化截断特性的嵌入式块编码,是JPEG2000编码最关键的技术,也是硬件实现最复杂的部分,它的主要思想是将重要的信息优先编码、传输,为MQ算术编码器提供上下文CX,实现码流的“按质量渐进传输”和“断点优化阶段”。这种算法使得JPEG2000在码流控制上不仅可以输出具有丰富特性的码流,而且还可以生成高压缩比的码流。
由于EBCOT的运算对象是各个子带内的编码块,每个编码块又是由若干比特平面构成,每个编码平面又是由若干个条带(stripe),若干列(column)和若干象素(pixel)构成,JPEG2000编解码的数据处理都是基于这种比特平面进行的,如图1所示,由于每个比特平面需要进行三个编码过程(pass)的扫描和算术编码,大大降低了EBCOT的运算速度,使得EBCOT解码与小波变换之间出现瓶颈。许多文献提出了加速EBCOT运算的VLSI结构,提出了基于象素跳跃(Pixel Skipping)、列组跳跃(Group of Column Skipping)甚至平面跳跃(Plane Skipping)的加速方法。然而,这些方法一般只适用在JPEG2000编码电路中,因为编码时,每个象素的每个比特是透明的,也就是说对于编码器,这些系数是已知的,因而只要存储器足够大,只要缓存足够大,可以将原先串行的三个编码过程改为并行执行,这样就提高了编码效率。但是对于解码电路,对解码器透明的只有压缩的比特流,解码器需要重新构建各个系数平面,要想提高解码效率需要综合考虑JPEG2000的码流特点,以及外部存储器的组织。
JPEG2000标准中的位平面解码属于EBCOT解码的一部分,它的解码原理如图2所示。
一个“图像片”(tile)经过小波变换后分为四个子带(LL,LH,HL,HH),每个子带的系数分为若干个解码块,每个解码块又分为若干个位平面,每个位平面按照三个解码过程依次逐列解码,如图3所示。同编码过程一样,解码也是从系数的最高位(MSB)的位平面开始解码,直到最后一个pass解完,完成所有比特平面的解码。解码时,码块的每个系数分别对应一个4位的状态寄存器,分别记录符号、重要性、幅度特性及该系数是否被访问这四个系数特征。解码起始时所有系数均被初始化为“不重要的”(insignificant),遇到非零比特时,该系数变为重要的(significant),接着接收该系数的符号位,并根据标准中规定的符号计算公式解出该系数的符号,并存入状态寄存器。之后,该系数的其他(在后续比特平面中处理的)比特位即进行“幅度精练”解码,直到整个系数所有比特平面解完。由于在编码时,小波变换将图像的大部分能量都集中到低频的子带,即LL子带,因此从系数构成看,初始的几个位平面为全“零”的平面,这些平面对整个码块信息量贡献很小,因此在开始解码时,需要从包头中获取从MSB开始零平面个数的信息,最后根据解得的系数合成最终需要进行反量化的系数,然后再进行离散小波逆变换。
在每个pass进行解码时,位平面解码器为算术解码器提供系数上下文(context,CX),上下文可以理解为对码块系数及其周围系数特性的一个代数描述,为19个不同的代码,用数字0到18来表示。算术解码器根据CX查找概率估计表并进行相应的比较计算,输出系数值D,然后比特平面解码器根据接收的D,产生下一个系数的CX,再输出给算术解码器。上下文的产生是由当前解码系数周围8个系数的状态信息决定的,如图4所示。处理码块边界系数时,一律视码块之外系数为非重要的,即重要性状态为“零”。JPEG2000的嵌入式编码算法对每个编码通道提供了一个可能的断点,这样可以对码流进行失真度和码率的平衡处理,解码时根据编码的模式设置,提供对断点的支持。此外,本BPD还提供对算术解码起初始化的控制,根据编码码流的模式特性决定如何对算术解码器进行查找表和移位寄存器的初始化工作。
由于解码时,输入给解码器的码流是具有一定pass顺序的,即按照重要性扩展通道,幅度细化通道和清除通道的顺序,因此,解码时解得的系数位不是按每个编码块每个比特平面的条带(Stripe)顺序的,因此要想实现编码通道并行处理的机制十分困难,而且硬件复杂度非常高,串行解码使得解码效率十分低下,解码引擎不断的产生CX,总是按照三个pass的解码顺序扫描已解的系数,并不断地判决下一个系数位属于哪个pass,是否具备可解条件,这样就浪费许多时钟周期。由于同一级各个子带反量化系数都准备好了才能进行小波逆变换的处理,因此,一个仅用BPD模块完成整个tile的解码必将出现瓶颈。而在多个BPD并行处理时,各个BPD的处理速度是不一致的,这样会出现解码快的BPD等待解码慢的BPD的情况,而不能启动已完成解码的BPD开始下一个码块的解码,这样就降低了工作效率。
为了避免BPD解码瓶颈的出现,最大限度提高整个tile的解码效率,并且减少后续小波逆变换时RAM地址访问的硬件开销,本发明采用的优化方法主要有:
(1)采用与片内RAM位宽对应检测窗口对待解的系数位进行扫描,加速“判决过程”。
(2)对存储器进行合理组织,在地址产生时减小硬件开销。
(3)并行实列化3个BPD,分别对LL和LH,HL,HH子带的码块进行解码。
(4)将解码完“无序”的系数按照码块各行列顺序写入外部存储器。
在整个JPEG2000解码器层,采用并行的BPD结构,对多个码块并行解码,提高了BPD和算术解码器、小波逆变换模块的数据吞吐量。
发明内容
本发明的目的在于提出一种适用于JPEG2000标准的,解码效率高,硬件开销小的EBCOT比特平面解码器,是对已实现的JPEG2000位平面解码器的改进,该解码器与算术解码器(MQD)协同工作,完成JPEG2000解码器中的EBCOT解码,对原有码块进行初始化,扩充虚拟系数,形成一个新的码块,BPD采用一个4×6的检测与解码窗口对新码块的系数进行重构,每个pass解码时采用“窗口跳跃”方法,并采用流水的方式处理解码、寄存器更新、写外部RAM的过程,以提高解码效率,最终将解得的系数存入外部RAM中;BPD解码电路访问片内RAM采用多bank方式,减小存储器访问次数,并在整个JPEG2000解码器实例化多个BPD模块并行解码,以提高解码效率;
所述的协同工作是指BPD和MQD通过两个握手信号,即bpd_ready和mqd_ready,仅在两个时钟周期以内完成一次比特平面上下文(Context,CX)和解码比特(D)的传输;
所述的对图像系数重构是指在重要性通道,幅度细化通道和清除通道的三个pass通道解码时通过输入的比特位重建整个系数;
所述的窗口跳跃方法是:对于每个比特平面,在三个通道解码过程中,跳过窗口内无需解码的2×4个系数位;
所述的流水方式处理系数包括三个过程:
(1)对读入窗口的系数位进行通道解析,筛选出待解的系数,即处理过程;
(2)对系数位寄存器的更新过程,即将新的系数值及状态值进行更新;
(3)将解得的系数写到对外部存储器的过程。
本发明基于现有的JPEG2000标准的EBCOT编码器原理,并将其进行改进提出的。BPD解码器内部包含象素解析部分,和存储器操作部分,电路结构如图5所示。象素解析部分主要采用一个象素检测窗口,该窗口大小视片内存储器的位宽决定,位宽越大,意味着一次读入的系数越多,窗口就可以设置的越大,一次扫描的信息量就越大,存储器分为多个bank,分别存放每个条带中各个行的系数,如图6所示。如本发明中采用的存储器位宽为64bit,BPD解码的系数为16位,这样一次可以读取两列系数到内部寄存器。这样构成4×6的扫描窗口,只需一个时钟周期可以完成窗口内待解系数的定位或者发生skip的判决。如果窗口中含有待解的系数位,则根据“bit index”指向在一个周期内产生相应的上下文CX,并通过两根握手信号与MQD在两个时钟周期内共同完成一个或四个(run-length下为四个)系数位的解码。系数从RAM的读取到电路内部进行判决(处理过程)、解码结果的更新是按照流水的方式进行操作的,如图7所示。
在扫描窗口中采用一下两种加速策略的结合,分别为:
(1)跳过非待解系数位,即Pixel Skipping,PS。
(2)跳过不包含解码系数位的窗口(4×2个系数),即Window Skiping。
由于每个码块解出来可能包含不同数量的全“零”平面,位平面的解码是按照从MSB到LSB的顺序解的,而同步RAM又不能按位读取,这样需设置一个24×16位通用的寄存器,用来存储当前解码的系数,当系数的状态寄存器更新时,系数寄存器同步更新,当最后一个Pass解完,即完成了整个码块的解码,再将系数寄存器的系数倒序排列,输出到外部存储器中,自动完成“零”补齐的工作。
与编码过程不同,解码时每个位平面的三个解码过程需要按照顺序进行,硬件电路实现并行解码比较困难,除非将传输的码流进行缓存控制,并予以相应截断,这样会很大程度上增加硬件复杂度。因此,为了不过多增加硬件复杂度,本BPD采用在每个解码过程中进行加速。由于系数RAM的位宽为64位,每个单元最多存储4个系数(每个系数为16位),系数状态RAM的位宽为16位,每个单元同样存储4个系数的状态,系数RAM和系数状态RAM地址共享,这样对系数状态进行更新的同时对系数也进行了更新。另外,为了降低解码引擎对片内RAM的访问次数,本BPD内部RAM分别采用3个bank存储系数和系数状态,如图6所示,将每个条带的不同行系数分布到不同的bank,也就是说,在读取和存入系数及系数状态时,对RAM的操作是按照“123”,“321”,“123”……的顺序进行,这样做的好处是降低处理每个条带时硬件对RAM的访问次数,平均每个条带每个窗口1次,从而降低了功耗。
JPEG2000标准中规定了Vertically causal mode,这种模式主要针对CX形成规则,当窗口扫描到条带边界时,视条带外的象素的significant状态为“零”。解码时为了支持该模式,同时减少硬件复杂度,本BPD通过占用了少量内部存储器资源,采用将原码块边缘扩展虚拟象素的方法,将“新的”码块存入内部RAM,对于最后一个条带无法构成完成窗口的码块,将条带补齐,使得上述扫描窗口可以一致的从码块头到码块尾扫描完毕,而无需增加非完整条带的判断过程及相应硬件。
由于后续的小波逆变处理换需要等同一级中整个“图像片”(tile)反量化后的系数都准备好,而BPD仅是针对码块级的解码,若将整个“图像片”的解码系数存储起来必将浪费大量片内RAM,而且还要增加小波逆变换模块的访问端口,从而增加RAM成本,因此本BPD采用将码块系数写到外部RAM的方法,解决以上问题。在解码到最后一个平面时,将解得的系数不在存放到片内RAM,而是通过一个34位接口(18位地址和16位数据)将系数写到外部RAM中。在扫描窗口中解码与写外部RAM操作是流水的方式进行,由于解码时系数不是按照每条带每列的顺序重构的,而是按照三个解码过程重构的,因此从解码器特点角度考虑也应该采用这种流水方式,在解码过程中将系数输出,既提高了工作效率又重用了地址产生单元,和bit index引擎。
为了加速每个“图像片”的解码,在JPEG2000硬件解码器中采用并行BPD,即将LL和HL、LH、LL分别采用三个不同BPD模块并行解码,提高解码效率。如图8所示。
附图说明
图1JPEG2000压缩标准中的码块及位平面、条带、列、象素
图2比特平面解码器原理图
图3比特平面的解码顺序
图4系数的CX,“X”为当前解码的系数,“H”、“V”、“D”分别表示与该系数相邻对水平、垂直和角线方向的系数,这九个系数的状态信息共同构成X系数的19个CX值。
图5BPD的电路结构。
图6系数在片内RAM中的存储方式。
图7系数从RAM的读取,电路内部的处理与寄存器更新的流水线操作过程。
图8BPD的并行结构。
图9扫描窗口解码时序图。a为发生一次skip情况,b为发生多次skip情况。
图10比特引导电路原理图
具体实施方式
下面结合三个解码过程进一步详细描述本发明。
整个EBCOT的解码是在BPD与MQD配合下完成的,两者通过两条握手信号:bpd_rely和mqd_ready信号完成通讯,CX和D的产生均是在一个时钟周期完成,即每产生一个解码系数位需要两个时钟周期。时序图如图9所示,这样需要在一个时钟周期内完成“象素引导”的工作,即找到当前窗口内待解的系数位,当该系数解完后,完成寄存器的更新,bit_index的相应位变为“零”,于是引导解码引擎进行下一位的解码,即bit_index从高位起的第一个非零位,若bit_index为全零,表明当前窗口的所有系数解码完毕,则发生RAM的读取和写操作,寄存器窗口向左移动两列,此时,新的系数及系数状态进入扫描窗口,新的bit_index产生,依次,进行新的窗口的系数引导与解码。本发明采用的窗口大小为6×4,有效处理象素为8个,构成8个比特ID,该8个ID的有效性由Pixel ID generator产生,根据JPEG2000标准规定的CX形成规则,分别产生这8个ID的使能电路,再由pixel state generator产生这八个系数的状态信息,根据当前的解码过程判定好的8个ID有效状态,产生bit_index信号,通过选择最终产生待解系数的状态信息——由两个字节表示的唯一数值,输出到CX查找表,最终生成该系数的CX,输出给算术解码器。电路结构如图10所示。
当bit_index为“零”时,表示没有待解码的系数,则输出skip信号,这时进行一次RAM的读写操作,并且窗口左移两列,将新的系数状态和系数读入寄存器中,这样构成了新的“引导窗口”,若此时该窗口仍不含待解的系数,则继续“跳跃”两列,读入新的系数进行判断,若包含待解的系数,则根据是否需要pixel skip选择正确的待解系数,解码引擎根据引导的系数地址及当前的解码过程产生需要的系数状态,根据这个系数状态产生当前系数的CX,输出给MQD,并产生cx_ready有效信号。无论是pixel skip还是window skip都是在一个时钟周期内完成的。特别地,当解最后一个比特平面时,由于本发明将写外部RAM的过程集成到模块内部,因此在解码同时还要写RAM的信号以及相应系数的地址,在一个窗口内,系数解码和写外部RAM是按流水方式进行的,即若内存控制器没有相应,不会耽误解码的继续进行。
解码过程中,当Vertically causal mode为无效时,表示在解码本条带边界系数比特时需要考虑相邻条带系数状态的影响,也就是说,在产生某些系数位的CX时需要考虑相邻条带系数状态值(significant状态和符号状态)。这就需要合理构造RAM结构,如果安排不合理必然造成RAM的重复访问,从而增加电路的功耗。为了解决此问题,本BPD首先将原有码块进行虚拟系数扩充,可以形象的表示为将原有码块“包了一层”,若最后一个条带为非完整条带时,为了保证硬件处理的一致性,将其扩充为完整条带,这样“新”的条带可以认为由6行系数构成,然后采用三个bank分别存储每个条带的1、2行,3、4行和5、6行。处理第一个真实条带时,分别读取和写入bank1、bank2、bank3中的数据,当处理第二个真实条带时,相当于bank1和bank3发生了调换,即读取和写入bank3、bank2、bank1中的数据,因此,设置一个swap信号,根据条带序号swap信号进行翻转,控制bank的翻转状况。
本BPD中在进行最后一个比特平面解码时,将系数写入外部存储器,供反量化和小波逆变换时访问。解码器根据当前pass的计数判断是否解到最后一个比特平面,若为最后一个平面,则每解完一个系数立即将该系数写到外部RAM,写外部RAM和解当前窗口的系数以流水线方式进行。如图9所示。
在JPEG2000解码中,最重要的部分为EBCOT解码、反量化和小波逆变换,反量化过程相对简单,占用时钟周期较少,小波逆变换过程需要整个子带的系数全部准备好,因此整个解码瓶颈会出现在EBCOT解码,因为EBCOT解码是基于码块的,而一个BPD和MQD只能同时处理一个码块,为了减小这种瓶颈的影响,提高整个图像的解码效率,本发明采用并行结构配置三路BPD分别对LL和LH,HL,HH子带的码块进行解码。
本发明完成Verilog RTL设计,并采用Xilinx Vertex II FPGA,利用Xilinx ISE进行综合并下载,在50MHz的时钟频率下可以达到12M bits/S的比特率。