一种基于硬件的Huffman编码方法及系统与流程

文档序号:13520447阅读:767来源:国知局
本发明涉及压缩编码
技术领域
,更具体地,涉及一种基于硬件的huffman编码方法及系统。
背景技术
:当今社会信息化发展迅速,海量的信息存储和传递对压缩技术和传输技术提出了更高的要求。huffman编码是一种无损的压缩编码方式,在数据压缩、数据传输以及图像处理领域有着非常广泛的应用。传统huffman编码的软件实现由于编码过程需要顺序执行,其编码速度已经不能满足一些需要快速反应或者是大数据处理的需求。目前,数据压缩技术可以分为无损压缩和有损压缩两种。对于文本数据、程序和特殊应用场合的图像数据的压缩,因为需要保证数据完整无任何丢失,必须采用无损压缩。根据香农定理的编码思想,huffman于1952年提出了一种不定码长编码的无损压缩方法,被称为huffman编码。其核心思想是根据数据符号发生的概率进行编码,即概率越高编码越短。理论研究证实,huffman编码是一种非常接近压缩比上限的编码方法,因此称之为最优编码。传统的huffman编码是通过软件在计算机上实现,靠cpu和内存进行编码解码等。由于编码原理并不复杂,所以对于软件工程师来说比较容易。但是,在计算机中运行huffman编码,会过多消耗cpu资源,并且由于cpu自身的工作方式,串行处理huffman编码的速度也非常慢。特别是解压或者是压缩海量数据的时候,耗时极长。尽管现在计算机性能已经提升了很多,但是对于一些快速反应,实时传输,或者是实时压缩解压的任务,普通计算机的性能就不能满足时间要求。在硬件上实现huffman编码可以解决上述缺点。提高编码速度,增强实时性处理能力,节省宝贵的cpu资源。但是目前硬件上应用huffman编码的多为一些图像或者是视频的解压压缩芯片,功能固定且应用范围单一。在进行一个新的项目,或系统的研发时,往往难以获得一个能灵活应用的huffman实现方案。因此,如何实现huffman编码硬件化和并行化具有很好的实用价值。技术实现要素:本发明为解决以上现有技术提供的huffman编码方法编码速度不快、实时性较弱的技术缺陷,提供了一种基于硬件的huffman编码方法。为实现以上发明目的,采用的技术方案是:一种基于硬件的huffman编码方法,包括以下步骤:s1.将所有的编码元素按照其权值的大小进行排序,然后将排序后的编码元素按照从小到大的顺序分别存储在若干个寄存器组中,寄存器组的数量与编码元素的数量一致;所述寄存器组包括huffman编码位、码长位和标识位;为每个寄存器组的标识位初始化一个标识数值;s2.将权值最小及次小的两个编码元素所在的寄存器组分别记为寄存器组1与寄存器组2,然后对两个编码元素的权值做加法操作,得到合并后的权值;s3.使用合并后的权值对寄存器组1的编码元素的权值进行替换;将寄存器组2的编码元素的权值赋值为二进制的全1,即最大值;s4.根据寄存器组1的标识,调用标识判断器从所有的寄存器组中找出标识与其相应的寄存器组;s5.对步骤s4找出的寄存器组,调用编码单元以压栈的方式在其编码位中添加编码1,然后调用累加单元在其码长位中加1,标识位保持不变;s6.根据寄存器组2的标识,调用标识判断器从所有的寄存器组中找出标识与其相应的寄存器组;s7.对步骤s6找出的寄存器组,调用编码单元以压栈的方式在其编码位中添加编码0,然后调用累加单元在其码长位中加1,标识位保持不变;s8.调用标识单元使用步骤s2中寄存器组1的标识替换步骤s7中找出的所有寄存器组的标识;s9.循环执行步骤s1~步骤s8共t次,t为编码元素的个数;s10.执行完毕步骤s9后,t个寄存器组中分别存储了各个编码元素的编码和码长,即huffman编码需要用到的编码表,根据编码表完成huffman编码输出。上述方案中,使用本发明提供的方法进行huffman编码,可简化编码流程,大幅提高编码效率及信息吞吐量,非常适合使用硬件实现进一步加速。与现有技术相比,本发明的有益效果是:1.本发明提供的技术方案,是基于硬件特性设计的,非常有利于硬件的实现。2.本发明提供的编码方法能很好的利用硬件特性,并由于编码方法本身的优势,能使得huffman的编码速度大大提高。本发明的一个实施例中,设排序需要a个时钟周期,编码元素为n个,则完成一次合并仅需要(a+2)个时钟周期,循环次数为(n-1)次,一共仅需(n-1)*(a+2)个时钟周期即可完成编码表的生成,算法复杂度为o(n),相比现有的软件实现方案,有着非常显著的提升。附图说明图1为huffman编码硬件实现的系统框图。图2为huffman硬件实现中编码模块的详细结构图,图3为本发明提供的方法的流程图。具体实施方式附图仅用于示例性说明,不能理解为对本专利的限制;以下结合附图和实施例对本发明做进一步的阐述。实施例1对于上述的
发明内容,本实施例针对一种格式的原始数据的具体实施进行说明。原始数据中,为0-4的数字随机分布,数据类型为3位二进制,总数是256个。其中数字0占52个,1~4各51个,权值以数据个数代替,个数越多,权值越大。对于上述的数据,参考图2,本实施例中独立的寄存器组中的权值位为9位,标识位为3位。压栈编码单元中的寄存器组,编码位为5位,码长为3位,标识占3位。根据图1,实现huffman编码模块周边的辅助模块,分别为时钟模块,输入模块,和输出模块,以上模块与本发明的
发明内容无关,其实现略过。上述时钟模块,功能为产生稳定的100mhz同步时钟,供整个系统使用。上述输入模块,功能为检测输入的256个数据,并进行统计,统计的最终结果存储于独立寄存器组中,供后续的huffman编码模块使用。上述输出模块,功能为调用huffman编码模块生成的编码表进行原始数据的编码输出。用于调试。根据图2,在fpga上实现huffman编码模块。其中,每个寄存器组存储一个编码元素的编码、码长和标识信息。每个寄存器组的寄存器个数及位数如上文确定,寄存器组从高位到低位,依次为编码、码长和标识信息。这里的标识信息采取2进制编码表示。所述标识判别器用于根据控制单元提供的标识,在数个寄存器组中选通相同标识的寄存器组。所述编码单元用于在根据标识选通寄存器组后,在寄存器组的编码位以压栈的方式添加一位编码。所述累加单元用于在编码单元添加编码后对相应的码长位进行加一处理。所述标识单元用于哈夫曼编码合并节点过程中每个寄存器组标识的修改。对于每2个需要合并的节点,在进行编码以及合并生成新的节点后,会对压栈编码单元中相应寄存器组的标识进行一次修改,目的是将两个需要的合并的节点进行统一,在后续对合并后新节点的编码中能统一编码。所述控制单元进行流程的控制,将权值最小节点进行合并,调用压栈编码单元进行编码,调用标识单元进行标识修改,为新的节点进行下一轮的节点合并和编码准备。编码表生成流程如图3所示。具体的编码步骤如下:步骤1:调用排序模块将所有编码元素根据权值大小进行排序,排序结果按照从小到大存储在上述独立的数个寄存器组中,个数与编码元素个数相等。(由于排序模块为借鉴他人成果,不属于本发明范围,故不详细介绍)。步骤2:将地址最低的两个寄存器组,即权值最小与次小元素所在的寄存器组,分别记为寄存器组1与寄存器组2,将其权值部分做加法操作,得到合并后的权值。步骤3:用步骤2的计算结果覆盖寄存器组1的权值。步骤4:将寄存器组2的权值赋值为全1,即最大值。步骤5:根据寄存器组1的标识,调用压栈编码单元中的标识判别器,找到压栈编码单元中相应的寄存器组,结果可能为一个或多个。步骤6:对步骤5中定位到的寄存器组,调用编码单元以压栈的方式添加编码1,码长位置在原来的数据上加1。标识位保持不变。多个寄存器组并行执行相同操作。步骤7:根据寄存器组2的标识,调用压栈编码单元中的标识判别器,找到压栈编码单元中相应的寄存器组。结果可能为一个或多个。步骤8:对步骤7中定位到的寄存器组,调用编码单元以压栈的方式添加编码0,码长位置在原来的数据上加1。多个寄存器组并行执行相同操作。步骤9:调用标识单元,用步骤2中寄存器组1的标识,替换步骤8中定位的所有寄存器组的标识。多个寄存器组并行执行相同操作。步骤10:控制循环的总计数器减1,(总循环计数器的初始值为编码元素个数)。步骤11:若计数器不为0,返回步骤1循环进行。若计数器为0,则进行步骤12。步骤12:压栈编码单元中的多个寄存器组,分别存储了各个节点的编码和码长,即哈夫曼编码需要用到的编码表。步骤13:输出模块根据编码表进行编码输出。各循环结束时的编码表如下所示:编码|标识循环1循环2循环3循环4最终编码表元素0xxxxx|0xxxxx|0xxxx1|0xxx01|001|3元素1xxxx1|1xxxx1|1xxx01|1xx001|0001|3元素2xxxx0|2xxxx0|1xxx00|1xx000|0000|3元素3xxxxx|3xxxx1|3xxxx1|3xxx11|311|3元素4xxxxx|4xxxx0|4xxxx0|3xxx10|310|3显然,本发明的上述实施例仅仅是为清楚地说明本发明所作的举例,而并非是对本发明的实施方式的限定。对于所属领域的普通技术人员来说,在上述说明的基础上还可以做出其它不同形式的变化或变动。这里无需也无法对所有的实施方式予以穷举。凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明权利要求的保护范围之内。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1