CN109889205A - 编码方法及系统、解码方法及系统、编解码方法及系统 - Google Patents
编码方法及系统、解码方法及系统、编解码方法及系统 Download PDFInfo
- Publication number
- CN109889205A CN109889205A CN201910268357.0A CN201910268357A CN109889205A CN 109889205 A CN109889205 A CN 109889205A CN 201910268357 A CN201910268357 A CN 201910268357A CN 109889205 A CN109889205 A CN 109889205A
- Authority
- CN
- China
- Prior art keywords
- decoding
- node
- coding
- huffman
- code
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
- 238000000034 method Methods 0.000 title claims abstract description 89
- 230000015654 memory Effects 0.000 claims description 107
- 239000000872 buffer Substances 0.000 claims description 83
- 230000008569 process Effects 0.000 claims description 20
- 235000013399 edible fruits Nutrition 0.000 claims description 8
- 238000010276 construction Methods 0.000 claims description 7
- 238000013519 translation Methods 0.000 description 14
- 238000010586 diagram Methods 0.000 description 11
- 239000002151 riboflavin Substances 0.000 description 4
- 239000013589 supplement Substances 0.000 description 4
- 230000006870 function Effects 0.000 description 3
- 230000009286 beneficial effect Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 239000004065 semiconductor Substances 0.000 description 2
- 241000208340 Araliaceae Species 0.000 description 1
- 235000005035 Panax pseudoginseng ssp. pseudoginseng Nutrition 0.000 description 1
- 235000003140 Panax quinquefolius Nutrition 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 238000013461 design Methods 0.000 description 1
- 235000008434 ginseng Nutrition 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- 238000003672 processing method Methods 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
Landscapes
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
本公开提供了一种编码方法及系统、解码方法及系统、编解码方法及系统,只需存储霍夫曼树状链表以及第二编码表即可完成编码,只需存储解码表和霍夫曼树状链表即可完成解码,而无需存储整个霍夫曼编码表、以及与整个霍夫曼编码表对应的解码表,大大减少了编码中所需的存储空间,可大幅降低硬件资源开销,并同时兼顾编、解码效率。
Description
技术领域
本公开涉及数据处理领域,尤其涉及一种编码方法及系统、解码方法及系统、编解码方法及系统。
背景技术
编码和解码是应用广泛的数据处理方式,其一般利用码表(包括编码表和解码表)对数据进行编码和解码。码表的大小与编码的码长密切相关,当编码码长增加时,码表的大小几乎呈指数级的增加,例如霍夫曼编码即是如此。现有的编码和解码技术都是直接存储码表。这样当编码码长较长时,其码表会非常庞大,需要大量的存储空间来存储码表,导致硬件资源消耗巨大。
发明内容
(一)要解决的技术问题
针对上述技术问题,本公开提供了一种编码方法及系统、解码方法及系统、编解码方法及系统。
(二)技术方案
本公开提供了一种编码方法,包括:
对信源字符进行编码,得到一编码结构以及第一编码表;
根据所述编码结构建立码表,并存储所述码表;
选取所述第一编码表的部分记录,建立所述码表的链接记录,所述链接记录与所述部分记录组成第二编码表,存储所述第二编码表,其中,所述第二编码表和所述码表所占的存储空间小于所述第一编码表所占的存储空间。
本公开还提供了一种解码方法,包括:
获取码表、以及与第二编码表对应的解码表,并存储所述码表和所述解码表;
利用所述解码表对信源字符编码进行第一解码;
若所述第一解码成功,则输出解码结果;若所述第一解码未成功,则利用所述码表对所述信源字符编码进行第二解码,并输出解码结果;其中,所述解码表和所述码表所占的存储空间小于第一编码表所对应的解码表所占的存储空间,其中所述第一编码表可对信源字符进行编码。
本公开还提供了一种编解码方法,包括:
对信源字符进行编码,得到一编码结构以及第一编码表和信源字符编码;
根据所述编码结构建立码表,并存储所述码表;
选取所述第一编码表的部分记录,建立所述码表的链接记录,所述链接记录与所述部分记录组成第二编码表,存储所述第二编码表,其中,所述第二编码表和所述码表所占的存储空间小于所述第一编码表所占的存储空间;
获取所述码表、以及与所述第二编码表对应的解码表,并存储所述码表和所述解码表;
利用所述解码表对所述信源字符编码进行第一解码;
若所述第一解码成功,则输出解码结果;若所述第一解码未成功,则利用所述码表对所述信源字符编码进行第二解码,并输出解码结果;其中,所述解码表和所述码表所占的存储空间小于所述第一编码表所对应的解码表所占的存储空间。
本公开还提供了一种编码系统,其包括:
第一编码装置,用于对信源字符进行编码,得到一编码结构以及第一编码表;
第二编码装置,用于根据所述编码结构建立码表;
第三编码装置,用于选取所述第一编码表的部分记录,建立所述码表的链接记录,所述链接记录与所述部分记录组成第二编码表;
存储装置,用于存储所述码表和所述第二编码表,其中,所述第二编码表和所述码表所占的存储空间小于所述第一编码表所占的存储空间。
本公开还提供了一种解码系统,包括:
获取装置,用于获取码表、以及与第二编码表对应的解码表;
第一解码装置,用于利用所述解码表对信源字符编码进行第一解码;
判断装置,用于判断所述第一解码是否成功;
输出装置,若所述第一解码成功,用于输出解码结果;
第二解码装置,若所述第一解码未成功,用于利用所述码表对所述信源字符编码进行第二解码,并输出解码结果;
存储装置,用于存储所述解码表和所述码表,其中,所述解码表和所述码表所占的存储空间小于第一编码表所对应的解码表所占的存储空间,其中所述第一编码表可对信源字符进行编码。
本公开还提供了一种编解码系统,包括:
第一编码装置,用于对信源字符进行编码,得到一编码结构以及第一编码表和信源字符编码;
第二编码装置,用于根据所述编码结构建立码表;
第三编码装置,用于选取所述第一编码表的部分记录,建立所述码表的链接记录,所述链接记录与所述部分记录组成第二编码表;
第一存储装置,用于存储所述码表和所述第二编码表,其中,所述第二编码表和所述码表所占的存储空间小于所述第一编码表所占的存储空间;
获取装置,用于获取码表、以及与第二编码表对应的解码表,并;
第一解码装置,用于利用所述解码表对所述信源字符编码进行第一解码;
判断装置,用于判断所述第一解码是否成功;
输出装置,若所述第一解码成功,用于输出解码结果;
第二解码装置,若所述第一解码未成功,用于利用所述码表对所述信源字符编码进行第二解码,并输出解码结果;
第二存储装置,用于存储所述解码表和所述码表,其中,所述解码表和所述码表所占的存储空间小于所述第一编码表所对应的解码表所占的存储空间。
本公开还提供了一种计算设备,包括:算力板和控制板;所述算力板和所述控制板的至少一者包括:上述编码系统、解码系统、编解码系统的至少其中之一。
(三)有益效果
本公开只需存储霍夫曼树状链表以及第二编码表即可完成编码,只需存储解码表和霍夫曼树状链表即可完成解码,而无需存储整个霍夫曼编码表、以及与整个霍夫曼编码表对应的解码表,大大减少了编码中所需的存储空间,可大幅降低硬件资源开销,并同时兼顾编、解码效率。
附图说明
图1是本公开第一实施例编码方法的流程图。
图2是构建霍夫曼二叉树结构第一步的示意图。
图3是构建霍夫曼二叉树结构第二步的示意图。
图4是构建霍夫曼二叉树结构第三步的示意图。
图5是构建霍夫曼二叉树结构第四步的示意图。
图6是构建霍夫曼二叉树结构第五步的示意图。
图7是霍夫曼二叉树结构的示意图。
图8是构建霍夫曼树状链表的第一示意图。
图9是构建霍夫曼树状链表的第二示意图。
图10是本公开第二实施例解码方法的流程图。
图11是本公开第二实施例解码方法的过程图。
图12是本公开第三实施例编解码方法的流程图。
图13是本公开第四实施例编码系统的结构示意图。
图14是本公开第五实施例解码系统的结构示意图。
图15是本公开第六实施例编解码系统的结构示意图。
具体实施方式
下面将结合实施例和实施例中的附图,对本公开实施例中的技术方案进行清楚、完整的描述。显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。基于本公开中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本公开保护的范围。
本公开第一实施例提供了一种编码方法,如图1所示,该编码方法包括:
步骤S101:对信源字符进行编码,得到一编码结构以及第一编码表。
步骤S102:根据编码结构建立码表,并存储码表。
步骤S103:选取第一编码表的部分记录,建立所述码表的链接记录,所述链接记录与所述部分记录组成第二编码表,存储所述第二编码表,其中,所述第二编码表和所述码表所占的存储空间小于第一编码表所占的存储空间。
在本实施例中,步骤S101对信源字符进行霍夫曼编码,构建霍夫曼二叉树结构,并得到霍夫曼编码表。具体过程包括:
子步骤S101a:将信源字符的出现次数按预定规则排队,该预定规则为从多到少的顺序。
例如,对于8个信源字符(A、B、C、D、E、F、G和F)组成的一字符串,信源符号的长度是L=3,即信源字符的个数为2L=23=8。
BABACAC ADADABB CBABEBE DDABEEEBBFFGH
统计该字符串中各个信源字符的出现次数,并将信源字符按出现次数从多到少的顺序排队,如表1所示。
表1
信源字符 | 出现次数 |
B | 10 |
A | 8 |
E | 5 |
D | 4 |
C | 3 |
F | 2 |
G | 1 |
H | 1 |
当多个信源字符的出现次数相同时,这多个信源字符之间的顺序不做限制,可以任意排列。例如G和H的排列顺序,可以如表1所示,也可以将H排在G前面。
子步骤S101b:构建霍夫曼二叉树结构,将下一层的出现次数最少的两个结点的出现次数相加,作为上一层的中间结点,其中,第一层为两个叶子结点,最后一层的中间结点称为顶层结点。其中,该相加的两个结点可以是两个叶子结点、两个中间结点、一个叶子结点和一个中间结点。叶子结点是指信源字符及其对应的出现次数,中间结点是指两个结点的出现次数相加之和。在构建的过程中,在每一层重复上述过程,始终将出现次数较多的结点放在右边,直到最后一层的顶层结点,顶层结点的出现次数为字符串的信源字符个数。若霍夫曼二叉树结构的一层中包括出现次数相同的三个以上结点,可将其中任意两个结点的出现次数相加,作为该层的上一层的中间结点。
例如,对于步骤S101a中的字符串,根据表1将信源字符及其对应的出现次数作为一个叶子结点,并将叶子结点从左到右一字排开,如图2所示。首先,将出现次数最少的两个叶子结点(G和H)作为最下层的结点,并将二者的出现次数相加,得到中间结点(2),得到上一层的七个结点:一个中间结点(2)和六个叶子结点(B、A、C、E、D、C、F),如图3所示。再将出现次数最少的中间结点(2)和叶子结点(F)的出现次数相加,得到中间结点(4),如图4所示。再将出现次数最少的两个叶子结点(E、D)的出现次数相加,得到中间结点(9),将叶子结点(C)和中间结点(4)的出现次数相加,得到中间结点(7),如图5所示。最后,将中间结点(12)和叶子结点(A)的出现次数相加,得到中间结点(15),将中间结点(9)和叶子结点(10)的出现次数相加,得到中间结点(19)。中间结点(15)和中间结点(19)的出现次数相加,得到顶层结点(34),如图6所示。
子步骤S101c:对霍夫曼二叉树结构的结点进行编号,得到信源字符编码以及霍夫曼编码表,将霍夫曼编码表作为第一编码表。
编号方法为:对于霍夫曼二叉树结构的每一个结点,如果该结点处于其上一层中间结点的左分支,则将该结点编号为0;如果该结点处于其上一层中间结点的右分支,则将该结点编号为1,顶层结点不编号,如图7所示。
沿霍夫曼二叉树结构的最后一层至第一层搜索每个信源字符的路径,将该路径经过的结点编码序列作为该信源字符的霍夫曼编码,将所有信源字符按照出现次数由多至少排列,组成霍夫曼编码表。霍夫曼编码表的大小取决于信源字符编码的最大码长N,一般N>L。当信源字符编码的最大码长为N时,霍夫曼编码表包括2N条记录。
如表2所示,其第一列为信源字符,第二列为信源字符编码,第三列为码长。在表2中信源字符编码的最大码长N=5。表2的每一行数据作为一条记录,每条记录包括信源字符、信源字符编码和码长。需要说明的是,表2并非完整的霍夫曼编码表,完整的霍夫曼编码表还包括冗余信息。对于最大码长N=5的霍夫曼编码表,其共有25=32条记录,为简化起见,表2去除了霍夫曼编码表中的冗余记录。
表2
信源字符 | 信源字符编码 | 码长 |
A | 01 | 2 |
B | 11 | 2 |
C | 000 | 3 |
D | 100 | 3 |
E | 101 | 3 |
F | 0010 | 4 |
G | 00110 | 5 |
H | 00111 | 5 |
在本实施例中,步骤S102根据霍夫曼二叉树结构建立霍夫曼树状链表,霍夫曼树状链表作为码表,并存储霍夫曼树状链表。
步骤S101得到霍夫曼二叉树结构后,步骤S102利用该霍夫曼二叉树结构建立一个或多个霍夫曼树状链表。霍夫曼树状链表中的元素结构如表3所示。
表3
霍夫曼树状链表中的每个元素包含10bit数据,其中[9:9]bit为Leaf_node字段(结点类型字段),该字段的含义是:若该元素对应的结点是叶子结点,则Leaf_node=1:若该元素对应的结点是中间结点,则Leaf_node=0。[8:0]bit为Pointer字段(指针编码字段),该字段的含义是:当Leaf_node=1时,pointer字段表示该叶子结点对应的信源字符;当Leaf_node=0时,pointer字段表示该中间结点的左分支中间结点或叶子结点的指针,该中间结点的右分支中间结点或叶子结点的指针为pointer+1,所谓指针是指中间结点和叶子结点在存储器中的存储地址。这样,该霍夫曼树状链表可表示出霍夫曼二叉树结构的整个结构,包括结点以及结点之间的连接关系。
建立霍夫曼树状链表的过程为:
首先选取正整数n,且n<N。对于霍夫曼二叉树结构的第(N-n+1)层,该层的每一个中间结点对应一个霍夫曼树状链表。第(N-n+1)层的中间结点的左分支结点作为该中间结点对应的霍夫曼树状链表的首个元素,从第(N-n)层至第一层,依次将各层中间结点、各层中间结点的左分支结点和右分支结点作为霍夫曼树状链表的连续三个元素。
当左分支结点和右分支结点为中间结点时,其对应的元素的leaf_node=0,pointer代表该中间结点的左分支的中间结点或叶子结点对应元素的指针。当左分支结点和右分支结点为叶子结点时,其对应的元素的leaf_node=1,pointer代表该叶子结点的信源字符。
建立霍夫曼树状链表后,将霍夫曼树状链表进行存储。其中,霍夫曼树状链表在存储器中占据连续的存储空间,即霍夫曼树状链表中后一个元素的指针为前一个元素的指针+1。如果霍夫曼树状链表有多个,多个霍夫曼树状链表在存储器中也可以占据连续的存储空间,即后一个霍夫曼树状链表的首个元素的指针为前一个霍夫曼树状链表最后一个元素的指针+1。所有霍夫曼树状链表的元素总个数≤2*2L。
以下以图7所示的霍夫曼二叉树结构为例,说明如何建立和存储霍夫曼树状链表。在该示例中,信源字符编码的最大码长N=5。
当取正整数n=3时,如图8所示,从霍夫曼二叉树结构的第(N-n+1)层,即第3层,建立霍夫曼树状链表。第3层中只有一个中间结点(4),所以该示例只需建立一个霍夫曼树状链表。首先将第3层的中间结点(4)的左分支结点,即叶子结点(F)作为中间结点(4)对应的霍夫曼树状链表的首个元素。然后将第2层的中间结点(2)、第2层中间结点(2)的左分支叶子结点(G)和右分支叶子结点(H)作为霍夫曼树状链表的连续三个元素,至此霍夫曼树状链表建立完成。霍夫曼树状链表共包括四个元素:依次分别是叶子结点(F)、中间结点(2)、叶子结点(G)和叶子结点(H)对应的元素。存储该霍夫曼树状链表时,霍夫曼树状链表在存储器中占据连续的存储空间,即四个元素在存储空间中连续存储。霍夫曼树状链表如表4所示:
表4
元素指针 | Leaf_node | Pointer |
0000 | 1 | F |
0001 | 0 | 0010 |
0010 | 1 | G |
0011 | 1 | H |
首个元素为叶子结点(F)对应的元素,因为该元素对应叶子结点,所以其Leaf_node为1,Pointer存储的是F。
第二个元素为中间结点(2)对应的元素,当首个元素的指针为0000时,第二元素的指针为0001。因为该元素对应中间结点,所以其Leaf_node为0,Pointer存储的是其左分支叶子结点(G)对应元素的指针0010。
第三个元素为叶子结点(G)对应的元素,其指针为0010。因为该元素对应叶子结点,所以其Leaf_node为1,Pointer存储的是G。
第四个元素为叶子结点(H)对应的元素,其指针为0011。因为该元素对应叶子结点,所以其Leaf_node为1,Pointer存储的是H。
当取正整数n=2时,如图9所示,从霍夫曼二叉树结构的第(N-n+1)层,即第4层,建立霍夫曼树状链表。第4层中有两个中间结点(7)和(9),所以该示例需建立两个霍夫曼树状链表。
首先建立中间结点(7)对应的霍夫曼树状链表。将中间结点(7)的左分支结点,即叶子结点(C)作为该霍夫曼树状链表的首个元素。然后将第3层的中间结点(4)、第2层的叶子结点(F)和中间结点(2)作为霍夫曼树状链表的第二、第三个元素。再将第1层的叶子结点(G)和(H)作为霍夫曼树状链表的第四、第五个元素,至此该霍夫曼树状链表建立完成。该霍夫曼树状链表共包括六个元素:依次分别是叶子结点(C)、中间结点(4)、叶子结点(F)、中间结点(2)、叶子结点(G)和叶子结点(H)对应的元素。存储该霍夫曼树状链表时,霍夫曼树状链表在存储器中占据连续的存储空间,即六个元素在存储空间中连续存储。霍夫曼树状链表如表5所示:
表5
元素指针 | Leaf_node | Pointer |
0000 | 1 | C |
0001 | 0 | 0010 |
0010 | 1 | F |
0011 | 0 | 0100 |
0100 | 1 | G |
0101 | 1 | H |
然后建立中间结点(9)对应的霍夫曼树状链表。将中间结点(9)的左分支结点,即叶子结点(D)作为该霍夫曼树状链表的首个元素,将右分支结点,即叶子结点(E)作为该霍夫曼树状链表的第二个元素,至此该霍夫曼树状链表建立完成。该霍夫曼树状链表共包括两个元素:依次分别是叶子结点(D)、叶子结点(E)对应的元素。将该霍夫曼树状链表与中间结点(7)对应的霍夫曼树状链表连续存储,该霍夫曼树状链表在存储器中占据连续的存储空间,即两个元素在存储空间中连续存储。两个霍夫曼树状链表如表6所示:
表6
元素指针 | Leaf_node | Pointer |
0000 | 1 | C |
0001 | 0 | 0010 |
0010 | 1 | F |
0011 | 0 | 0100 |
0100 | 1 | G |
0101 | 1 | H |
0110 | 1 | D |
0111 | 1 | E |
其中,前六个元素属于中间结点(7)对应的霍夫曼树状链表,后两个元素属于中间结点(9)对应的霍夫曼树状链表。元素指针并不以表8为限(0000-0111),而是以霍夫曼树状链表在存储器中实际存储地址为准。
在本实施例的步骤S103中,第一编码表的部分记录包括:
霍夫曼二叉树结构的第(N-n+1)层至最后一层的所有叶子结点所对应的记录,以及第(N-n+1)层的所有中间结点所对应的记录。
其中,霍夫曼二叉树结构第(N-n+1)层的叶子结点仅对应一条记录,其余层的叶子结点对应多条冗余记录。对于其余层的叶子结点,通过将其所对应的信源字符编码高位对齐,低位补充0或1得到冗余记录。冗余记录的信源字符编码位数与第(N-n+1)层的叶子节点对应的信源字符编码位数相等。
建立所述码表的链接记录包括:
将第(N-n+1)层中间结点所对应的记录链接至步骤S102得到的第(N-n+1)层中间结点对应的霍夫曼树状链表的首个元素指针,得到码表的链接记录。链接记录第一列为第(N-n+1)层中间结点的编码,第二列为的第(N-n+1)层中间结点对应的霍夫曼树状链表的首个元素指针,第三列为空。
将第一编码表的部分记录和码表的链接记录组成一个新的编码表:第二编码表,并存储第二编码表和码表。第二编码表共包括2n条记录,n为步骤S102中的正整数n。
例如,当取正整数n=3时,霍夫曼二叉树结构的第3层至最后一层包括:叶子结点(A)、(B)、(C)、(D)、(E),第3层的中间结点(4)。所以第一编码表的部分记录包括:叶子结点(C)、(D)、(E)各自对应的一条记录,以及叶子结点(A)、(B)各自对应的两条冗余记录。如表7所示。
表7
信源字符 | 信源字符编码 | 码长 |
C | 000 | 3 |
A | 010 | 2 |
A | 011 | 2 |
D | 100 | 3 |
E | 101 | 3 |
B | 110 | 2 |
B | 111 | 2 |
链接记录包括:第3层中间结点(4)链接至其对应的霍夫曼树状链表的首个元素指针,即表4中的0000。链接记录如表8所示。
表8
第一编码表的部分记录和码表的链接记录组成的第二编码表如表9所示,其第一例为字符或指针,第二列为编码,第三列为码长。
表9
当取正整数n=2时,霍夫曼二叉树结构的第4层至最后一层包括:叶子结点(A)、(B),第3层的中间结点(7)、(9)。所以第一编码表的部分记录包括:叶子结点(A)、(B)各自对应的一条冗余记录。如表10所示。
表10
信源字符 | 信源字符编码 | 码长 |
A | 01 | 2 |
B | 11 | 2 |
链接记录包括:第4层中间结点(7)和中间结点(9)链接至其对应的霍夫曼树状链表的首个元素指针,即表6中的0000和0110。链接记录如表11所示。
表11
第一编码表的部分记录和码表的链接记录组成的第二编码表如表12所示,其第一例为字符或指针,第二列为编码,第三列为码长。
表12
这样,本实施例根据霍夫曼编码结果(即霍夫曼二叉树结构)建立码表(即霍夫曼树状链表),只需存储霍夫曼树状链表(≤2*2L个元素)以及第二编码表(2n条记录)即可完成编码,相对于存储整个霍夫曼编码表(2N条记录),大大减少了编码中所需的存储空间,可大幅降低硬件资源开销,并同时兼顾编码效率。
以上只是示例性的说明,本实施例并不以此为限。例如,L应根据信源字符的个数来确定。当信源字符的个数为m时,L的取值为使2M>m成立的最小的M值。对霍夫曼二叉树结构的结点进行编号时,也可以将处于上一层中间结点左分支的结点编码为1,将处于其上一层中间结点右分支的结点编码为0。n可以取小于或等于N/2的数值。
本公开第二实施例提供了一种解码方法,其是与第一实施例的编码方法相对应的解码方法,利用码表和第二编码表对信源字符编码进行解码。如图10所示,该解码方法包括:
步骤S201:获取码表、以及与第二编码表对应的解码表,并存储码表和解码表。
步骤S202:利用解码表对信源字符编码进行第一解码。
步骤S203:若第一解码成功,则输出解码结果;若第一解码未成功,则利用存储的码表对信源字符编码进行第二解码,并输出解码结果;其中,解码表和码表所占的存储空间小于第一编码表所对应的解码表所占的存储空间。
在本实施例的步骤S201中,与第二编码表相同,解码表也包括2n条记录。对于表9所示的第二编码表,解码表如表13所示,对于表12所示的第二编码表,解码表如表14所示,其第一例为编码,第二列为字符或指针,第三列为码长。“描述”部分对每条记录的含义进行了解释。
表13
表14
在本实施例中,步骤S202利用解码表对信源字符编码的n bit符号进行第一解码,具体包括:
子步骤S202a:从信源字符编码取出n bit符号;
子步骤S202b:利用霍夫曼解码表对n bit符号进行第一解码。因为码长越短的信源字符,其出现次数越多。所以首先对n bit符号解码,解码成功的概率较高,可以提高解码效率。
上述过程如图11所示,子步骤S202a包括:
初始化步骤:在初始状态,设置寄存器bit_cnt、word_len,并将二者置为0。在第一解码和第二解码的过程中,寄存器bit_cnt用于存储缓存器dec_buf中的字符位数,寄存器word_len用于存储解码结果的码长,即解码出的信源字符对应的编码码字的长度。信源字符编码组成的字符串存储于fifo存储器中。
取码步骤:从fifo存储器中取出K bit符号存入缓存器dec_buf,并将寄存器bit_cnt的值+K。图11中所述K取64。
取出步骤:从缓存器dec_buf取出n bit符号。图11中取出4bit符号。
在本实施例中,步骤S203首先判断步骤S202的第一解码是否成功,若第一解码成功,则直接输出解码结果;若第一解码未成功,则利用霍夫曼树状链表继续对信源字符编码的n bit字符进行第二解码。
如果步骤S202的第一解码成功,那么一个时钟周期解码即可结束。本实施例在输出解码结果后,还包括如下步骤:
首先,获取被解码信源字符对应的编码码字的长度,将编码码字的长度赋予寄存器word_len。
缓存器dec_buf平移寄存器word_len位,并将寄存器bit_cnt的值减去寄存器word_len的值。
判断寄存器bit_cnt的值是否小于k,如果是,则返回子步骤S202a,从取码步骤开始执行,再次进行第一解码。如果否,则返回子步骤S202a,从取出步骤开始执行再次进行第一解码。其中,k<K。在图11中,所述k取16。
本实施例利用霍夫曼树状链表对信源字符编码进行第二解码具体包括:解码步骤和更新步骤。
解码步骤读取霍夫曼树状链表,利用霍夫曼树状链表对n bit符号进行解码,在图11中,首先对4bit符号进行解码。该步骤需要获得初始链表指针,并读取链表信息。
解码步骤具体包括:
初始化子步骤:从解码表获取码表的指针,该指针为霍夫曼树状链表的首个元素指针;寄存器word_len=n。
搜索子步骤:
从缓存器dec_buf再取出1bit符号;
更新寄存器word_len,word_len=word_len+1;
更新所述指针,指针=指针+再取出的1bit符号;
查找码表中所述指针对应的元素。
判断子步骤:判断所述指针对应的元素的Leaf_node字段是否为1,如果是1,则解码成功,如果Leaf_node字段是否为0,则解码不成功。
输出子步骤:如果解码成功,所述指针对应的元素的Pointer字段存储的信源字符作为解码结果,并输出该解码结果。与第一解码类似,输出该解码结果后还包括如下步骤:
缓存器dec_buf平移寄存器word_len位,并将寄存器bit_cnt的值减去寄存器word_len的值。
判断寄存器bit_cnt的值是否小于k,如果是,则返回子步骤S202a,从取码步骤开始执行,再次进行第一解码。如果否,则返回子步骤S202a,从取出步骤开始执行再次进行第一解码。
更新步骤:如果解码不成功,更新所述指针,指针=指针+1;返回上述搜索子步骤,并从上述搜索子步骤开始再次执行解码步骤的各个子步骤,直至解码成功。
例如,对于字符串“0100000110”,利用表13所示的解码表和表4所示的码表进行解码的过程如下:
首先进行第一解码。n取3,所以先从缓存器dec_buf获取前3bit字符:“010”。查找解码表,第一解码成功得到“A”,根据码长word_len=2,缓存器dec_buf左移2bit。再次从缓存器dec_buf获取3bit字符:“000”。查找解码表,第一解码成功得到“C”,根据码长word_len=3,缓存器dec_buf左移3bit。再次从缓存器dec_buf获取3bit字符:“001”。查找解码表,第一解码不成功。
接下来进行第二解码,寄存器word_len=3。从解码表中获取“001”对应的码表的首个元素的指针X(0000)。从缓存器dec_buf再取出1bit符号:“1”;更新寄存器word_len,word_len=3+1=4;更新所述指针,指针=0000+1=0001;查找指针0001对应的元素(表4中第二行的元素)。由于该元素的Leaf_node=0,判断第二解码不成功。更新所述指针,指针=0001+1=0010。从缓存器dec_buf再取出1bit符号:“0”,更新寄存器word_len,word_len=4+1=5;更新所述指针,指针=0010+0=0010;查找指针0010对应的元素(表4中第三行的元素)。由于该元素的Leaf_node=l,判断第二解码成功,得到“G”。输出该解码结果后缓存器dec_buf平移寄存器word_len=5位,并将寄存器bit_cnt的值减去寄存器word_len=5。字符串“0100000110”的解码结果即为“ACG”。
对于字符串“0100000110”,还可以利用表14所示的解码表和表6所示的码表进行解码,过程如下:
首先进行第一解码。n取2,所以先从缓存器dec_buf获取前2bit字符:“01”。查找解码表,第一解码成功得到“A”,根据码长word_len=2,缓存器dec_buf左移2bit。
再次从缓存器dec_buf获取2bit字符:“00”。查找解码表,第一解码不成功。
接下来进行第二解码,寄存器word_len=2。从解码表中获取“00”对应的码表的首个元素的指针X0(0000)。从缓存器dec_buf再取出1bit符号:“0”;更新寄存器word_len,word_len=2+1=3;更新所述指针,指针=0000+0=0000;查找指针0000对应的元素(表6中第一行的元素)。由于该元素的Leaf_node=1,判断第二解码成功,得到“C”。输出该解码结果后缓存器dec_buf平移寄存器word_len=3位,并将寄存器bit_cnt的值减去寄存器word_len=5。
再次进行第一解码,再次从缓存器dec_buf获取2bit字符:“00”。查找解码表,第一解码不成功。
接下来再进行第二解码,寄存器word_len=2。从解码表中获取“00”对应的码表的首个元素的指针X0(0000)。从缓存器dec_buf再取出1bit符号:“1”;更新寄存器word_len,word_len=2+1=3;更新所述指针,指针=0000+1=0001;查找指针0001对应的元素(表6中第二行的元素)。由于该元素的Leaf_node=0,判断第二解码不成功。更新所述指针,指针=0001+1=0010。
从缓存器dec_buf再取出1bit符号:“1”;更新寄存器word_len,word_len=3+1=4;更新所述指针,指针=0010+1=0011;查找指针0011对应的元素(表6中第四行的元素)。由于该元素的Leaf_node=0,判断第二解码不成功。更新所述指针,指针=0011+1=0100。
从缓存器dec_buf再取出1bit符号:“0”;更新寄存器word_len,word_len=4+1=5;更新所述指针,指针=0100+0=0100;查找指针0100对应的元素(表6中第五行的元素)。由于该元素的Leaf_node=l,判断第二解码成功,得到“G”。输出该解码结果后缓存器dec_buf平移寄存器word_len=5位,并将寄存器bit_cnt的值减去寄存器word_len=5。字符串“0100000110”的解码结果仍为“ACG”。
这样,本实施例的解码方法,只需存储解码表(2n条记录)和霍夫曼树状链表(≤2*2L个元素),而无需存储与整个霍夫曼编码表对应的解码表(2N条记录),大大减少了解码中所需的存储空间,可大幅降低硬件资源开销,并同时兼顾解码效率。
本公开第三实施例提供了一种编解码方法。如图12所示,该编解码方法包括:
步骤S301:对信源字符进行编码,得到一编码结构以及第一编码表和信源字符编码。
步骤S302:根据编码结构建立码表,并存储码表。
步骤S303:选取第一编码表的部分记录,建立所述码表的链接记录,所述链接记录与所述部分记录组成第二编码表,存储所述第二编码表,其中,所述第二编码表和所述码表所占的存储空间小于第一编码表所占的存储空间。
步骤S304:获取码表、以及与第二编码表对应的解码表,并存储码表和解码表。
步骤S305:利用解码表对信源字符编码进行第一解码。
步骤S306:若第一解码成功,则输出解码结果;若第一解码未成功,则利用存储的码表对信源字符编码进行第二解码,并输出解码结果;其中,解码表和码表所占的存储空间小于第一编码表所对应的解码表所占的存储空间。
在本实施例中,步骤S301对信源字符进行霍夫曼编码,构建霍夫曼二叉树结构,并得到霍夫曼编码表。具体过程包括:
子步骤S301a:将信源字符的出现次数按预定规则排队,该预定规则为从多到少的顺序。
例如,对于8个信源字符(A、B、C、D、E、F、G和F)组成的一字符串,信源符号的长度是L=3,即信源字符的个数为2L=23=8。
BABACAC ADADABB CBABEBE DDABEEEBBFFGH
统计该字符串中各个信源字符的出现次数,并将信源字符按出现次数从多到少的顺序排队,如表15所示。
表15
信源字符 | 出现次数 |
B | 10 |
A | 8 |
E | 5 |
D | 4 |
C | 3 |
F | 2 |
G | 1 |
H | 1 |
当多个信源字符的出现次数相同时,这多个信源字符之间的顺序不做限制,可以任意排列。例如G和H的排列顺序,可以如表1所示,也可以将H排在G前面。
子步骤S301b:构建霍夫曼二叉树结构,将下一层的出现次数最少的两个结点的出现次数相加,作为上一层的中间结点,其中,第一层为两个叶子结点,最后一层的中间结点称为顶层结点。其中,该相加的两个结点可以是两个叶子结点、两个中间结点、一个叶子结点和一个中间结点。叶子结点是指信源字符及其对应的出现次数,中间结点是指两个结点的出现次数相加之和。在构建的过程中,在每一层重复上述过程,始终将出现次数较多的结点放在右边,直到最后一层的顶层结点,顶层结点的出现次数为字符串的信源字符个数。若霍夫曼二叉树结构的一层中包括出现次数相同的三个以上结点,可将其中任意两个结点的出现次数相加,作为该层的上一层的中间结点。
例如,对于步骤S301a中的字符串,根据表15将信源字符及其对应的出现次数作为一个叶子结点,并将叶子结点从左到右一字排开,如图2所示。首先,将出现次数最少的两个叶子结点(G和H)作为最下层的结点,并将二者的出现次数相加,得到中间结点(2),得到上一层的七个结点:一个中间结点(2)和六个叶子结点(B、A、C、E、D、C、F),如图3所示。再将出现次数最少的中间结点(2)和叶子结点(F5)的出现次数相加,得到中间结点(4),如图4所示。再将出现次数最少的两个叶子结点(E、D)的出现次数相加,得到中间结点(9),将叶子结点(C)和中间结点(4)的出现次数相加,得到中间结点(7),如图5所示。最后,将中间结点(12)和叶子结点(A)的出现次数相加,得到中间结点(15),将中间结点(9)和叶子结点(10)的出现次数相加,得到中间结点(19)。中间结点(15)和中间结点(19)的出现次数相加,得到顶层结点(34),如图6所示。
子步骤S301c:对霍夫曼二叉树结构的结点进行编号,得到霍夫曼编码表,将霍夫曼编码表作为第一编码表。
编号方法为:对于霍夫曼二叉树结构的每一个结点,如果该结点处于其上一层中间结点的左分支,则将该结点编号为0;如果该结点处于其上一层中间结点的右分支,则将该结点编号为1,顶层结点不编号,如图7所示。
沿霍夫曼二叉树结构的最后一层至第一层搜索每个信源字符的路径,将该路径经过的结点编码序列作为该信源字符的霍夫曼编码,将所有信源字符按照出现次数由多至少排列,组成霍夫曼编码表。霍夫曼编码表的大小取决于信源字符编码的最大码长N,一般N>L。当信源字符编码的最大码长为N时,霍夫曼编码表包括2N条记录。
如表16所示,其第一列为信源字符,第二列为信源字符编码,第三列为码长。在表16中信源字符编码的最大码长N=5。表16的每一行数据作为一条记录,每条记录包括信源字符、信源字符编码和码长。需要说明的是,表16并非完整的霍夫曼编码表,完整的霍夫曼编码表还包括冗余信息。对于最大码长N=5的霍夫曼编码表,其共有25=32条记录,为简化起见,表16去除了霍夫曼编码表中的冗余记录。
表16
信源字符 | 信源字符编码 | 码长 |
A | 01 | 2 |
B | 11 | 2 |
C | 000 | 3 |
D | 100 | 3 |
E | 101 | 3 |
F | 0010 | 4 |
G | 00110 | 5 |
H | 00111 | 5 |
在本实施例中,步骤S302根据霍夫曼二叉树结构建立霍夫曼树状链表,霍夫曼树状链表作为码表,并存储霍夫曼树状链表。
步骤S301得到霍夫曼二叉树结构后,步骤S302利用该霍夫曼二叉树结构建立一个或多个霍夫曼树状链表。霍夫曼树状链表中的元素结构如表17所示。
表17
霍夫曼树状链表中的每个元素包含10bit数据,其中[9:9]bit为Leaf_node字段(结点类型字段),该字段的含义是:若该元素对应的结点是叶子结点,则Leaf_node=1:若该元素对应的结点是中间结点,则Leaf_node=0。[8:0]bit为Pointer字段(指针编码字段),该字段的含义是:当Leaf_node=1时,pointer字段表示该叶子结点对应的信源字符;当Leaf_node=0时,pointer字段表示该中间结点的左分支中间结点或叶子结点的指针,该中间结点的右分支中间结点或叶子结点的指针为pointer+1,所谓指针是指中间结点和叶子结点在存储器中的存储地址。这样,该霍夫曼树状链表可表示出霍夫曼二叉树结构的整个结构,包括结点以及结点之间的连接关系。
建立霍夫曼树状链表的过程为:
首先选取正整数n,且n<N。对于霍夫曼二叉树结构的第(N-n+1)层,该层的每一个中间结点对应一个霍夫曼树状链表。第(N-n+1)层的中间结点的左分支结点作为该中间结点对应的霍夫曼树状链表的首个元素,从第(N-n)层至第一层,依次将各层中间结点、各层中间结点的左分支结点和右分支结点作为霍夫曼树状链表的连续三个元素。
当左分支结点和右分支结点为中间结点时,其对应的元素的leaf_node=0,pointer代表该中间结点的左分支的中间结点或叶子结点对应元素的指针。当左分支结点和右分支结点为叶子结点时,其对应的元素的leaf_node=1,pointer代表该叶子结点的信源字符。
建立霍夫曼树状链表后,将霍夫曼树状链表进行存储。其中,霍夫曼树状链表在存储器中占据连续的存储空间,即霍夫曼树状链表中后一个元素的指针为前一个元素的指针+1。如果霍夫曼树状链表有多个,多个霍夫曼树状链表在存储器中也可以占据连续的存储空间,即后一个霍夫曼树状链表的首个元素的指针为前一个霍夫曼树状链表最后一个元素的指针+1。所有霍夫曼树状链表的元素总个数≤2*2L。
以下以图7所示的霍夫曼二叉树结构为例,说明如何建立和存储霍夫曼树状链表。在该示例中,信源字符编码的最大码长N=5。
当取正整数n=3时,如图8所示,从霍夫曼二叉树结构的第(N-n+1)层,即第3层,建立霍夫曼树状链表。第3层中只有一个中间结点(4),所以该示例只需建立一个霍夫曼树状链表。首先将第3层的中间结点(4)的左分支结点,即叶子结点(F)作为中间结点(4)对应的霍夫曼树状链表的首个元素。然后将第2层的中间结点(2)、第2层中间结点(2)的左分支叶子结点(G)和右分支叶子结点(H)作为霍夫曼树状链表的连续三个元素,至此霍夫曼树状链表建立完成。霍夫曼树状链表共包括四个元素:依次分别是叶子结点(F)、中间结点(2)、叶子结点(G)和叶子结点(H)对应的元素。存储该霍夫曼树状链表时,霍夫曼树状链表在存储器中占据连续的存储空间,即四个元素在存储空间中连续存储。霍夫曼树状链表如表18所示:
表18
元素指针 | Leaf_node | Pointer |
0000 | 1 | F |
0001 | 0 | 0010 |
0010 | 1 | G |
0011 | 1 | H |
首个元素为叶子结点(F)对应的元素,因为该元素对应叶子结点,所以其Leaf_node为1,Pointer存储的是F。
第二个元素为中间结点(2)对应的元素,当首个元素的指针为0000时,第二元素的指针为0001。因为该元素对应中间结点,所以其Leaf_node为0,Pointer存储的是其左分支叶子结点(G)对应元素的指针0010。
第三个元素为叶子结点(G)对应的元素,其指针为0010。因为该元素对应叶子结点,所以其Leaf_node为1,Pointer存储的是G。
第四个元素为叶子结点(H)对应的元素,其指针为0011。因为该元素对应叶子结点,所以其Leaf_node为1,Pointer存储的是H。
当取正整数n=2时,如图9所示,从霍夫曼二叉树结构的第(N-n+1)层,即第4层,建立霍夫曼树状链表。第4层中有两个中间结点(7)和(9),所以该示例需建立两个霍夫曼树状链表。
首先建立中间结点(7)对应的霍夫曼树状链表。将中间结点(7)的左分支结点,即叶子结点(C)作为该霍夫曼树状链表的首个元素。然后将第3层的中间结点(4)、第2层的叶子结点(F)和中间结点(2)作为霍夫曼树状链表的第二、第三个元素。再将第1层的叶子结点(G)和(H)作为霍夫曼树状链表的第四、第五个元素,至此该霍夫曼树状链表建立完成。该霍夫曼树状链表共包括六个元素:依次分别是叶子结点(C)、中间结点(4)、叶子结点(F)、中间结点(2)、叶子结点(G)和叶子结点(H)对应的元素。存储该霍夫曼树状链表时,霍夫曼树状链表在存储器中占据连续的存储空间,即六个元素在存储空间中连续存储。霍夫曼树状链表如表19所示:
表19
元素指针 | Leaf_node | Pointer |
0000 | 1 | C |
0001 | 0 | 0010 |
0010 | 1 | F |
0011 | 0 | 0100 |
0100 | 1 | G |
0101 | 1 | H |
然后建立中间结点(9)对应的霍夫曼树状链表。将中间结点(9)的左分支结点,即叶子结点(D)作为该霍夫曼树状链表的首个元素,将右分支结点,即叶子结点(E)作为该霍夫曼树状链表的第二个元素,至此该霍夫曼树状链表建立完成。该霍夫曼树状链表共包括两个元素:依次分别是叶子结点(D)、叶子结点(E)对应的元素。将该霍夫曼树状链表与中间结点(7)对应的霍夫曼树状链表连续存储,该霍夫曼树状链表在存储器中占据连续的存储空间,即两个元素在存储空间中连续存储。两个霍夫曼树状链表如表20所示:
表20
元素指针 | Leaf_node | Pointer |
0000 | 1 | C |
0001 | 0 | 0010 |
0010 | 1 | F |
0011 | 0 | 0100 |
0100 | 1 | G |
0101 | 1 | H |
0110 | 1 | D |
0111 | 1 | E |
其中,前六个元素属于中间结点(7)对应的霍夫曼树状链表,后两个元素属于中间结点(9)对应的霍夫曼树状链表。元素指针并不以表8为限(0000-0111),而是以霍夫曼树状链表在存储器中实际存储地址为准。
在本实施例的步骤S303中,第一编码表的部分记录包括:
霍夫曼二叉树结构的第(N-n+1)层至最后一层的所有叶子结点所对应的记录,以及第(N-n+1)层的所有中间结点所对应的记录。
其中,霍夫曼二叉树结构第(N-n+1)层的叶子结点仅对应一条记录,其余层的叶子结点对应多条冗余记录。对于其余层的叶子结点,通过将其所对应的信源字符编码高位对齐,低位补充0或1得到冗余记录。冗余记录的信源字符编码位数与第(N-n+1)层的叶子节点对应的信源字符编码位数相等。
建立所述码表的链接记录包括:
将第(N-n+1)层中间结点所对应的记录链接至步骤S302得到的第(N-n+1)层中间结点对应的霍夫曼树状链表的首个元素指针,得到码表的链接记录。链接记录第一列为第(N-n+1)层中间结点的编码,第二列为的第(N-n+1)层中间结点对应的霍夫曼树状链表的首个元素指针,第三列为空。
将第一编码表的部分记录和码表的链接记录组成一个新的编码表:第二编码表,并存储第二编码表和码表。第二编码表共包括2n条记录,n为步骤S302中的正整数n。
例如,当取正整数n=3时,霍夫曼二叉树结构的第3层至最后一层包括:叶子结点(A)、(B)、(C)、(D)、(E),第3层的中间结点(4)。所以第一编码表的部分记录包括:叶子结点(C)、(D)、(E)各自对应的一条记录,以及叶子结点(A)、(B)各自对应的两条冗余记录。如表21所示。
表21
信源字符 | 信源字符编码 | 码长 |
C | 000 | 3 |
A | 010 | 2 |
A | 011 | 2 |
D | 100 | 3 |
E | 101 | 3 |
B | 110 | 2 |
B | 111 | 2 |
链接记录包括:第3层中间结点(4)链接至其对应的霍夫曼树状链表的首个元素指针,即表18中的0000。链接记录如表22所示。
表22
第一编码表的部分记录和码表的链接记录组成的第二编码表如表23所示,其第一例为字符或指针,第二列为编码,第三列为码长。
表23
当取正整数n=2时,霍夫曼二叉树结构的第4层至最后一层包括:叶子结点(A)、(B),第3层的中间结点(7)、(9)。所以第一编码表的部分记录包括:叶子结点(A)、(B)各自对应的一条冗余记录。如表24所示。
表24
信源字符 | 信源字符编码 | 码长 |
A | 01 | 2 |
B | 11 | 2 |
链接记录包括:第4层中间结点(7)和中间结点(9)链接至其对应的霍夫曼树状链表的首个元素指针,即表20中的0000和0110。链接记录如表25所示。
表25
第一编码表的部分记录和码表的链接记录组成的第二编码表如表26所示,其第一例为字符或指针,第二列为编码,第三列为码长。
表26
字符或指针 | 编码 | 码长 |
X0 | 00 | - |
A | 01 | 2 |
X1 | 10 | - |
B | 11 | 2 |
这样,本实施例根据霍夫曼编码结果(即霍夫曼二叉树结构)建立码表(即霍夫曼树状链表),只需存储霍夫曼树状链表(≤2*2L个元素)以及第二编码表(2n条记录)即可完成编码,相对于存储整个霍夫曼编码表(2N条记录),大大减少了编码中所需的存储空间,可大幅降低硬件资源开销,并同时兼顾编码效率。
以上只是示例性的说明,本实施例并不以此为限。例如,L应根据信源字符的个数来确定。当信源字符的个数为m时,L的取值为使2M>m成立的最小的M值。对霍夫曼二叉树结构的结点进行编号时,也可以将处于上一层中间结点左分支的结点编码为1,将处于其上一层中间结点右分支的结点编码为0。n可以取小于或等于N/2的数值。
在本实施例的步骤S304中,与第二编码表相同,解码表也包括2n条记录。对于表23所示的第二编码表,解码表如表27所示,对于表26所示的第二编码表,解码表如表28所示,其第一例为编码,第二列为字符或指针,第三列为码长。“描述”部分对每条记录的含义进行了解释。
表27
表28
在本实施例中,步骤S305利用解码表对信源字符编码的n bit符号进行第一解码,具体包括:
子步骤S305a:从信源字符编码取出n bit符号;
子步骤S305b:利用霍夫曼解码表对n bit符号进行第一解码。因为码长越短的信源字符,其出现次数越多。所以首先对n bit符号解码,解码成功的概率较高,可以提高解码效率。
上述过程如图11所示,子步骤S305a包括:
初始化步骤:在初始状态,设置寄存器bit_cnt、word_len,并将二者置为0。在第一解码和第二解码的过程中,寄存器bit_cnt用于存储缓存器dec_buf中的字符位数,寄存器word_len用于存储解码结果的码长,即解码出的信源字符对应的编码码字的长度。信源字符编码组成的字符串存储于fifo存储器中。
取码步骤:从fifo存储器中取出K bit符号存入缓存器dec_buf,并将寄存器bit_cnt的值+K。图11中所述K取64。
取出步骤:从缓存器dec_buf取出n bit符号。图11中取出4bit符号。
在本实施例中,步骤S306首先判断步骤S305的第一解码是否成功,若第一解码成功,则直接输出解码结果;若第一解码未成功,则利用霍夫曼树状链表继续对信源字符编码的n bit字符进行第二解码。
如果步骤S305的第一解码成功,那么一个时钟周期解码即可结束。本实施例在输出解码结果后,还包括如下步骤:
首先,获取被解码信源字符对应的编码码字的长度,将编码码字的长度赋予寄存器word_len。
缓存器dec_buf平移寄存器word_len位,并将寄存器bit_cnt的值减去寄存器word_len的值。
判断寄存器bit_cnt的值是否小于k,如果是,则返回子步骤S305a,从取码步骤开始执行,再次进行第一解码。如果否,则返回子步骤S305a,从取出步骤开始执行再次进行第一解码。其中,k<K。在图11中,所述k取16。
本实施例利用霍夫曼树状链表对信源字符编码进行第二解码具体包括:解码步骤和更新步骤。
解码步骤读取霍夫曼树状链表,利用霍夫曼树状链表对n bit符号进行解码,在图11中,首先对4bit符号进行解码。该步骤需要获得初始链表指针,并读取链表信息。
解码步骤具体包括:
初始化子步骤:从解码表获取码表的指针,该指针为霍夫曼树状链表的首个元素指针;寄存器word_len=n。
搜索子步骤:
从缓存器dec_buf再取出1bit符号;
更新寄存器word_len,word_len=word_len+1;
更新所述指针,指针=指针+再取出的1bit符号;
查找码表中所述指针对应的元素。
判断子步骤:判断所述指针对应的元素的Leaf_node字段是否为1,如果是1,则解码成功,如果Leaf_node字段是否为0,则解码不成功。
输出子步骤:如果解码成功,所述指针对应的元素的Pointer字段存储的信源字符作为解码结果,并输出该解码结果。与第一解码类似,输出该解码结果后还包括如下步骤:
缓存器dec_buf平移寄存器word_len位,并将寄存器bit_cnt的值减去寄存器word_len的值。
判断寄存器bit_cnt的值是否小于k,如果是,则返回子步骤S305a,从取码步骤开始执行,再次进行第一解码。如果否,则返回子步骤S305a,从取出步骤开始执行再次进行第一解码。
更新步骤:如果解码不成功,更新所述指针,指针=指针+1;返回上述搜索子步骤,并从上述搜索子步骤开始再次执行解码步骤的各个子步骤,直至解码成功。
例如,对于字符串“0100000110”,利用表27所示的解码表和表18所示的码表进行解码的过程如下:
首先进行第一解码。n取3,所以先从缓存器dec_buf获取前3bit字符:“010”。查找解码表,第一解码成功得到“A”,根据码长word_len=2,缓存器dec_buf左移2bit。再次从缓存器dec_buf获取3bit字符:“000”。查找解码表,第一解码成功得到“C”,根据码长word_len=3,缓存器dec_buf左移3bit。再次从缓存器dec_buf获取3bit字符:“001”。查找解码表,第一解码不成功。
接下来进行第二解码,寄存器word_len=3。从解码表中获取“001”对应的码表的首个元素的指针X(0000)。从缓存器dec_buf再取出1bit符号:“1”;更新寄存器word_len,word_len=3+1=4;更新所述指针,指针=0000+1=0001;查找指针0001对应的元素(表18中第二行的元素)。由于该元素的Leaf_node=0,判断第二解码不成功。更新所述指针,指针=0001+1=0010。从缓存器dec_buf再取出1bit符号:“0”,更新寄存器word_len,word_len=4+1=5;更新所述指针,指针=0010+0=0010;查找指针0010对应的元素(表18中第三行的元素)。由于该元素的Leaf_node=l,判断第二解码成功,得到“G”。输出该解码结果后缓存器dec_buf平移寄存器word_len=5位,并将寄存器bit_cnt的值减去寄存器word_len=5。字符串“0100000110”的解码结果即为“ACG”。
对于字符串“0100000110”,还可以利用表28所示的解码表和表20所示的码表进行解码,过程如下:
首先进行第一解码。n取2,所以先从缓存器dec_buf获取前2bit字符:“01”。查找解码表,第一解码成功得到“A”,根据码长word_len=2,缓存器dec_buf左移2bit。
再次从缓存器dec_buf获取2bit字符:“00”。查找解码表,第一解码不成功。
接下来进行第二解码,寄存器word_len=2。从解码表中获取“00”对应的码表的首个元素的指针X0(0000)。从缓存器dec_buf再取出1bit符号:“0”;更新寄存器word_len,word_len=2+1=3;更新所述指针,指针=0000+0=0000;查找指针0000对应的元素(表20中第一行的元素)。由于该元素的Leaf_node=1,判断第二解码成功,得到“C”。输出该解码结果后缓存器dec_buf平移寄存器word_len=3位,并将寄存器bit_cnt的值减去寄存器word_len=5。
再次进行第一解码,再次从缓存器dec_buf获取2bit字符:“00”。查找解码表,第一解码不成功。
接下来再进行第二解码,寄存器word_len=2。从解码表中获取“00”对应的码表的首个元素的指针X0(0000)。从缓存器dec_buf再取出1bit符号:“1”;更新寄存器word_len,word_len=2+1=3;更新所述指针,指针=0000+1=0001;查找指针0001对应的元素(表20中第二行的元素)。由于该元素的Leaf_node=0,判断第二解码不成功。更新所述指针,指针=0001+1=0010。
从缓存器dec_buf再取出1bit符号:“1”;更新寄存器word_len,word_len=3+1=4;更新所述指针,指针=0010+1=0011;查找指针0011对应的元素(表20中第四行的元素)。由于该元素的Leaf_node=0,判断第二解码不成功。更新所述指针,指针=0011+1=0100。
从缓存器dec_buf再取出1bit符号:“0”;更新寄存器word_len,word_len=4+1=5;更新所述指针,指针=0100+0=0100;查找指针0100对应的元素(表20中第五行的元素)。由于该元素的Leaf_node=1,判断第二解码成功,得到“G”。输出该解码结果后缓存器dec_buf平移寄存器word_len=5位,并将寄存器bit_cnt的值减去寄存器word_len=5。字符串“0100000110”的解码结果仍为“ACG”。
这样,本实施例的解码方法,只需存储解码表(2n条记录)和霍夫曼树状链表(≤2*2L个元素),而无需存储与整个霍夫曼编码表对应的解码表(2N条记录),大大减少了解码中所需的存储空间,可大幅降低硬件资源开销,并同时兼顾解码效率。
本公开第四实施例提供了一种编码系统,如图13所示,该编码系统包括:
第一编码装置,用于对信源字符进行编码,得到一编码结构以及第一编码表。
第二编码装置,用于根据编码结构建立码表。
第三编码装置,用于选取第一编码表的部分记录,建立所述码表的链接记录,所述链接记录与所述部分记录组成第二编码表;
存储装置,用于存储码表和第二编码表,其中,所述第二编码表和所述码表所占的存储空间小于第一编码表所占的存储空间。
在本实施例中,编码系统还包括输入装置和控制装置。输入装置用于接收输入的信源字符,并将信源字符输出给第一编码装置。控制装置连接第一编码装置、第二编码装置、第三编码装置、存储装置和输入装置,用于控制各个装置的操作。
第一编码装置为霍夫曼编码装置,霍夫曼编码装置对输入装置传来的信源字符进行霍夫曼编码,构建霍夫曼二叉树结构,并得到霍夫曼编码表。
霍夫曼编码装置包括:
排队单元,用于将信源字符的出现次数按从小到大的顺序排队。当多个信源字符的出现次数相同时,这多个信源字符之间的顺序不做限制,可以任意排列。
构建单元,用于构建霍夫曼二叉树结构,将下一层的出现次数最少的两个结点的出现次数相加,作为上一层的中间结点,其中,第一层为两个叶子结点,最后一层的中间结点称为顶层结点。其中,该相加的两个结点可以是两个叶子结点、两个中间结点、一个叶子结点和一个中间结点。叶子结点是指信源字符及其对应的出现次数,中间结点是指两个结点的出现次数相加之和。在构建的过程中,在每一层重复上述过程,始终将出现次数较多的结点放在右边,直到最后一层的顶层结点,顶层结点的出现次数为字符串的信源字符个数。若霍夫曼二叉树结构的一层中包括出现次数相同的三个以上结点,可将其中任意两个结点的出现次数相加,作为该层的上一层的中间结点。
编码单元,用于对霍夫曼二叉树结构的结点进行编号,得到信源字符编码以及霍夫曼编码表,将霍夫曼编码表作为第一编码表。
对于霍夫曼二叉树结构的每一个结点,如果该结点处于其上一层中间结点的左分支,则将该结点编号为0;如果该结点处于其上一层中间结点的右分支,则将该结点编号为1,如图7所示。
沿霍夫曼二叉树结构的最上层至最下层搜索每个信源字符的路径,将该路径经过的结点编码作为该信源字符的霍夫曼编码,将所有信源字符按照出现次数由多至少排列,组成霍夫曼编码表。霍夫曼编码表的大小取决于信源字符编码的最大码长N,一般N>L。当信源字符编码的最大码长为N时,霍夫曼编码表包括2N条记录。
在本实施例中,第二编码装置根据霍夫曼二叉树结构建立霍夫曼树状链表,霍夫曼树状链表作为码表。
第一编码装置将霍夫曼二叉树结构传输给第二编码装置,第二编码装置利用该霍夫曼二叉树结构建立一霍夫曼树状链表。霍夫曼树状链表中的元素结构如表29所示。
表29
霍夫曼树状链表中的每个元素包含10bit数据,其中[9:9]bit为Leaf_node字段(结点类型字段),该字段的含义是:若该元素对应的结点是叶子结点,则Leaf_node=l:若该元素对应的结点是中间结点,则Leaf_node=0。[8:0]bit为Pointer字段(指针编码字段),该字段的含义是:当Leaf_node=l时,pointer字段表示该叶子结点对应的信源字符;当Leaf_node=0时,pointer字段表示该中间结点的左分支中间结点或叶子结点的指针,该中间结点的右分支中间结点或叶子结点的指针为pointer+1,所谓指针是指中间结点和叶子结点在存储器中的存储地址。这样,该霍夫曼树状链表可表示出霍夫曼二叉树结构的整个结构,包括结点以及结点之间的连接关系。
建立霍夫曼树状链表的过程为:
首先选取正整数n,且n<N。对于霍夫曼二叉树结构的第(N-n+1)层,该层的每一个中间结点对应一个霍夫曼树状链表。第(N-n+1)层的中间结点的左分支结点作为该中间结点对应的霍夫曼树状链表的首个元素,从第(N-n)层至第一层,依次将各层中间结点、各层中间结点的左分支结点和右分支结点作为霍夫曼树状链表的连续三个元素。
当左分支结点和右分支结点为中间结点时,其对应的元素的leaf_node=0,pointer代表该中间结点的左分支的中间结点或叶子结点对应元素的指针。当左分支结点和右分支结点为叶子结点时,其对应的元素的leaf_node=1,pointer代表该叶子结点的信源字符。
建立霍夫曼树状链表后,存储装置存储霍夫曼树状链表。其中,霍夫曼树状链表在存储装置中占据连续的存储空间,即霍夫曼树状链表中后一个元素的指针为前一个元素的指针+1。如果霍夫曼树状链表有多个,多个霍夫曼树状链表在存储装置中也可以占据连续的存储空间,即后一个霍夫曼树状链表的首个元素的指针为前一个霍夫曼树状链表最后一个元素的指针+1。所有霍夫曼树状链表的元素总个数≤2*2L。
第一编码装置和第二编码装置分别将霍夫曼编码表和霍夫曼树状链表发送给第三编码装置。第三编码装置用于选取霍夫曼编码表的部分记录,建立霍夫曼树状链表的链接记录,所述链接记录与所述部分记录组成第二编码表。
霍夫曼编码表的部分记录包括:
霍夫曼二叉树结构的第(N-n+1)层至最后一层的所有叶子结点所对应的记录,以及第(N-n+1)层的所有中间结点所对应的记录。
其中,霍夫曼二叉树结构第(N-n+1)层的叶子结点仅对应一条记录,其余层的叶子结点对应多条冗余记录。对于其余层的叶子结点,通过将其所对应的信源字符编码高位对齐,低位补充0或1得到冗余记录。冗余记录的信源字符编码位数与第(N-n+1)层的叶子节点对应的信源字符编码位数相等。
建立霍夫曼树状链表的链接记录包括:
将第(N-n+1)层中间结点所对应的记录链接至第(N-n+1)层中间结点对应的霍夫曼树状链表的首个元素指针,得到码表的链接记录。链接记录第一列为第(N-n+1)层中间结点的编码,第二列为的第(N-n+1)层中间结点对应的霍夫曼树状链表的首个元素指针,第三列为空。
将第一编码表的部分记录和码表的链接记录组成一个新的编码表:第二编码表,并存储第二编码表。第二编码表共包括2n条记录,n为正整数。第一编码装置还可以将信源字符编码发送至存储装置,由存储装置存储信源字符编码。
这样,本实施例根据霍夫曼编码结果(即霍夫曼二叉树结构)建立码表(即霍夫曼树状链表),只需存储霍夫曼树状链表(≤2*2L个元素)以及第二编码表(2n条记录)即可完成编码,相对于存储整个霍夫曼编码表(2N条记录),大大减少了编码中所需的存储空间,可大幅降低硬件资源开销,并同时兼顾编码效率。
以上只是示例性的说明,本实施例并不以此为限。例如,L应根据信源字符的个数来确定。当信源字符的个数为m时,L的取值为使2M>m成立的最小的M值。对霍夫曼二叉树结构的结点进行编号时,也可以将处于上一层中间结点左分支的结点编码为1,将处于其上一层中间结点右分支的结点编码为0。n可以取小于或等于N/2的数值。
所述存储装置可以是SRAM存储器,当然也可以是其他任何类型的存储器,例如但不限于各种易失性/非易失性存储器、光学/磁/半导体存储器等。
本公开第五实施例提供了一种解码系统,其是与第四实施例的编码系统相对应的解码系统,如图14所示,该解码系统包括:
获取装置,用于获取码表、以及与第二编码表对应的解码表。
第一解码装置,用于利用解码表对信源字符编码进行第一解码。
判断装置,用于判断所述第一解码是否成功。
输出装置,若第一解码成功,用于输出解码结果。
第二解码装置,若第一解码未成功,用于利用码表对信源字符编码进行第二解码,并输出解码结果。
存储装置,用于存储解码表和码表,其中,解码表和码表所占的存储空间小于第一编码表所对应的解码表所占的存储空间。
解码系统还包括输入装置和控制装置。输入装置用于接收输入的信源字符编码,并将信源字符编码输出给第一解码装置。控制装置连接获取装置、存储装置、第一解码装置、判断装置、输出装置、第二解码装置,用于控制各个装置的操作。
在本实施例中,与第二编码表相同,解码表也包括2n条记录。在本实施例中,第一解码装置利用霍夫曼解码表对信源字符编码的n bit符号进行第一解码。
第一解码装置包括:
初始化单元、寄存器bit_cnt和word_len。初始化单元用于将寄存器bit_cnt、word_len置为0。在解码过程中,寄存器bit_cnt用于存储缓存器dec_buf中的符号位数,寄存器word_len用于存储解码结果的码长,即解码出的信源字符的码长。信源字符编码组成的字符串存储于fifo存储器中。
取码单元和缓存器dec_buf。取码单元用于从fifo存储器中取出K bit符号存入缓存器dec_buf,并将寄存器bit_cnt的值+K。
取出单元:从缓存器dec_buf取出n bit符号。第一解码单元,利用霍夫曼解码表对n bit符号进行解码。
在本实施例中,判断装置判断第一解码是否成功,若第一解码成功,输出装置输出解码结果。若第一解码未成功,第二解码装置利用霍夫曼树状链表对信源字符编码的n bit字符进行第二解码。
如果第一解码单元解码成功,那么一个时钟周期解码即可结束。本实施例在输出解码结果后,解码系统还进行如下操作:
第一解码装置获取被解码信源字符对应的编码码字的长度,将编码码字的长度赋予寄存器word_len。
缓存器dec_buf平移寄存器word_len位,并将寄存器bit_cnt的值减去寄存器word_len的值。
第一解码装置判断寄存器bit_cnt的值是否小于k,如果是,取码单元继续从fifo存储器中取出K bit符号存入缓存器dec_buf,并将寄存器bit_cnt的值+K,再次进行第一解码。如果否,取出单元继续从缓存器dec_buf取出n bit符号,再次进行第一解码。
本实施例的第二解码装置包括:
初始化单元,从解码表获取码表的指针,该指针为霍夫曼树状链表的首个元素指针;寄存器word_len=n。
搜索单元,从缓存器dec_buf再取出1bit符号,更新寄存器word_len,word_len=word_len+1,更新所述指针,指针=指针+再取出的1bit符号,查找码表中所述指针对应的元素。
判断单元,判断所述指针对应的元素的Leaf_node字段是否为1,如果是1,则解码成功,如果Leaf_node字段是否为0,则解码不成功。
输出单元,如果解码成功,所述指针对应的元素的Pointer字段存储的信源字符作为解码结果,并输出该解码结果。与第一解码类似,输出该解码结果后解码系统还进行如下操作:
缓存器dec_buf平移寄存器word_len位,并将寄存器bit_cnt的值减去寄存器word_len的值。
第二解码装置判断寄存器bit_cnt的值是否小于k,如果是,取码单元继续从fifo存储器中取出K bit符号存入缓存器dec_buf,并将寄存器bit_cnt的值+K,再次进行第一解码。如果否,取出单元继续从缓存器dec_buf取出前n bit符号,再次进行第一解码。
更新单元,如果解码不成功,更新所述指针,指针=指针+1;搜索单元再次执行搜索操作,直至解码成功。
这样,本实施例的解码系统,只需存储解码表(2n条记录)和霍夫曼树状链表(≤2*2L个元素),而无需存储与整个霍夫曼编码表对应的解码表(2N条记录),大大减少了解码中所需的存储空间,可大幅降低硬件资源开销,并同时兼顾解码效率。
本公开第六实施例提供了一种编解码系统,如图15所示,该编解码系统包括:
本公开第四实施例提供了一种编码系统,如图13所示,该编码系统包括:
第一编码装置,用于对信源字符进行编码,得到一编码结构以及第一编码表和信源字符编码。
第二编码装置,用于根据编码结构建立码表。
第三编码装置,用于选取第一编码表的部分记录,建立所述码表的链接记录,所述链接记录与所述部分记录组成第二编码表;
第一存储装置,用于存储码表和第二编码表,其中,所述第二编码表和所述码表所占的存储空间小于第一编码表所占的存储空间。
获取装置,用于获取码表、以及与第二编码表对应的解码表。
第一解码装置,用于利用解码表对信源字符编码进行第一解码。
判断装置,用于判断所述第一解码是否成功。
输出装置,若第一解码成功,用于输出解码结果。
第二解码装置,若第一解码未成功,用于利用码表对信源字符编码进行第二解码,并输出解码结果。
第二存储装置,用于存储解码表和码表,其中,解码表和码表所占的存储空间小于第一编码表所对应的解码表所占的存储空间。
在本实施例中,编解码系统还包括第一输入装置和第一控制装置。第一输入装置用于接收输入的信源字符,并将信源字符输出给第一编码装置。第一控制装置连接第一编码装置、第二编码装置、第三编码装置、存储装置和输入装置,用于控制各个装置的操作。编解码系统还包括第二输入装置和第二控制装置。第二输入装置用于从第一存储装置读取信源字符编码,并将信源字符编码输出给第一解码装置。第二控制装置连接获取装置、第二存储装置、第一解码装置、判断装置、输出装置、第二解码装置、第二输入装置,用于控制各个装置的操作。
第一编码装置为霍夫曼编码装置,霍夫曼编码装置对第一输入装置输入的信源字符进行霍夫曼编码,构建霍夫曼二叉树结构,并得到霍夫曼编码表。
霍夫曼编码装置包括:
排队单元,用于将信源字符的出现次数按从小到大的顺序排队。当多个信源字符的出现次数相同时,这多个信源字符之间的顺序不做限制,可以任意排列。
构建单元,用于构建霍夫曼二叉树结构,将下一层的出现次数最少的两个结点的出现次数相加,作为上一层的中间结点,其中,第一层为两个叶子结点,最后一层的中间结点称为顶层结点。其中,该相加的两个结点可以是两个叶子结点、两个中间结点、一个叶子结点和一个中间结点。叶子结点是指信源字符及其对应的出现次数,中间结点是指两个结点的出现次数相加之和。在构建的过程中,在每一层重复上述过程,始终将出现次数较多的结点放在右边,直到最后一层的顶层结点,顶层结点的出现次数为字符串的信源字符个数。若霍夫曼二叉树结构的一层中包括出现次数相同的三个以上结点,可将其中任意两个结点的出现次数相加,作为该层的上一层的中间结点。
编码单元,用于对霍夫曼二叉树结构的结点进行编号,得到霍夫曼编码表,将霍夫曼编码表作为第一编码表。
对于霍夫曼二叉树结构的每一个结点,如果该结点处于其上一层中间结点的左分支,则将该结点编号为0;如果该结点处于其上一层中间结点的右分支,则将该结点编号为1,如图7所示。
沿霍夫曼二叉树结构的最上层至最下层搜索每个信源字符的路径,将该路径经过的结点编码作为该信源字符的霍夫曼编码,将所有信源字符按照出现次数由多至少排列,组成霍夫曼编码表。霍夫曼编码表的大小取决于信源字符编码的最大码长N,一般N>L。当信源字符编码的最大码长为N时,霍夫曼编码表包括2N条记录。
在本实施例中,第二编码装置根据霍夫曼二叉树结构建立霍夫曼树状链表,霍夫曼树状链表作为码表。
第一编码装置将霍夫曼二叉树结构传输给第二编码装置,第二编码装置利用该霍夫曼二叉树结构建立一霍夫曼树状链表。霍夫曼树状链表中的元素结构如表30所示。
表30
霍夫曼树状链表中的每个元素包含10bit数据,其中[9:9]bit为Leaf_node字段(结点类型字段),该字段的含义是:若该元素对应的结点是叶子结点,则Leaf_node=l:若该元素对应的结点是中间结点,则Leaf_node=0。[8:0]bit为Pointer字段(指针编码字段),该字段的含义是:当Leaf_node=l时,pointer字段表示该叶子结点对应的信源字符;当Leaf_node=0时,pointer字段表示该中间结点的左分支中间结点或叶子结点的指针,该中间结点的右分支中间结点或叶子结点的指针为pointer+1,所谓指针是指中间结点和叶子结点在存储器中的存储地址。这样,该霍夫曼树状链表可表示出霍夫曼二叉树结构的整个结构,包括结点以及结点之间的连接关系。
建立霍夫曼树状链表的过程为:
首先选取正整数n,且n<N。对于霍夫曼二叉树结构的第(N-n+1)层,该层的每一个中间结点对应一个霍夫曼树状链表。第(N-n+1)层的中间结点的左分支结点作为该中间结点对应的霍夫曼树状链表的首个元素,从第(N-n)层至第一层,依次将各层中间结点、各层中间结点的左分支结点和右分支结点作为霍夫曼树状链表的连续三个元素。
当左分支结点和右分支结点为中间结点时,其对应的元素的leaf_node=0,pointer代表该中间结点的左分支的中间结点或叶子结点对应元素的指针。当左分支结点和右分支结点为叶子结点时,其对应的元素的leaf_node=1,pointer代表该叶子结点的信源字符。
建立霍夫曼树状链表后,第一存储装置存储霍夫曼树状链表。其中,霍夫曼树状链表在第一存储装置中占据连续的存储空间,即霍夫曼树状链表中后一个元素的指针为前一个元素的指针+1。如果霍夫曼树状链表有多个,多个霍夫曼树状链表在第一存储装置中也可以占据连续的存储空间,即后一个霍夫曼树状链表的首个元素的指针为前一个霍夫曼树状链表最后一个元素的指针+1。所有霍夫曼树状链表的元素总个数≤2*2L。
第一编码装置和第二编码装置分别将霍夫曼编码表和霍夫曼树状链表发送给第三编码装置。第三编码装置用于选取霍夫曼编码表的部分记录,建立霍夫曼树状链表的链接记录,所述链接记录与所述部分记录组成第二编码表。
霍夫曼编码表的部分记录包括:
霍夫曼二叉树结构的第(N-n+1)层至最后一层的所有叶子结点所对应的记录,以及第(N-n+1)层的所有中间结点所对应的记录。
其中,霍夫曼二叉树结构第(N-n+1)层的叶子结点仅对应一条记录,其余层的叶子结点对应多条冗余记录。对于其余层的叶子结点,通过将其所对应的信源字符编码高位对齐,低位补充0或1得到冗余记录。冗余记录的信源字符编码位数与第(N-n+1)层的叶子节点对应的信源字符编码位数相等。
建立霍夫曼树状链表的链接记录包括:
将第(N-n+1)层中间结点所对应的记录链接至第(N-n+1)层中间结点对应的霍夫曼树状链表的首个元素指针,得到码表的链接记录。链接记录第一列为第(N-n+1)层中间结点的编码,第二列为的第(N-n+1)层中间结点对应的霍夫曼树状链表的首个元素指针,第三列为空。
将第一编码表的部分记录和码表的链接记录组成一个新的编码表:第二编码表,并存储第二编码表。第二编码表共包括2n条记录,n为正整数。第一编码装置还可以将信源字符编码发送至的第一存储装置,由第一存储装置存储信源字符编码。
以上只是示例性的说明,本实施例并不以此为限。例如,L应根据信源字符的个数来确定。当信源字符的个数为m时,L的取值为使2M>m成立的最小的M值。对霍夫曼二叉树结构的结点进行编号时,也可以将处于上一层中间结点左分支的结点编码为1,将处于其上一层中间结点右分支的结点编码为0。n可以取小于或等于N/2的数值。
在本实施例中,与第二编码表相同,解码表也包括2n条记录。第一解码装置利用霍夫曼解码表对信源字符编码的n bit符号进行第一解码。
第一解码装置包括:
初始化单元、寄存器bit_cnt和word_len。初始化单元用于将寄存器bit_cnt、word_len置为0。在解码过程中,寄存器bit_cnt用于存储缓存器dec_buf中的符号位数,寄存器word_len用于存储解码结果的码长,即解码出的信源字符的码长。信源字符编码组成的字符串存储于fifo存储器中。
取码单元和缓存器dec_buf。取码单元用于从fifo存储器中取出K bit符号存入缓存器dec_buf,并将寄存器bit_cnt的值+K。
取出单元:从缓存器dec_buf取出n bit符号。第一解码单元,利用霍夫曼解码表对n bit符号进行解码。
在本实施例中,判断装置判断第一解码是否成功,若第一解码成功,输出装置输出解码结果。若第一解码未成功,第二解码装置利用霍夫曼树状链表对信源字符编码的n bit字符进行第二解码。
如果第一解码单元解码成功,那么一个时钟周期解码即可结束。本实施例在输出解码结果后,编解码系统还进行如下操作:
第一解码装置获取被解码信源字符对应的编码码字的长度,将编码码字的长度赋予寄存器word_len。
缓存器dec_buf平移寄存器word_len位,并将寄存器bit_cnt的值减去寄存器word_len的值。
第一解码装置判断寄存器bit_cnt的值是否小于k,如果是,取码单元继续从fifo存储器中取出K bit符号存入缓存器dec_buf,并将寄存器bit_cnt的值+K,再次进行第一解码。如果否,取出单元继续从缓存器dec_buf取出n bit符号,再次进行第一解码。
本实施例的第二解码装置包括:
初始化单元,从解码表获取码表的指针,该指针为霍夫曼树状链表的首个元素指针;寄存器word_len=n。
搜索单元,从缓存器dec_buf再取出1bit符号,更新寄存器word_len,word_len=word_len+1,更新所述指针,指针=指针+再取出的1bit符号,查找码表中所述指针对应的元素。
判断单元,判断所述指针对应的元素的Leaf_node字段是否为1,如果是1,则解码成功,如果Leaf_node字段是否为0,则解码不成功。
输出单元,如果解码成功,所述指针对应的元素的Pointer字段存储的信源字符作为解码结果,并输出该解码结果。与第一解码类似,输出该解码结果后编解码系统还进行如下操作:
缓存器dec_buf平移寄存器word_len位,并将寄存器bit_cnt的值减去寄存器word_len的值。
第二解码装置判断寄存器bit_cnt的值是否小于k,如果是,取码单元继续从fifo存储器中取出K bit符号存入缓存器dec_buf,并将寄存器bit_cnt的值+K,再次进行第一解码。如果否,取出单元继续从缓存器dec_buf取出前n bit符号,再次进行第一解码。
更新单元,如果解码不成功,更新所述指针,指针=指针+1;搜索单元再次执行搜索操作,直至解码成功。
所述第一存储装置和第二存储装置可以是SRAM存储器,当然也可以是其他任何类型的存储器,例如但不限于各种易失性/非易失性存储器、光学/磁/半导体存储器等。
这样,本实施例的编解码系统,只需存储霍夫曼树状链表(≤2*2L个元素)以及第二编码表(2n条记录)即可完成编码,只需存储解码表(2n条记录)和霍夫曼树状链表(≤2*2L个元素)即可完成解码,而无需存储整个霍夫曼编码表、以及与整个霍夫曼编码表对应的解码表(2N条记录),大大减少了编码中所需的存储空间,可大幅降低硬件资源开销,并同时兼顾编解码效率。
本公开的第七实施例提供了一种计算设备,该计算设备可以是矿机或挖矿机。计算设备包括:外壳、外壳内的算力板和控制板。算力板和控制板的至少一者包括:第四实施例的编码系统、第五实施例的解码系统、第六实施例的编解码系统的至少其中之一。
其中,对于本公开的编码系统、解码系统以及编解码系统,其包含的各个装置可以分别由不同的芯片实现,也可以由同一芯片实现。这些芯片包括但不限于CPU、GPU、DSP、FPGA、ASIC等芯片。同时,编码系统各个装置的功能可以由硬件、软件、或软硬件相结合来实现。
至此,已经结合附图对本实施例进行了详细描述。依据以上描述,本领域技术人员应当对本公开有了清楚的认识。
需要说明的是,在附图或说明书正文中,未绘示或描述的实现方式,均为所属技术领域中普通技术人员所知的形式,并未进行详细说明。此外,上述对各元件的定义并不仅限于实施例中提到的各种具体结构、形状或方式,本领域普通技术人员可对其进行简单地更改或替换,例如:
(1)实施例中提到的方向用语,例如“上”、“下”、“前”、“后”、“左”、“右”等,仅是参考附图的方向,并非用来限制本公开的保护范围;
(2)上述实施例可基于设计及可靠度的考虑,彼此混合搭配使用或与其他实施例混合搭配使用,即不同实施例中的技术特征可以自由组合形成更多的实施例。
以上所述的具体实施例,对本公开的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本公开的具体实施例而已,并不用于限制本公开,凡在本公开的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本公开的保护范围之内。
Claims (69)
1.一种编码方法,其特征在于,包括:
对信源字符进行编码,得到一编码结构以及第一编码表;
根据所述编码结构建立码表,并存储所述码表;
选取所述第一编码表的部分记录,建立所述码表的链接记录,所述链接记录与所述部分记录组成第二编码表,存储所述第二编码表,其中,所述第二编码表和所述码表所占的存储空间小于所述第一编码表所占的存储空间。
2.如权利要求1所述的编码方法,其特征在于,所述编码包括霍夫曼编码;所述编码结构包括霍夫曼二叉树结构;所述第一编码表包括霍夫曼编码表。
3.如权利要求2所述的编码方法,其特征在于,所述对信源字符进行编码,得到一编码结构以及第一编码表包括:
将所述信源字符的出现次数按预定规则排队;
根据所述排队结果构建霍夫曼二叉树结构;
对所述霍夫曼二叉树结构的结点进行编号,得到所述霍夫曼编码表。
4.如权利要求3所述的编码方法,其特征在于,所述对所述霍夫曼二叉树结构的结点进行编号,得到所述霍夫曼编码表包括:
对于所述霍夫曼二叉树结构的每一个结点,如果所述结点处于其上一层结点的左分支,则将所述结点编为第一编号;如果所述结点处于其上一层结点的右分支,则将所述结点编为第二编号;
沿所述霍夫曼二叉树结构最后一层至第一层,搜索每个信源字符的路径,将所述路径经过的结点编号作为信源字符编码;
将所有信源字符按照出现次数由多至少排列,组成所述霍夫曼编码表。
5.如权利要求4所述的编码方法,其特征在于,所述码表包括至少一个霍夫曼树状链表。
6.如权利要求5所述的编码方法,其特征在于,所述霍夫曼树状链表中的每个元素包括:第一字段和第二字段;
所述第一字段代表所述元素对应的结点类型;
所述第二字段代表所述元素对应结点的信源字符,或者所述元素对应结点的左分支结点所对应元素的指针。
7.如权利要求6所述的编码方法,其特征在于,所述结点类型包括叶子结点和中间结点;
当所述结点类型为叶子结点时,所述第二字段代表所述叶子结点对应的信源字符;
当所述结点类型为中间结点时,所述第二字段代表所述中间结点的左分支中间结点或叶子结点所对应元素的指针,所述中间结点的右分支中间结点或叶子结点所对应元素的指针为第二字段的值加一。
8.如权利要求5所述的编码方法,其特征在于,所述根据编码结构建立码表包括:
选取正整数n,且n<N;N为所述信源字符编码的最大码长;所述霍夫曼二叉树结构的第(N-n+1)层的每一个中间结点对应一个霍夫曼树状链表;
对于所述第(N-n+1)层的每一个中间结点,将所述中间结点的左分支结点作为所述中间结点对应的霍夫曼树状链表的首个元素;
从所述霍夫曼二叉树结构的第(N-n)层至第一层,依次将各层中间结点、各层中间结点的左分支结点和右分支结点作为所述霍夫曼树状链表的连续三个元素。
9.如权利要求5所述的编码方法,其特征在于,所述存储码表包括:
存储所述至少一个霍夫曼树状链表,使每个所述霍夫曼树状链表占据连续的存储空间。
10.如权利要求9所述的编码方法,其特征在于,所述码表包括多个霍夫曼树状链表,所述多个霍夫曼树状链表占据连续的存储空间。
11.如权利要求8所述的编码方法,其特征在于,所述第一编码表的部分记录包括:
所述霍夫曼二叉树结构的第(N-n+1)层至最后一层的所有叶子结点所对应的记录,以及第(N-n+1)层的所有中间结点所对应的记录。
12.如权利要求11所述的编码方法,其特征在于,所述建立所述码表的链接记录包括:
将所述霍夫曼二叉树结构第(N-n+1)层中间结点所对应的记录链接至所述第(N-n+1)层中间结点对应的霍夫曼树状链表的首个元素指针,得到所述码表的链接记录。
13.一种解码方法,其特征在于,包括:
获取码表、以及与第二编码表对应的解码表,并存储所述码表和所述解码表;
利用所述解码表对信源字符编码进行第一解码;
若所述第一解码成功,则输出解码结果;若所述第一解码未成功,则利用所述码表对所述信源字符编码进行第二解码,并输出解码结果;其中,所述解码表和所述码表所占的存储空间小于第一编码表所对应的解码表所占的存储空间,其中所述第一编码表可对信源字符进行编码。
14.如权利要求13所述的解码方法,其特征在于,所述码表包括至少一个霍夫曼树状链表;所述第一编码表包括霍夫曼编码表;
第二编码表包括:第一编码表的部分记录和所述码表的链接记录。
15.如权利要求14所述的解码方法,其特征在于,所述利用所述解码表对信源字符编码进行第一解码包括:
从所述信源字符编码取出n bit符号;n为正整数n,且n<N,N为所述信源字符编码的最大码长;
利用所述解码表对所述n bit符号进行第一解码。
16.如权利要求15所述的解码方法,其特征在于,所述从所述信源字符编码取出n bit符号包括:
初始化:将第一寄存器和第二寄存器置为0;
取码:将K bit符号存入缓存器,并将所述第一寄存器的值+K;
取出:从所述缓存器取出n bit符号。
17.如权利要求16所述的解码方法,其特征在于,所述利用所述码表对所述信源字符编码进行第二解码包括:
初始化:从所述解码表获取所述霍夫曼树状链表的指针,将n赋予所述第二寄存器;
搜索:
从所述缓存器再取出1bit符号;
更新所述第二寄存器,将所述第二寄存器的值+1;
更新所述指针,将所述指针的值+再取出的所述1bit符号;
查找所述霍夫曼树状链表中所述指针对应的元素;
判断:判断所述指针对应的元素是否对应叶子结点;如果是,则所述第二解码成功;如果否,则所述第二解码不成功;
输出:如果所述第二解码成功,所述所述指针对应元素的信源字符作为所述n bit符号的解码结果,并输出解码结果;
更新:如果所述第二解码不成功,更新所述指针,将所述指针的值+1;返回所述搜索步骤,并从所述搜索步骤开始再次进行第二解码,直至第二解码成功。
18.如权利要求16或17所述的解码方法,其特征在于,所述输出解码结果后还包括:
获取被解码信源字符对应的编码码字的长度,将所述编码码字的长度赋予第二寄存器;
所述缓存器平移所述第二寄存器的值的位数,并将所述第一寄存器的值减去所述第二寄存器的值;
判断所述第一寄存器的值是否小于k,如果是,则重新返回所述取码步骤开始执行;如果否,则重新返回所述取出步骤开始执行;其中,k<K。
19.一种编解码方法,其特征在于,包括:
对信源字符进行编码,得到一编码结构以及第一编码表和信源字符编码;
根据所述编码结构建立码表,并存储所述码表;
选取所述第一编码表的部分记录,建立所述码表的链接记录,所述链接记录与所述部分记录组成第二编码表,存储所述第二编码表,其中,所述第二编码表和所述码表所占的存储空间小于所述第一编码表所占的存储空间;
获取所述码表、以及与所述第二编码表对应的解码表,并存储所述码表和所述解码表;
利用所述解码表对所述信源字符编码进行第一解码;
若所述第一解码成功,则输出解码结果;若所述第一解码未成功,则利用所述码表对所述信源字符编码进行第二解码,并输出解码结果;其中,所述解码表和所述码表所占的存储空间小于所述第一编码表所对应的解码表所占的存储空间。
20.如权利要求19所述的编解码方法,其特征在于,所述编码包括霍夫曼编码;所述编码结构包括霍夫曼二叉树结构;所述第一编码表包括霍夫曼编码表。
21.如权利要求20所述的编解码方法,其特征在于,所述对信源字符进行编码,得到一编码结构以及第一编码表和信源字符编码包括:
将所述信源字符的出现次数按预定规则排队;
根据所述排队结果构建所述霍夫曼二叉树结构;
对所述霍夫曼二叉树结构的结点进行编号,得到所述霍夫曼编码表以及所述信源字符编码。
22.如权利要求21所述的编解码方法,其特征在于,所述对所述霍夫曼二叉树结构的结点进行编号,得到所述霍夫曼编码表以及信源字符编码包括:
对于所述霍夫曼二叉树结构的每一个结点,如果所述结点处于其上一层结点的左分支,则将所述结点编为第一编号;如果所述结点处于其上一层结点的右分支,则将所述结点编为第二编号;
沿所述霍夫曼二叉树结构最后一层至第一层,搜索每个信源字符的路径,将所述路径经过的结点编号作为所述信源字符编码,将所有信源字符按照出现次数由多至少排列,组成所述霍夫曼编码表。
23.如权利要求20至22任一项所述的编解码方法,其特征在于,所述码表包括至少一个霍夫曼树状链表。
24.如权利要求23所述的编解码方法,其特征在于,所述霍夫曼树状链表中的每个元素包括:第一字段和第二字段;
所述第一字段代表所述元素对应的结点类型;
所述第二字段代表所述元素对应结点的信源字符,或者所述元素对应结点的左分支结点所对应元素的指针。
25.如权利要求24所述的编解码方法,其特征在于,所述结点类型包括叶子结点和中间结点;
当所述结点类型为叶子结点时,所述第二字段代表所述叶子结点对应的信源字符;
当所述结点类型为中间结点时,所述第二字段代表所述中间结点的左分支中间结点或叶子结点所对应元素的指针,所述中间结点的右分支中间结点或叶子结点所对应元素的指针为第二字段的值加一。
26.如权利要求23所述的编解码方法,其特征在于,所述根据编码结构建立码表包括:
选取正整数n,且n<N;N为所述信源字符编码的最大码长;所述霍夫曼二叉树结构的第(N-n+1)层的每一个中间结点对应一个霍夫曼树状链表;
对于所述第(N-n+1)层的每一个中间结点,将所述中间结点的左分支结点作为所述中间结点对应的霍夫曼树状链表的首个元素;
从所述霍夫曼二叉树结构的第(N-n)层至第一层,依次将各层中间结点、各层中间结点的左分支结点和右分支结点作为所述霍夫曼树状链表的连续三个元素。
27.如权利要求23所述的编解码方法,其特征在于,所述存储码表包括:
存储所述至少一个霍夫曼树状链表,使每个所述霍夫曼树状链表占据连续的存储空间。
28.如权利要求27所述的编解码方法,其特征在于,所述码表包括多个霍夫曼树状链表,所述多个霍夫曼树状链表占据连续的存储空间。
29.如权利要求26所述的编解码方法,其特征在于,所述第一编码表的部分记录包括:
所述霍夫曼二叉树结构的第(N-n+1)层至最后一层的所有叶子结点所对应的记录,以及第(N-n+1)层的所有中间结点所对应的记录。
30.如权利要求29所述的编解码方法,其特征在于,所述建立所述码表的链接记录包括:
将所述霍夫曼二叉树结构第(N-n+1)层中间结点所对应的记录链接至所述第(N-n+1)层中间结点对应的霍夫曼树状链表的首个元素指针,得到所述码表的链接记录。
31.如权利要求23所述的编解码方法,其特征在于,所述利用所述解码表对信源字符编码进行第一解码包括:
从所述信源字符编码取出n bit符号;
利用所述解码表对所述n bit符号进行第一解码。
32.如权利要求31所述的编解码方法,其特征在于,所述从所述信源字符编码取出nbit符号包括:
初始化:将第一寄存器和第二寄存器置为0;
取码:将K bit符号存入缓存器,并将所述第一寄存器的值+K;
取出:从所述缓存器取出n bit符号。
33.如权利要求32所述的编解码方法,其特征在于,所述利用所述码表对所述信源字符编码进行第二解码包括:
初始化:从所述解码表获取所述霍夫曼树状链表的指针,将n赋予所述第二寄存器;
搜索:
从所述缓存器再取出1bit符号;
更新所述第二寄存器,将所述第二寄存器的值+1;
更新所述指针,将所述指针的值+再取出的所述1bit符号;
查找所述霍夫曼树状链表中所述指针对应的元素;
判断:判断所述指针对应的元素是否对应叶子结点;如果是,则所述第二解码成功;如果否,则所述第二解码不成功;
输出:如果所述第二解码成功,所述所述指针对应元素的信源字符作为所述n bit符号的解码结果,并输出解码结果;
更新:如果所述第二解码不成功,更新所述指针,将所述指针的值+1;返回所述搜索步骤,并从所述搜索步骤开始再次进行第二解码,直至第二解码成功。
34.如权利要求32或33所述的编解码方法,其特征在于,所述输出解码结果后还包括:
获取被解码信源字符对应的编码码字的长度,将所述编码码字的长度赋予第二寄存器;
所述缓存器平移所述第二寄存器的值的位数,并将所述第一寄存器的值减去所述第二寄存器的值;
判断所述第一寄存器的值是否小于k,如果是,则重新返回所述取码步骤开始执行;如果否,则重新返回所述取出步骤开始执行;其中,k<K。
35.一种编码系统,其特征在于,包括:
第一编码装置,用于对信源字符进行编码,得到一编码结构以及第一编码表;
第二编码装置,用于根据所述编码结构建立码表;
第三编码装置,用于选取所述第一编码表的部分记录,建立所述码表的链接记录,所述链接记录与所述部分记录组成第二编码表;
存储装置,用于存储所述码表和所述第二编码表,其中,所述第二编码表和所述码表所占的存储空间小于所述第一编码表所占的存储空间。
36.如权利要求35所述的编码系统,其特征在于,所述第一编码装置包括霍夫曼编码装置;所述编码结构包括霍夫曼二叉树结构;所述第一编码表包括霍夫曼编码表。
37.如权利要求36所述的编码系统,其特征在于,所述霍夫曼编码装置包括:
排队单元,用于将所述信源字符的出现次数按预定规则排队;
构建单元,用于根据所述排队结果构建霍夫曼二叉树结构;
编码单元,用于对所述霍夫曼二叉树结构的结点进行编号,得到所述霍夫曼编码表。
38.如权利要求37所述的编码系统,其特征在于,对于所述霍夫曼二叉树结构的每一个结点,如果所述结点处于其上一层结点的左分支,所述编码单元将所述结点编为第一编号;如果所述结点处于其上一层结点的右分支,所述编码单元将所述结点编为第二编号;
所述编码单元沿所述霍夫曼二叉树结构最后一层至第一层,搜索每个信源字符的路径,将所述路径经过的结点编号作为信源字符编码,将所有信源字符按照出现次数由多至少排列,组成所述霍夫曼编码表。
39.如权利要求38所述的编码系统,其特征在于,所述码表包括至少一个霍夫曼树状链表。
40.如权利要求39所述的编码系统,其特征在于,所述霍夫曼树状链表中的每个元素包括:第一字段和第二字段;
所述第一字段代表所述元素对应的结点类型;
所述第二字段代表所述元素对应结点的信源字符,或者所述元素对应结点的左分支结点所对应元素的指针。
41.如权利要求40所述的编码系统,其特征在于,所述结点类型包括叶子结点和中间结点;
当所述结点类型为叶子结点时,所述第二字段代表所述叶子结点对应的信源字符;
当所述结点类型为中间结点时,所述第二字段代表所述中间结点的左分支中间结点或叶子结点所对应元素的指针,所述中间结点的右分支中间结点或叶子结点所对应元素的指针为第二字段的值加一。
42.如权利要求39所述的编码系统,其特征在于,所述第二编码装置用于:
选取正整数n,且n<N;N为所述信源字符编码的最大码长;所述霍夫曼二叉树结构的第(N-n+1)层的每一个中间结点对应一个霍夫曼树状链表;
对于所述第(N-n+1)层的每一个中间结点,将所述中间结点的左分支结点作为所述中间结点对应的霍夫曼树状链表的首个元素;
从所述霍夫曼二叉树结构的第(N-n)层至第一层,依次将各层中间结点、各层中间结点的左分支结点和右分支结点作为所述霍夫曼树状链表的连续三个元素。
43.如权利要求39所述的编码系统,其特征在于,所述存储装置存储所述至少一个霍夫曼树状链表,使每个所述霍夫曼树状链表占据连续的存储空间。
44.如权利要求43所述的编码系统,其特征在于,所述码表包括多个霍夫曼树状链表,所述存储装置存储所述多个霍夫曼树状链表,所述多个霍夫曼树状链表占据连续的存储空间。
45.如权利要求42所述的编码系统,其特征在于,所述第三编码装置选取所述霍夫曼二叉树结构的第(N-n+1)层至最后一层的所有叶子结点所对应的记录,以及第(N-n+1)层的所有中间结点所对应的记录作为第一编码表的部分记录,
46.如权利要求45所述的编码系统,其特征在于,所述第三编码装置将所述霍夫曼二叉树结构第(N-n+1)层中间结点所对应的记录链接至所述第(N-n+1)层中间结点对应的霍夫曼树状链表的首个元素指针,得到所述码表的链接记录。
47.一种解码系统,其特征在于,包括:
获取装置,用于获取码表、以及与第二编码表对应的解码表;
第一解码装置,用于利用所述解码表对信源字符编码进行第一解码;
判断装置,用于判断所述第一解码是否成功;
输出装置,若所述第一解码成功,用于输出解码结果;
第二解码装置,若所述第一解码未成功,用于利用所述码表对所述信源字符编码进行第二解码,并输出解码结果;
存储装置,用于存储所述解码表和所述码表,其中,所述解码表和所述码表所占的存储空间小于第一编码表所对应的解码表所占的存储空间,其中所述第一编码表可对信源字符进行编码。
48.如权利要求47所述的解码系统,其特征在于,所述码表包括至少一个霍夫曼树状链表;所述第一编码表包括霍夫曼编码表;
第二编码表包括:第一编码表的部分记录和所述码表的链接记录。
49.如权利要求48所述的解码系统,其特征在于,所述第一解码装置用于:
从所述信源字符编码取出n bit符号;n为正整数n,且n<N,N为所述信源字符编码的最大码长;
利用所述解码表对所述n bit符号进行第一解码。
50.如权利要求49所述的解码系统,其特征在于,所述第一解码装置用于:
将第一寄存器和第二寄存器置为0;
将K bit符号存入缓存器,并将所述第一寄存器的值+K;
从所述缓存器取出n bit符号。
51.如权利要求50所述的解码系统,其特征在于,所述第二解码装置用于:
从所述解码表获取所述霍夫曼树状链表的指针,将n赋予所述第二寄存器;
从所述缓存器再取出1bit符号;更新所述第二寄存器,将所述第二寄存器的值+1;更新所述指针,将所述指针的值+再取出的所述1bit符号;查找所述霍夫曼树状链表中所述指针对应的元素;
判断所述指针对应的元素是否对应叶子结点;如果是,则所述第二解码成功;如果否,则所述第二解码不成功;
如果所述第二解码成功,所述所述指针对应元素的信源字符作为所述n bit符号的解码结果,并输出解码结果;
如果所述第二解码不成功,更新所述指针,将所述指针的值+1;并从所述缓存器再取出1bit符号开始,再次进行第二解码,直至第二解码成功。
52.如权利要求50或51所述的解码系统,其特征在于,所述解码系统在所述输出解码结果后还用于:
获取被解码信源字符对应的编码码字的长度,将所述编码码字的长度赋予第二寄存器;
所述缓存器平移所述第二寄存器的值的位数,并将所述第一寄存器的值减去所述第二寄存器的值;
判断所述第一寄存器的值是否小于k,如果是,则重新返回所述取码步骤开始执行;如果否,则重新返回所述取出步骤开始执行;其中,k<K。
53.一种编解码系统,其特征在于,包括:
第一编码装置,用于对信源字符进行编码,得到一编码结构以及第一编码表和信源字符编码;
第二编码装置,用于根据所述编码结构建立码表;
第三编码装置,用于选取所述第一编码表的部分记录,建立所述码表的链接记录,所述链接记录与所述部分记录组成第二编码表;
第一存储装置,用于存储所述码表和所述第二编码表,其中,所述第二编码表和所述码表所占的存储空间小于所述第一编码表所占的存储空间;
获取装置,用于获取码表、以及与第二编码表对应的解码表,并;
第一解码装置,用于利用所述解码表对所述信源字符编码进行第一解码;
判断装置,用于判断所述第一解码是否成功;
输出装置,若所述第一解码成功,用于输出解码结果;
第二解码装置,若所述第一解码未成功,用于利用所述码表对所述信源字符编码进行第二解码,并输出解码结果;
第二存储装置,用于存储所述解码表和所述码表,其中,所述解码表和所述码表所占的存储空间小于所述第一编码表所对应的解码表所占的存储空间。
54.如权利要求53所述的编解码系统,其特征在于,所述第一编码装置包括霍夫曼编码装置;所述编码结构包括霍夫曼二叉树结构;所述第一编码表包括霍夫曼编码表。
55.如权利要求54所述的编解码系统,其特征在于,所述霍夫曼编码装置包括:
排队单元,用于将信源字符的出现次数按预定规则排队;
构建单元,用于根据所述排队结果构建霍夫曼二叉树结构;
编码单元,用于对所述霍夫曼二叉树结构的结点进行编号,得到所述霍夫曼编码表以及信源字符编码。
56.如权利要求55所述的编解码系统,其特征在于,对于所述霍夫曼二叉树结构的每一个结点,如果所述结点处于其上一层结点的左分支,所述编码单元将所述结点编为第一编号;如果所述结点处于其上一层结点的右分支,所述编码单元将所述结点编为第二编号;
所述编码单元沿所述霍夫曼二叉树结构最后一层至第一层,搜索每个信源字符的路径,将所述路径经过的结点编号作为所述信源字符编码,将所有信源字符按照出现次数由多至少排列,组成所述霍夫曼编码表。
57.如权利要求54至56任一项所述的编解码系统,其特征在于,所述码表包括至少一个霍夫曼树状链表。
58.如权利要求57所述的编解码系统,其特征在于,所述霍夫曼树状链表中的每个元素包括:第一字段和第二字段;
所述第一字段代表所述元素对应的结点类型;
所述第二字段代表所述元素对应结点的信源字符,或者所述元素对应结点的左分支结点所对应元素的指针。
59.如权利要求58所述的编解码系统,其特征在于,所述结点类型包括叶子结点和中间结点;
当所述结点类型为叶子结点时,所述第二字段代表所述叶子结点对应的信源字符;
当所述结点类型为中间结点时,所述第二字段代表所述中间结点的左分支中间结点或叶子结点所对应元素的指针,所述中间结点的右分支中间结点或叶子结点所对应元素的指针为第二字段的值加一。
60.如权利要求57所述的编解码系统,其特征在于,所述第二编码装置用于:
选取正整数n,且n<N;N为所述信源字符编码的最大码长;所述霍夫曼二叉树结构的第(N-n+1)层的每一个中间结点对应一个霍夫曼树状链表;
对于所述第(N-n+1)层的每一个中间结点,将所述中间结点的左分支结点作为所述中间结点对应的霍夫曼树状链表的首个元素;
从所述霍夫曼二叉树结构的第(N-n)层至第一层,依次将各层中间结点、各层中间结点的左分支结点和右分支结点作为所述霍夫曼树状链表的连续三个元素。
61.如权利要求57所述的编解码系统,其特征在于,所述第一存储装置存储所述至少一个霍夫曼树状链表,使每个所述霍夫曼树状链表占据连续的存储空间。
62.如权利要求61所述的编解码系统,其特征在于,所述码表包括多个霍夫曼树状链表,所述第一存储装置存储所述多个霍夫曼树状链表,所述多个霍夫曼树状链表占据连续的存储空间。
63.如权利要求57所述的编解码系统,其特征在于,所述第三编码装置选取所述霍夫曼二叉树结构的第(N-n+1)层至最后一层的所有叶子结点所对应的记录,以及第(N-n+1)层的所有中间结点所对应的记录作为所述第一编码表的部分记录。
64.如权利要求63所述的编解码系统,其特征在于,所述第三编码装置将所述霍夫曼二叉树结构第(N-n+1)层中间结点所对应的记录链接至所述第(N-n+1)层中间结点对应的霍夫曼树状链表的首个元素指针,得到所述码表的链接记录。
65.如权利要求57所述的编解码系统,其特征在于,所述第一解码装置用于:
从所述信源字符编码取出n bit符号;
利用所述解码表对所述n bit符号进行第一解码。
66.如权利要求65所述的编解码系统,其特征在于,所述第一解码装置用于:
将第一寄存器和第二寄存器置为0;
将K bit符号存入缓存器,并将所述第一寄存器的值+K;
从所述缓存器取出n bit符号。
67.如权利要求66所述的编解码系统,其特征在于,所述第二解码装置用于:
从所述解码表获取所述霍夫曼树状链表的指针,将n赋予所述第二寄存器;
从所述缓存器再取出1bit符号;更新所述第二寄存器,将所述第二寄存器的值+1;更新所述指针,将所述指针的值+再取出的所述1bit符号;查找所述霍夫曼树状链表中所述指针对应的元素;
判断所述指针对应的元素是否对应叶子结点;如果是,则所述第二解码成功;如果否,则所述第二解码不成功;
如果所述第二解码成功,所述所述指针对应元素的信源字符作为所述n bit符号的解码结果,并输出解码结果;
如果所述第二解码不成功,更新所述指针,将所述指针的值+1;返回从所述缓存器再取出1bit符号开始,再次进行第二解码,直至第二解码成功。
68.如权利要求66或67所述的编解码系统,其特征在于,所述解码系统在所述输出解码结果后还用于:
获取被解码信源字符对应的编码码字的长度,将所述编码码字的长度赋予第二寄存器;
所述缓存器平移所述第二寄存器的值的位数,并将所述第一寄存器的值减去所述第二寄存器的值;
判断所述第一寄存器的值是否小于k,如果是,则重新返回所述取码步骤开始执行;如果否,则重新返回所述取出步骤开始执行;其中,k<K。
69.一种计算设备,其特征在于,包括:算力板和控制板;所述算力板和所述控制板的至少一者包括:权利要求35-46任一项所述的编码系统、权利要求47至52任一项所述的解码系统、权利要求53至68任一项所述的编解码系统的至少其中之一。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910268357.0A CN109889205B (zh) | 2019-04-03 | 2019-04-03 | 编码方法及系统、解码方法及系统、编解码方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910268357.0A CN109889205B (zh) | 2019-04-03 | 2019-04-03 | 编码方法及系统、解码方法及系统、编解码方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109889205A true CN109889205A (zh) | 2019-06-14 |
CN109889205B CN109889205B (zh) | 2023-08-15 |
Family
ID=66936012
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910268357.0A Active CN109889205B (zh) | 2019-04-03 | 2019-04-03 | 编码方法及系统、解码方法及系统、编解码方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109889205B (zh) |
Cited By (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110473264A (zh) * | 2019-07-26 | 2019-11-19 | 北京华捷艾米科技有限公司 | 基于霍夫曼编码的深度图压缩方法、解压缩方法及编码器 |
CN111913957A (zh) * | 2020-07-07 | 2020-11-10 | 普华云创科技(北京)有限公司 | 数据序列化后特征提取方法、系统及计算机可读存储介质 |
CN112003625A (zh) * | 2020-08-14 | 2020-11-27 | 山东云海国创云计算装备产业创新中心有限公司 | 一种霍夫曼编码方法、系统及设备 |
CN116073835A (zh) * | 2023-03-06 | 2023-05-05 | 智慧足迹数据科技有限公司 | 地理位置数据压缩方法、装置、电子设备及存储介质 |
WO2023109019A1 (zh) * | 2021-12-17 | 2023-06-22 | 苏州浪潮智能科技有限公司 | 一种基于deflate霍夫曼编码的动态码表生成装置和方法 |
CN116471007A (zh) * | 2023-06-20 | 2023-07-21 | 北京双鑫汇在线科技有限公司 | 基于云平台的网络信息加密传输方法 |
CN118314481A (zh) * | 2024-06-07 | 2024-07-09 | 湖北华中电力科技开发有限责任公司 | 一种基于图像识别的变电设备的巡检方法及系统 |
CN118381580A (zh) * | 2024-06-21 | 2024-07-23 | 辽宁吉左网络科技有限公司 | 一种机房运维数据管理方法及系统 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH01286627A (ja) * | 1988-05-13 | 1989-11-17 | Mitsubishi Electric Corp | 情報の符号化・復号化方式 |
JPH0936748A (ja) * | 1995-07-19 | 1997-02-07 | Toshiba Corp | ハフマン符号化方法及びその装置並びにハフマン復号化方法及びその装置 |
US6061398A (en) * | 1996-03-11 | 2000-05-09 | Fujitsu Limited | Method of and apparatus for compressing and restoring data |
JP2002252563A (ja) * | 2001-02-23 | 2002-09-06 | Yamaha Corp | ハフマン符号の復号方法、復号装置、ハフマン符号復号用テーブルおよびその作成方法 |
CN101022552A (zh) * | 2007-03-13 | 2007-08-22 | 北京中星微电子有限公司 | 一种实现霍夫曼译码的方法和装置 |
CN101060337A (zh) * | 2007-05-22 | 2007-10-24 | 北京中星微电子有限公司 | 一种优化的霍夫曼解码方法和装置 |
-
2019
- 2019-04-03 CN CN201910268357.0A patent/CN109889205B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH01286627A (ja) * | 1988-05-13 | 1989-11-17 | Mitsubishi Electric Corp | 情報の符号化・復号化方式 |
JPH0936748A (ja) * | 1995-07-19 | 1997-02-07 | Toshiba Corp | ハフマン符号化方法及びその装置並びにハフマン復号化方法及びその装置 |
US6061398A (en) * | 1996-03-11 | 2000-05-09 | Fujitsu Limited | Method of and apparatus for compressing and restoring data |
JP2002252563A (ja) * | 2001-02-23 | 2002-09-06 | Yamaha Corp | ハフマン符号の復号方法、復号装置、ハフマン符号復号用テーブルおよびその作成方法 |
US20020130796A1 (en) * | 2001-02-23 | 2002-09-19 | Toshiaki Tsuchido | Huffman decoding method and decoder, huffman decoding table, method of preparing the table, and storage media |
CN101022552A (zh) * | 2007-03-13 | 2007-08-22 | 北京中星微电子有限公司 | 一种实现霍夫曼译码的方法和装置 |
CN101060337A (zh) * | 2007-05-22 | 2007-10-24 | 北京中星微电子有限公司 | 一种优化的霍夫曼解码方法和装置 |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110473264A (zh) * | 2019-07-26 | 2019-11-19 | 北京华捷艾米科技有限公司 | 基于霍夫曼编码的深度图压缩方法、解压缩方法及编码器 |
CN110473264B (zh) * | 2019-07-26 | 2023-04-07 | 北京华捷艾米科技有限公司 | 基于霍夫曼编码的深度图压缩方法、解压缩方法及编码器 |
CN111913957A (zh) * | 2020-07-07 | 2020-11-10 | 普华云创科技(北京)有限公司 | 数据序列化后特征提取方法、系统及计算机可读存储介质 |
CN112003625A (zh) * | 2020-08-14 | 2020-11-27 | 山东云海国创云计算装备产业创新中心有限公司 | 一种霍夫曼编码方法、系统及设备 |
WO2023109019A1 (zh) * | 2021-12-17 | 2023-06-22 | 苏州浪潮智能科技有限公司 | 一种基于deflate霍夫曼编码的动态码表生成装置和方法 |
CN116073835A (zh) * | 2023-03-06 | 2023-05-05 | 智慧足迹数据科技有限公司 | 地理位置数据压缩方法、装置、电子设备及存储介质 |
CN116073835B (zh) * | 2023-03-06 | 2023-08-25 | 智慧足迹数据科技有限公司 | 地理位置数据压缩方法、装置、电子设备及存储介质 |
CN116471007A (zh) * | 2023-06-20 | 2023-07-21 | 北京双鑫汇在线科技有限公司 | 基于云平台的网络信息加密传输方法 |
CN116471007B (zh) * | 2023-06-20 | 2023-08-15 | 北京双鑫汇在线科技有限公司 | 基于云平台的网络信息加密传输方法 |
CN118314481A (zh) * | 2024-06-07 | 2024-07-09 | 湖北华中电力科技开发有限责任公司 | 一种基于图像识别的变电设备的巡检方法及系统 |
CN118381580A (zh) * | 2024-06-21 | 2024-07-23 | 辽宁吉左网络科技有限公司 | 一种机房运维数据管理方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN109889205B (zh) | 2023-08-15 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109889205A (zh) | 编码方法及系统、解码方法及系统、编解码方法及系统 | |
US7917835B2 (en) | Memory system and method for use in trellis-based decoding | |
CN101667958B (zh) | 选择哈希函数的方法、存储及查找路由表的方法及装置 | |
US8291150B2 (en) | Table device, variable length coding apparatus, variable length decoding apparatus, and variable length coding and decoding apparatus | |
CN110533096B (zh) | 基于K-means聚类的多元宇宙算法的DNA存储编码优化方法 | |
JP2000115243A (ja) | パケット中継装置およびマルチキャスト高速化方式 | |
CN100377154C (zh) | 改进型多路基数树 | |
JPH0697838A (ja) | 復号化装置 | |
US6760821B2 (en) | Memory engine for the inspection and manipulation of data | |
CN102902713B (zh) | 一种基于图形处理单元的非确定有限自动机的匹配方法及装置 | |
CN105264488A (zh) | 使用数组对来合并有序列表 | |
CN106656205A (zh) | 一种降低存储器消耗的极化码译码方法和系统 | |
CN107565973A (zh) | 一种结点可扩展的哈夫曼编码的实现方法及电路结构 | |
CN108288966A (zh) | 极性Polar码的速率匹配处理方法及装置 | |
JP4267707B2 (ja) | データフローアーキテクチャにおけるビットストリングのn−ウェイ処理 | |
CN113139100A (zh) | 一种网络流量实时索引方法及系统 | |
CN102591958B (zh) | 基于tcam的确定性有穷状态自动机的匹配方法和装置 | |
US20120139763A1 (en) | Decoding encoded data | |
CN105874774A (zh) | 用于在帧的处理过程中保持计数表的计数表保持装置以及相关的保持方法 | |
Arming et al. | Data compression in hardware—the burrows-wheeler approach | |
US8525708B2 (en) | Decoding device and coding method | |
US7624326B2 (en) | Encoding device and method, decoding device and method, program, and recording medium | |
CN108092670B (zh) | 编码方法和装置 | |
CN103294735B (zh) | 基于tcam的确定性有穷状态自动机dfa的匹配方法和装置 | |
CN109241058A (zh) | 一种向b+树批量插入键值对的方法和装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
TA01 | Transfer of patent application right | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20201130 Address after: Room 206, 2 / F, building C, phase I, Zhongguancun Software Park, No. 8, Dongbei Wangxi Road, Haidian District, Beijing 100094 Applicant after: Canaan Bright Sight Co.,Ltd. Address before: 310016, room 12, building 4, building nine, No. nine, 1203 Ring Road, Hangzhou, Zhejiang, Jianggan District Applicant before: Hangzhou Canaan Creative Information Technology Ltd. |
|
GR01 | Patent grant | ||
GR01 | Patent grant | ||
TG01 | Patent term adjustment |