Jpeg-ls游程编码硬件实现方法

文档序号:7743215阅读:705来源:国知局

专利名称::Jpeg-ls游程编码硬件实现方法
技术领域
:本发明属于图像处理领域,涉及一种基于FPGA实现JPEG-LS游程编码的方法。
背景技术
:JPEG-LS(InformationTechnology-Lossless/near-losslesscompressionstandardforcontinuous-tonestillimages)算法是联合图像专家组(JointPhotographicExpertsGroup)制定的一种图像压縮标准,相比于其它的压縮算法,JPEG-LS在无损和近无损压縮领域具有更高的压縮性能,在医疗、遥感图像通信等对恢复图像质量要求高的领域有着广泛的应用。JPEG-LS标准算法采用两种模式对像素进行编码_游程模式和常规模式,常规模式对预测残差进行Golomb编码,而游程模式对游程长度进行编码,用来压縮图像的平坦区域,从而对平滑图像可以进行大倍率的压縮,因此对JPEG-LS压縮比提高起着至关重要的作用。JPEG-LS游程编码的输入是游程长度RUNcnt和行尾标志E0Line,游程编码需要使用J表和RUNindex索弓l,J表艮卩J={0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,5,5,6,6,7,7,8,9,10,11,12,13,14,15},RUNindex索引初始值为O,范围为031,编码过程中RUNindex索引不断计算更新,并且通过RUNindex索引查找J表相应值。时执行i输出比特'rIIRUNcnt=RUNcnt-2J[Index]III当RUNindex<31,RUNindex=RUNindex+1该步骤的编码结果定义为游长编码。b、当到达行尾,即E0Line==1时执行I当RUNcnt>O,输出比特'1,II跳出游程编码该步骤的编码结果定义为行尾编码。c、输出比特'0',该步骤的编码结果定义为分隔编码。d、输出J[RUNindex]比特RUNcnt二进制数(MSB开始),该步骤的编码结果定义为残差编码。e、当RUNindex>0,RUNindex减1。然后,跳出游程编码。上述流程如附图1所示,为JPEG-LS标准算法采用的游程编码方法。从中可以看出,游程编码的判断分支较多,码字分多次追加输出并且下一次编码用到前一次更新后的RUNindex值,这些都不利于FPGA硬件实现。在a步骤中,需要不断判断RUNcnt>2瓜皿由],循环次数不确定,造成设计复杂,资源占用较多,难于流水实现。另外,RUNindex每次编码完更新,给下一次游程编码使用,这相当于在硬件上实现数据环路。再者,d步骤的码字与4a步骤后残差RUNcnt和更新后的RUNindex相关,也就是输出的码字可变,这也给硬件设计带来了困难。国内外关于FPGA实现JPEG-LS的非专利文献较多,但都没有涉及游程编码的具体实现。例如,清华大学学报(自然科学版)2007年第47巻第10期,《低功耗全流水线JPEG-LS无损图像编码器的VLSI设计》一文提出了一种多时钟域全流水线设计实现JPEG-LS,文中对Golomb编码的设计做了详细介绍,并且介绍了中断编码、游程编码和常规编码的三种码字合成,但是并未对游程编码的设计作叙述。弹道与制导学报2006年第26巻第2期,《基于FPGA的JPEG-LS无损压縮算法的实现》一文提出的编码器具有处理高分辨率图像的能力,但是系统的数据吞吐率约为64Mbps,也就是相当于像元时钟为8Mhz(以图像位深度为8bit计算),并且也没有提到游程编码的实现过程。专利申请号为CN200710141738.X,名称为《用于医学图像的基于快速JPEG-LS的压縮方法》的中国专利公开了一种图像数据压縮和重建技术优化方法,优化可以被应用于基于JPEG-LS的算法以使处理加速约50%,同时保持误差可控性和压縮比。但是,该专利中也未涉及游程编码的FPGA硬件实现的内容。
发明内容本发明的技术解决问题是克服现有技术的不足,提供了一种处理速度高、实时性好、便于流水设计的JPEG-LS游程编码硬件实现方法。本发明的技术解决方案是JPEG-LS游程编码硬件实现方法,步骤如下(1)输入前次游程编码更新后的范围在031之间的索引值RUNindex和游程长度RUNcnt,然后根据二者计算得到比较标志CompareFlag、映射值Map_Value和编码减值Sub_Jvalue[RUNindex],其中,CompareFlag的计算公式如下f1!y2J_Value[w]Cowpt"e_F/ag=<{_w=0~31lOz/iMVc"f<J—Value[附]编码减值Sub—Jvalue[i]的计算公式如下Sw6/va/we(TI=<{-lJ一T画[Z-1]1&、31映射值Map_Value=x。x丄,x3。x31,j=0flz/iLWc"QJTransRUNindex[/]x———u」、0z/iMVc"/<JT腦RUNindex[;']31,x,.的计算公式如下其中乂—rra"s["]=t2J'],"=0~31,j_Value[p]=2J[P],p=031J_Trans_RUNindex[q]=J_Trans[q]_Sub_Jvalue[q],q=031;J_Trans、J_Trans_RUNindex、Sub_Jvalue和J_Value均采用映射表的形式存储在FPGA内部,采用索引值RUNindex和游程长度RUNcn查表获得具体值;(2)输入行尾标志EOLine,根据行尾标志EOLine以及步骤(1)得到的比较标志CompareFlag、映射值M即—Value计算出更新后的索引值RUNindex,计算时采用两级更新,其中一级更新完成RUNindex的累加运算,一级更新后RUNindex的值为映射值M即—Value中1的个数,二级更新完成RUNindex保持不变或者RUNindex的值减1运算;当比较标志CompareFlag为0时,只进行二级更新操作,当比较标志CompareFlag为1时,先进行一级更新,而后进行二级更新,当输入行尾标志E0Line为1时,二级更新操作为保持RUNindex不变,当输入行尾标志EOLine为0时,二级更新操作为RUNindex的值减1运算;一级更新采用寄存器、查找表实现,二级更新采用加法器、多路选择器和寄存器实现,每级更新执行各自占用一个时钟周期;(3)根据游程长度RUNcnt,步骤(1)得到的映射值M即—Value、编码减值Sub_Jvalue[RUNindex]以及初始索引值RUNindex计算出游长编码和残差编码,其中游长编码为映射值M即Jalue中由全部l组成的码段,残差编码为J[k+1]比特的y,计算公式为y=RUNcnt-J_Trans[k]+Sub_Value[RUNindex],其中k应同时满足以下两个关系式,RUNcnt>J_Trans_RUNindex[k]且RUNcnt<J_Trans_RUNindex[k+1];(4)将步骤(3)得到的游长编码、残差编码和行尾编码'1'、分隔编码'0'按照8种不同情况完成编码合成,输出合成后的编码值和编码长度并等待下一次编码开始;所述的8种情况如下表所示,<table>tableseeoriginaldocumentpage6</column></row><table>上表中当残差编码值大于零时残差标志为1,当残差编码值不大于零时残差标志为0,&为连接符号,游程编码值用VI表示,游程编码长度用Ll表示,残差编码值用V2表示,残差编码长度用L2表示,游程编码值用V表示,游程编码长度用L表示。本发明与现有技术相比的优点在于(1)本发明JPEG-LS游程编码硬件实现方法可以全部采用FPGA实现,具有全流水线、实时性好的特点;(2)本发明方法通过引入编码映射操作,解决了原标准算法中多个时钟周期循环编码的问题,具体方法是预先计算生成四个表,存储在FPGA内部的查找表和块存储器中,通过比较查表得到编码需要的映射值、比较标志和编码减值,这样可以零周期实现循环编码操作;(3)本发明方法,根据只游长编码采用索引值RUNindex单周期更新操作,同时游长编码和残差编码采用索引值RUNindex双周期更新操作。该RUNindex更新和编码映射构成数据环路,通过编码映射引入四个映射表和RUNindex更新引入单双周期,解决了游程编码中数据环路的路径过长瓶颈问题,使得更新后的RUNindex可以提供给下一次游程编码,能使游程编码全流水实现;(4)本发明方法预先计算出游长编码和残差编码所有可能的结果,存储在FPGA内部的查找表和块存储器中,通过比较映射值查表可以得到相应的结果。该步骤的查表可以单周期完成,流水线实现;(5)本发明方法提出的编码输出由固定位宽的编码值和编码长度组成的格式,相对于不固定位宽的编码输出,在编码合成时易于操作,实现简单,可移植性好。图1为采用JPEG-LS标准算法进行游程编码的流程图2为采用本发明方法进行游程编码的流程图3为本发明映射产生步骤的流程图4为本发明RUNindex更新步骤的流程图。具体实施例方式如图2所示,为本发明方法的流程框图,主要包括四个步骤,即映射产生、RUNindex更新、码字产生和码字合成。下面分别介绍四个步骤1)映射产生映射产生步骤所需要的输入为索引值RUNindex和游程长度RUNcnt,然后根据二者计算得到比较标志CompareFlag、映射值M即—Value和编码减值Sub_Jvalue[RUNindex]。映射产生的流程如图3所示,主要包含四个映射表J_Trans、J_Trans_RUNindex、Sub_Jvalue禾口J_Value。J_Trans表由J表得至lj,公式为J—=尤2J[;1,其中n=031,即J_Trans={1,2,3,4,6,8,10,12,16,20,24,28,36,44,52,60,76,92,124,156,220,284,412,540,796,1308,2332,4380,8476,16668,33052,65820}。上面是RUNindex初始值为0的J_Trans表,对于初始值不为0的RUNindex,J_Trans表更新为J_Trans_RUNindex表,J_Trans_RUNindex[q]=J_Trans[q]_Sub_Jvalue[q],Sub_Jvalue表由J_Trans表得到,Sub_Jvalue[q]的取值在硬件上通过q查Sub_JValue表得到,表示为公式如下通过RUNcnt和J_Trans_RUNindex--做比较,即采用RUNcnt和J_Trans_RUNindex比较得到x。、禾PJ_Trans_RUNindex[1]比较得到.,和J_Trans_RUNindex[j]比较得到Xj,.,禾PJ_Trans_RUNindex[30]比较得到x3。,禾PJ_Trans_RUNindex[31]比较得到x『然后拼接x。,Xl,...,Xj,...,x3。.x31得到映射值M即Jalue,拼接公式为M即Jalue=x。Xl.Xj.x3。x31,j=031,Xj的计算公式如下「1z"LWc"QJTransRUNindex[/]r=<!—一L0MVW<J—Trans—R而ndex[;.]映射值Map_Value中包含的1的个数即为标准算法中a步骤II执行次数。另夕卜,J_Value表的产生公式J_Value[p]=2J[P](p=031),可得J_Value={1,1,1,1,2,2,2,2,4,4,4,4,8,8,8,8,16,16,32,32,64,64,128,128,256,512,1024,2048,4096,8192,16384,32764},通过输入RUNindex查表J_Value得到J_Value[RUNindex],然后采用RUNcnt和J_Value[RUNindex]比较得到比较标志CompareFlag,CompareFlag的公式如下,flz/iWVc"OJValue[附]Co,are_F/ag=<{一(w=0~31)(0J—Value[附]比较标志CompareFlag为0时,只进行残差编码(标准算法d步骤),比较标志CompareFlag为1时,既进行游长编码(标准算法a步骤),又产生残差编码(标准算法d步骤)。上述两个比较过程均采用来硬件来实现,如图3所示,编码映射步骤由J_Trans表、J_Trans_RUNindex表、Sub_Jvalue表、J_Value表和33个比较器组成。第一,上次游程编码更新后的RUNindex查表Subjvalue得到Sub_Jvalue[RUNindex];第二,J_Trans表减去Sub_Jvalue[RUNindex]得到J_Trans_RUNindex表,输入的RUNcnt和J_Trans_RUNindex表的值通过32个比较器——比较得到映射值M即—Value;第三,上次游程编码更新后的RUNindex查表J_Value得到J_Value[RUNindex],输入的RUNcnt和J_Value[RUNindex]通过比较器比较得到比较标志CompareFlag。该步骤的第一和第三在硬件上同时执行,由于都是查表比较操作,可以零周期实现编码映射。该步骤将原算法a步骤循环不确定的问题,预先计算映射生成四个表,存储在FPGA内部的查找表和块存储器中,采用索引值RUNindex和游程长度RUNcnt的一系列查表比较得到比较标志CompareFlag、映射值M即—Value和编码减值Sub_Jvalue[RUNindex],提供给下面的步骤完成RUNindex更新和码字产生。上面操作的原理如下假设RUNcnt=r,EOLine=0,RUNindex=s(0《s《31),分两种情况考虑(1)RUNcnt>2J[Index]情况该种情况下,既产生游长编码(标准算法a步骤),又产生残差编码(标准算法d步骤)。按照标准算法a步骤,RUNcnt可以展开为下式,RUNcnt=2J[S]+2J[S+1]+.+2+y(k>s,y为残差且y<2m+1])。下面以1《s《31的情况进行讨论(s=0的情况,定义SubJvalue=O,计算方法和结果与1《s《31的情况一致)定义,J一rra"4iW/"cfe;c]=Z2单](及MV/mfec:031)4=0J_Trans=2J.J_Trans[S-l]=2n°」+.+2JLs—"J_Trans[S]=2则+.+2J[S—1]+2'J_Trans[k]=2J[。]+...+2J[S—1]+2J[S]+...+2J[k]J_Trans[k+l]=2J[°]+...+2J[S—1]+2J[S]+...+2J[k+1]J_Trans[31]=2n°」+...+2化—"+2化」+,..+2JL31」以上各式分别减Subjvalue[s]=2J[°]+2J[1]+.+2化—1]得,J_Trans_RUNindex=_(2J[1]+.+2J[S—1])J_Trans_RUNindex[s_l]=0J_Trans_RUNindex[s]=2J[S]J_Trans_RUNindex[k]=2J[S]+...+2J[k]J_Trans_RUNindex[k+l]=2J[S]+.+2J[k+l]J_Trans_RUNindex[31]=2JLs」+...+2JL31」采用RUNcnt=2J[S]+2J[S+1]+.+2J[k]+y(k>s,y为残差)与上式做一一比较得,x。=RUNcnt>J_Trans_RUNindex=1xs—i=RUNcnt>J_Trans_RUNindex[s_l]=1xs=RUNcnt>J_Trans_RUNindex[s]=1RUNcnt>J_Trans_RUNindex[k]=1=RUNcnt>J_Trans_RUNindex[k+l]=xx...x31=RUNcnt>J_Trans_RUNindex[31]=0拼接x。、......x31得到Map—Value=x。x^x3。x31。(2)RUNcnt<2J[Index]情况该种情况下,不执行标准算法的a步骤,所以无游长编码,a步骤后RUNindex值保持不变,还是s。残差编码可以表示为J[RUNindex]比特的RUNcnt,即J[s]比特的r。2)RUNindex更新该步骤所需要的输入为索引值RUNindex、比较标志CompareFlag和映射值Map_Value,通过单双周期更新操作得到更新后的RUNindex,更新后的RUNindex提供给下一次游程编码使用。在标准游程编码流程中,有两个环节完成RUNindex的更新,即
背景技术
中提及的a步骤和e步骤。由于RUNindex更新步骤与映射产生步骤构成数据环路,为了保证流水实现和满足速度要求,RUNindex分为两级更新,每级更新都插入一级寄存器。一级更新完成a步骤的RUNindex累加运算,采用查找表实现,通过输入的映射值Map_Value可以查表1得到更新后的RUNindex;二级更新完成原算法b步骤RUNindex不变操作,硬件上为直通或者e步骤的RUNindex减1运算。当输入行尾标志EOLine为1时,二级更新操作为保持RUNindex不变,当输入行尾标志EOLine为0时,二级更新操作为RUNindex的值减1运算。表lRUNindex—级更新结果表<table>tableseeoriginaldocumentpage10</column></row><table><table>tableseeoriginaldocumentpage11</column></row><table><table>tableseeoriginaldocumentpage12</column></row><table>根据映射产生步骤中的原理推导可知,Runlndex更新后的值为(k+1),M即—Value和k+1—一对应可以得到表l,表1中4字节映射值M即—Value中1的个数为标准算法中a步骤II执行的次数,每增加一个l,说明Runlndex的值就加1。例外情况是M即—VAlue=Oxff—ff—ff—ff,若按照上述规律Runlndex的值应为32,而按照标准算法Runlndex的最大值为31,因此已在表1中做了修正。比较标志CompareFlag为0或者1是RUNindex单双周期的选择信号,RUNindex更新的流程如图4所示,一级更新采用寄存器和查找表组成,二级更新采用加法器、多路选择器和寄存器组成,两级更新之间的多路选择器用来选择执行只执行二级更新还是同时一二级更新,具体硬件实现描述如下。当RUNcnt初始值小于2J[Index],比较标志CompareFlag为0,不执行一级更新,即不执行a步骤,只执行RUNindex二级更新。在图4中,CompareFlag为0,多路选择器MUX执行0分支,也就是输出的RUNindex经多路选择器MUX的0分支执行RUNindex二级更新,二级更新按照下面的公式整个RUNindex更新步骤需要一个时钟周期(单周期)运算,能保证流水线实现,可以提供给下一个游程编码更新后的RUNindex值,符合JPEG-LS算法要求。当RUNcnt初始值大于等于2J[Index],比较标志CompareFlag为1,同时执行一级更新和二级更新,也就是执行a步骤和e步骤。在图4中,CompareFlag为l,多路选择器MUX执行1分支,也就是输入的RUNindex首先经一级更新查表运算,继续执行RUNindex二级更新,然后输出更新后的RUNindex。整个RUNindex更新步骤包含两个寄存器需要两个时钟周期(双周期)运算,也满足JPEG-LS算法要求。3)码字产生码字产生步骤所需要的输入为初始RUNindex、游程长度RUNcnt、映射值M即—Value和编码减值Subjvalue[RUNindex],查表2生成游长码字和残差码字,并给出残差标志Leaving—Flag,传递给下一级码字合成步骤完成合成操作。表2游程编码映射表(4)<table>tableseeoriginaldocumentpage13</column></row><table><table>tableseeoriginaldocumentpage14</column></row><table><table>tableseeoriginaldocumentpage15</column></row><table>根据映射产生步骤中的原理推导可知,游长编码输出(k+l-s)个'l',这样可以得到表2中Map_Value和游长编码值、游长编码长度的对应关系。表2中游长编码值所在列为游长编码的结果,游长编码长度为(k+l-s)。残差编码值的计算方式如下面的推导过程所示。残差编码计算对RUNcnt=2J[S]+2J[S+1]+.+2J[k]+y左右两边加2J+.+2J[S—1]得2J[CI]+...+2J[S—1]+RUNcnt=2J[CI]+...+2J[S—1]+2J[S]+2J[S+1]+...+2J[k]+yZs—,RUNcnt=Zk+yy=RUNcnt_Zk+Zs—!由于<formula>formulaseeoriginaldocumentpage15</formula>i=0Sub_Jvalue[RUNindex]=J_Trans[RUNindex-1]y=RUNcnt_J_Trans[k]+J_Trans[s_l]可得=r-J_Trans[k]+J_Trans[s-l]=r_J_Trans[k]+Sub_Value[s]这样残差编码输出J(k+1)比特的y,可以得到表2的M即—Value和残差编码值、残差编码长度的对应关系。例外情况是M即—Value=Oxff_ff_ff_ff,按照标准算法15比特的y,已在表中做了修正。本发明中,游长码字由游长编码值和游长编码长度组成这样可以唯一确定码字,并且游长编码值采用4字节二进制数(最多32位"l")表示,游长编码长度采用6位二进制数(最大值32)表示,这样使用统一固定数据宽度的表达形式,相对于不定长数据宽度形式易于硬件编码合成的操作。同理,残差码字由残差编码值和残差编码长度组成,残差编码值采用2字节二进制数(最大值为215-1=32767,至少采用15位二进制数表示)表示,残差编码长度采用4位二进制数(最大值15)表示。由于原算法b步骤I分步中输出比特'l'的前提条件之一是残差大于O,所以定义残差标志Leaving—Flag给码字合成步骤使用。通过判断残差编码值是否大于零,得到残差标志Leaving—Flag。当残差编码值大于零,残差标志Leaving—Flag为1;当残差编码值不大于零,残差标志Leaving_Flag为0。4)码字合成码字合成步骤需要的输入为行尾标志EOLine、比较标志CompareFlag、残差标志Leaving—Flag、游长编码值、游长编码长度、残差编码值、残差编码长度,通过将各码字合成生成最终的编码值和编码长度。经过分析原算法中三个码字产生条件比较标志CompareFlag、残差标志Leaving—Flag和行尾标志E0Line,对各种出现的码字合成方式进行归类共有8种合成方式。同样,通过比较标志、残差标志和行尾标志决定执行某一种合成方式,详细设计见下面编码连接真值表。表3编码连接真值表<table>tableseeoriginaldocumentpage16</column></row><table>表格中&为连接符号,即'1'&'0'的连接结果为二进制数"10"。游程编码值用VI表示,游程编码长度用LI表示。残差编码值用V2表示,残差编码长度用L2表示。游程编码值用V表示,游程编码长度用L表示。该步骤在硬件上采用多路选择器、加法器和寄存器实现,通过某一方式的编码合成完成最终的编码值和编码长度输出,然后跳转到映射产生步骤,等待下一次编码开始。实施例以两次编码RUNcnt=5,且E0Line为0为例说明。(—)采用标准算法參第一次编码RUNcnt=5,EOLine=0Ba步骤此时RUNindex=0,即2一由]=2J=2。=1按照编码流程,RUNcnt>2J[Index]即5>1,输出比特'1,;同时RUNcnt=RUNcnt-2J[Index]=4;RUNindex加1变为1。由于RUNcnt>2瓜丽由]即4>1,继续执行a步骤,输出比特'1';同时RUNcnt=RUNcnt-2J[Index]=3;RUNindex加1变为2。由于RUNcnt>2瓜丽由]即3>1,继续执行a步骤,输出比特'1';同时RUNcnt=RUNcnt-2J[Index]=2;RUNindex加1变为3。由于RUNcnt>2瓜丽由]即2>1,继续执行a步骤,输出比特'1';同时RUNcnt=RUNcnt-2J[Index]=1;RUNindex加1变为4。由于RUNcnt>2麵由]即1>2不成立,跳出a步骤。这样a步骤循环执行了四次,输出码字为"1111",RUNindex值为4。Bb步骤由于EOLine为O,不执行直接跳出b步骤。此时的码字为"llll",RUNindex值为4。Bc步骤输出比特'0',跳出c步骤。此时的码字为"11110",RUNindex值为4。Bd步骤输出J[RUNindex]比特RUNcnt二进制数(MSB开始),即输出1比特'1';跳出d步骤。此时的码字为"111101",RUNindex值为4。Be步骤由于RUNindex值为4大于O,执行减1变为3。完成所有的编码流程,跳到a步骤,等待下一次编码。最终的码字为"111101",RUNindex值为3。參第二次编码RUNcnt=5,EOLine=0Ba步骤由于上一次的最终值RUNindex=3,即2J[Index]=2J[3]=2°=117按照编码流程,RUNcnt>2J[Index]即5>1,输出比特'1,;同时RUNcnt=RUNcnt-2J[Index]=4;RUNindex加1变为4。由于RUNcnt>2J,Index]即4>2,继续执行a步骤,输出比特'1';同时RUNcnt=RUNcnt-2J[Index]=2;RUNindex加1变为5。由于RUNcnt>2J,Index]即2>2,继续执行a步骤,输出比特'1';同时RUNcnt=RUNcnt-2J[Index]=0;RUNindex加1变为6。由于RUNcnt>2麵由]即0>2不成立,跳出a步骤。这样a步骤循环执行了三次,输出码字为"111",RUNindex值为6。■b步骤由于E0Line为O,不执行直接跳出b步骤。此时的码字为"lll",RUNindex值为6。■c步骤输出比特'0,,跳出c步骤。此时的码字为"1110",RUNindex值为6。■d步骤输出J[RUNindex]比特RUNcnt二进制数(MSB开始),即输出1比特'0,;跳出d步骤。此时的码字为"11100",RUNindex值为6。Be步骤由于RUNindex值为6大于O,执行减1变为5。完成所有的编码流程,跳到a步骤,等待下一次编码。最终的码字为"11100",RUNindex值为5。(二)采用本发明方法參第一次编码RUNcnt=5,EOLine=0B编码映射步骤此时RUNindex=O,查表得Sub_Jvalue=0,J_Value[RUNindex]=1。J_Trans_RUNindex=J_Trans-Subjvalue[3]=J—Trans。采用RUNcnt=5和J_Trans_RUNindex--比较并且拼接,结果M即—Value为OxfO_00_00_00。采用RUNcnt和J_Value[RUNindex]比较得CompareFlag为1。可得,Map_Value为OxfO_00_00_00,CompareFlag为1。■RUNindex更新步骤CompareFlag为1,执行一级和二级更新。一级更新通过M即—Value=OxfO_00_00_00查表1的RUNindex为4;二级更新RUNindex减1为3。最终,RUNindex更新后的结果为3。B码字产生步骤通过Map_Value为OxfO_00_00_00查表2,游长编码输出为"llll",残差编码输出'l'。另外,由于残差编码值大于零,残差标志Leaving—Flag为1。B码字合成步骤比较标志为1、残差标志为1,行尾标志为0,所以,采用表3序号1的码字合成方式完成输出,结果为"1111"&'0'&'1'即"111101"。最终的输出结果为"111101",RUNindex为3。參第二次编码RUNcnt=5,EOLine=0B编码映射步骤此时RUNindex=3,查表得Sub_Jvalue[3]=3,J_value[RUNindex]=1。J_Trans_RUNindex=J_Trans-Subjvalue[3]=J_Trans。采用RUNcnt=5和J_Trans_RUNindex--比较并且拼接,结果M即—Value为Oxfc_00_00_00。采用RUNcnt=5和J_Value[RUNindex]=1比较得CompareFlag为1。可得,Map_Value为Oxfc_00_00_00,CompareFlag为1。■RUNindex更新步骤CompareFlag为1,执行一级和二级更新。一级更新通过M即—Value=0xfc_00_00_00查表1的RUNindex为6;二级更新RUNindex减1为5。B码字产生步骤通过Map_Value为0xfc_00_00_00查表2,游长编码输出为"lll",残差编码输出'O'。另外,由于残差编码值不大于零,残差标志Leaving—Flag为0。B码字合成步骤比较标志为1、残差标志为0,行尾标志为0,所以,采用表3序号1的码字合成方式完成输出,结果为"1111"&'0'&'0'即"111100"。最终的输出结果为"111100",RUNindex为5。可见,本发明方法通过引入编码映射操作和RUNindex单双周期更新操作,可以流水线实时实现JPEG-LS游程编码算法。而原标准算法由于a步骤的循环编码需要多个时钟周期以及a、b和e步骤都需要更新索引值,在本次编码还未结束时下一次编码又到来的情况会出现,所以不能完成流水线实时编码要求。对比标准算法,本发明方法硬件实现采用多路选择器、寄存器、查找表和块存储器实现,时钟频率可达80MHz,可以广泛应用于JPEG-LS无损或近无损压縮硬件算法。本发明说明书中未作详细描述的内容属本领域技术人员的公知技术。19权利要求JPEG-LS游程编码硬件实现方法,其特征在于步骤如下(1)输入前次游程编码更新后的范围在0~31之间的索引值RUNindex和游程长度RUNcnt,然后根据二者计算得到比较标志CompareFlag、映射值Map_Value和编码减值Sub_Jvalue[RUNindex],其中,CompareFlag的计算公式如下<mrow><mi>CompareFlag</mi><mo>=</mo><mfencedopen='{'close=''><mtable><mtr><mtd><mn>1</mn></mtd><mtd><mi>ifRUNcnt</mi><mo>&GreaterEqual;</mo><mi>J</mi><mo>_</mo><mi>Value</mi><mo>[</mo><mi>m</mi><mo>]</mo></mtd></mtr><mtr><mtd><mn>0</mn></mtd><mtd><mi>ifRUNcnt</mi><mo>&lt;</mo><mi>J</mi><mo>_</mo><mi>Value</mi><mo>[</mo><mi>m</mi><mo>]</mo></mtd></mtr></mtable></mfenced><mo>,</mo><mi>m</mi><mo>=</mo><mn>0</mn><mo>~</mo></mrow>编码减值Sub_Jvalue[i]的计算公式如下<mrow><mi>Sub</mi><mo>_</mo><mi>Jvalue</mi><mo>[</mo><mi>i</mi><mo>]</mo><mo>=</mo><mfencedopen='{'close=''><mtable><mtr><mtd><mn>0</mn></mtd><mtd><mi>ifi</mi><mo>=</mo><mn>0</mn></mtd></mtr><mtr><mtd><mi>J</mi><mo>_</mo><mi>Trans</mi><mo>[</mo><mi>i</mi><mo>-</mo><mn>1</mn><mo>]</mo></mtd><mtd><mi>if</mi><mn>1</mn><mo>&le;</mo><mi>i</mi><mo>&le;</mo><mn>31</mn></mtd></mtr></mtable></mfenced></mrow>映射值Map_Value=x0x1…xj…X30X31,j=0~31,xj的计算公式如下<mrow><msub><mi>x</mi><mi>j</mi></msub><mo>=</mo><mfencedopen='{'close=''><mtable><mtr><mtd><mn>1</mn></mtd><mtd><mi>ifRUNcnt</mi><mo>&GreaterEqual;</mo><mi>J</mi><mo>_</mo><mi>Trans</mi><mo>_</mo><mi>RUNindex</mi><mo>[</mo><mi>j</mi><mo>]</mo></mtd></mtr><mtr><mtd><mn>0</mn></mtd><mtd><mi>ifRUNcnt</mi><mo>&lt;</mo><mi>J</mi><mo>_</mo><mi>Trans</mi><mo>_</mo><mi>RUNindex</mi><mo>[</mo><mi>j</mi><mo>]</mo></mtd></mtr></mtable></mfenced></mrow>其中,<mrow><mi>J</mi><mo>_</mo><mi>Trans</mi><mo>[</mo><mi>n</mi><mo>]</mo><mo>=</mo><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mi>n</mi></munderover><msup><mn>2</mn><mrow><mi>J</mi><mo>[</mo><mi>i</mi><mo>]</mo></mrow></msup><mo>,</mo><mi>n</mi><mo>=</mo><mn>0</mn><mo>~</mo><mn>31</mn><mo>,</mo></mrow>J_Value[p]=2J[p],p=0~31J_Trans_RUNindex[q]=J_Trans[q]-Sub_Jvalue[q],q=0~31;J_Trans、J_Trans_RUNindex、Sub_Jvalue和J_Value均采用映射表的形式存储在FPGA内部,采用索引值RUNindex和游程长度RUNcn查表获得具体值;(2)输入行尾标志EOLine,根据行尾标志EOLine以及步骤(1)得到的比较标志CompareFlag、映射值Map_Value计算出更新后的索引值RUNindex,计算时采用两级更新,其中一级更新完成RUNindex的累加运算,一级更新后RUNindex的值为映射值Map_Value中1的个数,二级更新完成RUNindex保持不变或者RUNindex的值减1运算;当比较标志CompareFlag为0时,只进行二级更新操作,当比较标志CompareFlag为1时,先进行一级更新,而后进行二级更新,当输入行尾标志EOLine为1时,二级更新操作为保持RUNindex不变,当输入行尾标志EOLine为0时,二级更新操作为RUNindex的值减1运算;一级更新采用寄存器、查找表实现,二级更新采用加法器、多路选择器和寄存器实现,每级更新执行各自占用一个时钟周期;(3)根据游程长度RUNcnt,步骤(1)得到的映射值Map_Value、编码减值Sub_Jvalue[RUNindex]以及初始索引值RUNindex计算出游长编码和残差编码,其中游长编码为映射值Map_Value中由全部1组成的码段,残差编码为J[k+1]比特的y,计算公式为y=RUNcnt-J_Trans[k]+Sub_Value[RUNindex],其中k应同时满足以下两个关系式,RUNcnt≥J_Trans_RUNindex[k]且RUNcnt<J_Trans_RUNindex[k+1];(4)将步骤(3)得到的游长编码、残差编码和行尾编码’1’、分隔编码’0’按照8种不同情况完成编码合成,输出合成后的编码值和编码长度并等待下一次编码开始;所述的8种情况如下表所示,上表中当残差编码值大于零时残差标志为1,当残差编码值不大于零时残差标志为0,&为连接符号,游程编码值用V1表示,游程编码长度用L1表示,残差编码值用V2表示,残差编码长度用L2表示,游程编码值用V表示,游程编码长度用L表示。全文摘要JPEG-LS游程编码硬件实现方法,对JPEG-LS游程编码的标准流程进行了改进和优化,引入编码映射操作,通过比较查表操作流水线实现编码,解决原算法中多个时钟周期循环编码的问题。另外,根据只残差编码采用索引值RUNindex单周期更新操作,同时游长编码和残差编码采用索引值RUNindex双周期更新操作,提高了编码的速度。本发明方法全部通过FPGA实现,具有全流水线、实时性好的特点,可以应用于JPEG-LS无损和近无损压缩的硬件算法。文档编号H04N1/41GK101783953SQ201010120398公开日2010年7月21日申请日期2010年3月8日优先权日2010年3月8日发明者张媛,武文波,王琨,陈大羽,雷宁申请人:北京空间机电研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1