发明内容
本发明针对上述现有技术的不足,提供了一种基于变长分裂表的矢量量化高阶码本扩展编码及解码系统,采用变长分裂表进行高阶码本扩展,既保证了对较小值码字分裂量化的高效性,又节约了在对大值码字进行矢量量化时开销的比特数。
本发明是通过如下技术方案实现的:
本发明涉及一种基于变长分裂表的矢量量化高阶码本扩展编码系统,包括如下模块:扩展编码判断模块,编码格矢量分裂模块,基础码本编码模块,扩展模式选择模块,一级扩展计算模块,二级扩展计算模块,打包输出模块。其中:
扩展编码判断模块判断待编码格矢量
是否在基础码本中,若在,则将
输出到基础码本编码模块,同时将编码模式标识信息header输出到打包输出模块;若不在,则将
输出到编码格矢量分裂模块;
编码格矢量分裂模块利用变长分裂表中的分裂量将待编码格矢量
中的八个分量y(i)(i=1,…,8)分别作分裂处理,将每个y(i)分裂后形成一个新的码字分量c(i)与变长分裂表中的一个分裂量y’(i),分裂量y’(i)为变长分裂表中能使c(i)绝对值最小的一个分裂量;其中生成的八个码字分量c(i)组成的八维矢量为基础码本中的某一矢量
将八个y’(i)输出到扩展模式选择模块,并将
输出到基础码本编码模块;
基础码本编码模块计算
或
在基础码本中的索引i,将i输出到打包输出模块;
扩展模式选择模块检测八个y’(i)值的大小,若均小于等于一级扩展阈值,一级扩展阈值为一级分裂表中最大分裂量的值,则将y’(i)输出到一级扩展计算模块,否则将y’(i)输出到二级扩展计算模块。同时,将编码模式标识信息header输出到打包输出模块;
一级扩展计算模块计算y’(1)…y’(8)在一级扩展分裂表中的分裂表索引k,并将k输出到打包输出模块;
二级扩展计算模块分别计算各个分裂量y’(1)…y’(8)在二级扩展中的分裂表标识信息split header和在该分裂表中的分裂表索引k,并将八组splitheader和k输出到打包输出模块;
打包输出模块将接收到的参数header来将各参数打包并输出。若header标识编码方法为基础码本编码,则将header,i打包输出;若header标识编码方法为一级扩展编码,则将header,i,k打包输出;若header标识编码方法为二级扩展编码,则将header,i,split header,k打包输出。
其中,所述编码模式标识信息header,用于识别出编码端采用的编码方式;基本索引i,用于索引编码分裂出的基础码本中的码字部分;分裂表标识信息split header为二级扩展中分裂表的编号,该信息用于识别所使用的分裂量选用的哪个分裂表;分裂表索引k为每个分裂量在所选用的分裂表中的索引,用于索引该分裂表中的值。
本发明还涉及一种基于变长分裂表的矢量量化高阶码本扩展解码系统,包括如下模块:参数获取模块,编码方式判断模块,基础码本解码模块,一级扩展分裂量解码模块,二级扩展分裂量解码模块,矢量合成模块。其中:
参数获取模块接收编码端发来的数据包,并对数据包进行解析,读取编码端传过来的所有参数,参数可包括:编码模式标识信息header、基本索引i、分裂表标识信息split header、分裂表索引k,并将所有参数输出到编码方式判断模块;
编码方式判断模块根据编码模式标识信息header的值判断编码端采用的编码方式,若采用的是基础码本编码方式,则将header和i输出到基础码本解码模块;若采用的是一级扩展编码方式,则将header和i输出到基础码本解码模块,并将k输出到一级扩展分裂量解码模块;若采用的是二级扩展编码方式,则将header和i输出到基础码本解码模块,并将split header和k输出到二级扩展分裂量解码模块;
基础码本解码模块检测header的值,若其标识为基础码本编码,则根据header和i的值计算码字
解码结束;若其标识为扩展码本编码方式,则根据header和i的值计算码字
并将
输出到矢量合成模块;
一级扩展分裂量解码模块根据分裂表索引k计算分裂量的值y’(i),并将y’(i)输出到矢量合成模块;
二级扩展分裂量解码模块根据八个分裂表标识信息split header和其对应的分裂表索引k计算八个分裂量的值y’(i),并将y’(i)输出到矢量合成模块;
矢量合成模块将
的各个分量c(i)分别与各个分裂量y’(i)对应相加,得到还原的矢量
解码结束。
与现有技术相比,本发明具有如下有益效果:本发明由于采用变长分裂表进行高阶码本扩展,既保证了对较小值码字分裂量化的高效性,又节约了在对大值码字进行矢量量化时开销的比特数,尤其是对多维矢量中只有少数几维需要分裂的情况,比特数节省尤为明显。在低比特率音频编码应用中,相对于现有技术各维分裂量等长编码方法,本发明采用的方法在10.4kbps编码时,每帧(80ms)能节约10~30比特,而在24kbps编码时,每帧(80ms)能节约40~140比特。而对于使用了高阶扩展方法编码的矢量,本发明所采用的方法能节省7%-15%的比特数。
具体实施方式
下面结合附图对本发明的实施例作详细说明:本实施例在以本发明技术方案为前提下进行实施,给出了详细的实施方式和具体的操作过程,但本发明的保护范围不限于下述的实施例。
本实施例中选取RE8点集作为基础码本。
所述的RE8点集的定义为:
RE8=2D8∪{2D8+(1,…,1)},其中D8={(x1,x2,…,x8)∈Z8|x1+…+x8为偶数};
可见,RE8集合中所有数据之和是4的倍数,并且奇偶性相同,在所述的RE8点集中选取如下子集作为基础码本,其特征码本(leader)如表1所示:
表1
特征码本
{0,0,0,0,0,0,0,0},{3,3,3,3,1,1,1,1},
{2,0,0,0,0,0,0,0},{5,3,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1},{6,2,0,0,0,0,0,0},
{2,2,0,0,0,0,0,0},{5,3,3,1,1,1,1,1},
{2,2,2,2,0,0,0,0},{5,5,1,1,1,1,1,1},
{3,1,1,1,1,1,1,1},{7,1,1,1,1,1,1,1},
{4,0,0,0,0,0,0,0},{7,3,1,1,1,1,1,1},
{3,3,1,1,1,1,1,1},{3,3,3,3,3,3,3,1},
{4,2,2,0,0,0,0,0},{3,3,3,3,3,3,3,3},
{3,3,3,1,1,1,1,1},{9,1,1,1,1,1,1,1},
{4,4,0,0,0,0,0,0},{11,1,1,1,1,1,1,1},
{5,1,1,1,1,1,1,1},{13,1,1,1,1,1,1,1},
基础码本又分为Q0,Q2,Q3,Q4四个码本,此外,当实际需要的是{3,3,3,3,3,1,1,1}和{3,3,3,3,3,3,1,1}时,则将3和1对调,于是对于{3,3,3,3,3,1,1,1}对调得到{3,3,3,1,1,1,1,1};对于{3,3,3,3,3,3,1,1}对调得到{3,3,1,1,1,1,1,1},这样,便可以用基础码本进行检索。故在基础码本Q4中不包含{3,3,3,3,3,1,1,1}和{3,3,3,3,3,3,1,1}。将这两种特征码本称作属于码本inv_Q4。
在表1中,Leader所属码本的情况如表2所示:
表2
在编码过程中,不同的基础码本是用一个不同长度的二进制数列来标识的,即数据包中的header(头)信息,具体的表示方式如下:
Q0→header=0;
Q2→header=10;
Q3→header=110;
Q4→header=1110;
inv_Q4→header=111111 110。
而对于在上述基础码本中找不到的矢量,则对各维分量进行分裂,然后将各维分裂量用变长编码方法进行编码。
本实施例具体可以应用于低码率编码方案中,如AVS-M音频编码等编码处理过程中。
本实施例编码过程中所采用的变长分裂表如表3所示,
表3变长分列表
17 |
|
|
|
|
|
192 |
320 |
18 |
|
|
|
|
|
196 |
324 |
19 |
|
|
|
|
|
200 |
328 |
20 |
|
|
|
|
|
204 |
332 |
21 |
|
|
|
|
|
208 |
336 |
22 |
|
|
|
|
|
212 |
340 |
23 |
|
|
|
|
|
216 |
344 |
24 |
|
|
|
|
|
220 |
348 |
25 |
|
|
|
|
|
224 |
352 |
26 |
|
|
|
|
|
228 |
356 |
27 |
|
|
|
|
|
232 |
360 |
28 |
|
|
|
|
|
236 |
364 |
29 |
|
|
|
|
|
240 |
368 |
30 |
|
|
|
|
|
244 |
372 |
31 |
|
|
|
|
|
248 |
376 |
… |
|
|
|
|
|
|
… |
63 |
|
|
|
|
|
|
504 |
如图1所示,本实施例涉及一种基于变长分裂表的矢量量化高阶码本扩展编码系统,在编码端的高阶码本扩展处理过程中,包括两个扩展级编码方式:一级扩展编码、二级扩展编码,下面分别对两个扩展级的实现分别进行具体描述:
(一)编码端扩展级为一级扩展编码时,以数据 为例,对基于变长分裂表编码过程具体如下:
扩展编码判断模块对
进行检测,发现数据
不在基础码本中,将
输出到编码格矢量分裂模块;
编码格矢量分裂模块将
中的每一个分量y(i)都分裂为c(i)与变长分裂表中的某一个值y’(i),具体为:
将y(i)减去一个与其同号的分裂量,得到的差c(i)为新的码字分量,即c(i)=y(i)-sgn(y(i))y′(i),(i=0,1,…,7);
选取使c(i)的绝对值最小的分裂量
的每一个分量进行分裂:
c(1)=y(1)-4=7-4=3;
c(2)=y(2)-(-1)*4=-5-(-4)=-1;
c(3)=y(3)-0=1-0=1;
…
c(7)=y(7)-0=1-0=1;
分裂后得到的新的码字
为{3,-1,1,1,1,1,1,1},此时,
在基础码本Q3中,八个分裂量分别为:4,4,0,0,0,0,0,0。
将八个分裂量4,4,0,0,0,0,0,0输出到扩展模式选择模块,将
输出到基础码本编码模块。
基础码本编码模块计算{3,-1,1,1,1,1,1,1}在Q3中的索引base indexi,将i输出到打包输出模块。
扩展模式选择模块检测八个分裂量的值均<=4,判断扩展级为一级且{3,-1,1,1,1,1,1,1}在基础码本Q3中,得到编码模式标识信息为1111110。将八个分裂量输出到一级扩展计算模块,同时将编码模式标识信息1111110输出到打包输出模块。
一级扩展计算模块计算分裂量4,4,0,0,0,0,0,0在一级分裂表中的索引分别为1,1,0,0,0,0,0,0,将这些索引输出到打包输出模块。
打包输出模块打包输出编码参数,具体的输出格式如下:
1111110 |
base index in Q3 |
11000000 |
其中:1111110为header标识信息,标识此处编码方式为一级扩展,且对应的基础码本在Q3中,接下来为
在基础码本Q3中的索引,11000000为对应的八个分裂量在一级分裂表中的索引。
所述的一级扩展编码采用等比特数来编码各维分裂量。
一个码字若不在基础码本中,则是因其分量的绝对值太大,为此,可将绝对值大的分量减去一个分裂量,得到一个绝对值足够小的差,使该差成为基础码本中的一个码字,之后,将该差对应的码字在基础码本中的索引和分裂量在分裂表中的索引作为输出,从而实现基于分裂表编码。
其中,所述的一级扩展分裂表k1,如表4所示:
表4
i K1 binary
0 0 b0
1 4 b1
表4中列出了为一级扩展级时,分裂表k1的数值定义,表中k1为分裂量,i为分裂量的索引,各个分裂量的大小为4的整数倍。
表4中第三列为用二进制表示的k1在分裂级为1时的编码定义,即取分裂量0时,编码输出为其索引“0”,取分裂量4时,编码输出为其索引“1”。这样,对于一个八维矢量中的八个分量,每一个分量都需要1比特来表示其分裂量的索引,共8比特。
本实施例中,一级编码过程中,输出格式如下,
header |
Base index I |
Split index k |
具体包括header,
在基础码本中的索引base index和分裂量的索引
组成。其中一级扩展编码方式的header的定义方式如表5所示:
表5
header(binary/二进制) Header value/头值 header定义
11110 0x1E r=1,in Q4
1111110 0x7E r=1,in Q3
111111 11 10 0x3FE r=1,in inv_Q4
(二)编码端扩展级为二级扩展编码时,以数据 为例,基于变长分裂表的二级扩展编码过程具体如下:
扩展编码判断模块对
进行检测,发现数据
不在基础码本中,将
输出到编码格矢量分裂模块;
编码格矢量分裂模块将
中的每一个分量y(i)都分裂为c(i)与变长分裂表中的某一个值y’(i),具体为:
将y(i)减去一个与其同号的分裂量,得到的差c(i)为新的码字分量,即c(i)=y(i)-sgn(y(i))y′(i),(i=0,1,…,7);
选取使c(i)的绝对值最小的分裂量
的每一个分量进行分裂:
c(1)=y(1)-24=27-24=3;
c(2)=y(2)-(-1)*4=-7-(-4)=-3;
c(3)=y(3)-0=1-0=1;
…
c(7)=y(7)-0=1-0=1;
分裂后得到的新的码字
为{3,-3,1,1,1,1,1,1},此时,
在基础码本Q4中,八个分裂量分别为24,4,0,0,0,0,0,0。
将八个分裂量24,4,0,0,0,0,0,0输出到扩展模式选择模块,将
输出到基础码本编码模块。
基础码本编码模块计算{3,-3,1,1,1,1,1,1}在Q4中的索引base indexi,将i输出到打包输出模块。
扩展模式选择模块检测八个分裂量的值并非均<=4,判断扩展级为二级且{3,-3,1,1,1,1,1,1}在基础码本Q4中,得到编码模式标识信息为111110。将八个分裂量输出到二级扩展计算模块,同时将编码模式标识信息111110输出到打包输出模块。
二级扩展计算模块计算八个分裂量24,4,0,0,0,0,0,0在二级扩展所使用的分裂表中的索引,它们的索引分别用split header与index k的组合来表示。它们对应的split header和index k的组合分别为:110,11;10,0;0;0;0;0;0;0;其中分裂量“0”只有split header,无index k。将这些split header和索引k输出到打包输出模块。
打包输出模块打包输出编码参数,具体的输出格式如下:
111110 |
base index in Q4 |
11011100000000 |
其中:111110为header标识信息,标识此处编码方式为二级扩展,且对应的基础码本在Q4中,接下来为
在基础码本Q4中的索引,11011100000000为对应的八个分裂量在二级扩展分裂表中的索引。可见,编码此八个分裂量信息只需要14比特,若采用等长编码则需要8*3=24比特(等长分裂表中,分裂量24需要用3比特进行编码,所有分裂量的编码长度取八个中最长的那个)。
二级扩展编码采用不等长比特数来编码各维分裂量。二级扩展编码方式的header的定义方式如表6所示:
表6
header(binary/二进制) Header value/头值 header定义
111110 0x3E r=2,in Q4
111111 10 0xFE r=2,in Q3
111111 11 11 0x3FF r=2,in inv_Q4
二级扩展编码对应的分裂码表可以如表7所示:
表7
i |
k0 |
binary |
k2 |
binary |
k3 |
binary |
k4 |
binary |
k5 |
binary |
… |
0 |
0 |
none |
4 |
b0 |
12 |
b00 |
28 |
b000 |
60 |
b0000 |
… |
1 |
|
|
8 |
b1 |
16 |
b01 |
32 |
b001 |
64 |
b0001 |
… |
2 |
|
|
|
|
20 |
b10 |
36 |
b010 |
68 |
b0010 |
… |
3 |
|
|
|
|
24 |
b11 |
40 |
b011 |
72 |
b0011 |
… |
4 |
|
|
|
|
|
|
44 |
b100 |
76 |
b0100 |
… |
5 |
|
|
|
|
|
|
48 |
b101 |
80 |
b0101 |
… |
6 |
|
|
|
|
|
|
52 |
b110 |
84 |
b0110 |
… |
7 |
|
|
|
|
|
|
56 |
b111 |
88 |
b0111 |
… |
8 |
|
|
|
|
|
|
|
|
92 |
b1000 |
… |
9 |
|
|
|
|
|
|
|
|
96 |
b1001 |
… |
10 |
|
|
|
|
|
|
|
|
100 |
b1010 |
… |
11 |
|
|
|
|
|
|
|
|
104 |
b1011 |
… |
12 |
|
|
|
|
|
|
|
|
108 |
b1100 |
… |
13 |
|
|
|
|
|
|
|
|
112 |
b1101 |
… |
14 |
|
|
|
|
|
|
|
|
116 |
b1110 |
… |
15 |
|
|
|
|
|
|
|
|
120 |
b1111 |
… |
… |
|
|
|
|
|
|
|
|
|
|
… |
表7中列出了扩展级为2时使用的分裂表k0及k2-k5的数值定义,k6,k7依此类推。表中k为分裂量,i为分裂量的索引,各个分裂量的大小为4的整数倍,binary为所对应的二进制编码。在此,各个数值及级别均为具体举例示意,并不作为本发明实施例的限定。
由于二级扩展使用的分裂表包括各个不同的级别,固必须给各个级别的分裂表再定义header信息,即split header,定义如表8:
表8
Split header(binary/二进制) Header value/头值 header定义
0 0x0 K0
10 0x2 K2
110 0x6 K3
1110 0xE K4
11110 0x1E K5
111110 0x3E K6
1111110 0x7E K7
若取分裂量为0时,即该维数据未进行分裂,则输出一个比特“0”作为splitheader来标识,且无需输出分裂量在分裂表k0中的索引;若取分裂量为4时,该分裂量在k2中,编码输出其split header索引“10”,以及其在k2中的索引“0”;若取分裂量为20时,该分裂量在k3中,编码输出其split header索引“110”,以及其在k3中的索引“10”。
因此,本实施例中,二级编码过程中,输出格式如下,
header |
Baseindex I |
1<sup>st</sup>Splitheader |
1<sup>st</sup>Index k |
2<sup>nd</sup>splitheader |
2<sup>nd</sup>index k |
… |
8<sup>th</sup>splitheader |
8<sup>th</sup>index k |
具体包括header,
在基础码本中的索引base index I和八个分裂量的split header,以及对应的八个index k。这里要注意的是,当其中某一个splitheader为“0”时,其对应的index k不需要传,占用0比特。Index k的长度依据split header来定,不同的split header对应不同的index k长度。分裂量在k0,k2-k7中时,所消耗的比特数如表9所示:
表9
分裂表 |
Split header消耗比特数 |
Index k消耗比特数 |
一个分裂量消耗的总比特数 |
K0 |
1 |
0 |
1 |
K2 |
2 |
1 |
3 |
K3 |
3 |
2 |
5 |
K4 |
4 |
3 |
7 |
K5 |
5 |
4 |
9 |
K6 |
6 |
5 |
11 |
K7 |
7 |
6 |
13 |
实际情况中,对于一个八维矢量,往往只有少许几维需要分裂,且值特别大的数字往往只有一维,固采用不等长编码区别对待,能在实际应用中节省不少比特数。
如图2所示,本实施例还涉及一种基于变长分裂表的矢量量化高阶码本扩展解码系统,解码端也包括两种扩展级编码方式下的解码处理过程。
(一)在编码端使用一级扩展编码时,以数据 为例,解码端基于变长分裂表的解码过程具体如下:
参数获取模块接收编码端发来的数据包,对其进行解析,读取header,i,k等参数,并将这些参数输出到编码方式判断模块;
编码方式判断模块根据编码模式标识信息header值1111110,判断为一级扩展编码,并可以得知对应的所在基础码本为Q3,将header值1111110和i输出到基础码本解码模块,并将k的值11000000输出到一级扩展分裂量解码模块;
基础码本解码模块检测header的值1111110为一级扩展编码,根据header和索引i的值计算码字
得到
并将
输出到矢量合成模块;
一级扩展分裂量解码模块根据分裂表索引 计算得到分裂量的值为{4,4,0,0,0,0,0,0},并将这些分裂量输出到矢量合成模块;
矢量合成模块将基础码本中的矢量{3,-1,1,1,1,1,1,1}与分裂量{4,4,0,0,0,0,0,0}相加,这里分裂量取与基础码本中对应分量相同的符号,得到还原的矢量
为{7,-5,1,1,1,1,1,1},解码结束。
(二)在编码端使用二级扩展编码时,以数据 为例,在解码端基于变长分裂表的解码过程具体如下:
参数获取模块接收编码端发来的数据包,对其进行解析,读取header,I,split header,k等参数,并将这些参数输出到编码方式判断模块;
编码方式判断模块根据编码模式标识信息header值111110,判断为二级扩展编码,并可以得知对应的所在基础码本为Q4,将header值111110和i输出到基础码本解码模块,并将split header和k的值11011100000000输出到二级扩展分裂量解码模块;
基础码本解码模块检测header的值111110为二级扩展编码,根据header和索引i的值计算码字
得到
并将
输出到矢量合成模块;
二级扩展分裂量解码模块读取分裂量索引11011100000000,解析该索引,第一个split header为110,接下来往后读两位为第一个index k,即11,查分裂表得第一个分裂量为24;接着往下读,得到第二个split header为10,往后读一位为0,查分裂表得第二个分裂量为4;接着往下读,得到第三个splitheader为0,固知第三个分裂量为0;同理接着往下读,得到第四至八个分裂量均为0。最终得到八维分裂量为{24,4,0,0,0,0,0,0};并将这些分裂量输出到矢量合成模块;
矢量合成模块将基础码本中的矢量{3,-3,1,1,1,1,1,1}与分裂量{24,4,0,0,0,0,0,0}相加,这里分裂量取与基础码本中对应分量相同的符号,得到还原的矢量
为{27,-5,1,1,1,1,1,1},解码结束。
综上所述,一级扩展采用等长比特编码分裂量,适应于较小且比基础码本中矢量稍大的矢量;二级扩展采用不等长比特编码分裂量,适应于较大数值的矢量,由于实际应用中大值矢量中,往往只有1-3维需要分裂,故对分裂量采用不等长编码,给未分裂的几维用1比特“0”标识,有利于高效利用比特数,节省比特开销。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。