数字信号的编码/译码方法及其装置

申请号 CN200780005870.6 申请日 2007-02-13 公开(公告)号 CN101385245B 公开(公告)日 2012-09-26
申请人 法国电信公司; 发明人 史蒂芬·拉格特; 克劳德·拉姆博林;
摘要 本 发明 提供了一种使用置换码对数字 信号 进行编码/译码的方法及其装置。所述置换码包括计算表示置换的秩的量,所述量包括部分秩的累加,每一部分秩均对应于组合表示。其中,所述组合表示由素因数幂分解来表示,并通过对所选整数的分解的、预先记录的表示进行 存储器 读取来确定。本发明提供了对与置换码的索引及反运算都相关的问题的有效方案,该方案同时解决了变量的构造和除法的问题。
权利要求

1.一种使用置换码对数字信号进行编码/译码的方法,包括:
计算组合表达式,其中,所述组合表达式由素因数幂分解来表示,并通过读取预记录在存储器中的所选整数的分解表示而确定;所述预记录的分解表示包括用于表示每个所选整数的指数的值,所述值分别与表示连续素数的值相关联地存储;以及所述预记录的分解表示至少包括阶乘值的分解的表示;以及
计算表示置换的秩的量,所述量包括部分秩的累加,每一部分秩均对应于一个所述组合表达式。
2.如权利要求1所述的方法,其中,当对矢量量化的数字信号进行编码时,使用了置换秩的计算,以对前导矢量的分量的置换进行索引,所述置换已经在先前的步骤中执行以确定最接近输出矢量的码矢量。
3.如权利要求1所述的方法,其中,当根据置换的秩的给定值对矢量量化的数字信号进行译码时:
-根据待构造的码矢量的至少一个假定分量,计算表示与所述给定值接近的置换秩的至少一个量;
-如果所述量满足与所述秩的所述给定值的接近条件,那么所述假定分量的选择便生效。
4.如权利要求3所述的方法,其中,如果所述秩的所述给定值能够处于到与所述假定分量相关的部分秩的累积值与到与所述假定分量加一后对应的分量相关的部分秩的累积值之间,则满足所述接近条件。
5.如权利要求2所述的方法,其中,所述编码/译码的类型为具有矢量量化的信源编码/译码。
6.如权利要求1所述的方法,其中,所述编码/译码的类型为信道调制编码/译码,并且所述方法包括:
-在传输之前,根据置换的秩确定码矢量;以及
-在接收时,通过对应于接收的矢量的码矢量计算置换的秩。
7.如权利要求1所述的方法,其中,所述置换码利用Schalkwijk列举,并且与码矢量(y0,...yn-1)的截断(yk,...yn-1)相关的部分秩 表示为:
其中
-符号 表示从0到m的整数指数i的乘积,
-符号 表示从0到m的整数指数i的和;
-符号l!为整数l的阶乘值,对于l>0,l!=1×2×3×...×(l-1)×l,并且0!=1,
-整数n为所述置换码的维数,其对应于码矢量包括的分量的总数;
-0和n-1之间的整数k为所述码矢量的第k个分量yk的索引;
-整数q为所述码矢量包括的分量的数量;以及
d
-项wk 表示k和n-1之间的、其值等于同一索引分量d的索引分量的数量。
8.如权利要求7所述的方法,其中,通过确定所述部分秩 的累加,在编码时确定所述秩的计算,对于0和n-1之间的索引k,每一所述部分秩均根据码矢量(y0,...yn-1)的截断(yk,...yn-1)估计。
9.如权利要求8所述的方法,其中,对项 进行测试,以避免在所述项Sk为零时估计所述部分秩
10.如权利要求7所述的方法,其中,当根据置换的秩的给定值对矢量量化的数字信号进行译码时:
-根据待构造的码矢量的至少一个假定分量,计算表示与所述给定值接近的置换秩的至少一个量;
-如果所述量满足与所述秩的所述给定值的接近条件,那么所述假定分量的选择便生效,
在译码时计算表示所述部分秩 的缩减的量,以确定索引k从0到n-1的、所述码矢量的所述分量yk。
11.一种使用置换码对数字信号进行编码/译码的设备,包括:
用于计算组合表达式的装置,其中,所述组合表达式由素因数幂分解来表示,并通过读取预记录在存储器中的所选整数的分解表示而确定;所述预记录的分解表示包括用于表示每个所选整数的指数的值,所述值分别与表示连续素数的值相关联地存储;以及所述预记录的分解表示至少包括阶乘值的分解的表示;以及
用于计算表示置换的秩的量的装置,所述量包括部分秩的累加,每一部分秩均对应于一个所述组合表达式。

说明书全文

数字信号的编码/译码方法及其装置

技术领域

[0001] 本发明涉及诸如音频、视频以及更为广泛的多媒体信号之类的数字信号的编码/解码,以用于其存储或传输。本发明特别提出了一种解决方案,所述解决方案用于解决由置换码的编码和解码引起的问题。
[0002] 通常,本发明也应用于信源编码的同类:信道编码或“调制”。
[0003] 根据本发明的数字信号的压缩编码/解码对于语音或音频信号频率编码器的变换系数的量化非常有用。

背景技术

[0004] 矢量量化
[0005] 一种广泛应用的数字信号压缩解决方案为矢量量化。矢量量化通过选自有限集的相同维数的矢量来表征输入矢量。M级(或M个“码矢量”)的量化器为输入矢量集的非双n n n射应用,通常是将实欧氏空间R 或R 的子集映射到具有M个分离的元素的、R 的有限态子集Y中:Y={y0,y1,…yM-1}.
[0006] Y被称为复制字母表或“字典”甚或“目录”,它的码矢量元素被称为“码字”(或“输出点”或甚至是“表示(representative)”)。
[0007] 用于量化器的每一维的比特率(或其“分辨率”)r可由关系式定义:
[0008]
[0009] 在矢量量化中,将n个样本的作为n维矢量来处理。根据信源编码理论,当维数变得很大时,矢量量化的性能逼近信源失真比特率的极限。基于矢量量化器的最优性所必须的条件,矢量量化器字典可用统计学的方法如通用的劳埃德算法(GLA)设计。这样获得的统计学的矢量量化器不具有结构,从而使得它们的开发在计算和存储资源方面的成本非常昂贵,因为编码和存储二者的复杂性都是与n2nr成比例的。
[0010] 参考图1A,三个主要的运算用到了矢量量化器:两个运算在编码中用到,一个运算在解码中用到。通过首先从字典中选择码矢量来对输入矢量进行编码(步骤COD)。选择的码矢量是与输入矢量最类似的码矢量(图1A中的运算OP1)。然后,确定(步骤IND)是将该码矢量的索引进行传输还是存储(图1A中的运算OP2)。在解码器中(步骤DEC),根据其索引确定该码矢量(图1A中的运算OP3)。
[0011] 在调制中,以不同的顺序应用图1A中的三个运算OP1、OP2和OP3。图1B示出了调制/量化的二元性,规定了从索引到码矢量的转换(图1B的COD’步骤,其对应于图1A中的运算OP3)。然后,在通过受噪声影响的信道进行传输后,搜索与接收的矢量最接近的码矢量(图1B的DEC’步骤,其对应于图1A中的运算OP1)。最后,对码矢量索引的解码是第三步(图1B的IND’步骤,其对应于图1A中的运算OP2)。
[0012] 根据维数、矢量和比特率,复杂性指数的增加限制了具有小的维数和/或低比特率的无结构的矢量量化器的实时应用。对于无结构的矢量量化器,对最近邻居的搜索(运算OP1)要求在字典所有的元素中进行穷举搜索,以选择与输入矢量之间的距离最小的字典元素。后两个运算(索引OP2和转换运算OP3)通常通过对表的简单阅读来执行。然而这对于寄存器空间是非常昂贵的。为了克服尺寸和维度的限制,研究了基本矢量量化器的几个变体。这些变体试图修补字典结构的缺乏并从而减少复杂性,但这是以质量为代价的。但是,性能/复杂性的平衡得到了提高,使得它能够提高分辨率的范围或维数,以便矢量量化器能够有效地应用。提出了许多结构的矢量量化器方案,特别是,实现了下面描述的“置换码”的矢量量化器。
[0013] 置换码
[0014] 在“置换码”矢量量化器中,码矢量是通过(按字母顺序)对第一码矢量的各分量进行置换而获得的,其中该第一码矢量称为“前导(leader)”(或“前导矢量”)。这些分量的值取自大小为q的字母表A={a0,a1,…,aq-1}(其中,当i≠j时,ai≠aj)。分量ai是i实数(或整数)。权w(其中i是0到q-1范围内的索引)是字母表中字母ai的重复次数。
i
权w 是正整数,以使
[0015]
[0016] 按照惯例,字母表的值满足a0>a1>…>aq-1。前导的n个分量从位置0到位置(n-1)以降序排列。因此,前导矢量y0是如下形式的n维矢量:
[0017]
[0018] 可以理解,可选择不同的分量次序,例如为a0<a1<…<aq-1。
[0019] 前导矢量被称为“带符号前导”,且置换码被认为是“属于类型I”。其它的码矢量通过对y0的分量进行置换而获得。置换的总次数M为:
[0020]
[0021] 还有另一类型的置换码(类型II)。其前导矢量具有如上相同的形式,但是其分量必须是正的(a0>a1>…>aq-1≥0)。通过为其它码矢量分配所有可能的标记组合,其它码矢量也通过对y0的分量进行置换而获得。置换的总次数M为:
[0022]
[0023] 其中,如果aq-1>0,则h=n,否则,h=n-wq-1。
[0024] 在该情况下,前导矢量也称为绝对前导。
[0025] “置换码”矢量量化器已被推广到置换码的组合(并集),且最近该置换码联合结构已经推广到可变维数和分辨率的矢量量化中(在该申请人的申请文件WO-04/00219中)。置换码不仅用于统计矢量量化,还在使用高度结构化字典的代数矢量量化中由点的规则排列或纠错码得到。置换码还用于调制中。
[0026] 置换码结构的使用考虑到了最佳的和快速的最近邻域研究算法的发展(图1A中的运算OP1)。然而,码矢量的编索引(或编号)(图1A中的运算OP2)和反向译码运算(图1A中的运算OP3)比非结构化的矢量量化情况需要更多的计算。
[0027] 有多种列举置换的方法。Schalkwijk算法是这些方法的其中之一:
[0028] “用于信源编码的算法(An algorithm for source coding)”,由Schalkwijk J.P.M发表在1972年5月的IEEE Trans.on Information Theory的卷IT-18,N°3,第395-399页。
[0029] 使用组合分析,这些技术能够为置换码的码矢量编索引(运算OP2)且也能完成反向索引译码运算(运算OP3)。在置换编索引算法中,通常使用的Schalkwijk算法回顾如下,例如在标准中:
[0030] -[3GPP TS 26.273](ANSI-C code for the Fixed-point Extended AMR-Wideband(AMR-WB+);V6.1.0(2005-06)(第6版)),
[0031] -以及[3GPP TS 26.304](Extended Adaptive Multi-Rate-Wideband(AMR-WB+);Floating-point ANSI-C code;V6.1.0(2005-06)(第6版),2005年6月)。
[0032] 在编码中计算置换的秩(图1A中的运算OP2)
[0033] 此步骤包括为矢量y=(y0,y1…,yn-1)的分量的所有可能的置换进行排序和编索引。该次序是按词典顺序的,且该索引在本文中称为“秩(rank)”。计算矢量y的秩包括计算与y相关联的矢量D=(d0,d1…,dn-1)的秩,从而使得当且仅当yk=ad时,dk的索引值为d。
[0034] 例如,维数为n=8的矢量y包括如下分量:
[0035] y=(4,2,4,0,0,4,4,2)
[0036] 通过A={4,2,0},其中,a0=4,a1=2且a2=0,给出了具有3个(q=3)字母的字母表(不同值的分量)。
[0037] 矢量y则与矢量D=(0,1,0,2,2,0,0,1)相关联,其分量是字母表A的q个字母的简单索引。
[0038] y和D的秩是相同的,但是矢量D的定义减少了计算序列D的秩所需的运算,其中序列D的值包含在集{0,1,…,q-1}中(所包含的元素数目与字母表{a0,a1,…,aq-1}相同)。
[0039] 由于矢量y和D各自分量的出现是相同的,所以它们的权是相同的。中间权也被定义为与分量(yk,yk+1…,yn-1)的矢量的权,因此其对应于被截短为剩下位置k到n-1的矢量y。因而:
[0040]
[0041] 其中,δ(x,y)是Kronecker算子(如果x=y,则δ(x,y)=1,否则,δ(x,y)=0)。
[0042] 令
[0043] 通过组合分析,矢量y的秩t可通过以下公式计算:
[0044] 其中 且(-1)!=∞(5)
[0045] 该公式能够简化如下:
[0046]
[0047] 经常使用的就是公式(6),因此本文采用此公式。在下文中,将 称为“次序k的部分秩(partial rank)”,其中:
[0048]
[0049] 对秩进行译码(运算OP3):根据其索引确定置换
[0050] 对秩t进行译码需要获取与y相关联的矢量D=(d0,d1,…,dn-1)。一种连续搜索dk的方法描述如下。分量d0首先被确定,然后是分量d1,…到分量dn-1。
[0051] *d0的确定:
[0052] 通过利用包含不等式的公式找到d0:
[0053]
[0054] 对于d=0,…,q-1,项(n-1)!、t、 和值 都是已知的。为了得到d0的值,将d0=0用作开始点,且d0连续地增1直到满足公式(8)。通过将部分秩代入公式(8),值d0应使:
[0055] 其中,
[0056] *d1的确定:
[0057] 为了找到d1,利用如下关系式:
[0058]
[0059] 对于d=0,…,q-1,值 能按如下方法根据 的值推导出:
[0060] -如果d=d0,则 以及
[0061] -如果d≠d0,则 (只要d不等于d0,则重复 )。
[0062] 我们回到与确定分量d0相同的问题。为了找到d1的值,将d1≠0用作开始点,且d1连续地增1直到满足不等式(9)
[0063] *其它dk的确定
[0064] 之后的dk的计算是从上述情况推导出来的。为了找到dk的值,将dk=0用作开始点,且dk连续地增1直到满足不等式
[0065] 一旦矢量D=(d0,…,dn-1)被译码出,则通过简单的字母表变换从中推导出矢量y。
[0066] 现有技术的状况和问题
[0067] 置换码的编索引和反向运算都是复杂运算。利用的算法应用了组合分析。组合的编索引和反向运算需要阶乘乘积的除法。
[0068] 除法的复杂性
[0069] 尽管在集成电路信号处理器上已取得了进步,但是除法仍然是复杂的运算。通常,一个16位的整数除以一个16位整数花费的时间比它们的乘法花费的时间多18倍。一个32位整数除以一个16位整数的除法的权是32,而它们的乘法的权是5。
[0070] 变量的构造(framing)
[0071] 除法的成本不是唯一的问题。变量构造是另一问题,如下面表1所示。
[0072] 只有小于或等于8的整数的阶乘可用16位整字表示。对于大于12的数,用32位的整字都不能表示其阶乘。
[0073] 而且,运算的复杂性还随着用于表示变量的位数的增多而增加。因而,用16位整数除32位整数的除法(权32)的复杂度几乎是用16位整数除16位整数的除法(权18)的复杂度的两倍。
[0074]n n! Log2(n!)
0 1 0
1 1 0
2 2 1
3 6 2.5849625
4 24 4.5849625
5 120 6.9068906
6 720 9.4918531
7 5040 12.299208
8 40320 15.299208
9 362880 18.469133
10 3628800 21.7910611
11 39916800 25.2504927
12 479001600 28.8354552
13 6227020800 32.535895
14 87178291200 36.3432499
15 1307674368000 40.2501405
16 20922789888000 44.2501405
[0075] 表1:整数阶乘
[0076] 用于减少运算OP1复杂度的解决方法已被提出。而运算OP2和运算OP3的复杂度的问题并未很好地解决。然而,值得注意的是,在本申请人的TDAC编码/译码器或3GPP-AMR-WB+译码器中,已基于Schalkwijk公式对编码和译码算法进行了简化。
[0077] 置换列举的简化和反向运算(运算OP2和运算OP3)的简化
[0078] 置换的秩t的计算和反向运算的速度通过如下描述的简化进行了改进,其中该简化是针对n项 的计算,其定义回顾如下:
[0079]
[0080] 前两项用于减少编码和译码的复杂度。第三项用在编码中,且最后两项用在译码中。
[0081] 编码技术如图2和图3所示。特别地,图3包括通过现有技术意义下的Schalkwijk公式计算秩,而图2图解说明了基本步骤(在图2中用“EP-n”指定第n个基本步骤)。
[0082] 参考图2,处理过程由步骤EP-1开始,在该步骤中,恢复矢量y=(y0,…,yn-1)的分量。随后的步骤EP-2包括计算用于矢量A=(a0,…,aq-1)的字母表的元素并确定最大索引q。为此,在设置了q=1,a0=y0的初始化步骤EP-21之后,对1到n-1之间的索引k进行循环,以按如下方法搜索元素aq(在EP-26结束测试,否则在EP-27中递增):
[0083] -如果当前索引为k的分量yk不在元素{a0,…,aq-1}中(测试EP-22),那么,必须分配新的元素aq以使aq=yk加入到集{a0,…,aq-1}中(步骤EP-23),并且q必须增1(步骤EP-25)。
[0084] 随后的基本步骤EP-3是矢量D=(d0,…,dn-1)的计算,如下所示:
[0085] -对于范围为0到n-1的k(步骤EP-31用于将k初始化为0,在EP-37中对k进行结束测试,否则在EP-38中使k递增),在索引集(0,…,q-1)中找到值d,以使yk=ad(在循环中的EP-33对d进行测试,否则在EP-36中递增为d=d+1)。
[0086] 参考图3,其描述了在图2说明的基本处理过程之后的用于计算秩t的步骤。图3中说明的步骤以“CA-n”来表示现有技术意义下的第n个编码步骤。
[0087] 步骤CA-1将秩t初始化为0,将变量P初始化为1(在步骤CA-13中用作秩计算的分母),以及将q个权w0,…,wq-1初始化为0。
[0088] 在此,将k的值从n-1递减到0(步骤CA-2用于将k初始化为n-1,在CA-14结束测试,否则在CA-15递减)。该选择的益处随后描述。然后使用在基本步骤EP-3中获得的、矢量D的分量dk,对于当前k,设置d=dk(步骤CA-3)。对相关的权wd进行更新(在步骤CA-4中,wd=wd+1)以估计项P(在步骤CA-5中,P=P×wd)。将在对应于步骤CA-13的秩的计算中用作分子的和S初始化为0(步骤CA-6),然后对权wi的索引i进行循环(在CA-9结束测试,否则在CA-10递减为d-1),以更新和S(在步骤CA-8中,S=S+wi)在步骤CA-13计算秩t之前,进行检查以确保和S不为0(测试CA-11)。该实现的益处将在随后描述。
[0089] 秩t的计算(步骤CA-13)包括阶乘项(n-k-1)!,该计算如下:
[0090] t=t+(S/P)(n-k-1)!
[0091] 不在秩t每次更新时计算项(n-k-1)!,而是优选地,在存储器中预记录这些值,且使用简单的存储器存取(步骤CA-12)来获得(n-k-1)!的当前值。
[0092] 因此,图3说明的处理过程的一些优点将被本发明的实现再次吸收。这些优点详细描述如下。
[0093] *阶乘的存储
[0094] 为了避免实时计算项(n-k-1)!和 对n+1个阶乘值(0!,1!,…,n!)进行预计算和存储。如果维数n的变化是有限的(n≤nmax),则对值0!,1!,…,nmax!进行预计算和存储。
[0095] *为了避免进行除法而在中间权累积时进行测试
[0096] 如果项 为0,那么,计算
[0097]
[0098] 则是无意义的。现在,该项通常为零,尤其是在最后的位置上(k接近n-1)。通过增加对该项的零状态的测试(图3的测试CA-11),则可避免进行除法(和乘法)。由于除法的计算比测试复杂得多,因此在复杂性方面的节约是很有意义的。
[0099] *编码中位置的反向循环
[0100] 通过将 增1且通过重复d≠dk的其它值 权 (其中d=0,1,…,q-1)可根据权 推导出来。然后,则能够创建循环(图3中的步骤CA-2、CA-14、CA-15),从矢量的最后位置(k=n-1)工作到第一位置(k=0)。在初始化为1之后,该“反向”循环能够以这样的方式计算项Pk:
[0101]
[0102] 其中,对于每次迭代只进行递增和乘法,或如下计算:
[0103]
[0104] 以及
[0105] 还可单独处理最后两个位置(k=n-1和k=n-2)。事实上,
[0106] ●对于最后的位置(k=n-1), 因此
[0107] ●对于倒数第二的位置(k=n-2),
[0108] 如果dn-2>dn-1,则
[0109]
[0110]
[0111] 且(n-1-k)!=1!,
[0112] 因此,
[0113] 否则(dn-2≤dn-1), 因此
[0114] 其中,如果dn-2=dn-1,则Pn-2=2,否则,Pn-2=1。
[0115] 还可提供如下的其它有利的实现细节。
[0116] *消除译码中的除法
[0117] 当搜索d0时,为了避免译码中的除法,不等式(8)能够以如下形式重新表示为:
[0118]
[0119] 类似地,通过以如下形式重新表示不等式(9),也在搜索d1时消除除法:
[0120]
[0121] 或甚至
[0122]
[0123] 应该注意的是,虽然能够在搜索dk(0≤k≤n-1)时消除除法,但是仍然需要执行(n-1)次除法来计算 (0≤k≤n-3)。
[0124] *在译码时对权值进行测试
[0125] 在最后位置上,对于某些d值, (对于 分量占据了位置k之前位置的d值)。因此,对于这些d值,计算不等式(8)和不等式(9)的各项是没有意义的。
[0126] 现有技术的其它问题:变量的构造
[0127] 变量的构造问题已经在本申请人的TDAC编码中解决了。
[0128] 第一解决方法是将大于12的维数的运算处理与较小维数的运算处理区分开。对于小的维数(n<12),在32位的无符号整数上完成计算。对于较大的维数,则使用双精度浮点变量,其代价是将增加计算复杂性(浮点双精度运算比其整数精度等价的运算更昂贵)以及所需的存储器容量。
[0129] 而且,如果将最大精度限制为无符号的32位整数(由定点处理器实现),大于12的整数阶乘则不能直接预存,且维数大于12的矢量必须被分开地编码。为了解决该问题,j更完善的解决方法利用以2×r的形式表示阶乘n!的尾数和指数的伪浮点表示法。该分解如下表2所示。将n!(n小于或等于16)的存储简化为存储最大精度为30位的r以及对应于简单位偏移的指数j。
[0130]n log2(n!) 2j r log2r
0 0 1 1 0
1 0 1 1 0
2 1.0000 2 1 0
3 2.5849625 2 3 1.5849625
4 4.5849625 8 3 1.5849625
5 6.9068906 8 15 3.9068906
6 9.4918531 16 45 5.4918531
7 12.299208 16 315 8.29920802
8 15.299208 128 315 8.29920802
9 18.469133 128 2835 11.469133
10 21.7910611 256 14175 13.7910611
11 25.2504927 256 155925 17.2504927
12 28.8354552 1024 467775 18.8354552
13 32.535895 1024 6081075 22.535895
14 36.3432499 2048 42567525 25.3432499
15 40.2501405 2048 638512875 29.2501405
16 44.2501405 32768 6385l2875 29.2501405
[0131] 表2:阶乘的因数分解
[0132] 因此,现有技术中的技术大多不能解决有限精度(尤其是定点)变量的构造问题。虽然TDAC编码的实现解决了构造问题,但其不能避免两个整数的昂贵除法。而且,对于高维数,中间计算(例如,部分秩 的分子和分母)可接近饱和。在该情况下,上述的简化不能用在译码处理中,且需要还原为不等式(8)和不等式(9)的公式,因而再次引入了大量的除法。
[0133] 不同于Schalkwijk技术的列举技术也遇到了相同的问题。假设列举技术也使用组合分析,其则必须计算阶乘的乘积及其除法。

发明内容

[0134] 本发明旨在改善这种情况。
[0135] 为此,首先提出了一种使用置换码对数字信号进行编码/译码的方法,所述置换码包括组合表示的计算,其中所述组合表示由素因数幂分解来表示,并通过对所选整数的分解的、预先记录的表示进行存储器读取来确定。
[0136] 因而本发明提供了对与置换码的索引及反运算都相关的问题的有效方案。该方案同时解决了变量的构造和除法的问题。
[0137] 有效地,在有利的实施中,所述预先记录的表示包括表示用于每个所选整数的指数的值,所述值分别与表示连续素数的值相关联地存储。
[0138] 现有技术中与变量构造相关的问题因而被解决。
[0139] 对于利用阶乘项,变量构造问题就更加严重。
[0140] 在有利的实施中,为了在组合表示包括阶乘值时利用所述组合表示,所述预先记录的表示至少包括阶乘值的分解的表示。
[0141] 因而该实施可以去除变量构造的限制,因此将通常设定的限制推回为相关置换码的维数n。
[0142] 根据另一有利的特征,所述组合表示中的至少一个包括整数分子除以整数分母的商,并且所述商由素因数的幂分解来表示,其中每个幂均为分配给同一个素数的、分别与所述分子和所述分母相关联的指数的差。
[0143] 因而通过将该计算以简单的减法计算替代,解决了与现有技术中的除法计算相关的问题。
[0144] 在第一实施方式中,提供了存储器,所述存储器进行寻址以检索上述所选整数之一的预先记录的分解。为此,将所选整数的预先记录的表示存储在可寻址的存储器中,所述存储器的寻址提供待分配至各素数的一连串指数,以重构所选整数。
[0145] 优选地,所选整数的预先记录的表示以一连串地址的方式存储,其中,用于每个素数的地址均给出待分配至所述素数的指数,以重构所述所选整数。
[0146] 根据第一实施方式的该实施将在下文中指定为“分解的展开表示”。
[0147] 作为一种变体,在第二实施方式中,所述预先记录的表示以包括一连串位组的字的形式存储,其中每个位组均具有:
[0148] -取决于素数的权,以及
[0149] -取决于将与所述素数相关联的指数的值。
[0150] 优选地,然后通过将至少一个局部掩码连续地应用于位字,并通过根据位权的连续偏移和剩余位的读取,而确定所述素因数的幂。
[0151] 根据第二实施方式的该实施将在下文中指定为“分解的紧凑表示”。
[0152] 对于组合表示的计算的相同方法通常可根据以下步骤实现:
[0153] -根据所选整数识别出现在形成所述组合表示的乘积和/或商中的项;
[0154] -在存储器中读取包括在所述项的素因数分解中的指数;以及
[0155] -加上和/或减去所读取的指数,以确定包括在所述组合表示的素因数幂分解中的所述指数,并因此根据所述组合表示的素因数幂分解计算所述组合表示。
[0156] 关于乘积的计算(其将被循环执行并且在每一循环上均包括新的项),可有利地暂时存储用于前一循环的乘积计算的分解。因此,如果该方法包括用于计算乘积的循环步骤,在每一循环上,所述乘积包括与在前一循环上确定的乘积相乘的项,则:
[0157] -所述在前一循环上确定的乘积以素因数幂分解的形式保留在存储器中;
[0158] -与所述在前一循环上确定的乘积相乘的所述项是其分解已被预先记录的所选整数之一;以及
[0159] -为了在当前循环上确定所述乘积,逐一地对于每个素数,将根据在所述前一循环上确定的乘积的分解和与所述乘积相乘的所述项的分解推导出的所述指数相加。
[0160] 类似地,如果所述方法包括用于计算除法的循环步骤,在每一循环上,所述除法包括对在前一循环上确定的商进行除法的项:
[0161] -所述在前一循环上确定的商以素因数幂分解的形式保留在存储器中;
[0162] -除所述商的所述项是其分解已被预先记录的所选整数之一;以及[0163] -为了在当前循环上确定所述除法,逐一地对于每个素数,从所述在前一循环上确定的商推到出的指数中减去由所述项的分解推导的指数。
[0164] 当前计算的乘积和/商的中间分解的所述暂时存储在确定循环的部分秩时尤其有利,所述循环的部分秩的累积表示置换秩。
[0165] 因此,在本发明的有利实施中,所述置换码包括计算表示置换的秩的量,所述量包括部分秩的累积,因而每一部分秩均对应于所述组合表示中的一个。
[0166] 当对矢量量化的数字信号进行编码时,可以使用置换秩的计算(OP2),以对前导矢量的分量的置换进行索引,所述置换已经在先前的步骤(OP1)中执行以确定最接近输出矢量的码矢量。
[0167] 类似地,当对矢量量化的数字信号进行译码时,假定根据置换秩的给定值进行置换秩的估计:
[0168] -根据待构造的码矢量的至少一个假定分量(dk),计算表示与所述给定值接近的置换秩的至少一个量(OP3);
[0169] -如果所述量满足与所述秩的所述给定值的接近条件,那么所述假定分量(dk)的选择便生效。
[0170] 在示例性的实施中,如果所述秩(t)的所述给定值能够处于到与所述假定分量(dk)相关的部分秩的累积值与到与所述假定分量加一后对应的分量(dk+1)相关的部分秩的累积值之间,则满足所述接近条件。
[0171] 因此,在Schalkwijk列举的情况下,所述接近条件可与上述的不等式(8)的一般形式相对应。
[0172] 因而,本发明可有利地适用于图1A中表示的具有矢量量化的信源编码/译码。
[0173] 然而,所述编码/译码的类型也可以为图1B中表示的信道调制编码/译码,假定其包括:
[0174] -在传输之前,根据置换的秩确定码矢量(图1A和图1B中相同的OP3);以及[0175] -在接收时,通过对应于接收的矢量的码矢量计算置换的秩(图1A和图1B中相同的OP2)。
[0176] 部分秩的计算(在乘积或商中)包括这样的项,如将在下文中看到的一般规则,所述项保持小于或等于所述置换码具有最大维数n。因此,在有利的实施中,具有预先记录的分解的所述所选整数至少包括:
[0177] -1和所述最大维数n之间的整数;
[0178] -整数0的阶乘值;
[0179] -以及,优选地,1和所述最大维数n之间的整数的阶乘值。
[0180] 在具体可选的实施中,所述所选整数也包括数值0。
[0181] 因此,如果所述置换码利用Schalkwijk列举,则与码矢量(y0,…yn-1)的截断(yk,…yn-1)相关的部分秩 表示为:
[0182] 其中
[0183] -符号 表示从0到m的整数指数i的乘积,
[0184] -符号 表示从0到m的整数指数i的和;
[0185] -符号l!为整数l的阶乘值,对于l>0,l!=1×2×3×…×(l-1)×l,并且0!=1,
[0186] -整数n为所述置换码的维数,其对应于码矢量包括的分量的总数;
[0187] -0和n-1之间的整数k为所述码矢量的第k个分量yk的指数,从信源编码/译码(或信道调制编码/译码)中的秩值推导或者对于其的置换待在信源编码/译码(或信道调制编码/译码)中索引;
[0188] -整数q为所述码矢量包括的分离分量的数量;以及
[0189] -项 (称为中间权)表示k和n-1之间的、其值等于同一索引分量d的索引分量的数量。
[0190] 在这种情况下,在乘积和/或商中,具有预先记录的分解的、然后待在所述部分秩的表达式中识别的所述所选整数为:
[0191] -阶乘项(n-1-k)!,对于0和n-1之间的所有整数k;
[0192] -包含在乘积 中的每一项 的值和/或其阶乘值,每一项 均在0和n之间;以及
[0193] -对于0和n-1之间的所有整数k的项 每一项均在1和n-1之间。
[0194] 还是在Schalkwijk列举的情况下,中间分解的暂时存储有利地应用为:将用于前一索引k的所述项 的分解中的指数的和暂时存储在存储器中,以加到用于当前指索引k的项 的分解的指数中或者从中减去。附图说明
[0195] 通过阅读下文的详细描述和除了上述图1A、图1B、图2和图3以外的其它附图,本发明的其它特性和优点将会变得显而易见的,其中:
[0196] -图4图解说明了通过利用本发明的置换的秩的编码/译码原理;
[0197] -图5图解说明了根据第一实施方式用于通过利用本发明对置换的秩进行编码的处理运算,其中,提出了用于计算中的项的素数幂分解的指数的展开(exploded)表示法;
[0198] -图6图解说明了根据第二实施方式用于利用本发明对置换的秩进行编码的处理运算,其中,提出了分解的指数的紧凑(compact)表示法;
[0199] -图7图解说明了根据第一实施方式用于利用本发明对置换的秩进行译码的处理运算,其中,提出了分解的指数的展开表示法;以及
[0200] -图8图解说明了根据第二实施方式用于利用本发明对置换的秩进行译码的处理运算,其中,提出了分解的指数的紧凑表示法;
[0201] -图9用图解法表示了实现本发明的编码/译码装置。
[0202] 具体实施方式作为提醒,尤其是参考4到图8,应该强调的是:
[0203] -术语“编码”指计算置换的秩t(图1A和图1B中的运算OP2);以及[0204] -术语“译码”指根据秩t确定置换(图1A和图1B中的运算OP3)。
[0205] 因此,这些运算将参照通过矢量量化进行的信源编码/译码而指定。但是,应该记住的是,这些运算也可在信道编码/译码中、在调制中进行。
[0206] 为了上说明本发明的原理,素数幂因式分解描述如下。
[0207] 对非零正整数K进行素数幂分解的表示如下:
[0208]
[0209] pi是第i个素数(p0=1,p1=2,p2=3,p3=5,p4=7,p5=11,p6=13,p7=17,等)。
[0210] 在整数K的分解中,pi的指数记为 且mK表示K的分解中具有非零指数的最大素因数的索引。
[0211] 例如,数K=120(或5!)表示为:
[0212] 120=1*23*31*51,其中mk=3,这是因为最大因数“5”的索引是3(p3=5)。因此,和
[0213] 实践中,由于数“1”是乘法的中性元,因此可将p0从分解式中去除,即:
[0214]
[0215] 当然,K=0不能分解为素数幂。
[0216] 小于或等于16的正整数的素数幂乘积的分解由表3a给出,其阶乘的分解由表3b给出。该分解包括六个素数(2,3,5,7,11和13)。由于表3a和表3b中的列由素数pi做索引且行由n做索引,因而,在数n和n!的素数幂乘积分解中,位于列pi和行n交叉处的单元格分别是素数pi的指数 和
[0217] 对于任何正整数n>1,n!的素因数的数mn!使得 数mn!和mn分别显示在表3b的最后一列和表3a的倒数第二列。应该注意,mn≤mn!。
[0218] 如表3a所示,数n的分解的许多指数为零。在表3a的最后一列中,指出了n的分解中的非零指数的数m′n。n=0的分解的不存在(因此指数也不存在)通过“-”符号在表3a的行n=0中示出。
[0219]
[0220] 表3a:正整数n(n<17)的素数幂分解
[0221]
1 1 0 0 0 0 0 0 1
2 2 1 0 0 0 0 0 1
3 6 1 1 0 0 0 0 2
4 24 3 1 0 0 0 0 2
5 120 3 1 1 0 0 0 3
6 720 4 2 1 0 0 0 3
7 5040 4 2 1 1 0 0 4
8 40320 7 2 1 1 0 0 4
9 362880 7 4 1 1 0 0 4
10 3628800 8 4 2 1 0 0 4
11 39916800 8 4 2 1 1 0 5
12 479001600 10 5 2 1 1 0 5
13 6227020800 10 5 2 1 1 1 6
14 87178291200 11 5 2 2 1 1 6
15 1307674368000 11 6 3 2 1 1 6
16 20922789888000 15 6 3 2 1 1 6
[0222] 表3b:n!(n<17)的素数幂分解
[0223] 接下来介绍接下来这种分解在计算置换码的部分秩中的应用,首先介绍使用Schalkwijk公式的情况,然后介绍一般情况。
[0224] 应该记得,记为 的部分秩由上文的关系式(7)给出:
[0225]
[0226] 从而使得能对以下三项进行素数幂分解:
[0227] (n-1-k)!, 和
[0228] 根据(n-1-k)!、Pk和Sk的分解的指数,通过简单的加法和减法就可计算得到的分解的指数。
[0229] 实际上, 分解中的素因数pi的指数 由(n-1-k)!、Sk和Pk三项的分解中pi的三个指数计算得到。指数 等于前两项( 的分子)的pi指数和减去最后一项( 的分母)的pi的指数。该观测形式化后表示为:
[0230]
[0231] 图4描述了可包括在本发明意义下、用于编码和译码的处理运算中的一般步骤(以“G-n”来表示第n个一般步骤)。
[0232] 因而,参考图4,从当前索引k(步骤G-1)开始且通过将会在随后详细描述的一些中间步骤,首先应该记住,规定了查阅预先记录的表(在图4中示例性示出的步骤G-2中记为Dl和Dl!),以根据上文的关系式(10)来计算全局指数 (步骤G-3),该指数在素因数幂形式的、中间秩 的分解中是具体的。然后,可能通过在素因数的索引i上进行循环,而由此推导出中间秩 的值(步骤G-4)。在该中间秩的计算之后则可更新该置换的总秩(步骤G-5):
[0233] -对于秩编码,使用 类型的关系式,其中,索引k递减(步骤G-6);
[0234] -或者,对于秩译码,使用 类型的关系式,其中,索引k递增(步骤G-7),如随后所见。
[0235] 最后,在编码的步骤G-7中(或如图4的虚线所示在译码中)获得置换的秩t,在步骤G-8中,根据上述的不等式(8)、并通过上文中的关系式yk=ad根据矢量Y的分量将矢量D的分量dk推导出。
[0236] 在一般情况下,并与Schalkwijk列举无关地,如果置换的部分秩t′(t′>0)以Nt′项vj(1≤j≤Nt′)为分子、并以Nt′项ρj(1≤j≤Dt′)为分母的形式表示为:
[0237]
[0238] 那么,部分秩t′的分解的指数 由中间分解确定,其中,该中间分解是Nt′个vj的分解和Dt′个ρj的分解,指数 表示为:
[0239]
[0240] 素数因数分解还将在下文中用于部分秩t′的、整数商的乘积的公式。
[0241] 也作为一般规则,如果 则
[0242] 为了回到Schalkwijk列举的特殊情况、并然后根据部分秩 的分解对其进行计算,一旦该分解被确定之后,则如下执行。
[0243] 遵循关系式 的精神,通过乘以对应的幂简单地计算部分秩
[0244] 在此应该指出,项(n-1-k)!和Pk是严格正整数,但是项Sk可为零并因而是不可分解的。在该情况下,部分秩 为零。如上文所述(图3中的步骤CA-11),然后项Sk的值进行测试(Sk=0?),以仅当Sk≠0时,才计算部分秩
[0245] 更一般地,如果 则
[0246] 以及如果 则
[0247] 将要记住的是,组成部分秩的项的素因数因式分解使得能够通过用素因数幂的乘法代替除法来消除除法,特别地,通过用与这些素数相关的指数的简单加法和减法代替除法来消除除法。
[0248] 因而,在本发明意义下,由有限数量的整数的基因数分解,其中该因数分解被存储在存储器中(下文称为“基本分解”),提出了如下步骤:
[0249] -在图4的步骤G-2的意义下,确定在置换的秩中出现的项(例如(n-1-k)!,和 )的素因数分解(下文称为“中间分解”);
[0250] -在图4的步骤G-3的意义下,根据这些中间分解,确定置换的部分秩 的素因数分解,值得注意的是,这种分解是通过计算包含在该部分秩的分解中的指数(例如,类型关系式 )而实现的;以及
[0251] -在图4的步骤G-4的意义下,根据部分秩 的分解(例如,使用类型关系式),对其进行计算。
[0252] 当然,待存储的基本分解优选地是有利选择的目标。在优选的但非限制性的实现中,将根据相关置换码的最大维数(该最大维数记为n)选择将被存储的基本分解。因而,基本分解优选地为:
[0253] -整数l的阶乘(记为l!)的分解,其中,该整数l满足0≤l≤n;
[0254] -以及整数l自身的分解,其中,此时,1≤l≤n;
[0255] 其中,将要记住,n是相关置换码的最大维数
[0256] 然后,可通过数m识别基本分解,给定:
[0257] -将考虑的素因数的数量m
[0258] -m个素因数自身
[0259] -以及它们各自的指数
[0260] 稍后将在在分解的所谓“展开(exploded)”表示的上下文中,参考表4a和表4b对其实现的实施例进行描述。应该指出的是随后描述的所谓“紧凑”表示由存储单字组成,其中,该单字的各位给出了分解所包含的所有指数。
[0261] 然后,可定义基本分解的不同集,以及用于表示和存储这些基本分解的程序。
[0262] 而且,选择用于确定中间分解的项和确定适当地确定这些中间分解的适当确定是下文将描述的有利实现的目标。部分秩的分解以及根据其分解计算部分秩也是下文将描述的有利实现的目标。
[0263] 接着描述将被存储的基本分解的选择。
[0264] 一般地,且独立于用于列举n维置换码的技术,置换的秩的计算使用整数l(0≤l≤n),且首先使用其阶乘l!(0≤l≤n)。在优选的实现中,基本分解是l!(0≤l≤n)阶乘分解和l(1≤l≤n)分解,其中,如上文所述,n是相关置换码的最大维数。因此,在该优选的实现中提出了(2n+1)个基本分解。
[0265] 然而,其它实现也是可能的。
[0266] 例如,仅需提供(n+1)次基本分解,即,0!和l(1≤l≤n)的基本分解。因而,如果l!(l>0)的分解对部分秩的计算是必要的,则其可在用于确定中间分解的步骤中,根据j(1≤j≤l)的l次基本分解和 计算得到。
[0267] 相反地,只需要提供l!(0≤l≤n)的(n+1)次分解。如果l(l>0)的分解对部分秩的计算是必要的,则其可在用于确定中间分解的步骤中,根据l!和(l-1)!两个基本分解以及如下关系式中计算得到:
[0268]
[0269] 因此,将会理解,基本分解集的选择能有利地导致在最小化存储这些基本分解的表示所需存储器和最小化用于确定中间分解的步骤的复杂性之间得到平衡。
[0270] 下面描述根据本发明的分解的表示。
[0271] 如上所述,分解(无论是部分秩、中间分解或基本分解)由待考虑的素因数的数量m、该m个素因数及其各自的指数限定。下文提出了用于表示分解、并存储用于基本分解的数据不同的方案。
[0272] 指数的展开表示
[0273] 阶乘l!(0≤l≤n)的表示
[0274] 包含在值l!的分解中的素因数的数量ml!随着数l的增大而增大。用于表示l!(0≤l≤n)的分解的第一方案在于,对于每个l值,存储数ml!以及pi的幂(1≤i≤ml!)的ml!个指数。将注意到l!的ml!个指数是非零的。
[0275] 在更有利的变体中,基本分解集共享相同数量的mn!个素因数,且对于每一基本分解,均存储mn!个指数,l!的基本分解的索引大于ml!的指数为零。该方案可以通过提供对指数表的规则定址来利用该表。然而,这一实施需要相当大的存储容量。该表包括mn!×(n+1)个值,并且指数 存储于该表的地址(mn!,l+(i-1))处,其中符号(x,y)表示该表中的x行、y列上的单元。当然,将会理解,也可以考虑其它的惯例。因而,不考虑具有m列N行并因此具有m×N个单元(或元素)的二维表,而可考虑具有m×N个单元的一维表,其中,位于二维表的地址(x,y)处的单元位于该一维表的地址m×x+y处。然后,将存储在二维表的地址(l,(i-1))处的指数 存储在一维表的地址(mn!×l+(i-1))处。例如,可将数0至8的阶乘分解的指数存储在包括36个单元的二维表中,该表由表3b的4列(列pi=2,3,5,7)和9行(行n=0,..8)组成。这些相同的指数可以存储在下文给出的具有36个单元的一维表Dl!中(附录A-11)。第一表的地址(x,y)处的单元与Dl!中的地址:
4×x+y处的单元相等。
[0276] 此外,可以规定存储ml!的(n+1)个值,以能够利用l!的基本分解来减少中间分解的计算。
[0277] *整数l(1≤l≤n)的表示
[0278] 为了表示基本分解l(1≤l≤n),还可以提出几种方案。第一方案是对于每个值1,均存储数ml和l的pi的幂(1≤i≤ml)的ml个指数。在一种变体中,可以优选地存储和用于l!的指数(ml!或mn!个)同样多的指数。l和l!的基本分解因而共享相同的数m。
[0279] 在另一变体中,可以利用这样的事实,即,l的分解的非零指数的数量m′l较小。例如,在表3a中很明显的是,数m′l最大为2(对于l≤16)。因此,可以只存储该数以及对应的值pi或索引i。然而,还有必要规定存储非零次幂的这些素因数的索引i,这是因为它们不再由表中的相应指数的地址隐含地识别。
[0280] *除了基本分解之外的分解的表示
[0281] 中间分解的表示取决于基本分解的表示,中间分解的表示根据基本分解的表示而确定。类似地,部分秩的分解的表示取决于中间分解的表示,部分秩的分解的表示根据中间分解的表示而确定。
[0282] *基本分解的存储
[0283] 典型地,可通过下文用于8维(n=8)的置换码的表4a至4d作为示例来说明四个可能的存储方案,其中考虑了四个(m8!=4)素数(2,3,5和7)。这些实施例可应用于3GPP AMR-WB+编码器(标准[3GPPTS26.273]和[3GPPTS26.304]))。该编码器使用代数矢量量化,其字典为8维Gosset阵列RE8的置换码的并集。
[0284] 前三个方案(表4a-4c)以相同的方式表示并存储l!的基本分解。实际上,提供了对ml!和l!的pi的幂(1≤i≤ml!)的ml!个指数的存储。它们的区别在于l的基本分解的表示和存储。表4a示出了用于存储ml和l!的pi(1≤i≤ml!)的幂的ml!个指数的第一方案。表4b示出了用于存储l的pi(1≤i≤ml!)的幂的ml!个指数的第二方案。
[0285]0 0 - - - 1 - - - - 0
1 0 - - - 1 0 - - - 1
2 1 - - - 1 1 - - - 1
3 1 1 - - 2 0 1 - - 2
w
4 3 1 - - 2 2 - - - 1
5 3 1 1 - 3 0 0 1 - 3
6 4 2 1 - 3 1 1 - - 2
7 4 2 1 1 4 0 0 0 1 4
8 7 2 1 1 4 3 - - - 1
[0286] 表4a:用于存储l和l!的素数幂分解并用于8维(l从0至8)置换码的第一方案
[0287]
[0288] 表4b:用于存储l和l!的素数幂分解并用于8维(l从0至8)置换码的第二方案
[0289] 下面的表4c示出了用于存储l!的pi的幂的非零指数的数量m'l、并用于存储其指数的相应索引i的第三方案。在所表示的表中,为了更为清楚,所示出的是素因数pi。
[0290]l! l
[0291]
[0292] 表4c:用于存储l和l!的素数幂分解并用于8维(l从0至8)置换码的第三方案
[0293] 在第四方案中(由下面的表4d示出),基本分解的集由数mn!表示,并且对于每一基本分解(l或l!),存储了mn!个指数。表4d是从上文给出的表3a和3b中四列(pi=2,3,5和7)和9行(n=0至8)中提取的。
[0294]
[0295] 表4d:用于存储l和l!的素数幂分解并用于8维(l从0至8)置换码的第四方案
[0296] 在使用具有可变维数和分辨率的统计矢量量化的TDAC编码器中(最大维数为15),考虑了6个(m15!=6)素数:2,3,5,7,11和13。表3a和3b中的6列(pi=2,3,5,7,
11和13)和16行(n=0to 15)因而可表示第四方案的基本表示集的存储。
[0297] 指数的紧凑表示
[0298] 下面描述另一个有利的方案,其使存储最小化,并将基本分解的指数紧凑地表示在有限数量的字上。在该基本分解的表示的变体中,中间分解和部分秩的分解也被紧凑地表示。有利地,如下文将会看到的那样,该方法还使得确定这些分解的复杂性最小。
[0299] *分解的紧凑表示
[0300] 对于每一素因数pi,都进行搜索以确定部分秩的分子中的、其指数的最大值的上限βi。该上限给定pi的指数的最大可能值,即βi+1。通过用 表示各位整数以用二进制形式表示值βi+1,我们得到:
[0301] 以及 (其中 )
[0302] 其中 表示刚好大于或等于x的整数
[0303] 包含在部分秩t′中的项K的幂因子分解的指数可以由Bn位 的字eK紧凑地表示,该字eK为:
[0304]
[0305] 符号″<<B″表示左移B位。
[0306] 应注意的是,如果数n较大,则Bn可大于用来表示整数的位数B0(16、32或40比特)。在这种情况下,包含在t′中的整数K的素因数分解的指数被表示为M个整字eK(m)的形式,0≤m<M(当然,m>1).有利地,这M个字可如下形成:
[0307] ●eK(0)包括前i0个指数(从p1至 的指数):
[0308] 其中
[0309] ●eK(1)包括从 至 的指数:
[0310] 其中
[0311] ●后一个关系式可推广与任何m,直到组成包括指数 的最后的字。
[0312] 当然,还可以提供其它的变体。例如,一个变体在于,分离地存储p1的指数,并根据从p2的指数应用上述处理运算。
[0313] *上限的确定
[0314] 极限Bi可以以多种方式确定。利用置换码的信息(字母表的大小q,权wi,其中0≤i<q),可以明确地确定部分秩的分子的每一指数的最大值。如果使用多个置换码(可能具有不同的维数),则优选地对每一指数选择这些最大值中的最大数。
[0315] 本发明有利地提出了一般处理运算,以在Schalkwijk列举的上下文中确定该上限。除了最大维数之外,该处理运算不使用置换码的其它先验信息。其简单地利用了以下关系:
[0316]
[0317] 然后选择
[0318] 当使用多种的置换码时,这种非常通用的处理尤其适合。
[0319] 表5a给出了用于维数为8和15的 的分子中的指数的最大值的上限。表5b给出了用于维数为8和15的这些指数的位数 及其和Bn(最后一列)。在8维中,素因数2的指数在3位上表示,其它素因数(3、5和7)的指数在2位上表示。在15维中,素因数2的指数在4位上表示,其它素因数(5、7、11和、13)的指数在2位上表示。
[0320]
[0321] 表5a:对于维数为8和15的置换码的分子的指数的上限
[0322]
[0323] 表5b:表示对于维数为8和15的置换码的指数的位数
[0324] 表6a和6b分别给出了维数n等于8和15的l和l!的指数的紧凑表示。
[0325]l 0 1 2 3 4 5 6 7 8
el - 0 1 8 2 32 9 128 3
el! 0 0 1 9 11 43 52 180 183
[0326] 表6a:对于8维的置换码的指数的紧凑表示
[0327]l 0 1 2 3 4 5 6 7
el - 0 1 16 2 128 17 512
el! 0 0 1 17 19 147 164 676
l 8 9 10 11 12 13 14 15
el 3 32 129 2048 18 8192 513 144
el! 679 711 840 2888 2906 11098 11611 11755
[0328] 表6b:对于15维的置换码的指数的紧凑表示
[0329] 作为纯粹的说明性的示例,让我们设法利用表6b来确定整数l=12的分解。
[0330] 优选地,在表6b中,因为码的最大维数为n=15,因此“2”的指数在4位上表示,“3”的指数在3位上表示,而其它的素因数5、7、11和13在2位上表示。在该表中,在列l=12中,可以读出其紧凑指数e12=18。
[0331] 根据下表的读数,18(=16+2)在B15=15位上的二进制表示为:
[0332] 000 0000 0001 0010,通过将与同一个素数相关联的位分组在一起,其也表示为:00 00 00 00 001 0010。
[0333]i 15…7 6 5 4 3 2 1 0
2i … 64 32 16 8 4 2 1
在二进制表示中,18表示为: 0…0 0 0 1 0 0 1 0
[0334] 4个最低位(权i=0至3)为素因数2的指数,即,0010=2,这意味着待分配给素数2的指数为2。
[0335] 接下来的3位(权i=4至6)为素因数3的指数,即,001=1,这意味着待分配给素数3的指数为1。
[0336] 接下来的2位(权i=7至8)为素因数5的指数,即,00=0。
[0337] 接下来的2位(权i=9至10)为素因数7的指数,即,00=0。
[0338] 接下来的2位(权i=10至12)为素因数11的指数,即,00=0。
[0339] 接下来的2位(权i=13至14)为素因数13的指数,即,00=0。
[0340] 该提取过程需要对将高位屏蔽以恢复包含在低位中的素因数的指数,然后将恢复的位数的紧凑指数移位,以转至下一个素因数的指数。
[0341] 因此,在15维中,具有6个待选取的指数,开始于指数2。
[0342] 指数2二进制表示对应于18的4个最低位,即0 0 1 0,其对应于2。为了恢复它们,用15将18的高位屏蔽(记为18&15),15相当于:
[0343] 24-1=1 1 1 1。
[0344] 得到的结果是e12=18&(2<<4-1)=2,这意味着待分配至素数2的指数为2。
[0345] 然后将18右移4位,得到:000 0000 0001=1
[0346] 3的指数的二进制表示对应于1的3个最低位,即0 0 1(=1)。为了恢复它们,3
用7将1的高位屏蔽(表示为17&7,且值为2-1=1 1 1)。
[0347] 得到的结果是e112=1&(2<<3-1)=1,这意味着待分配至素数3的指数为1。
[0348] 然后将1右移2位,因而给出:000 0000=0,用于所有的其它高位。
[0349] 因此,如上所述,l=12的幂为:
[0350] -对于素数2,为2,而
[0351] -对于素数3,为1,
[0352] 即l=12=22×31
[0353] *分母的上限
[0354] 此处假定对于每一素因数,其在部分秩t′的分母中的指数小于或等于其在t′的分子中的指数。当t′是绝对负值时就是上述情况,这是因为 因此
[0355] 实际上,通过Schalkwijk公式,如果q>1,则值 为分母Pk的指数的最大值β′i的上限(如果q>1,Pk≤(n-1)!)。
[0356] 因此,检查不等式 就已足够,这已经由上述的确定βi的值的处理运算完成了。
[0357] 在其它情况下,可明确地搜索β′i,并利用βi和β′i的最大值来计算[0358] 在q=1的情况下,将会理解,公知秩(t=0)的单个码字包括在置换码中,因此,利用先验执行秩计算和相应的反运算是无用的。然而,如果不期望分别处理该特例,那么仍可以规定通过βi和 的最大值来计算 下表7示出了对于n=16的情况。
[0359]
[0360] 表7:对于16维的置换码计算分子βi和 (1≤i≤6)的上限
[0361] 接下来简单描述存储基本分解所需的存储容量。
[0362] 独立于所选的用于表示基本分解的方案,将基本分解存储在表中,并可在秩编码和译码运算中对该表进行寻址。虽然0的分解是不可能的(并且不使用),但可优选地为0的分解存储“哑”指数(例如0s或1s),以简化该寻址计算。下表8总结了在这两种情况下(存储和不存储0的哑分解),用于五种方案的、存储与基本分解相关的数据所需的存储容量。
[0363]
[0364] 表8:存储基本分解所需的存储器
[0365] 在第五方案中,考虑了位数 的存储(+mn!)。然而,实际上,如将在下面的实施方式中看到的那样,比从存储器中进行读取更优选的是,将其“硬连线”(将其值设定在计算程序中而不声明为变量)。因此,实际上,对其进行存储并没有意义。
[0366] 表9给出了对于nmax=8和15,存储与五个方案的分解的指数相关的数据所需的存储器(对0进行哑存储)。
[0367]
[0368] 表9:对于8维和15维的置换码,存储基本分解所需的存储器
[0369] 下面描述素因数幂的存储。
[0370] 在基本分解之外,本发明使用素因数幂来根据部分秩的分解计算部分秩。可根据这些素因数的表来实时(“在线”)计算其幂。优选地,预计算并除2之外的素数的幂并将其存储,而仅对2的幂进行实时计算。下表10a给出了8维置换码所需的3、5和7的幂(如同在AMR-WB+编码器中使用的幂)。表10b给出了最大15维的置换码所需的3、5、7、11和13的幂(如同在TDAC编码器中使用的幂)。
[0371]
[0372] 表10a:用于8维的置换码的素因数幂
[0373]
[0374] 表10b:用于15维的置换码的素因数幂。此处的变量Npfp表示待存储的素因数幂的数量。
[0375] 还是此处,对于每一素因数,可以只存储必要数量的幂。作为变体,如果优选地只具有可规律地寻址的幂的单个表,则可以规定对于每一素因数存储与所需的p2(p2=3)的幂的数量同样多的值。对于未使用的幂,当然可以利用例如1s或0s的哑值的存储。
[0376] 下面描述用于利用本发明进行编码的、置换的秩的计算。
[0377] 具有几种取决于所选的基本分解及其表示的集的变体。为了简便,下文中对可能的实施的说明仅限于用于基本分解集的优选实施方式的情况,其中,对阶乘l!和l进行分解。
[0378] 下面首先说明对于每一基本分解具有mn!个指数的、指数的展开表示的方案,这是最一般的情况。然后描述指数的展开表示的变体。最后,描述基本分解的指数的紧凑表示的方案及其一些变体。将会明显看到,本发明极好地适用于对置换的秩进行编码的处理运算。
[0379] 下面回顾Schalkwijk算法,作为列举处理的示例。
[0380] 分解的指数的展开表示
[0381] 令n为使用的置换码的最大维数,且mn!为包括在数n!中的素因数的数量。
[0382] 下面描述利用分解的指数的展开表示进行编码的第一实施方式
[0383] 根据第一实施方式的编码
[0384] 此处,l和l!的基本分解的指数优选地根据上文的表4d中的“第四”方案存储,其中用于l=0的哑存储位于两个单维表中,该两个表分别表示为Dl和Dl!且具有mn!×(n+1)个单元。如上所述,也可以考虑具有mn!列和(n+1)行的二维表。规则存储的l(或l!)的指数(均存储在mn!个值上)、读取基本分解的指数的运算需要表Dl(或Dl!)中的地址计算。为了读取l!(或l)的分解的指数,有必要指向表Dl!(或Dl)的地址(l×mn!)处,并因而标定指数 (或 )的地址,指数 (或 )位于下一地址(l×mn!+1)处,更普遍地,指数 (或 )位于地址(l×mn!+i-1)处。如上所述,在二维表中,指数(或 )位于地址((l;(i-1))处(列为(i-1)且行为l)。
[0385] 应注意到的是,如果未规定对l=0哑存储,那么l(l>0)的n个基本分解的表Dl中的地址计算为:(l-1)×mn!。
[0386] 初始化
[0387] ●将Pk的中间分解的mn!个指数初始化为零(其存储在具有mn!个单元且优选地在每一位置上进行更新的表P中,如将会参照下文中的步骤C-3看到的那样)。因而,指令如下:
[0388] ○P[i]=0,1≤i≤mn!
[0389] ●将秩t和q个权 也初始化为零(其存储在具有q个单元且将在每一位置上更新(下文中的步骤C-2)的表P中)。指令如下:
[0390] ○t=0
[0391] ○w[i]=0,0≤i<q
[0392] ○k=n-1
[0393] 索引k的迭代
[0394] 参见图5,进行n个位置上的迭代(通过变量k上的循环)。图5中的步骤C-n的符号中的字母“C”表示词“编码”。
[0395] 在步骤C-1中,读取变量dk。在步骤C-2对表w的单元dk进行更新:w[dk]=w[dk]+1。
[0396] 步骤C-3是对Pk(表P)的分解的指数的更新,其具体地通过:
[0397] -从地址mn!×w[dk]读取表Dl中的基本分解w[dk]的mn!个指数 (步骤C-31),且
[0398] -更新:对于1≤i≤mn!, (步骤C-32)。
[0399] 因此,为了实施步骤C-31,表Dl中的基本分解w[dk]的第一指数(表示为 )位于地址mn!×w[dk]处,第二指数(表示为 )位于地址mn!×w[dk]+1处,等等。更普遍地,指数 将位于地址mn!×w[dk]+i-1处。
[0400] 并行地,在步骤C-4中,根据普遍关系 计算Sk。
[0401] 步骤C-5是对Sk的值的测试。如果Sk为零(Y箭头),则意味着部分秩 为零(上文中的式(7))且秩t未改变,那么,处理继续进行随后的步骤C-11。否则(N箭头,Sk≠0),该处理继续进行步骤C-6,其中在表Dl的地址mn!×Sk处的读取基本分解的mn!个指数[0402] 并行地,步骤C-7在于,在表Dl!的地址mn!×(n-1-k)处读取基本分解(n-1-k)!的mn!个指数 将注意的是,如果和Sk不为零(测试C-5的输出否),则执行步骤C-7,以避免在(任何情况下)部分秩 为零时对表Dl!进行不必要的读取。
[0403] 在步骤C-8中,可以将表的不同读数的结果集合在一起,以根据以下关系式首先计算部分秩 的分解的mn!个指数:
[0404] 对于1≤i ≤mn!
[0405] 最后,在步骤C-9中,通过下式计算部分秩 本身:
[0406]
[0407] 如上所述,项w[dk]是必须小于或等于相关置换码的最大维数n的权。类似地,该权的和Sk仍小于最大维数n,并当然对于(n-1-k)同样适用。w[dk]、Sk和(n-1-k)!的分解实际上已在范围高达最大维数n的整数或整数阶乘的分解的表中列出,如表4d。根据表中列出的分解w[dk]以及在前述循环(k-1)上确定且保存在存储器中的Pk-1的分解,Pk的分解被确定。
[0408] 作为图5的部分秩计算步骤的纯粹说明性的示例,考虑维数n=8且q=4的置换码。在该示例中,指数被存储在具有4列和9行并因而包括36个单元的二维表中。因此,其可以从上文中给出的表4d中提取,其中列pi=2,3,5,7且行l=0,…,8。
[0409] 在该示例中,假定在前述的位置k=3处,权w的表为{1,1,0,3}且因而P3=1!1 1 0 0
10!3!=6。因此,P3(=2×3x5×7)的分解的指数的表P为{1,1,0,0}。
[0410] 在位置k=2上,对于步骤C-1,假定d2=2已经被读取。
[0411] 在该示例中,在步骤C-2中,通过将单元W[2]加1(W[2]=0+1=1)而将其更新。
[0412] 在步骤C-31中,读取1(=W[2])的分解的四个指数,即,0,0,0,0(参见表4d,第6至第9列和l=1的第3行)。
[0413] 然后(步骤C-32),表P被更新,因此得到P={1,1,0,0}。
[0414] 在步骤C-4中,计算Sk:Sk=w[0]+w[1]=1+1=2。因此,Sk不为零(测试C-5)。
[0415] ○读取Sk的分解的四个指数(步骤C-6)(仍参见表4d,第6至第9列,但l=2的第4行):对于p1=2(第6列),指数为1,对于pi=3,5,7(第7至第9列),指数为零。
[0416] ○仍参见表4d,读取5!(对应于(n-1-k)!)的分解的四个指数(步骤C-7),但是此时是在第2至第5列的l=5的第7行。对于p1=2(第2列),指数为3。对于p2=3(第3列),指数为1,对于p3=5(第4列),指数也为1。另一方面,对于p4=7(第5列),指数为零。
[0417] ○在步骤C-8中,计算部分秩 的分解的四个指数:
[0418] ○对于p1=2,
[0419] ○对于p2=3,
[0420] ○对于p3=5,
[0421] ○对于p4=7,
[0422] 在步骤C-9中,根据分解的指数计算部分秩 :23×30×51×70=40。
[0423] 再次参见图5,在步骤C-10中,通过根据关系 进行更新(加上在步骤C-9中得到的部分秩 )而确定置换的总秩t。
[0424] 然后,步骤C-11旨在递减变量k(k=k-1),且步骤C-12是对k值的测试,以确定是否继续处理。因此,如果k≥0(测试C-12输出“是”),处理运算的步骤则从第一步骤C-1开始重复,其中将k的值减去一个单位。否则(测试C-12输出“否”),该处理则终止在结束步骤C-13中(“结束”)。
[0425] 因此,将会理解,上述步骤C-9根据在步骤C-8中确定的部分秩的分解计算部分秩,部分秩的分解根据三个中间分解确定:
[0426] -(n-1-k)!
[0427] -Sk,以及
[0428] -Pk。
[0429] 在步骤C-6和C-7中执行的其中两个((n-1-k)!和Sk)的确定包括在基本分解的各表Dl和Dl!中的简单读取。第三中间分解(Pk的分解)的确定也可以简单地根据在表Dl!中读取的、w[d]!的q个基本分解而按照以下关系式执行:
[0430] 1≤i≤mn!.
[0431] 直接变体
[0432] 步骤C-3表示了确定该中间分解的更为有利的变体。实际上,Pk的中间分解可根据在表Dl!中读取的基本分解和被计算用于另一部分秩 的另一中间分解(Pk+1的中间分解)(例如k的迭代中的在先的部分秩 )而确定。更普遍地,在本发明的变体中,中间分解也可以根据用于至少一个其它部分秩的先前确定的至少一个中间分解而推出。
[0433] 在上文中,秩的计算通过从最后位置(k=n-1)到第一位置(k=0)的循环来执行。然而,本发明当然也适用于从第一位置到最后位置的循环。所有需要的是改变初始化相位并调整步骤C-2和C-3及其次序。为此,权w的表可以用q个权 进行初始化。然后,对于从0到q-1的d,在表Dl!中读取w[d]!的分解的mn!个指数,以通过累加中间分解的表的mn!个值(P0的分解的指数)来进行计算。
[0434] 然后,在步骤C-10之后且在步骤C-2之前进行步骤C-3。通过从P[i]中减去w[dk]的基本分解的指数 ( 对于1≤i≤mn!)而对P的中间分解进行更新。然后,通过将w[dk]的值递减1(w[dk]=w[dk]-1)而进行步骤C-2。步骤C-11可以标定为将变量k递增1,而步骤C-12简单地测试是否k=n。
[0435] 应简要地注意,对于具有可变维数n的置换码,比执行 个运算更优选的是,在初始化之后读取mn!以仅执行mn!次运算。
[0436] 第一实施方式的一般变体
[0437] 更普遍地,在图5中示出的用于根据本发明的编码的实施允许多个变体。
[0438] 因此,在第一变体中,(l或l!的)每一基本分解还包含数ml!。数ml!(0≤l≤n)的读取提供了有利条件。实际上,步骤C-3以及C-6至C-10不再均执行mn!次,而是:
[0439] ○对于步骤C-3,仅执行 次,
[0440] ○对于步骤C-6和步骤C-8的 的相加,仅执行 次,并且
[0441] ○对于步骤C-7和C-9以及步骤C-8的 的相减,仅执行m(n-1-k)!次。
[0442] 此外,如果已存储了值ml,那么仅需执行:
[0443] ○步骤C-3 次,且
[0444] ○步骤C-6 次以及步骤C-8的相加。
[0445] 在编码的另一变体中,如果如果除此之外还根据第三方案(上文的表4c)使用了l的基本分解的指数的存储,则可对 个值执行步骤C-3。类似地,对 个值执行步骤C-6。在步骤C-8中,不提供m(n-1-k)!个相加和m(n-1-k)!个相减,而是将待执行的相减的数量保持为m(n-1-k)!但是仅需要 个相加。具体地:
[0446] ■ 对于1≤i≤m(n-1-k)!
[0447] ■且 对于
[0448] 在第三变体中,不将部分秩分解为三项(分子中两项,分母中一项),而是将其分解为两项,其中之一为商。因此,部分秩 被分解为两项:
[0449] -和Sk
[0450] -商
[0451] 该商可以由下列关系更新:
[0452]
[0453] 因此,不根据q+1个基本分解(在表Dl!中读取的(n-1-k)!的分解以及q个w[dk]!的分解)确定Rk的分解,而是更优选地根据Rk+1的中间分解以及(n-1-k)的和w[dk](这两个基本分解是在表Dl中读取的)的基本分解确定Rk的中间分解,其表示为:
[0454] 与前述变体相比,不用确定和存储 的分子的中间分解(表P),而是确定商Rk的中间分解然后将其存储(为此目的提供表R)。将表P初始化为零替代为将该比率的指数的表R初始化为零。步骤C-3变为用于更新表R的简单步骤(通过读取(n-1-k)和w[dk]的基本分解的指数),该步骤表示为:
[0455]
[0456] 根据存储选项,该更新可以通过进行mn!个相加和相减或m(n-1-k)!个相加(或者个相减),或者甚至m(n-1-k)个相加(或者 个相减),或者仅对于w[dk]和(n-1-k)的非零指数进行m′(n-1-k)个相加和 个相减而实现。步骤C-8则仅包括以下类型的相加:
[0457]
[0458] 根据存储选项,然后计算mn!个相加或 个相加,或者甚至 个相加,或者仅对于Sk的非零指数进行的 个相加。
[0459] 将要注意的是,比率Rk不必是整数,这意味着指数R[i]可以是负数。在该变体中,编码中的阶乘的分解(因此为表Dl!)不再有用,从而可通过仅存储表Dl来使用整数l(l≤n)的(n+1)个基本分解的简单集。
[0460] 分解的指数的紧凑表示
[0461] 现在基于分解的指数紧凑表示对编码的第二实施方式进行描述。
[0462] 如上文中参照第一实施方式所述,将基本分解的指数紧凑地表示,而不再以展开形式表示。出于简洁的目的,只说明指数的紧凑表示包含在单字中的情况。因此,将这些字如上述地储存,且在分别表示为D′l和D′l!的两个具有(n+1)个单元的表中存储l=0的哑字。包含基本分解的指数的字的两个表中的地址计算是直接的,因为为了读取l!(或l)的分解的字,所需要的仅是指向表D′l!(或D′l)的地址l。
[0463] 要注意的是,在没有存储用于l=0的哑字的情况下,对应于基本分解l(l>0)的字位于表D′l的地址(l-1)上。
[0464] 根据第二实施方式的编码
[0465] 初始化
[0466] ●将包含Pk的中间分解的mn!个指数的紧凑表示的字ep初始化为零:
[0467] ep=0
[0468] 字ep会在每一个位置更新(下面的步骤CC-3)。
[0469] ●如前所述,将存储在具有q个单元的表w中的秩t和q个权 也初始化为值零。相应的指令是:
[0470] ○t=0
[0471] ○w[i]=0,0≤i<q
[0472] ○k=n-1
[0473] 在n个位置上的迭代(对k进行循环)
[0474] 现在参考图6说明该第二实施方式中的编码的主要步骤。图6中的步骤符号“CC-n”中的字符“CC”表示用“紧凑表示”进行“编码”。
[0475] 在步骤CC-1中,读取变量dk。步骤CC-2包含变量w的更新:w[dk]=w[dk]+1。
[0476] 步骤CC-3是字eP的更新,具体地:
[0477] -在步骤CC-31中,读取表D′l中包含w[dk]的分解的指数的紧凑表示的字然后,
[0478] -在步骤CC-32中,更新字:
[0479] 同时,在步骤CC-4中,计算和Sk: 后续步骤CC-5是对Sk的值的测试。如果和Sk是零(箭头“否”),索引k则直接减一。否则(在测试步骤CC-5输出箭头“是”),程序则继续到步骤CC-6中,读取表D′l中的包含Sk的分解的指数的紧凑表示的字[0480] 同时(并且有利地依据测试步骤CC-5的结果),在步骤CC-7中,在表D′l!中读取包含(n-1-k)!的指数的紧凑表示的字e(n-1-k)!。
[0481] 在步骤CC-8中,将从步骤CC-3、CC-6、CC-7获得的结果汇总在一起,以通过两个简单的运算(优选地在加运算后进行减运算),计算包含部分秩 的指数的紧凑表示的字[0482] 然后,
[0483] 步骤CC-9的目的是通过如前所述的对字的位进行适当的移位来抽取部分秩 的分解的mn!个指数 为此,提供对从1到mn!的索引i的循环(将i在步骤CC-91初始化为1,在步骤CC-93测试i值,在步骤CC-94将i递增直到其达到mn!的值)。这样,则已在如下类型的指令步骤CC-92应用i的每一个循环:
[0484] i′1)
[0485] i′2)
[0486] 符号“<<b”和“>>b”分别表示b位的左移位和右移位。另外,符号“&”表示按位进行的“与”逻辑运算符。指令i′1)包括恢复 的 个低位。实际上,对应于指令的掩码是硬连线设置的。
[0487] 换句话说,高位的掩码 应用于开始时(循环索引等于1时),这样可以首先仅恢复 的 个低位,从而给出与第一素因数p1相关的指数
[0488] 于是:
[0489] -将 的位“向右”移动 位,以恢复最高序位并给出与高位的下一个素因数p2(掩码 )相关的指数,
[0490] -然后指数 得以抽取,
[0491] -然后进行 位的右移,
[0492] 依此继续,直到i=mn!。
[0493] 接下来的步骤CC-10包括如下计算部分秩
[0494]
[0495] 然后,将部分秩 加到总秩t上(在步骤CC-11中, )。
[0496] 在下一步骤CC-12中,将索引k的值递减(k=k-1),并且该递减是在用递减后的值重新开始步骤CC-4、CC-1、CC-7以及后续步骤之前进行。在测试步骤CC-13中进行检查以确定k的值是否还未达到-1,如果达到了-1(k<0),则程序终止(步骤CC-14)。
[0497] 所以,不考虑分解的表示,本发明就可有效地计算部分秩。步骤CC-10的目的是根据在之前的步骤CC-8和CC-9中确定的部分秩的分解计算部分秩。使用了三个中间分解((n-1-k)!、Sk和Pk的分解)。在步骤CC-6和CC-7中执行的其中两个((n-1-k)!和Sk)的确定在于,在表D′l!和D′l中简单地读取其紧凑表示。在步骤CC-3中执行的第三中间分解(Pk)的确定也需要对表D′l进行读取,然后通过加上已读取的基本分解的紧凑表示来更新该中间分解的紧凑表示。
[0498] 根据前述的第一实施方式,值ml!(0≤l≤n)的存储可降低步骤CC-9和CC-10的复杂性。抽取部分秩 的分解的指数的循环执行m(n-1-k)!次而不是mn!次。类似地,步骤CC-10不再包含mn!次乘法,而是包含m(n-1-k)!次乘法。
[0499] 现在说明采用本发明进行的置换的秩的解码。
[0500] 这里,依据基本分解的表示(展开的或紧凑的)的技术方案,存在一些变体。下面,类似于上文对编码的第一实施方式的描述,根据根据参照表4d给出的第四方案,利用分解的展开表示及其存储,对解码的第一实施方式进行描述。显而易见的是,以Schalkwijk算法为例,本发明优选地可应用于置换的秩的解码。
[0501] 根据第一实施方式的解码
[0502] 对分解的指数使用展开表示的解码优选地以如下的数据初始化开始。
[0503] 初始化
[0504] ●将值w的表用q个权 初始化(在将在下面说明的步骤D-19中,在每一个位置上的循环的尾部对w进行更新)。适当的指令可以是以下类型:
[0505] ○ 0≤i<q
[0506] ●计算项P0的分解的mn!个指数(将其存储在具有mn!个单元的表P中,并在下文中将描述的步骤D-18在每个位置的循环的末尾对其进行更新),适当的指令可以是以下类型:
[0507] ○P[i]=0,1≤i≤mn!
[0508] ○从d=0到q-1的循环
[0509] ■读取表Dl!中的、 的分解的mn!个指数
[0510] ■然后, 其中1≤i≤mn!
[0511] ●最后,初始化k=0
[0512] 现在参考图7以说明根据第一实施方式的解码的主要步骤。图7中步骤D-n的符号中的字符“D”表示“解码”。
[0513] 在n个位置上迭代(对索引k的循环)
[0514] 第一步骤D-1在于从表Dl!中读取(n-1-k)!的分解的mn!个指数
[0515] 下一个步骤D-2设置值dk=0以及
[0516] 接下来是搜索字母表的dk的第一值,以使w[dk]≠0。为了这个目的,提供测试步骤D-3以检查是否w[dk]=0,如果w[dk]=0(箭头“是”),则将dk的值递增(dk=dk+1),并且重复测试步骤D-3,直到发现非零的w[dk]值。如果已发现该值(w[dk]≠0的箭头“否”),下一步骤则对秩t的值进行测试的步骤D-5。如果秩是零(测试步骤D-5输出箭头“是”),那么,采取接下来的步骤都是无意义,直到Pk的指数被更新(步骤D-18)。如果秩不是零(测试步骤D-5输出箭头“否”),程序则继续执行后续步骤D-6和D-7,其中分别设置Sk=0和中间值
[0517] 下一步骤D-8是用于更新和Sk=Sk+w[dk]的计算。随后对和Sk的分解的mn!个指数 的表Dl进行读取。
[0518] 步骤D-10的目的是根据关系式 (其中1≤i ≤mn!),计算部分秩的分解的mn!个指数 在当前循环的末尾对如上初始化的指数P[i]在步骤D-18更新以用于下一个循环,此步骤将在后面说明。
[0519] 步骤D-11的目的是计算部分秩:
[0520] 接下来的三个步骤的目的是通过将总秩t的值与部分秩比较而计算总秩t的值。为了实现此目的,在步骤D-12中,将dk的值递增(dk=dk+1),并且在测试步骤D-13测试:
[0521] 如果满足该不等式(箭头“是”),步骤D-7到D-13则以dk递增后的新值进行重复。否则(箭头“否”),程序则执行步骤D-14,用于递减dk(dk=dk-1)以在步骤D-12前返回到dk值。对于dk的该值,部分秩 取上述的中间值Ik(步骤D-15: )。于是,秩t得到更新,成为 (步骤D-16),并且根据表Dl中w[dk]的分解的mn!个指数 的读数将Pk的指数更新(步骤D-17)。接下来,适当地更新指数为 其中1≤i≤mn!
(步骤D-18)。然后将w[dk]的值递减(在步骤19,w[dk]=w[dk]-1),并将索引k的值递增(步骤D-20,k=k+1),以准备下一个循环。
[0522] 在返回第一步骤D-1前,进行检查以确保还有n个分量未被处理。为此,提供测试步骤D-21,通过将k的值与n进行比较(k<n),对k的值进行测试。只要索引k还未达到值n(测试D-21输出为箭头“是”),处理则在下一个k值的步骤D-1重新开始。否则(在步骤D-21输出处的箭头“否”),处理则在结束步骤D-22终止。
[0523] 应当记住,步骤D-11的目的是通过根据项(n-1-k)!、Sk和Pk三个中间分解利用在步骤D-10中确定的部分秩的分解来计算该部分秩。在步骤D-1和D-9中执行的其中两个((n-1-k)!和Sk)的确定包括在各表Dl!和Dl中的简单读取。在步骤D-18中确定的第三中间分解(Pk)也通过读取表Dl(步骤D-17)、接着通过将中间分解的指数减去已被读取的基本分解的指数而对其进行更新(步骤D-18)。上述对中间分解的初始化需要对表Dl!进行q次读取,然后通过将中间分解的指数加上q个基本分解读数而对其进行更新。
[0524] 关于上文描述的编码,图7的处理允许可在合适的情况下降低某些步骤的复杂性的变体。
[0525] 涉及比率Rk(如前所述)的指数的使用的变体尤其值得注意。实际上,在上述参考图7描述的解码运算过程中,对于给定的位置k,对多个d值计算指数 对于测试的每一个d值,对于每个指数而言,其它变体需要进行减和加 但是,使用比率Rk的指数的变体仅需要进行加法 这是因为对于给定的位置k,仅
有和Sk及其指数 是根据d变化的。
[0526] 根据第二实施方式的解码
[0527] 现在参考图8说明使用分解的紧凑表示进行解码的实施例。
[0528] 首先,将数据如下初始化。
[0529] 初始化
[0530] ●应先参考具有q个单元的表w以确定项 其中0≤i<q。
[0531] ●计算包含Pk的分解的mn!个指数的紧凑表示的字eP。为此:
[0532] ○设置eP=0
[0533] ○提供从d=0到q-1的循环:
[0534] ■在表D′l!中读取包含 的mn!个指数的紧凑表示的字
[0535] ■更新
[0536] ●然后设置k=0
[0537] 在n个位置上迭代(对索引k的循环)
[0538] 图8中的步骤DC-n的符号中的字符“DC”表示采用“紧凑表示”进行“解码”。
[0539] 步骤DC-1,在表D′l!中读取包含项(n-1-k)!的mn!个指数的紧凑表示的字e(n-1-k)!。
[0540] 步骤DC-2到DC-8与上文中参考图7描述的步骤DC-2到DC-8类似。
[0541] 另一方面,在步骤DC-9中,读取包含在表D′l中的和Sk的mn!个指数的紧凑表示的字 然后,在步骤DC-10中,计算包含部分秩 的指数的紧凑表示的字,优选地如下计算:
[0542] 然后
[0543] 总体步骤DC-11总体上在于部分秩 的指数的抽取。为此,规定:
[0544] -对i(1≤i≤ml!)进行循环(在步骤DC-111中将i初始化为i=1,然后抽取指数 (步骤DC-112,下文将描述),将循环索引i与值mn!进行比较(步骤DC-113),将索引加1(步骤DC-114)直到其达到值mn!);
[0545] -抽取指数 (步骤DC-112):
[0546] 通过用掩码 屏蔽 的高位而将其在紧凑指数 的低位表示:
[0547]
[0548] 在屏蔽后,将紧凑指数 右移 位:
[0549]
[0550] 总体步骤DC-11与图6中用于编码的总体步骤CC-9类似。
[0551] 步骤DC-12到DC-17类似于参考图7中以展开表示进行解码的步骤D-11到D-16类似。
[0552] 另一方面,通过在步骤DC-181在表D′l中读取包含w[dk]的mn!个指数的紧凑表示的字 并在步骤DC-182对Pk的指数进行适当的更新 而实现总体步骤DC-18中对Pk的指数(表P)的更新。
[0553] 然后,步骤DC-19到DC-22类似于图7中采用展开的分解进行解码中的步骤D-19到D-22。
[0554] 现在说明上述变体提供的各种优点。
[0555] 使用ml!(和/或ml或m′l)的表并具有展开表示的第一实施方式的变体比仅使用mn!的表的主实施方式包含更少的加/减运算。
[0556] 在该情况下,首先,对于最后的位置,复杂性的降低是非常显著的(即,当m(n-k)!,m′l或ml小于mn!时)。但是,这种复杂性的降低伴随着存储器读取步骤(C-31、C-6和C-7)的复杂性的提高。另一方面,尽管待读取的值更少了,但是地址计算更复杂。
[0557] 值得注意的折衷方案包含规律地存储基本分解(具有mn!个指数),以帮助实现表Dl和Dl!的寻址,然后将值ml!储存在具有(n+1)个单元的表Dm中。然后,应存储值ml,以有效地减少加/减的数量。但是,该措施必然伴随着在步骤C-6和D-9(或C-3和D-19)之前读取值 而值m(n-k)!必须仅在k的每次迭代开始时读取。
[0558] 另外,与展开表示相比,紧凑表示的益处如下:
[0559] -更新表P的步骤仅包括在编码中(或在解码中)进行单一的加(或减),[0560] -指数 的计算也仅需要单一的加和单一的减,
[0561] -用于读取字eK的地址计算是直接的,并对于每一个值K仅需要单一的存储器访问和读取。
[0562] 但是,紧凑表示需要抽取包含在字 中的部分秩 的指数(步骤CC-9和DC-11)。但是,如会在下述内容中看到的,对于根据部分秩的素因数分解计算部分秩而言,该操作不一定是缺点。
[0563] 现在说明用于根据部分秩的素因数分解计算部分秩的这些变体的优点。
[0564] 对于编码中(或解码中)步骤C-9和CC-10(或D-11和DC-12),用于计算素因数幂的乘积的步骤的复杂性随着因数数量的增加显著地增加,即使其仍然远不如现有技术中的除法复杂。现在,实际上,部分秩分解中的许多指数都是零,因此其相应的幂都为1。经常地,所有的指数都是零,或者仅第一指数是非零。所以,能够仅检测并保持非零的指数幂是有用的。在详细表示中,该检测可仅通过mn!个测试或m(n-1-k)!个测试(每个检测用于一个素因数)而执行。
[0565] 有利地,紧凑表示使得通过单次测试就能测试出所有的指数是否为零(是否),并且如果是的话,则秩t′=1。另外,对et′的高位的检测使得可获得秩t′中最大非零指数素因数的索引,并可减少编码中的步骤CC-9(或解码中的DC-11)的循环的重复次数。
[0566] 但是应该注意,对如紧凑表示的详细表示中的非零指数的检测会增加复杂性。如果所有的指数都是非零的,素因数的幂的乘法的复杂性则会保持不变,且该复杂性然后会因检测非零指数的过程的复杂性而增加。
[0567] 因此,在第一变体中,只有当素因数的可能的数量变得很大(k远小于n)且其幂的乘法的复杂性高于检测过程的复杂性时,才能进行零指数的检测。为此,可提供根据位置的不同循环,即使该实施会以指令行的增加为代价。
[0568] 也可将展开表示和紧凑表示相结合。对于最后的位置(低的ml!值),中间分解的计算几乎不需要运算。于是,使用展开表示是受到欢迎的,因为这种表示不需要抽取部分秩的指数。另一方面,对于第一位置,使用紧凑表示则更加受到欢迎。
[0569] 现在说明现有的编码器/解码器的一些示例性实施。
[0570] 3GPP AMR-WB+编码器
[0571] 3GPP AMR-WB+编码器(标准[3GPPTS26.304])采用代数矢量量化,其字典是8维的Gosset RE8网络的置换码的并集。
[0572] TCX技术对应于通过变换的预测编码。更具体地,其包括在感知加权滤波后应用的FFT变换编码方法。在标准[3GPPTS26.304]中,将获得的FFT谱分割为8维的子波段(或子矢量),并且对这些子矢量分别地编码。子矢量的量化采用常规的断点网络(network ofpoints)RE8。8维量化字典由从断点网络RE8获得类型I的置换码的并集构成。
[0573] 在根据标准[3GPPTS26.304]的TCX编码器中,每一个置换码对应于给定的8维带符号前导矢量。网络RE8的断点的量化索引由以下类型的公式计算:
[0574] 索引=基数偏移+置换的秩
[0575] 秩由Schalkwijk公式计算,而将基数偏移制成表格。然而,这些带符号的前导通过其绝对前导表示,以优化存储和置换码中的搜索。相关联的绝对前导的列表可在以下参考资料中找到:
[0576] 由Ragot S.、Bessette B.和Lefebvre R.在2004年5月的ICASSP会议论文集的第1卷第501-4页发表的论文“Low-complexity multi-rate lattice vector quantization with application to wideband TCX speech coding at 32kbit/s(应用于32千位/秒的宽带TCX语音编码的低复杂性的多速率点阵矢量量化)”。
[0577] 为了说明本发明的不同变体,下面介绍三个示例性实施。前两个示例性实施关于置换的秩的计算(编码),一个采用分解的展开表示,而另一个采用紧凑表示。
[0578] 在下述的这些示例性实施以及相应的附录中,表R和P的索引为从R[0]到R[mn!-1]和从P[0]到P[mn!-1](而不是如上文的示例中介绍的从1到mn!),而对秩的计算的处理没有特别的影响。
[0579] 第一示例性实施(编码)
[0580] 在该实施方式中,采用基本分解的展开表示。
[0581] 其指数存储在两个具有36个单元(=(8+1)x4)的表中。这些表在附录A-11中给出,并且表示为Dl[36](包含整数l(0≤l≤8)的分解的指数,因而对于0,存储哑分解)以及Dl![36](包含其秩的分解的指数)。
[0582] 3、5和7的幂的三个表也被存储:
[0583] Pow3[4]={1,3,9,27}
[0584] Pow5[3]={1,5,25}
[0585] Pow7[3]={1,7,49}
[0586] 在该实施方式中,部分秩的分解是根据两个中间分解而确定,这两个中间分解中的一个是整数Sk的基本分解,而另一个是如下的商的中间分解:
[0587]
[0588] 如上所示,比根据对应于(7-k)!和 的(q+1)个基本分解确定中间分解更优选的是,根据Rk+1的中间分解和(7-k)和 的两个基本分解确定该中间分解。该中间分解的四个指数存储在表R中。
[0589]
[0590] 表11:用于位置k的部分秩的项的分解并用于8维置换码的ml或ml!的最大值[0591] 本发明利用上表11中每个位置显示的 和 的最大值以及m(7-k)!的知识,从而不用计算索引大于这些限制的素因数的指数。
[0592] 附录A-12给出了相应的过程。要注意的是,在这些位置上的循环被展开。还要注意的是,商的素因数pi的指数存储在具有4个单元的表R的单元R[i-1]中。
[0593] 第二示例性实施(编码)
[0594] 在3GPPAMR-WB+编码器的变体中,基本分解以紧凑的方式表示。将包含其指数的字存储在两个具有9(=(8+1))个单元的表中。参考附录A-21,表D′l包含用于整数l(0≤l ≤8)的分解的字(因而具有对l=0的分解的哑存储),并且表D′l!包含用于其秩的分解的字。
[0595] 3、5和7的幂也存储在具有12个单元(具有用于未使用的幂的0的空存储)的表Pow[12]中。
[0596] 部分秩的分解根据三个中间分解确定,其中两个是整数Sk和秩(7-k)!的基本分解,而第三个是如下所示的、部分秩的分母的中间分解:
[0597]
[0598] 如前所述,比根据 的q个基本分解确定Pk的中间分解更优地,根据Pk+1的中间分解和 的基本分解确定该分解。包含该中间分解的四个指数的紧凑字在附录A-22中记为“eP”。同样,“el”表示包含部分秩的分解的四个指数的紧凑字。
[0599] 这里,再次应用m(7-k)!的知识,以仅抽取表示部分秩的分解的、紧凑字的m(7-k)!个指数。
[0600] 相应的处理是附录A-22的主题。这里,在所述位置上的循环也是展开的。
[0601] 第三示例性实施(解码)
[0602] 第三示例性实施处理在3GPP AMR-WB+解码中进行的置换的秩的解码。
[0603] 如在第一示例性实施例中一样,优选地使用基本分解的展开表示,并如在第二示例性实施例中一样,优选地使用部分秩的三项分解。但是,在位置上的循环是未展开的。
[0604] 如前所述,Pk的中间分解是根据的Pk-1的中间分解以及 的基本分解来确定,而不是根据基本分解来确定。此中间分解的四个指数都被存储于表P中。与此相似,根据Pk的中间分解和(7-k)!的基本分解,能计算另一个中间分解(商的中间分解),其指数存储于表R中。
[0605] 相应的处理是附录A-3的主题。应当注意的是,商(或乘积)的素因数pi的指数存储于具有四个单元的表R的单元R[i-1]中(或表P的单元P[i-1])。
[0606] 因此,以上第一示例在两项(包括商)中使用了部分秩的分解,另外两个示例在三项中(分子两项,分母一项)使用了分解。用于解码的模式仅使用了m8!(=4)项,但是用于编码的两个模式使用了单独的位置处理以使用ml!或ml个项,所述ml!或ml项不被读取,但却通过在Gosset网络的断点的八个位置上打破循环而“硬连线”于算法中。
[0607] TDAC解码器的示例性实施
[0608] 最终的示例性实施涉及申请人的TDAC感知式频率解码器,所述解码器用于对以16kHz(多种频率)采样的数字音频信号进行解码,以下将说明所述解码器的原理。
[0609] TDAC解码器使用最大维数为15的、具有可变的维数和分辨率的统计矢量量化。
[0610] 关于8维常规断点网络RE8的置换码,本发明基本上可以降低复杂性。但是,就使用维数大于12的置换码的TDAC解码器而论,本发明显示出极大的优势,因为其不仅允许降低复杂性,还能使解码器在最大精度限制为无符号32位整数的定点处理器上的实现。如果没有本发明,这种实现将是非常复杂的。
[0611] 此解码器的原理如下。
[0612] 将带宽被限定为7kHz且以16kHz采样的声频信号再分为具有320个(20ms的)采样的。将改进的离散余弦变换(MDCT)应用于具有50%的重叠的640个采样的输入信号块(相当于每20ms刷新一次MDCT分析)。通过将最后31个系数都设置为零(因此仅有前289个系数不为零)来将频谱限定为7225Hz。根据此频谱确定屏蔽曲线,并将所有被屏蔽的系数设置为零。将所述频谱分为32个宽度不相等的频段。任意被屏蔽的频段都根据信号的变换系数来确定。对于所述频谱的每个频段,计算MDCT系数的能量(以估计比例因数)。由32个比例因数组成信号的谱包络,然后在所述帧内进行量化、解码以及传递所述信号。位的动态分配基于用于根据谱包络的量化形式计算出的每个频段的屏蔽曲线,以便在编码器和解码器的二进制分配之间后获得兼容性。然后,由矢量量化器利用在大小上嵌套的字典将每个频段中的标准化的MDCT系数进行量化,所述字典由Ⅱ型置换码的并集组成。最终,将语调和声音信息以及谱包络和编码系数都在帧内多路传输并传送。
[0613] 此时,用于计算置换的秩(解码)的示例性实施使用分解的紧凑表示。所使用的置换码的维数是可变的,在所述位置上的循环不是展开的。此实施例图示出对部分秩的分解的非零指数进行检测的方法。
[0614] 在此,基本分解被紧凑表示。包括其指数的字被存储于两个具有16个(=(15+1))单元的表中。在附录B-1中,表 包含用于整数l(0≤l≤15)的分解的字,且表 包含用于其秩的分解的字。
[0615] 3的幂也被存储于具有八个单元的表中(表示为Pow3),且5、7、11以及13的幂被存储于具有二十个单元(具有用于未使用的幂的哑存储)的表中(表示为Pow)。
[0616] 相应的处理被重新转录在附录B-2中。
[0617] 当然,本发明并不局限于以上以示例方式描述的实施例,而是还包含其它的变形
[0618] 对于申请人的知识,本发明包括置换码中的素因数幂分解的第一使用。但是,如同在以置换码进行的矢量量化中一样,当提供组合的表示计算时,这种使用尤其有利。因此,一般地,本发明的目的在于,在用一个或多个置换码进行的编码/解码中的、用于任何组合表示(即使不同于置换的秩)的素因数幂分解的这种使用。
[0619] 有利地,本发明能够应用于语音信号的编码/解码中,例如在电话终端中,尤其是蜂窝式电话终端中。但是,本发明也应用于其它任意类型的信号(尤其是图像或视频信号)的编码/解码以及编码调制。
[0620] 本发明的目的还在于使用置换码的、设计以存储于数字信号编码/解码装置的存储器中的计算机程序。因而,此程序包括用于执行本发明意义上的方法的步骤的指令。特别是,以上描述的图4至图8能够对应于这种程序可包括的算法流程图
[0621] 本发明的目的还在于一种数字信号编码/解码装置,参考图9,所述数字信号编码/解码装置使用置换码并包括:
[0622] -存储单元MEM,其用于存储前面提到的类型的计算机程序的指令,以及预先记录的所选整数的分解的表示,以及
[0623] -计算模块PROC,其访问存储单元MEM以执行本发明意义上的方法。
[0624] 这些装置MEM、PROC能够被设计为:
[0625] ●根据所选的码矢量y给出置换的秩t(图9中的实线箭头):
[0626] ○在信源编码器的索引模块中,或者
[0627] ○在信道解码器的索引模块中,
[0628] ●或者根据置换的秩t给出待重构的码矢量y(图9中的虚线箭头):
[0629] ○在信源解码器的解码模块中,或者
[0630] ○在信道编码器的编码模块中。
[0631] 当然,存储器MEM中的预先记录的表示可以是地址内容的形式(展开表示)或者是位字的形式(紧凑表示)。
QQ群二维码
意见反馈