数字信号的改良编码/解码,尤其是用置换码进行矢量量化的编码/解码

申请号 CN200780005870.6 申请日 2007-02-13 公开(公告)号 CN101385245A 公开(公告)日 2009-03-11
申请人 法国电信公司; 发明人 史蒂芬·拉格特; 克劳德·拉姆博林;
摘要 本 发明 涉及数字 信号 的编码/译码,尤其是利用包含组合表示的计算的置换码。根据本发明,组合表示由素因数幂分解表示,通过对所选整数的分解的、预先记录的表示进行初步读取而确定。
权利要求

1.一种使用置换码对数字信号进行编码/译码的方法,所述置换码 包括组合表示的计算,
其特征在于,所述组合表示由素因数幂分解来表示,并通过对所 选整数的分解的、预先记录的表示进行存储器读取来确定。
2.如权利要求1所述的方法,其特征在于,所述预先记录的表示 包括表示用于每个所选整数的指数的值,所述值分别与表示连续素数 的值相关联地存储。
3.如权利要求1或2所述的方法,其特征在于,所述组合表示包 括整数(l)的阶乘值(l!),并且所述预先记录的表示至少包括阶乘值(l!) 的分解的表示。
4.如前述任意一项权利要求所述的方法,其特征在于,至少一个 所述组合表示(t′)包括整数分子(v)除以整数分母(ρ)的商,并且所述商由素 因数幂分解来表示,其中,每个幂均为分配给同一个素数(pi)的、分别与 所述分子(v)和所述分母(ρ)相关联的指数的差()。
5.如前述任意一项权利要求所述的方法,其特征在于,所选整数 的预先记录的表示存储在可寻址的存储器中,并且所述存储器的寻址 提供待分配至各素数的一连串指数,以重构所选整数。
6.如权利要求5所述的方法,其特征在于,所选整数的预先记录 的表示以一连串地址的方式存储,其中,用于每个素数的地址均给出 待分配至所述素数的指数,以重构所述所选整数。
7.如权利要求1至4中的任意一项所述的方法,其特征在于,所 述预先记录的表示以包括一连串位组的字的形式存储,其中每个位组 均具有:
-取决于素数的权,以及
-取决于将与所述素数相关联的指数的值。
8.如权利要求所述7的方法,其特征在于,通过将至少一个局部 掩码连续地应用于位字,并通过根据位权的连续偏移和剩余位的读取, 而确定所述素因数的幂。
9.如权利要求2所述的方法,其特征在于,对于组合表示的计算, 所述方法包括以下步骤:
-根据所选整数识别出现在形成所述组合表示()的乘积和/或商中 的项((n-1-k)!,Sk,Pk);
-在存储器中读取包括在所述项的素因数分解中的指数(ei(n-1-k)!,eisk, eiPk);以及
-加上和/或减去所读取的指数(ei(n-1-k)!+eiSk-eiPk),以确定包括在所述 组合表示的素因数幂分解中的所述指数(),并因此根据所述组合表示 的素因数幂分解计算所述组合表示。
10.如权利要求2和9中的任意一项所述的方法,包括用于计算 乘积的循环步骤,在每一循环上,所述乘积包括与在前一循环上确定 的乘积相乘的项,其特征在于:
-所述在前一循环上确定的乘积以素因数幂分解的形式保留在存 储器中;
-与所述在前一循环上确定的乘积相乘的所述项是其分解已被预 先记录的所选整数之一;以及
-为了在当前循环上确定所述乘积,逐一地对于每个素数,将根据 在所述前一循环上确定的乘积的分解和与所述乘积相乘的所述项的分 解推导出的所述指数相加。
11.如权利要求2和9中的任意一项所述的方法,包括用于计算 除法的循环步骤,在每一循环上,所述除法包括对在前一循环上确定 的商进行除法的项,其特征在于:
-所述在前一循环上确定的商以素因数幂分解的形式保留在存储 器中;
-除所述商的所述项是其分解已被预先记录的所选整数之一;以及
-为了在当前循环上确定所述除法,逐一地对于每个素数,从所述 在前一循环上确定的商推到出的指数中减去由所述项的分解推导的指 数。
12.如前述任意一项权利要求所述的方法,其特征在于,所述置 换码包括计算表示置换的秩(t)的量,所述量包括部分秩()的累加,每 一部分秩均对应于所述组合表示之一。
13.如权利要求12所述的方法,其特征在于,当对矢量量化的数 字信号进行编码时,使用了置换秩的计算(OP2),以对前导矢量的分量 的置换进行索引,所述置换已经在先前的步骤(OP1)中执行以确定最接 近输出矢量的码矢量。
14.如权利要求12和13中的任意一项所述的方法,其特征在于, 当根据置换的秩(t)的给定值对矢量量化的数字信号进行译码时:
-根据待构造的码矢量的至少一个假定分量(dk),计算表示与所述给定 值接近的置换秩的至少一个量(OP3);
-如果所述量满足与所述秩的所述给定值的接近条件,那么所述假定 分量(dk)的选择便生效。
15.如权利要求14所述的方法,其特征在于,如果所述秩(t)的所 述给定值能够处于到与所述假定分量(dk)相关的部分秩的累积值与到与 所述假定分量加一后对应的分量(dk+1)相关的部分秩的累积值之间,则满 足所述接近条件。
16.如权利要求13至15中的任意一项所述的方法,其特征在于, 所述编码/译码的类型为具有矢量量化的信源编码/译码。
17.如权利要求12所述的方法,其特征在于,所述编码/译码的类 型为信道调制编码/译码,并且所述方法包括:
-在传输之前,根据置换的秩确定码矢量(OP3);以及
-在接收时,通过对应于接收的矢量的码矢量计算置换的秩(OP2)。
18.如权利要求12至17中的任意一项所述的方法,并结合权利 要求3,其中,所述置换码的最大维数为n,其特征在于,所述所选整 数至少包括:
-1和所述最大维数n之间的整数;
-整数0的阶乘值;
-以及,优选地,1和所述最大维数n之间的整数的阶乘值。
19.如权利要求18所述的方法,其特征在于,所述所选整数还包 括值0。
20.如权利要求12至19中的任意一项所述的方法,其特征在于, 所述置换码利用Schalkwijk列举,并且与码矢量(y0,...yn-1)的截断(yk,...yn-1) 相关的部分秩表示为:
I k d k = ( n - 1 - k ) ! Π i = 0 q - 1 ( w k i ! ) ( Σ d = 0 d k - 1 w k d ) , 其中
-符号表示从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为所述码矢量包括的分量的数量;以及
-项wkd表示k和n-1之间的、其值等于同一索引分量d的索引分量的 数量。
21.如权利要求20所述的方法,并结合权利要求9,其特征在于, 将所述部分秩形成组合表示的乘积和/或商中识别或出现的所述整 数为:
-阶乘项(n-1-k)!,对于0和n-1之间的所有整数k;
-包含在乘积 P k = Π i = 0 q - 1 ( w k i ! ) 中的每一项的值和/或其阶乘值,每一项 均在0和n之间;以及
-对于0和n-1之间的所有整数k的项 S k = Σ d = 0 d k - 1 w k d ,每一项均在1和n-1 之间。
22.如权利要求20和21中的任意一项所述的方法,并结合权利 要求13,其特征在于,通过确定所述部分秩的累加,在编码时确定 所述秩的计算,对于0和n-1之间的索引k,每一所述部分秩均根据码矢 量(y0,...yn-1)的截断(yk,...yn-1)估计。
23.如权利要求22所述的方法,其特征在于,对所述项 S k = Σ d = 0 d k - 1 w k d 进 行测试,以避免在所述项Sk为零时估计所述部分秩
24.如权利要求20和21中的任意一项所述的方法,并结合权利 要求14和15中的任意一项,其特征在于,在译码时计算表示所述部 分秩的缩减的量,以确定索引k从0到n-1的、所述码矢量的所述分 量yk。
25.如权利要求22至24中的任意一项所述的方法,并结合权利 要求10和11中的任意一项,其特征在于,将用于前一索引k的所述 项 P k = Π i = 0 q - 1 ( w k i ! ) 的分解中的指数的和暂时存储在存储器中,以加到用于 当前指索引k的项的分解的指数中或者从中减去。
26.一种待存储到利用置换码对数字信号进行编码/译码的装置的 存储器中的计算机程序,其特征在于,所述计算机程序包括用于实施 如权利要求1至25中的任意一项所述方法的步骤的指令。
27.一种利用置换码对数字信号进行编码/译码的装置,其特征在 于,所述装置包括:
-存储器单元,用于存储如权利要求26所述的计算机程序的指令 以及所选整数的分解的预先记录的表示;以及
-计算模,其访问所述存储器单元以实施如权利要求1至25中 的任意一项所述的方法。

说明书全文

发明涉及诸如音频、视频以及更为广泛的多媒体信号之类的数字 信号的编码/解码,以用于其存储或传输。本发明特别提出了一种解决方 案,所述解决方案用于解决由置换码的编码和解码引起的问题。

通常,本发明也应用于信源编码的同类:信道编码或“调制”。

根据本发明的数字信号的压缩编码/解码对于语音或音频信号频率编 码器的变换系数的量化非常有用。

矢量量化

一种广泛应用的数字信号压缩解决方案为矢量量化。矢量量化通过 选自有限集的相同维数的矢量来表征输入矢量。M级(或M个“码矢量”) 的量化器为输入矢量集的非双射应用,通常是将实欧氏空间Rn或Rn的子集 映射到具有M个分离的元素的、Rn的有限态子集Y中:Y={y0,y1,...yM-1}。

Y被称为复制字母表或“字典”甚或“目录”,它的码矢量元素被称为 “码字”(或“输出点”或甚至是“表示(representative)”)。

用于量化器的每一维的比特率(或其“分辨率”)r可由关系式定义:

r = 1 n log 2 M

在矢量量化中,将n个样本的作为n维矢量来处理。根据信源编 码理论,当维数变得很大时,矢量量化的性能逼近信源失真比特率的极 限。基于矢量量化器的最优性所必须的条件,矢量量化器字典可用统计 学的方法如通用的劳埃德算法(GLA)设计。这样获得的统计学的矢量 量化器不具有结构,从而使得它们的开发在计算和存储资源方面的成本 非常昂贵,因为编码和存储二者的复杂性都是与n2nr成比例的。

参考图1A,三个主要的运算用到了矢量量化器:两个运算在编码中 用到,一个运算在解码中用到。通过首先从字典中选择码矢量来对输入 矢量进行编码(步骤COD)。选择的码矢量是与输入矢量最类似的码矢量 (图1A中的运算OP1)。然后,确定(步骤IND)是将该码矢量的索引 进行传输还是存储(图1A中的运算OP2)。在解码器中(步骤DEC), 根据其索引确定该码矢量(图1A中的运算OP3)。

在调制中,以不同的顺序应用图1A中的三个运算OP1、OP2和OP3。 图1B示出了调制/量化的二元性,规定了从索引到码矢量的转换(图1B 的COD’步骤,其对应于图1A中的运算OP3)。然后,在通过受噪声影 响的信道进行传输后,搜索与接收的矢量最接近的码矢量(图1B的DEC’ 步骤,其对应于图1A中的运算OP1)。最后,对码矢量索引的解码是第 三步(图1B的IND’步骤,其对应于图1A中的运算OP2)。

根据维数、矢量和比特率,复杂性指数的增加限制了具有小的维数 和/或低比特率的无结构的矢量量化器的实时应用。对于无结构的矢量量 化器,对最近邻居的搜索(运算OP1)要求在字典所有的元素中进行穷 举搜索,以选择与输入矢量之间的距离最小的字典元素。后两个运算(索 引OP2和转换运算OP3)通常通过对表的简单阅读来执行。然而这对于 寄存器空间是非常昂贵的。为了克服尺寸和维度的限制,研究了基本矢 量量化器的几个变体。这些变体试图修补字典结构的缺乏并从而减少复 杂性,但这是以质量为代价的。但是,性能/复杂性的平衡得到了提高, 使得它能够提高分辨率的范围或维数,以便矢量量化器能够有效地应用。 提出了许多结构的矢量量化器方案,特别是,实现了下面描述的“置换码” 的矢量量化器。

置换码

在“置换码”矢量量化器中,码矢量是通过(按字母顺序)对第一 码矢量的各分量进行置换而获得的,其中该第一码矢量称为“前导 (leader)”(或“前导矢量”)。这些分量的值取自大小为q的字母表A ={a0,a1,...,aq-1}(其中,当i≠j时,ai≠aj)。分量ai是实数(或整数)。 权wi(其中i是0到q-1范围内的索引)是字母表中字母ai的重复次 数。权wi是正整数,以使

Σ i = 0 q - 1 w i = n .

按照惯例,字母表的值满足a0>a1>...>aq-1。前导的n个分量从位 置0到位置(n-1)以降序排列。因此,前导矢量y0是如下形式的n维 矢量:

可以理解,可选择不同的分量次序,例如为a0

前导矢量被称为“带符号前导”,且置换码被认为是“属于类型I”。 其它的码矢量通过对y0的分量进行置换而获得。置换的总次数M为:

M = n ! Π i = 0 q - 1 w i ! - - - ( 2 )

还有另一类型的置换码(类型II)。其前导矢量具有如上相同的形 式,但是其分量必须是正的(a0>a1>...>aq-1≥0)。通过为其它码矢量 分配所有可能的标记组合,其它码矢量也通过对y0的分量进行置换而 获得。置换的总次数M为:

M = 2 h n ! Π i = 0 q - 1 w i ! - - - ( 3 )

其中,如果aq-1>0,则h=n,否则,h=n-wq-1。

在该情况下,前导矢量也称为绝对前导。

“置换码”矢量量化器已被推广到置换码的组合(并集),且最近该 置换码联合结构已经推广到可变维数和分辨率的矢量量化中(在该申 请人的申请文件WO-04/00219中)。置换码不仅用于统计矢量量化, 还在使用高度结构化字典的代数矢量量化中由点的规则排列或纠错码 得到。置换码还用于调制中。

置换码结构的使用考虑到了最佳的和快速的最近邻域研究算法的 发展(图1A中的运算OP1)。然而,码矢量的编索引(或编号)(图 1A中的运算OP2)和反向译码运算(图1A中的运算OP3)比非结构 化的矢量量化情况需要更多的计算。

有多种列举置换的方法。Schalkwijk算法是这些方法的其中之一:

“用于信源编码的算法(An algorithm for source coding)”,由 Schalkwijk J.P.M发表在1972年5月的IEEE Trans.on Information Theory的卷IT-18,N°3,第395-399页。

使用组合分析,这些技术能够为置换码的码矢量编索引(运算 OP2)且也能完成反向索引译码运算(运算OP3)。在置换编索引算法 中,通常使用的Schalkwijk算法回顾如下,例如在标准中:

-[3GPP TS 26.273](ANSI-C code for the Fixed-point Extended AMR-Wideband(AMR-WB+);V6.1.0(2005-06)(第6版)),

-以及[3GPP TS 26.304](Extended Adaptive Multi-Rate-Wideband (AMR-WB+);Floating-point ANSI-C code;V6.1.0(2005-06)(第6 版),2005年6月)。

在编码中计算置换的秩(图1A中的运算OP2)

此步骤包括为矢量y=(y0,y1...,yn-1)的分量的所有可能的置换进行 排序和编索引。该次序是按词典顺序的,且该索引在本文中称为“秩 (rank)”。计算矢量y的秩包括计算与y相关联的矢量D=(d0,d1...,dn-1) 的秩,从而使得当且仅当yk=ad时,dk的索引值为d。

例如,维数为n=8的矢量y包括如下分量:

y=(4,2,4,0,0,4,4,2)

通过A={4,2,0},其中,a0=4,a1=2且a2=0,给出了具有3 个(q=3)字母的字母表(不同值的分量)。

矢量y则与矢量D=(0,1,0,2,2,0,0,1)相关联,其分量是字母表 A的q个字母的简单索引。

y和D的秩是相同的,但是矢量D的定义减少了计算序列D的秩 所需的运算,其中序列D的值包含在集{0,1,...,q-1}中(所包含的元 素数目与字母表{a0,a1,...,aq-1}相同)。

由于矢量y和D各自分量的出现是相同的,所以它们的权是相同 的。中间权也被定义为与分量(yk,yk+1...,yn-1)的矢量的权, 因此其对应于被截短为剩下位置k到n-1的矢量y。因而:

w k d = Σ i = k n - 1 δ ( y i , a d ) = Σ i = k n - 1 δ ( d i , d ) - - - ( 4 )

其中,δ(x,y)是Kronecker算子(如果x=y,则δ(x,y)=1,否则, δ(x,y)=0)。

( w 0 0 , w 0 1 , . . . , w 0 q - 1 ) = ( w 0 , w 1 , . . . , w q - 1 ) .

通过组合分析,矢量y的秩t可通过以下公式计算:

t = Σ k = 0 n - 1 Σ d = 0 d k - 1 ( n - 1 - k ) ! ( w k d - 1 ) ! Π i d i = 0 q - 1 ( w k i ! ) , 其中 Σ d = 0 - 1 = 0 且(-1)!=∞      (5)

该公式能够简化如下:

t = Σ k = 0 n - 1 ( n - 1 - k ) ! Π i = 0 q - 1 ( w k i ! ) ( Σ d = 0 d k - 1 w k d ) = Σ k = 0 n - 1 I k d k - - - ( 6 )

经常使用的就是公式(6),因此本文采用此公式。在下文中,将 称为“次序k的部分秩(partial rank)”,其中:

I k d k = ( n - 1 - k ) ! Π i = 0 q - 1 ( w k i ! ) ( Σ d = 0 d k - 1 w k d ) - - - ( 7 )

对秩进行译码(运算OP3):根据其索引确定置换

对秩t进行译码需要获取与y相关联的矢量D=(d0,d1,...,dn-1)。一 种连续搜索dk的方法描述如下。分量d0首先被确定,然后是分量d1,... 到分量dn-1。

*d0的确定:

通过利用包含不等式的公式找到d0:

( n - 1 ) ! Π i = 0 q - 1 ( w 0 i ! ) ( Σ d = 0 d 0 - 1 w 0 d ) t < ( n - 1 ) ! Π i = 0 q - 1 ( w 0 i ! ) ( Σ d = 0 d 0 w 0 d ) - - - ( 8 )

对于d=0,...,q-1,项(n-1)!、t、和值都是已知的。为了 得到d0的值,将d0=0用作开始点,且d0连续地增1直到满足公式(8)。 通过将部分秩代入公式(8),值d0应使:

I 0 d 0 t < I 0 d 0 + 1 , 其中, I 0 d 0 = ( n - 1 ) ! Π i = 0 q - 1 ( w 0 i ! ) ( Σ d = 0 d 0 - 1 w 0 d )

*d1的确定:

为了找到d1,利用如下关系式:

( n - 2 ) ! Π i = 0 q - 1 ( w 1 i ! ) ( Σ d = 0 d 1 - 1 w 1 d ) t - I 0 d 0 < ( n - 2 ) ! Π i = 0 q - 1 ( w 1 i ! ) ( Σ d = 0 d 1 w 1 d ) - - - ( 9 )

对于d=0,...,q-1,值能按如下方法根据的值推导出:

-如果d=d0,则 w 1 d = w 0 d - 1 , 以及

-如果d≠d0,则 w 1 d = w 0 d (只要d不等于d0,则重复)。

我们回到与确定分量d0相同的问题。为了找到d1的值,将d1=0 用作开始点,且d1连续地增1直到满足不等式(9)( I 1 d 1 ( t - I 0 d 0 ) < I 1 d 1 + 1 )。

*其它dk的确定

之后的dk的计算是从上述情况推导出来的。为了找到dk的值,将 dk=0用作开始点,且dk连续地增1直到满足不等式 I k d k ( t - Σ k = 0 k - 1 I k d k ) < I k d k + 1 .

一旦矢量D=(d0,...,dn-1)被译码出,则通过简单的字母表变换从 中推导出矢量y。

现有技术的状况和问题

置换码的编索引和反向运算都是复杂运算。利用的算法应用了组 合分析。组合的编索引和反向运算需要阶乘乘积的除法。

除法的复杂性

尽管在集成电路信号处理器上已取得了进步,但是除法仍然是 复杂的运算。通常,一个16位的整数除以一个16位整数花费的时间 比它们的乘法花费的时间多18倍。一个32位整数除以一个16位整数 的除法的权是32,而它们的乘法的权是5。

变量的构造(framing)

除法的成本不是唯一的问题。变量构造是另一问题,如下面表1 所示。

只有小于或等于8的整数的阶乘可用16位整字表示。对于大于 12的数,用32位的整字都不能表示其阶乘。

而且,运算的复杂性还随着用于表示变量的位数的增多而增加。 因而,用16位整数除32位整数的除法(权32)的复杂度几乎是用16 位整数除16位整数的除法(权18)的复杂度的两倍。

  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

表1:整数阶乘

用于减少运算OP1复杂度的解决方法已被提出。而运算OP2和运 算OP3的复杂度的问题并未很好地解决。然而,值得注意的是,在本 申请人的TDAC编码/译码器或3GPP-AMR-WB+译码器中,已基于 Schalkwijk公式对编码和译码算法进行了简化。

置换列举的简化和反向运算(运算OP2和运算OP3)的简化

置换的秩t的计算和反向运算的速度通过如下描述的简化进行了 改进,其中该简化是针对n项的计算,其定义回顾如下:

I k d k = ( n - 1 - k ) ! Π i = 0 q - 1 ( w k i ! ) ( Σ d = 0 d k - 1 w k d ) , (0≤k≤n-1)

前两项用于减少编码和译码的复杂度。第三项用在编码中,且最 后两项用在译码中。

编码技术如图2和图3所示。特别地,图3包括通过现有技术意 义下的Schalkwijk公式计算秩,而图2图解说明了基本步骤(在图2 中用“EP-n”指定第n个基本步骤)。

参考图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中递增):

-如果当前索引为k的分量yk不在元素{a0,...,aq-1}中(测试EP-22), 那么,必须分配新的元素aq以使aq=yk加入到集{a0,...,aq-1}中(步骤 EP-23),并且q必须增1(步骤EP-25)。

随后的基本步骤EP-3是矢量D=(d0,...,dn-1)的计算,如下所示:

-对于范围为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)。

参考图3,其描述了在图2说明的基本处理过程之后的用于计算 秩t的步骤。图3中说明的步骤以“CA-n”来表示现有技术意义下的第 n个编码步骤。

步骤CA-1将秩t初始化为0,将变量P初始化为1(在步骤CA-13 中用作秩计算的分母),以及将q个权w0,...,wq-1初始化为0。

在此,将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)。该实现的益处将 在随后描述。

秩t的计算(步骤CA-13)包括阶乘项(n-k-1)!,该计算如下:

t=t+(S/P)(n-k-1)!

不在秩t每次更新时计算项(n-k-1)!,而是优选地,在存储器中预 记录这些值,且使用简单的存储器存取(步骤CA-12)来获得(n-k-1)! 的当前值。

因此,图3说明的处理过程的一些优点将被本发明的实现再次吸 收。这些优点详细描述如下。

*阶乘的存储

为了避免实时计算项(n-k-1)!和!,对n+1个阶乘值(0!,1!,...,n!) 进行预计算和存储。如果维数n的变化是有限的(n≤nmax),则对值0!, 1!,...,nmax!进行预计算和存储。

*为了避免进行除法而在中间权累积时进行测试

如果项 S k = Σ d = 0 d k - 1 w k d 为0,那么,计算

I k d k = ( n - 1 - k ) ! Π i = 0 q - 1 ( w k i ! ) ( Σ d = 0 d k - 1 w k d )

则是无意义的。现在,该项通常为零,尤其是在最后的位置上(k 接近n-1)。通过增加对该项的零状态的测试(图3的测试CA-11),则 可避免进行除法(和乘法)。由于除法的计算比测试复杂得多,因此在 复杂性方面的节约是很有意义的。

*编码中位置的反向循环

通过将增1且通过重复d≠dk的其它值权(其中 d=0,1,..,q-1)可根据权推导出来。然后,则能够创建循环(图3中 的步骤CA-2、CA-14、CA-15),从矢量的最后位置(k=n-1)工作到 第一位置(k=0)。在初始化为1之后,该“反向”循环能够以这样的方 式计算项Pk:

P k = Π i = 0 q - 1 ( w k i ! ) ,

其中,对于每次迭代只进行递增和乘法,或如下计算:

w k d k = w k + 1 d k + 1

以及 P k = w k d k × P k + 1 ( Π i = 0 q - 1 ( w k i ! ) = w k d k × Π i = 0 q - 1 ( w k + 1 i ! ) )

还可单独处理最后两个位置(k=n-1和k=n-2)。事实上,

●对于最后的位置(k=n-1), Σ d = 0 d n - 1 - 1 w n - 1 d = 0 , 因此 I n - 1 d n - 1 = 0

●对于倒数第二的位置(k=n-2),

如果dn-2>dn-1,则

Σ d = 0 d n - 2 - 1 w n - 2 d = 1 ,

P n - 2 = Π i = 0 q - 1 ( w n - 1 i ! ) = 1 ! · 1 ! · Π i = 0 q - 3 ( 0 ! ) = 1 ,

且(n-1-k)!=1!,

因此, I n - 2 d n - 2 = 1 ,

否则(dn-2≤dn-1), Σ d = 0 d n - 2 - 1 w n - 2 d = 0 , 因此 I n - 2 d n - 2 = 0 ,

其中,如果dn-2=dn-1,则Pn-2=2,否则,Pn-2=1。

还可提供如下的其它有利的实现细节。

*消除译码中的除法

当搜索d0时,为了避免译码中的除法,不等式(8)能够以如下 形式重新表示为:

( n - 1 ) ! × ( Σ d = 0 d 0 - 1 w 0 d ) t × Π i = 0 q - 1 ( w 0 i ! ) < ( n - 1 ) ! × ( Σ d = 0 d 0 w 0 d )

类似地,通过以如下形式重新表示不等式(9),也在搜索d1时消 除除法:

( n - 2 ) ! × ( Σ d = 0 d 1 - 1 w 1 d ) ( t - I 0 d 0 ) × Π i = 0 q - 1 ( w 1 i ! ) < ( n - 2 ) ! × ( Σ d = 0 d 1 w 1 d )

或甚至

( n - 2 ) ! × ( Σ d = 0 d 1 - 1 w 1 d ) ( t - I 0 d 0 ) × Π i = 0 q - 1 ( w 1 i ! ) < ( n - 2 ) ! × ( Σ d = 0 d 1 w 1 d )

应该注意的是,虽然能够在搜索dk(0≤k≤n-1)时消除除法,但是 仍然需要执行(n-1)次除法来计算

*在译码时对权值进行测试

在最后位置上,对于某些d值, w k d = 0 (对于分量占据了位置k 之前位置的d值)。因此,对于这些d值,计算不等式(8)和不等式 (9)的各项是没有意义的。

现有技术的其它问题:变量的构造

变量的构造问题已经在本申请人的TDAC编码中解决了。

第一解决方法是将大于12的维数的运算处理与较小维数的运算 处理区分开。对于小的维数(n<12),在32位的无符号整数上完成计 算。对于较大的维数,则使用双精度浮点变量,其代价是将增加计算 复杂性(浮点双精度运算比其整数精度等价的运算更昂贵)以及所需 的存储器容量。

而且,如果将最大精度限制为无符号的32位整数(由定点处理器 实现),大于12的整数阶乘则不能直接预存,且维数大于12的矢量必 须被分开地编码。为了解决该问题,更完善的解决方法利用以2j×r的 形式表示阶乘n!的尾数和指数的伪浮点表示法。该分解如下表2所示。 将n!(n小于或等于16)的存储简化为存储最大精度为30位的r以 及对应于简单位偏移的指数j。

  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 638512875 29.2501405

表2:阶乘的因数分解

因此,现有技术中的技术大多不能解决有限精度(尤其是定点) 变量的构造问题。虽然TDAC编码的实现解决了构造问题,但其不能 避免两个整数的昂贵除法。而且,对于高维数,中间计算(例如,部 分秩的分子和分母)可接近饱和。在该情况下,上述的简化不能用 在译码处理中,且需要还原为不等式(8)和不等式(9)的公式,因 而再次引入了大量的除法。

不同于Schalkwijk技术的列举技术也遇到了相同的问题。假设列 举技术也使用组合分析,其则必须计算阶乘的乘积及其除法。

本发明旨在改善这种情况。

为此,首先提出了一种使用置换码对数字信号进行编码/译码的方 法,所述置换码包括组合表示的计算,其中所述组合表示由素因数幂 分解来表示,并通过对所选整数的分解的、预先记录的表示进行存储 器读取来确定。

因而本发明提供了对与置换码的索引及反运算都相关的问题的有效 方案。该方案同时解决了变量的构造和除法的问题。

有效地,在有利的实施中,所述预先记录的表示包括表示用于每个 所选整数的指数的值,所述值分别与表示连续素数的值相关联地存储。

现有技术中与变量构造相关的问题因而被解决。

对于利用阶乘项,变量构造问题就更加严重。

在有利的实施中,为了在组合表示包括阶乘值时利用所述组合表 示,所述预先记录的表示至少包括阶乘值的分解的表示。

因而该实施可以去除变量构造的限制,因此将通常设定的限制推回 为相关置换码的维数n。

根据另一有利的特征,所述组合表示中的至少一个包括整数分子除 以整数分母的商,并且所述商由素因数的幂分解来表示,其中每个幂均 为分配给同一个素数的、分别与所述分子和所述分母相关联的指数的差。

因而通过将该计算以简单的减法计算替代,解决了与现有技术中的 除法计算相关的问题。

在第一实施方式中,提供了存储器,所述存储器进行寻址以检索上 述所选整数之一的预先记录的分解。为此,将所选整数的预先记录的 表示存储在可寻址的存储器中,所述存储器的寻址提供待分配至各素 数的一连串指数,以重构所选整数。

优选地,所选整数的预先记录的表示以一连串地址的方式存储, 其中,用于每个素数的地址均给出待分配至所述素数的指数,以重构 所述所选整数。

根据第一实施方式的该实施将在下文中指定为“分解的展开表示”。

作为一种变体,在第二实施方式中,所述预先记录的表示以包括一 连串位组的字的形式存储,其中每个位组均具有:

-取决于素数的权,以及

-取决于将与所述素数相关联的指数的值。

优选地,然后通过将至少一个局部掩码连续地应用于位字,并通 过根据位权的连续偏移和剩余位的读取,而确定所述素因数的幂。

根据第二实施方式的该实施将在下文中指定为“分解的紧凑表示”。

对于组合表示的计算的相同方法通常可根据以下步骤实现:

-根据所选整数识别出现在形成所述组合表示的乘积和/或商中的 项;

-在存储器中读取包括在所述项的素因数分解中的指数;以及

-加上和/或减去所读取的指数,以确定包括在所述组合表示的素因数 幂分解中的所述指数,并因此根据所述组合表示的素因数幂分解计算所 述组合表示。

关于乘积的计算(其将被循环执行并且在每一循环上均包括新的 项),可有利地暂时存储用于前一循环的乘积计算的分解。因此,如 果该方法包括用于计算乘积的循环步骤,在每一循环上,所述乘积包 括与在前一循环上确定的乘积相乘的项,则:

-所述在前一循环上确定的乘积以素因数幂分解的形式保留在存 储器中;

-与所述在前一循环上确定的乘积相乘的所述项是其分解已被预 先记录的所选整数之一;以及

-为了在当前循环上确定所述乘积,逐一地对于每个素数,将根据 在所述前一循环上确定的乘积的分解和与所述乘积相乘的所述项的分 解推导出的所述指数相加。

类似地,如果所述方法包括用于计算除法的循环步骤,在每一循 环上,所述除法包括对在前一循环上确定的商进行除法的项:

-所述在前一循环上确定的商以素因数幂分解的形式保留在存储 器中;

-除所述商的所述项是其分解已被预先记录的所选整数之一;以及

-为了在当前循环上确定所述除法,逐一地对于每个素数,从所述 在前一循环上确定的商推到出的指数中减去由所述项的分解推导的指 数。

当前计算的乘积和/商的中间分解的所述暂时存储在确定循环的部分 秩时尤其有利,所述循环的部分秩的累积表示置换秩。

因此,在本发明的有利实施中,所述置换码包括计算表示置换的秩 的量,所述量包括部分秩的累积,因而每一部分秩均对应于所述组合表 示中的一个。

当对矢量量化的数字信号进行编码时,可以使用置换秩的计算 (OP2),以对前导矢量的分量的置换进行索引,所述置换已经在先前的 步骤(OP1)中执行以确定最接近输出矢量的码矢量。

类似地,当对矢量量化的数字信号进行译码时,假定根据置换秩 的给定值进行置换秩的估计:

-根据待构造的码矢量的至少一个假定分量(dk),计算表示与所述给定 值接近的置换秩的至少一个量(OP3);

-如果所述量满足与所述秩的所述给定值的接近条件,那么所述假定 分量(dk)的选择便生效。

在示例性的实施中,如果所述秩(t)的所述给定值能够处于到与所述 假定分量(dk)相关的部分秩的累积值与到与所述假定分量加一后对应的 分量(dk+1)相关的部分秩的累积值之间,则满足所述接近条件。

因此,在Schalkwijk列举的情况下,所述接近条件可与上述的不等 式(8)的一般形式相对应。

因而,本发明可有利地适用于图1A中表示的具有矢量量化的信源 编码/译码。

然而,所述编码/译码的类型也可以为图1B中表示的信道调制编码 /译码,假定其包括:

-在传输之前,根据置换的秩确定码矢量(图1A和图1B中相同的 OP3);以及

-在接收时,通过对应于接收的矢量的码矢量计算置换的秩(图1A和 图1B中相同的OP2)。

部分秩的计算(在乘积或商中)包括这样的项,如将在下文中看 到的一般规则,所述项保持小于或等于所述置换码具有最大维数n。 因此,在有利的实施中,具有预先记录的分解的所述所选整数至少包 括:

-1和所述最大维数n之间的整数;

-整数0的阶乘值;

-以及,优选地,1和所述最大维数n之间的整数的阶乘值。

在具体可选的实施中,所述所选整数也包括数值0。

因此,如果所述置换码利用Schalkwijk列举,则与码矢量(y0,...yn-1) 的截断(yk,...yn-1)相关的部分秩表示为:

I k d k = ( n - 1 - k ) ! Π i = 0 q - 1 ( w k i ! ) ( Σ d = 0 d k - 1 w k d ) , 其中

-符号表示从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为所述码矢量包括的分离分量的数量;以及

-项(称为中间权)表示k和n-1之间的、其值等于同一索引分量 d的索引分量的数量。

在这种情况下,在乘积和/或商中,具有预先记录的分解的、然后 待在所述部分秩的表达式中识别的所述所选整数为:

-阶乘项(n-1-k)!,对于0和n-1之间的所有整数k;

-包含在乘积 P k = Π i = 0 q - 1 ( w k i ! ) 中的每一项的值和/或其阶乘值,每一项 均在0和n之间;以及

-对于0和n-1之间的所有整数k的项 S k = Σ d = 0 d k - 1 w k d , 每一项均在1和n-1 之间。

还是在Schalkwijk列举的情况下,中间分解的暂时存储有利地应 用为:将用于前一索引k的所述项 P k = Π i = 0 q - 1 ( w k i ! ) 的分解中的指数的和暂 时存储在存储器中,以加到用于当前指索引k的的分解的指数中 或者从中减去。

通过阅读下文的详细描述和除了上述图1A、图1B、图2和图3 以外的其它附图,本发明的其它特性和优点将会变得显而易见的,其 中:

-图4图解说明了通过利用本发明的置换的秩的编码/译码原理;

-图5图解说明了根据第一实施方式用于通过利用本发明对置换的 秩进行编码的处理运算,其中,提出了用于计算中的项的素数幂分解 的指数的展开(exploded)表示法;

-图6图解说明了根据第二实施方式用于利用本发明对置换的秩进 行编码的处理运算,其中,提出了分解的指数的紧凑(compact)表示 法;

-图7图解说明了根据第一实施方式用于利用本发明对置换的秩进 行译码的处理运算,其中,提出了分解的指数的展开表示法;以及

-图8图解说明了根据第二实施方式用于利用本发明对置换的秩进 行译码的处理运算,其中,提出了分解的指数的紧凑表示法;

-图9用图解法表示了实现本发明的编码/译码装置。

作为提醒,尤其是参考4到图8,应该强调的是:

-术语“编码”指计算置换的秩t(图1A和图1B中的运算OP2); 以及

-术语“译码”指根据秩t确定置换(图1A和图1B中的运算OP3)。

因此,这些运算将参照通过矢量量化进行的信源编码/译码而指 定。但是,应该记住的是,这些运算也可在信道编码/译码中、在调制 中进行。

为了上说明本发明的原理,素数幂因式分解描述如下。

对非零正整数K进行素数幂分解的表示如下:

K = Π i = 0 m K ( p i ) e K i

pi是第i个素数(p0=1,p1=2,p2=3,p3=5,p4=7,p5=11, p6=13,p7=17,等)。

在整数K的分解中,pi的指数记为且mK表示K的分解中具 有非零指数的最大素因数的索引。

例如,数K=120(或5!)表示为:

120=1*23*31*51,其中mk=3,这是因为最大因数“5”的索引是3 (p3=5)。因此, e 5 ! 0 = 1 , e 5 ! 1 = 3 , e 5 ! 2 = 1 e 5 ! 3 = 1 .

实践中,由于数“1”是乘法的中性元,因此可将p0从分解式中去除, 即:

K = Π i = 0 m K ( p i ) e K i

当然,K=0不能分解为素数幂。

小于或等于16的正整数的素数幂乘积的分解由表3a给出,其阶 乘的分解由表3b给出。该分解包括六个素数(2,3,5,7,11和13)。由 于表3a和表3b中的列由素数pi做索引且行由n做索引,因而,在数 n和n!的素数幂乘积分解中,位于列pi和行n交叉处的单元格分别是 素数pi的指数和

对于任何正整数n>1,n!的素因数的数mn!使得 p m n ! n < p m n ! + 1 . 数mn! 和mn分别显示在表3b的最后一列和表3a的倒数第二列。应该注意, mn≤mn!。

如表3a所示,数n的分解的许多指数为零。在表3a的最后一列 中,指出了n的分解中的非零指数的数m′n。n=0的分解的不存在(因 此指数也不存在)通过“-”符号在表3a的行n=0中示出。

表3a:正整数n(n<17)的素数幂分解

表3b:n!(n<17)的素数幂分解

接下来介绍接下来这种分解在计算置换码的部分秩中的应用,首 先介绍使用Schalkwijk公式的情况,然后介绍一般情况。

应该记得,记为的部分秩由上文的关系式(7)给出:

I k d k = ( n - 1 - k ) ! Π i = 0 q - 1 ( w k i ! ) ( Σ d = 0 d k - 1 w k d ) - - - ( 7 ) ,

从而使得能对以下三项进行素数幂分解:

(n-1-k)!, P k = Π i = 0 q - 1 w k i ! S k = Σ d = 0 d k - 1 w k d .

根据(n-1-k)!、Pk和Sk的分解的指数,通过简单的加法和减法就 可计算得到的分解的指数。

实际上,分解中的素因数pi的指数由(n-1-k)!、Sk和Pk三项 的分解中pi的三个指数计算得到。指数等于前两项(的分子)的 pi指数和减去最后一项(的分母)的pi的指数。该观测形式化后表 示为:

e I k d k i = e ( n - 1 - k ) ! i + e S k i - e P k i - - - ( 10 )

图4描述了可包括在本发明意义下、用于编码和译码的处理运算 中的一般步骤(以“G-n”来表示第n个一般步骤)。

因而,参考图4,从当前索引k(步骤G-1)开始且通过将会在随 后详细描述的一些中间步骤,首先应该记住,规定了查阅预先记录的 表(在图4中示例性示出的步骤G-2中记为Dl和Dl!),以根据上文的 关系式(10)来计算全局指数(步骤G-3),该指数在素因数幂形 式的、中间秩的分解中是具体的。然后,可能通过在素因数的索引 i上进行循环,而由此推导出中间秩的值(步骤G-4)。在该中间秩 的计算之后则可更新该置换的总秩(步骤G-5):

-对于秩编码,使用 t = t + I k d k 类型的关系式,其中,索引k递减(步 骤G-6);

-或者,对于秩译码,使用 t = t - I k d k 类型的关系式,其中,索引k递 增(步骤G-7),如随后所见。

最后,在编码的步骤G-7中(或如图4的虚线所示在译码中)获 得置换的秩t,在步骤G-8中,根据上述的不等式(8)、并通过上文中 的关系式yk=ad根据矢量Y的分量将矢量D的分量dk推导出。

在一般情况下,并与Schalkwijk列举无关地,如果置换的部分秩 t′(t′>0)以Nt′项vj(1≤j≤Nt′)为分子、并以Nt′项ρj(1≤j≤Dt′)为分母的 形式表示为:

t = Π j = 1 N t v j Π j = 1 D t ρ j ,

那么,部分秩t′的分解的指数由中间分解确定,其中,该中间 分解是Nt′个vj的分解和Dt′个ρj的分解,指数表示为:

e t i = Σ j = 1 N t e v j i - Σ j = 1 D t e ρ j i

素数因数分解还将在下文中用于部分秩t′的、整数商的乘积的公 式。

也作为一般规则,如果 t = Π j = 1 Q t v j ρ j = Π j = 1 Q t τ j , e t i = Σ j = 1 N t e τ j i .

为了回到Schalkwijk列举的特殊情况、并然后根据部分秩的分 解对其进行计算,一旦该分解被确定之后,则如下执行。

遵循关系式 e t i = e I k d k i = e ( n - 1 - k ) ! i + e S k i - e P k i 的精神,通过乘以对应的幂简 单地计算部分秩

I k d k = Π i = 1 m I k d k ( p i ) e I k d k i

在此应该指出,项(n-1-k)!和Pk是严格正整数,但是项Sk可为零 并因而是不可分解的。在该情况下,部分秩为零。如上文所述(图 3中的步骤CA-11),然后项Sk的值进行测试(Sk=0?),以仅当Sk≠0 时,才计算部分秩

更一般地,如果 e t i = Σ j = 1 N t e v j i - Σ j = 1 D t e ρ j i , t = Π i = 1 m t p i e t i = Π i = 1 m t p i Σ j = 1 N t e v j i - Σ j = 1 D t e ρ j i ,

以及如果 e t i = Σ j = 1 Q t e τ j i , t = Π i = 1 m t p i e t i = Π i = 1 m t p i Σ j = 1 Q t e τ j i (t′>0)

将要记住的是,组成部分秩的项的素因数因式分解使得能够通过 用素因数幂的乘法代替除法来消除除法,特别地,通过用与这些素数 相关的指数的简单加法和减法代替除法来消除除法。

因而,在本发明意义下,由有限数量的整数的基因数分解,其中 该因数分解被存储在存储器中(下文称为“基本分解”),提出了如下步 骤:

-在图4的步骤G-2的意义下,确定在置换的秩中出现的项(例如 (n-1-k)!, P k = Π i = 0 q - 1 w k i ! S k = Σ d = 0 d k - 1 w k d )的素因数分解(下文称为“中间分 解”);

-在图4的步骤G-3的意义下,根据这些中间分解,确定置换的部 分秩的素因数分解,值得注意的是,这种分解是通过计算包含 在该部分秩的分解中的指数(例如,类型关系式 e I k d k i = e ( n - 1 - k ) ! i + e S k i - e P k i ) 而实现的;以及

-在图4的步骤G-4的意义下,根据部分秩的分解(例如, 使用类型关系式 I k d k = Π i = 0 m I k d k ( p i ) e I k d k i ),对其进行计算。

当然,待存储的基本分解优选地是有利选择的目标。在优选的但 非限制性的实现中,将根据相关置换码的最大维数(该最大维数记为 n)选择将被存储的基本分解。因而,基本分解优选地为:

-整数l的阶乘(记为l!)的分解,其中,该整数l满足0≤l≤n;

-以及整数l自身的分解,其中,此时,1≤l≤n;

其中,将要记住,n是相关置换码的最大维数

然后,可通过数m识别基本分解,给定:

-将考虑的素因数的数量m

-m个素因数自身

-以及它们各自的指数

稍后将在在分解的所谓“展开(exploded)”表示的上下文中,参考 表4a和表4b对其实现的实施例进行描述。应该指出的是随后描述的 所谓“紧凑”表示由存储单字组成,其中,该单字的各位给出了分解所 包含的所有指数。

然后,可定义基本分解的不同集,以及用于表示和存储这些基本 分解的程序。

而且,选择用于确定中间分解的项和确定适当地确定这些中间分 解的适当确定是下文将描述的有利实现的目标。部分秩的分解以及根 据其分解计算部分秩也是下文将描述的有利实现的目标。

接着描述将被存储的基本分解的选择。

一般地,且独立于用于列举n维置换码的技术,置换的秩的计算 使用整数l(0≤l≤n),且首先使用其阶乘l!(0≤l≤n)。在优选的实现 中,基本分解是l!(0≤l≤n)阶乘分解和l(1≤l≤n)分解,其中,如上文 所述,n是相关置换码的最大维数。因此,在该优选的实现中提出了 (2n+1)个基本分解。

然而,其它实现也是可能的。

例如,仅需提供(n+1)次基本分解,即,0!和l(1≤l≤n)的基 本分解。因而,如果l!(l>0)的分解对部分秩的计算是必要的,则其 可在用于确定中间分解的步骤中,根据j(1≤j≤l)的l次基本分解和 e l ! i = Σ j = 1 l e j i 计算得到。

相反地,只需要提供l!(0≤l≤n)的(n+1)次分解。如果l(l>0) 的分解对部分秩的计算是必要的,则其可在用于确定中间分解的步骤 中,根据l!和(l-1)!两个基本分解以及如下关系式中计算得到:

e l i = e l ! i - e ( l - 1 ) ! i

因此,将会理解,基本分解集的选择能有利地导致在最小化存储 这些基本分解的表示所需存储器和最小化用于确定中间分解的步骤的 复杂性之间得到平衡。

下面描述根据本发明的分解的表示。

如上所述,分解(无论是部分秩、中间分解或基本分解)由待考虑 的素因数的数量m、该m个素因数及其各自的指数限定。下文提出了用 于表示分解、并存储用于基本分解的数据不同的方案。

指数的展开表示

阶乘l!(0≤l≤n)的表示

包含在值l!的分解中的素因数的数量ml!随着数l的增大而增大。用于 表示l!(0≤l≤n)的分解的第一方案在于,对于每个l值,存储数ml!以及 pi的幂(1≤i≤ml!)的ml!个指数。将注意到l!的ml!个指数是非零的。

在更有利的变体中,基本分解集共享相同数量的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处的单元相等。

此外,可以规定存储ml!的(n+1)个值,以能够利用l!的基本分解来减 少中间分解的计算。

*整数l(1≤l≤n)的表示

为了表示基本分解l(1≤l≤n),还可以提出几种方案。第一方案是对 于每个值1,均存储数ml和l的pi的幂(1≤i≤ml)的ml个指数。在一种变 体中,可以优选地存储和用于l!的指数(ml!或mn!个)同样多的指数。l和l! 的基本分解因而共享相同的数m。

在另一变体中,可以利用这样的事实,即,l的分解的非零指数的数 量m′l较小。例如,在表3a中很明显的是,数m′l最大为2(对于l≤16)。 因此,可以只存储该数以及对应的值pi或索引i。然而,还有必要规定存 储非零次幂的这些素因数的索引i,这是因为它们不再由表中的相应指数 的地址隐含地识别。

*除了基本分解之外的分解的表示

中间分解的表示取决于基本分解的表示,中间分解的表示根据基本 分解的表示而确定。类似地,部分秩的分解的表示取决于中间分解的表 示,部分秩的分解的表示根据中间分解的表示而确定。

*基本分解的存储

典型地,可通过下文用于8维(n=8)的置换码的表4a至4d作为示例 来说明四个可能的存储方案,其中考虑了四个(m8!=4)素数(2,3,5和7)。 这些实施例可应用于3GPP AMR-WB+编码器(标准[3GPPTS26.273]和 [3GPPTS26.304]))。该编码器使用代数矢量量化,其字典为8维Gosset 阵列RE8的置换码的并集。

前三个方案(表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!个指数的第二方案。

表4a:用于存储l和l!的素数幂分解并用于8维(l从0至8)置换码的 第一方案

表4b:用于存储l和l!的素数幂分解并用于8维(l从0至8)置换码的 第二方案

下面的表4c示出了用于存储l!的pi的幂的非零指数的数量m′l、并用 于存储其指数的相应索引i的第三方案。在所表示的表中,为了更为清楚, 所示出的是素因数pi。

表4c:用于存储l和l!的素数幂分解并用于8维(l从0至8)置换码的 第三方案

在第四方案中(由下面的表4d示出),基本分解的集由数mn!表示, 并且对于每一基本分解(l或l!),存储了mn!个指数。表4d是从上文给出 的表3a和3b中四列(pi=2,3,5和7)和9行(n=0至8)中提取的。

表4d:用于存储l和l!的素数幂分解并用于8维(l从0至8)置换码的 第四方案

在使用具有可变维数和分辨率的统计矢量量化的TDAC编码器中 (最大维数为15),考虑了6个(m15!=6)素数:2,3,5,7,11和13。表3a 和3b中的6列(pi=2,3,5,7,11和13)和16行(n=0 to 15)因而可表示第四方 案的基本表示集的存储。

指数的紧凑表示

下面描述另一个有利的方案,其使存储最小化,并将基本分解的 指数紧凑地表示在有限数量的字上。在该基本分解的表示的变体中, 中间分解和部分秩的分解也被紧凑地表示。有利地,如下文将会看到 的那样,该方法还使得确定这些分解的复杂性最小。

*分解的紧凑表示

对于每一素因数pi,都进行搜索以确定部分秩的分子中的、其指 数的最大值的上限βi。该上限给定pi的指数的最大可能值,即βi+1。 通过用表示各位整数以用二进制形式表示值βi+1,我们得到:

以及 B n i = Σ j = 1 i - 1 b n j (其中 B n 1 = 0 )

其中表示刚好大于或等于x的整数

包含在部分秩t′中的项K的幂因子分解的指数可以由Bn位 ( B n = Σ i = 1 m n ! b n i )的字eK紧凑地表示,该字eK为:

e K = Σ i = 1 m n ! ( e K i < < B n i )

符号"<

应注意的是,如果数n较大,则Bn可大于用来表示整数的位数 B0(16、32或40比特)。在这种情况下,包含在t′中的整数K的素因数 分解的指数被表示为M个整字eK(m)的形式,0≤m1)。

有利地,这M个字可如下形成:

·eK(0)包括前i0个指数(从p1至的指数):

e K ( 0 ) = Σ i = 1 i 0 e K i < < B n i , 其中 B n i 0 + 1 < B 0 B n i 0 + 2

●eK(1)包括从至的指数:

e K ( 1 ) = Σ i = i 0 + 1 i 1 e K i < < ( B n i - B n i 0 + 1 ) , 其中 ( B n i 1 + 1 - B n i 0 + 1 ) < B 0 ( B n i 1 + 2 - B n i 0 + 1 )

●后一个关系式可推广与任何m,直到组成包括指数的最后 的字。

当然,还可以提供其它的变体。例如,一个变体在于,分离地存储 p1的指数,并根据从p2的指数应用上述处理运算。

*上限的确定

极限βi可以以多种方式确定。利用置换码的信息(字母表的大小q, 权wi,其中0≤i

本发明有利地提出了一般处理运算,以在Schalkwijk列举的上下文 中确定该上限。除了最大维数之外,该处理运算不使用置换码的其它先 验信息。其简单地利用了以下关系:

max 0 k < n ( e ( n - 1 - k ) ! i + e S k i ) max 0 k < n ( e ( n - 1 - k ) ! i ) + max 1 l < n ( e l i ) = e ( n - 1 ) ! i + max 1 l < n ( e l i )

然后选择 β i = e ( n - 1 ) ! i + max 1 l < n ( e l i ) .

当使用多种的置换码时,这种非常通用的处理尤其适合。

表5a给出了用于维数为8和15的的分子中的指数的最大值的上 限。表5b给出了用于维数为8和15的这些指数的位数及其和Bn(最 后一列)。在8维中,素因数2的指数在3位上表示,其它素因数(3、 5和7)的指数在2位上表示。在15维中,素因数2的指数在4位上表 示,其它素因数(5、7、11和、13)的指数在2位上表示。

表5a:对于维数为8和15的置换码的分子的指数的上限

表5b:表示对于维数为8和15的置换码的指数的位数

表6a和6b分别给出了维数n等于8和15的l和l!的指数的紧凑表 示。

  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

表6a:对于8维的置换码的指数的紧凑表示

  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

表6b:对于15维的置换码的指数的紧凑表示

作为纯粹的说明性的示例,让我们设法利用表6b来确定整数l=12 的分解。

优选地,在表6b中,因为码的最大维数为n=15,因此“2”的指数 在4位上表示,“3”的指数在3位上表示,而其它的素因数5、7、11和 13在2位上表示。在该表中,在列l=12中,可以读出其紧凑指数e12=18。

根据下表的读数,18(=16+2)在B15=15位上的二进制表示为:

000 0000 0001 0010,通过将与同一个素数相关联的位分组在一起, 其也表示为:00 00 00 00 001 0010。

    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

4个最低位(权i=0至3)为素因数2的指数,即,0010=2,这意 味着待分配给素数2的指数为2。

接下来的3位(权i=4至6)为素因数3的指数,即,001=1,这意 味着待分配给素数3的指数为1。

接下来的2位(权i=7至8)为素因数5的指数,即,00=0。

接下来的2位(权i=9至10)为素因数7的指数,即,00=0。

接下来的2位(权i=10至12)为素因数11的指数,即,00=0。

接下来的2位(权i=13至14)为素因数13的指数,即,00=0。

该提取过程需要对将高位屏蔽以恢复包含在低位中的素因数的指 数,然后将恢复的位数的紧凑指数移位,以转至下一个素因数的指数。

因此,在15维中,具有6个待选取的指数,开始于指数2。

指数2二进制表示对应于18的4个最低位,即0 0 1 0,其对应于2。 为了恢复它们,用15将18的高位屏蔽(记为18&15),15相当于:

24-1=1111。

得到的结果是e12=18&(2<<4-1)=2,这意味着待分配至素数2的 指数为2。

然后将18右移4位,得到:000 0000 0001=1

3的指数的二进制表示对应于1的3个最低位,即0 0 1(=1)。为了 恢复它们,用7将1的高位屏蔽(表示为17&7,且值为23-1=111)。

得到的结果是e112=1&(2<<3-1)=1,这意味着待分配至素数3的 指数为1。

然后将1右移2位,因而给出:000 0000=0,用于所有的其它高位。

因此,如上所述,l=12的幂为:

-对于素数2,为2,而

-对于素数3,为1,

即l=12=22×31

*分母的上限

此处假定对于每一素因数,其在部分秩t′的分母中的指数小于或等于 其在t′的分子中的指数。当t′是绝对负值时就是上述情况,这是因为 e t i = ( e ( Num ( t ) i - e Den ( t ) i ) 0 , 因此 e ( Num ( t ) i e Den ( t ) i .

实际上,通过Schalkwijk公式,如果q>1,则值为分母Pk的指 数的最大值β′i的上限(如果q>1,Pk≤(n-1)!)。

因此,检查不等式 e ( n - 1 ) ! i < 2 b n i 就已足够,这已经由上述的确定βi的值 的处理运算完成了。

在其它情况下,可明确地搜索β′i,并利用βi和β′i的最大值来计算

在q=1的情况下,将会理解,公知秩(t=0)的单个码字包括在置换码 中,因此,利用先验执行秩计算和相应的反运算是无用的。然而,如果 不期望分别处理该特例,那么仍可以规定通过βi和的最大值来计算 下表7示出了对于n=16的情况。

表7:对于16维的置换码计算分子βi和的上限

接下来简单描述存储基本分解所需的存储容量。

独立于所选的用于表示基本分解的方案,将基本分解存储在表中, 并可在秩编码和译码运算中对该表进行寻址。虽然0的分解是不可能的 (并且不使用),但可优选地为0的分解存储“哑”指数(例如0s或1s), 以简化该寻址计算。下表8总结了在这两种情况下(存储和不存储0的 哑分解),用于五种方案的、存储与基本分解相关的数据所需的存储容 量。

表8:存储基本分解所需的存储器

在第五方案中,考虑了位数的存储(+mn!)。然而,实际上,如将在 下面的实施方式中看到的那样,比从存储器中进行读取更优选的是,将 其“硬连线”(将其值设定在计算程序中而不声明为变量)。因此,实际 上,对其进行存储并没有意义。

表9给出了对于nmax=8和15,存储与五个方案的分解的指数相关 的数据所需的存储器(对0进行哑存储)。

表9:对于8维和15维的置换码,存储基本分解所需的存储器

下面描述素因数幂的存储。

在基本分解之外,本发明使用素因数幂来根据部分秩的分解计算部 分秩。可根据这些素因数的表来实时(“在线”)计算其幂。优选地, 预计算并除2之外的素数的幂并将其存储,而仅对2的幂进行实时计算。 下表10a给出了8维置换码所需的3、5和7的幂(如同在AMR-WB+编 码器中使用的幂)。表10b给出了最大15维的置换码所需的3、5、7、 11和13的幂(如同在TDAC编码器中使用的幂)。

表10a:用于8维的置换码的素因数幂

表10b:用于15维的置换码的素因数幂。此处的变量Npfp表示待存储的 素因数幂的数量。

还是此处,对于每一素因数,可以只存储必要数量的幂。作为变体, 如果优选地只具有可规律地寻址的幂的单个表,则可以规定对于每一素 因数存储与所需的p2(p2=3)的幂的数量同样多的值。对于未使用的幂,当 然可以利用例如1s或0s的哑值的存储。

下面描述用于利用本发明进行编码的、置换的秩的计算。

具有几种取决于所选的基本分解及其表示的集的变体。为了简便, 下文中对可能的实施的说明仅限于用于基本分解集的优选实施方式的情 况,其中,对阶乘l!和l进行分解。

下面首先说明对于每一基本分解具有mn!个指数的、指数的展开表示 的方案,这是最一般的情况。然后描述指数的展开表示的变体。最后, 描述基本分解的指数的紧凑表示的方案及其一些变体。将会明显看到, 本发明极好地适用于对置换的秩进行编码的处理运算。

下面回顾Schalkwijk算法,作为列举处理的示例。

分解的指数的展开表示

令n为使用的置换码的最大维数,且mn!为包括在数n!中的素因数的 数量。

下面描述利用分解的指数的展开表示进行编码的第一实施方式

根据第一实施方式的编码

此处,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)。

应注意到的是,如果未规定对l=0哑存储,那么l(l>0)的n个基本分 解的表Dl中的地址计算为:(l-1)×mn!。

初始化

●将Pk的中间分解的mn!个指数初始化为零(其存储在具有mn!个 单元且优选地在每一位置上进行更新的表P中,如将会参照下文中的 步骤C-3看到的那样)。因而,指令如下:

○  P[i]=0,1≤i≤mn!

·将秩t和q个权也初始化为零(其存储在具有q个单元且 将在每一位置上更新(下文中的步骤C-2)的表P中)。指令如下:

○  t=0

○  w[i]=0,0≤i

○  k=n-1

索引k的迭代

参见图5,进行n个位置上的迭代(通过变量k上的循环)。图5中 的步骤C-n的符号中的字母“C”表示词“编码”。

在步骤C-1中,读取变量dk。在步骤C-2对表w的单元dk进行更新: w[dk]=w[dk]+1。

步骤C-3是对Pk(表P)的分解的指数的更新,其具体地通过:

-从地址mn!×w[dk]读取表Dl中的基本分解w[dk]的mn!个指数 (步骤C-31),且

-更新:对于1≤i≤mn!, P [ i ] = P [ i ] + e w [ d k ] i (步骤C-32)。

因此,为了实施步骤C-31,表Dl中的基本分解w[dk]的第一指数(表 示为)位于地址mn!×w[dk]处,第二指数(表示为)位于地址 mn!×w[dk]+1处,等等。更普遍地,指数将位于地址mn!×w[dk]+i-1处。

并行地,在步骤C-4中,根据普遍关系 S k = Σ d = 0 d k - 1 w [ d ] 计算Sk。

步骤C-5是对Sk的值的测试。如果Sk为零(Y箭头),则意味着部分 秩为零(上文中的式(7))且秩t未改变,那么,处理继续进行随后 的步骤C-11。否则(N箭头,Sk≠0),该处理继续进行步骤C-6,其中在 表Dl的地址mn!×Sk处的读取基本分解的mn!个指数

并行地,步骤C-7在于,在表Dl!的地址mn!×(n-1-k)处读取基本分解 (n-1-k)!的mn!个指数将注意的是,如果和Sk不为零(测试C-5的 输出否),则执行步骤C-7,以避免在(任何情况下)部分秩为零时 对表Dl!进行不必要的读取。

在步骤C-8中,可以将表的不同读数的结果集合在一起,以根据以 下关系式首先计算部分秩的分解的mn!个指数:

e I k d k i = e ( n - 1 - k ) ! i + e S k i - P [ i ] , 对于1≤i≤mn!

最后,在步骤C-9中,通过下式计算部分秩本身:

I k d k = Π i = 1 m n ! ( p i ) e I k d k i

如上所述,项w[dk]是必须小于或等于相关置换码的最大维数n的权。 类似地,该权的和Sk仍小于最大维数n,并当然对于(n-1-k)同样适用。 w[dk]、Sk和(n-1-k)!的分解实际上已在范围高达最大维数n的整数或整数 阶乘的分解的表中列出,如表4d。根据表中列出的分解w[dk]以及在前述 循环(k-1)上确定且保存在存储器中的Pk-1的分解,Pk的分解被确定。

作为图5的部分秩计算步骤的纯粹说明性的示例,考虑维数n=8且 q=4的置换码。在该示例中,指数被存储在具有4列和9行并因而包括 36个单元的二维表中。因此,其可以从上文中给出的表4d中提取,其中 列pi=2,3,5,7且行l=0,...,8。

在该示例中,假定在前述的位置k=3处,权w的表为{1,1,0,3}且因 而P3=1!1 0!3!=6。因此,P3(=21×31 x 50×70)的分解的指数的表P为{1,1, 0,0}。

在位置k=2上,对于步骤C-1,假定d2=2已经被读取。

在该示例中,在步骤C-2中,通过将单元w[2]加1(w[2]=0+1=1)而将 其更新。

在步骤C-31中,读取1(=w[2])的分解的四个指数,即,0,0,0,0(参 见表4d,第6至第9列和l=1的第3行)。

然后(步骤C-32),表P被更新,因此得到P={1,1,0,0}。

在步骤C-4中,计算Sk:Sk=w[0]+w[1]=1+1=2。因此,Sk不为零 (测试C-5)。

○读取Sk的分解的四个指数(步骤C-6)(仍参见表4d,第6至第 9列,但l=2的第4行):对于p1=2(第6列),指数为1,对于pi=3, 5,7(第7至第9列),指数为零。

○仍参见表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列),指数为零。

○在步骤C-8中,计算部分秩的分解的四个指数:

○对于p1=2, e I k d k 1 = e ( n - 1 - k ) ! 1 + e S k 1 - P [ 1 ] = 3 + 1 - 1 = 3

○对于p2=3, e I k d k 2 = e ( n - 1 - k ) ! 2 + e S k 2 - P [ 2 ] = 1 + 0 - 1 = 0

○对于p3=5, e I k d k 3 = e ( n - 1 - k ) ! 3 + e S k 3 - P [ 3 ] = 1 + 0 - 0 = 1

○对于p4=7, e I k d k 4 = e ( n - 1 - k ) ! 4 + e S k 4 - P [ 4 ] = 0 + 0 - 0 = 0

在步骤C-9中,根据分解的指数计算部分秩:23×30×51×70=40。

再次参见图5,在步骤C-10中,通过根据关系 t = t + I k d k 进行更新(加 上在步骤C-9中得到的部分秩)而确定置换的总秩t。

然后,步骤C-11旨在递减变量k(k=k-1),且步骤C-12是对k值的测 试,以确定是否继续处理。因此,如果k≥0(测试C-12输出“是”), 处理运算的步骤则从第一步骤C-1开始重复,其中将k的值减去一个单 位。否则(测试C-12输出“否”),该处理则终止在结束步骤C-13中(“结 束”)。

因此,将会理解,上述步骤C-9根据在步骤C-8中确定的部分秩的 分解计算部分秩,部分秩的分解根据三个中间分解确定:

-(n-1-k)!

-Sk,以及

-Pk。

在步骤C-6和C-7中执行的其中两个((n-1-k)!和Sk)的确定包括在 基本分解的各表Dl和Dl!中的简单读取。第三中间分解(Pk的分解)的 确定也可以简单地根据在表Dl!中读取的、w[d]!的q个基本分解而按照 以下关系式执行:

P [ i ] = Σ d = 0 q - 1 e w [ d ] ! i , 1≤i≤mn!。

直接变体

步骤C-3表示了确定该中间分解的更为有利的变体。实际上,Pk的 中间分解可根据在表Dl!中读取的基本分解和被计算用于另一部分秩 的另一中间分解(Pk+1的中间分解)(例如k的迭代中的在先的部分秩) 而确定。更普遍地,在本发明的变体中,中间分解也可以根据用于至少 一个其它部分秩的先前确定的至少一个中间分解而推出。

在上文中,秩的计算通过从最后位置(k=n-1)到第一位置(k=0)的循环 来执行。然而,本发明当然也适用于从第一位置到最后位置的循环。所 有需要的是改变初始化相位并调整步骤C-2和C-3及其次序。为此,权w 的表可以用q个权进行初始化。然后,对于从0到q-1的d,在表Dl!中 读取w[d]!的分解的mn!个指数,以通过累加中间分解的表的mn!个值(P0 的分解的指数)来进行计算。

然后,在步骤C-10之后且在步骤C-2之前进行步骤C-3。通过从P[i] 中减去w[dk]的基本分解的指数( P [ i ] = P [ i ] - e w [ d k ] i , 对于1≤i≤mn!)而对P 的中间分解进行更新。然后,通过将w[dk]的值递减1(w[dk]=w[dk]-1)而 进行步骤C-2。步骤C-11可以标定为将变量k递增1,而步骤C-12简单 地测试是否k=n。

应简要地注意,对于具有可变维数n的置换码,比执行个运算 更优选的是,在初始化之后读取mn!以仅执行mn!次运算。

第一实施方式的一般变体

更普遍地,在图5中示出的用于根据本发明的编码的实施允许多个 变体。

因此,在第一变体中,(l或l!的)每一基本分解还包含数ml!。数 ml!(0≤l≤n)的读取提供了有利条件。实际上,步骤C-3以及C-6至C-10 不再均执行mn!次,而是:

○对于步骤C-3,仅执行次,

○对于步骤C-6和步骤C-8的的相加,仅执行次,并 且

○对于步骤C-7和C-9以及步骤C-8的 e I k d k i = e ( n - 1 - k ) ! i + e S k i - P [ i ] 的相减, 仅执行m(n-1-k)!次。

此外,如果已存储了值ml,那么仅需执行:

○步骤C-3次,且

○步骤C-6次以及步骤C-8的相加。

在编码的另一变体中,如果如果除此之外还根据第三方案(上文的 表4c)使用了l的基本分解的指数的存储,则可对个值执行步骤C-3。 类似地,对个值执行步骤C-6。在步骤C-8中,不提供m(n-1-k)!个相加 和m(n-1-k)!个相减,而是将待执行的相减的数量保持为m(n-1-k)!但是仅需要 个相加。具体地:

e I k d k i = e ( n - 1 - k ) ! i - e P k i , 对于1≤i≤m(n-1-k)!

■且 e I k d k i ( j ) = e I k d k i ( j ) + e S k i ( j ) ,对于 1 j m S k

在第三变体中,不将部分秩分解为三项(分子中两项,分母中一项), 而是将其分解为两项,其中之一为商。因此,部分秩被分解为两项:

-和Sk

-商 R k = ( n - 1 - k ) ! Π i = 0 q - 1 ( w k i ! ) .

该商可以由下列关系更新:

R k = ( n - 1 - k ) ) ! Π i = 0 q - 1 ( w k i ! ) = ( n - 1 - ( k + 1 ) ) ! × ( n - 1 - k ) Π i = 0 q - 1 ( w k + 1 i ! ) × w k d k = R k + 1 × ( n - 1 - k ) w k d k

因此,不根据q+1个基本分解(在表Dl!中读取的(n-1-k)!的分解以 及q个w[dk]!的分解)确定Rk的分解,而是更优选地根据Rk+1的中间分解 以及(n-1-k)的和w[dk](这两个基本分解是在表Dl中读取的)的基本分 解确定Rk的中间分解,其表示为: e R k i = e R k + 1 i + e n - 1 - k i - e w k d k i .

与前述变体相比,不用确定和存储的分子的中间分解(表P),而是 确定商Rk的中间分解然后将其存储(为此目的提供表R)。将表P初始化 为零替代为将该比率的指数的表R初始化为零。步骤C-3变为用于更新 表R的简单步骤(通过读取(n-1-k)和w[dk]的基本分解的指数),该步 骤表示为:

R [ i ] = R [ i ] + e n - 1 - k i - e w k d k i

根据存储选项,该更新可以通过进行mn!个相加和相减或m(n-1-k)!个相 加(或者个相减),或者甚至m(n-1-k)个相加(或者个相减),或 者仅对于w[dk]和(n-1-k)的非零指数进行m′(n-1-k)个相加和个相减而 实现。步骤C-8则仅包括以下类型的相加:

e I k d k i = R [ i ] + e S k i

根据存储选项,然后计算mn!个相加或个相加,或者甚至个相 加,或者仅对于Sk的非零指数进行的个相加。

将要注意的是,比率Rk不必是整数,这意味着指数R[i]可以是负数。 在该变体中,编码中的阶乘的分解(因此为表Dl!)不再有用,从而可通 过仅存储表Dl来使用整数l(l≤n)的(n+1)个基本分解的简单集。

分解的指数的紧凑表示

现在基于分解的指数紧凑表示对编码的第二实施方式进行描述。

如上文中参照第一实施方式所述,将基本分解的指数紧凑地表示, 而不再以展开形式表示。出于简洁的目的,只说明指数的紧凑表示包 含在单字中的情况。因此,将这些字如上述地储存,且在分别表示为 D′l和D′l!的两个具有(n+1)个单元的表中存储l=0的哑字。包含基本分 解的指数的字的两个表中的地址计算是直接的,因为为了读取l!(或l) 的分解的字,所需要的仅是指向表D′l!(或D′l)的地址l。

要注意的是,在没有存储用于l=0的哑字的情况下,对应于基本 分解l(l>0)的字位于表D′l的地址(l-1)上。

根据第二实施方式的编码

初始化

●将包含Pk的中间分解的mn!个指数的紧凑表示的字eP初始化为 零:

eP=0

字eP会在每一个位置更新(下面的步骤CC-3)。

●如前所述,将存储在具有q个单元的表w中的秩t和q个权 也初始化为值零。相应的指令是:

○ t=0

○ w[i]=0,0≤i

○ k=n-1

在n个位置上的迭代(对k进行循环)

现在参考图6说明该第二实施方式中的编码的主要步骤。图6中 的步骤符号“CC-n”中的字符“CC”表示用“紧凑表示”进行“编码”。

在步骤CC-1中,读取变量dk。步骤CC-2包含变量w的更新: w[dk]=w[dk]+1。

步骤CC-3是字eP的更新,具体地:

-在步骤CC-31中,读取表D′1中包含w[dk]的分解的指数的紧凑表 示的字然后,

-在步骤CC-32中,更新字: e P = e P + e w [ d k ] .

同时,在步骤CC-4中,计算和Sk: S k = Σ d = 0 d k - 1 w [ d ] 。后续步骤CC-5 是对Sk的值的测试。如果和Sk是零(箭头“否”),索引k则直接减一。 否则(在测试步骤CC-5输出箭头“是”),程序则继续到步骤CC-6中, 读取表D′l中的包含Sk的分解的指数的紧凑表示的字

同时(并且有利地依据测试步骤CC-5的结果),在步骤CC-7中, 在表D′l!中读取包含(n-1-k)!的指数的紧凑表示的字e(n-1-k)!。

在步骤CC-8中,将从步骤CC-3、CC-6、CC-7获得的结果汇总 在一起,以通过两个简单的运算(优选地在加运算后进行减运算),计 算包含部分秩的指数的紧凑表示的字

e I k d k = e ( n - 1 - k ) ! + e S k , 然后, e I k d k = e I k d k - e P .

步骤CC-9的目的是通过如前所述的对字的位进行适当的移位来 抽取部分秩的分解的mn!个指数为此,提供对从1到mn!的索引 i的循环(将i在步骤CC-91初始化为1,在步骤CC-93测试i值,在 步骤CC-94将i递增直到其达到mn!的值)。这样,则已在如下类型的 指令步骤CC-92应用i的每一个循环:

i′1)

i′2) e I k d k = e I k d k > > b n i

符号“<>b”分别表示b位的左移位和右移位。另外,符号 “&”表示按位进行的“与”逻辑运算符。指令i′1)包括恢复的个低 位。实际上,对应于指令 ( ( 1 < < b n i ) - 1 ) 的掩码是硬连线设置的。

换句话说,高位的掩码 ( ( 1 < < b n 1 ) - 1 ) 应用于开始时(循环索引等于1 时),这样可以首先仅恢复的个低位,从而给出与第一素因数p1 相关的指数

于是:

-将的位“向右”移动位,以恢复最高序位并给出与高位的下 一个素因数p2(掩码 ( ( 1 < < b n 2 ) - 1 ) )相关的指数,

-然后指数得以抽取,

-然后进行位的右移,

依此继续,直到i=mn!。

接下来的步骤CC-10包括如下计算部分秩

I k d k = Π i = 1 m n ! ( p i ) e I k d k i .

然后,将部分加到总秩t上(在步骤CC-11中, t = t + I k d k )。

在下一步骤CC-12中,将索引k的值递减(k=k-1),并且该递减 是在用递减后的值重新开始步骤CC-4、CC-1、CC-7以及后续步骤之 前进行。在测试步骤CC-13中进行检查以确定k的值是否还未达到-1, 如果达到了-1(k<0),则程序终止(步骤CC-14)。

所以,不考虑分解的表示,本发明就可有效地计算部分秩。步骤 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进行读取,然后通过加上已读取 的基本分解的紧凑表示来更新该中间分解的紧凑表示。

根据前述的第一实施方式,值ml!(0≤l≤n)的存储可降低步骤 CC-9和CC-10的复杂性。抽取部分秩的分解的指数的循环执行 m(n-1-k)!次而不是mn!次。类似地,步骤CC-10不再包含mn!次乘法,而是 包含m(n-1-k)!次乘法。

现在说明采用本发明进行的置换的秩的解码。

这里,依据基本分解的表示(展开的或紧凑的)的技术方案,存 在一些变体。下面,类似于上文对编码的第一实施方式的描述,根据 根据参照表4d给出的第四方案,利用分解的展开表示及其存储,对解 码的第一实施方式进行描述。显而易见的是,以Schalkwijk算法为例, 本发明优选地可应用于置换的秩的解码。

根据第一实施方式的解码

对分解的指数使用展开表示的解码优选地以如下的数据初始化开 始。

初始化

●将值w的表用q个权初始化(在将在下面说明的步骤D-19 中,在每一个位置上的循环的尾部对w进行更新)。适当的指 令可以是以下类型:

w [ i ] = w 0 i ,  0≤i

●计算项P0的分解的mn!个指数(将其存储在具有mn!个单元的表 P中,并在下文中将描述的步骤D-18在每个位置的循环的末尾 对其进行更新),适当的指令可以是以下类型:

○P[i]=0,1≤i≤mn!

○从d=0到q-1的循环

■读取表Dl!中的、的分解的mn!个指数

■然后, P [ i ] = P [ i ] + e w 0 d ! i , 其中1≤i≤mn!

●最后,初始化k=0

现在参考图7以说明根据第一实施方式的解码的主要步骤。图7 中步骤D-n的符号中的字符“D”表示“解码”。

在n个位置上迭代(对索引k的循环)

第一步骤D-1在于从表Dl!中读取(n-1-k)!的分解的mn!个指数 e ( n - 1 - k ) ! i .

下一个步骤D-2设置值dk=0以及 I k d k = 0 .

接下来是搜索字母表的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和中间值 I k = I k d k .

下一步骤D-8是用于更新和Sk=Sk+w[dk]的计算。随后对和Sk的分 解的mn!个指数的表Dl进行读取。

步骤D-10的目的是根据关系式 e I k d k i = e ( n - 1 - k ) ! i + e S k i - P [ i ] (其中1≤i≤mn!), 计算部分秩的分解的mn!个指数。在当前循环的末尾对如上初始化的指 数P[i]在步骤D-18更新以用于下一个循环,此步骤将在后面说明。

步骤D-11的目的是计算部分秩: I k d k = Π i = 1 m n ! ( p i ) e I k d k i .

接下来的三个步骤的目的是通过将总秩t的值与部分秩比较而计算 总秩t的值。为了实现此目的,在步骤D-12中,将dk的值递增(dk=dk+1), 并且在测试步骤D-13测试: t - I k d k 0 ? .

如果满足该不等式(箭头“是”),步骤D-7到D-13则以dk递增后的 新值进行重复。否则(箭头“否”),程序则执行步骤D-14,用于递减dk (dk=dk-1)以在步骤D-12前返回到dk值。对于dk的该值,部分秩取上 述的中间值Ik(步骤D-15: I k d k = I k )。于是,秩t得到更新,成为 t = t - I k d k (步骤D-16),并且根据表Dl中w[dk]的分解的mn!个指数的读数将Pk 的指数更新(步骤D-17)。接下来,适当地更新指数为 P [ i ] = P [ i ] - e w [ d k ] i , 其中1≤i≤mn!(步骤D-18)。然后将w[dk]的值递减(在步骤19, w[dk]=w[dk]-1),并将索引k的值递增(步骤D-20,k=k+1),以准备下 一个循环。

在返回第一步骤D-1前,进行检查以确保还有n个分量未被处理。 为此,提供测试步骤D-21,通过将k的值与n进行比较(k

应当记住,步骤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个基本分解读数 而对其进行更新。

关于上文描述的编码,图7的处理允许可在合适的情况下降低某些 步骤的复杂性的变体。

涉及比率Rk(如前所述)的指数的使用的变体尤其值得注意。实际 上,在上述参考图7描述的解码运算过程中,对于给定的位置k,对多个 d值计算指数。对于测试的每一个d值,对于每个指数而言,其它变 体需要进行减和加( e I k d k i = e ( n - 1 - k ) ! i - e P k i + e S k i )。但是,使用比率Rk的指数的 变体仅需要进行加法( e I k d k i = R [ i ] + e S k i ),这是因为对于给定的位置k,仅有 和Sk及其指数是根据d变化的。

根据第二实施方式的解码

现在参考图8说明使用分解的紧凑表示进行解码的实施例。

首先,将数据如下初始化。

初始化

●应先参考具有q个单元的表w以确定项 w [ i ] = w 0 i , 其中0≤i

●计算包含Pk的分解的mn!个指数的紧凑表示的字eP。为此:

○设置eP=0

○提供从d=0到q-1的循环:

■在表D′l!中读取包含的mn!个指数的紧凑表示的字

■更新 e P = e P + e w 0 d !

●然后设置k=0

在n个位置上迭代(对索引k的循环)

图8中的步骤DC-n的符号中的字符“DC”表示采用“紧凑表示”进行 “解码”。

步骤DC-1,在表D′l!中读取包含项(n-1-k)!的mn!个指数的紧凑表示 的字e(n-1-k)!。

步骤DC-2到DC-8与上文中参考图7描述的步骤DC-2到DC-8类 似。

另一方面,在步骤DC-9中,读取包含在表D′l中的和Sk的mn!个指数 的紧凑表示的字。然后,在步骤DC-10中,计算包含部分秩的指数 的紧凑表示的字,优选地如下计算:

e I k d k = e ( n - 1 - k ) ! + e S k 然后 e I k d k = e I k d k - e P

总体步骤DC-11总体上在于部分秩的指数的抽取。为此,规定:

-对i(1≤i≤ml!)进行循环(在步骤DC-111中将i初始化为i=1,然 后抽取指数(步骤DC-112,下文将描述),将循环索引i与值mn!进行 比较(步骤DC-113),将索引加1(步骤DC-114)直到其达到值mn!);

-抽取指数(步骤DC-112):

通过用掩码 ( ( 1 < < b n i ) - 1 ) 屏蔽的高位而将其在紧凑指数的低位 表示:

在屏蔽后,将紧凑指数右移位:

e I k d k = e I k d k > > b n i

总体步骤DC-11与图6中用于编码的总体步骤CC-9类似。

步骤DC-12到DC-17类似于参考图7中以展开表示进行解码的步骤 D-11到D-16类似。

另一方面,通过在步骤DC-181在表D′l中读取包含w[dk]的mn!个指数 的紧凑表示的字,并在步骤DC-182对Pk的指数进行适当的更新 ( e P = e P - e w [ d k ] ),而实现总体步骤DC-18中对Pk的指数(表P)的更新。

然后,步骤DC-19到DC-22类似于图7中采用展开的分解进行解码 中的步骤D-19到D-22。

现在说明上述变体提供的各种优点。

使用ml!(和/或ml或m′l)的表并具有展开表示的第一实施方式的变体 比仅使用mn!的表的主实施方式包含更少的加/减运算。

在该情况下,首先,对于最后的位置,复杂性的降低是非常显著的 (即,当m(n-k)!,m′l或ml小于mn!时)。但是,这种复杂性的降低伴随着存 储器读取步骤(C-31、C-6和C-7)的复杂性的提高。另一方面,尽管待 读取的值更少了,但是地址计算更复杂。

值得注意的折衷方案包含规律地存储基本分解(具有mn!个指数),以 帮助实现表Dl和Dl!的寻址,然后将值ml!储存在具有(n+1)个单元的表 Dm中。然后,应存储值ml,以有效地减少加/减的数量。但是,该措施必 然伴随着在步骤C-6和D-9(或C-3和D-19)之前读取值,而值m(n-k)! 必须仅在k的每次迭代开始时读取。

另外,与展开表示相比,紧凑表示的益处如下:

-更新表P的步骤仅包括在编码中(或在解码中)进行单一的加(或 减),

-指数的计算也仅需要单一的加和单一的减,

-用于读取字eK的地址计算是直接的,并对于每一个值K仅需要单 一的存储器访问和读取。

但是,紧凑表示需要抽取包含在字中的部分秩的指数(步骤 CC-9和DC-11)。但是,如会在下述内容中看到的,对于根据部分秩的素 因数分解计算部分秩而言,该操作不一定是缺点。

现在说明用于根据部分秩的素因数分解计算部分秩的这些变体的优 点。

对于编码中(或解码中)步骤C-9和CC-10(或D-11和DC-12), 用于计算素因数幂的乘积的步骤的复杂性随着因数数量的增加显著地增 加,即使其仍然远不如现有技术中的除法复杂。现在,实际上,部分秩 分解中的许多指数都是零,因此其相应的幂都为1。经常地,所有的指数 都是零,或者仅第一指数是非零。所以,能够仅检测并保持非零的指数 幂是有用的。在详细表示中,该检测可仅通过mn!个测试或m(n-1-k)!个测试 (每个检测用于一个素因数)而执行。

有利地,紧凑表示使得通过单次测试就能测试出所有的指数是否为 零(是否 e I k d k = 0 ),并且如果是的话,则秩t′=1。另外,对et′的高位的检 测使得可获得秩t′中最大非零指数素因数的索引,并可减少编码中的步骤 CC-9(或解码中的DC-11)的循环的重复次数。

但是应该注意,对如紧凑表示的详细表示中的非零指数的检测会增 加复杂性。如果所有的指数都是非零的,素因数的幂的乘法的复杂性则 会保持不变,且该复杂性然后会因检测非零指数的过程的复杂性而增加。

因此,在第一变体中,只有当素因数的可能的数量变得很大(k远小 于n)且其幂的乘法的复杂性高于检测过程的复杂性时,才能进行零指数 的检测。为此,可提供根据位置的不同循环,即使该实施会以指令行的 增加为代价。

也可将展开表示和紧凑表示相结合。对于最后的位置(低的ml!值), 中间分解的计算几乎不需要运算。于是,使用展开表示是受到欢迎的, 因为这种表示不需要抽取部分秩的指数。另一方面,对于第一位置,使 用紧凑表示则更加受到欢迎。

现在说明现有的编码器/解码器的一些示例性实施。

3GPP AMR-WB+编码器

3GPP AMR-WB+编码器(标准[3GPPTS26.304])采用代数矢量量化, 其字典是8维的Gosset RE8网络的置换码的并集。

TCX技术对应于通过变换的预测编码。更具体地,其包括在感知加 权滤波后应用的FFT变换编码方法。在标准[3GPPTS26.304]中,将获得 的FFT谱分割为8维的子波段(或子矢量),并且对这些子矢量分别地编 码。子矢量的量化采用常规的断点网络(network ofpoints)RE8。8维量 化字典由从断点网络RE8获得类型I的置换码的并集构成。

在根据标准[3GPPTS26.304]的TCX编码器中,每一个置换码对应于 给定的8维带符号前导矢量。网络RE8的断点的量化索引由以下类型的 公式计算:

索引=基数偏移+置换的秩

秩由Schalkwijk公式计算,而将基数偏移制成表格。然而,这些带 符号的前导通过其绝对前导表示,以优化存储和置换码中的搜索。相关 联的绝对前导的列表可在以下参考资料中找到:

由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 32 kbit/s(应用于32千位/秒的宽带TCX语音编码的低复杂性的多速率点阵 矢量量化)”。

为了说明本发明的不同变体,下面介绍三个示例性实施。前两个示 例性实施关于置换的秩的计算(编码),一个采用分解的展开表示,而另 一个采用紧凑表示。

在下述的这些示例性实施以及相应的附录中,表R和P的索引为从 R[0]到R[mn!-1]和从P[0]到P[mn!-1](而不是如上文的示例中介绍的从1到 mn!),而对秩的计算的处理没有特别的影响。

第一示例性实施(编码)

在该实施方式中,采用基本分解的展开表示。

其指数存储在两个具有36个单元(=(8+1)x4)的表中。这些表在附 录A-11中给出,并且表示为Dl[36](包含整数l(0≤l≤8)的分解的指数, 因而对于0,存储哑分解)以及Dl![36](包含其秩的分解的指数)。

3、5和7的幂的三个表也被存储:

Pow3[4]={1,3,9,27}

Pow5[3]={1,5,25}

Pow7[3]={1,7,49}

在该实施方式中,部分秩的分解是根据两个中间分解而确定,这两 个中间分解中的一个是整数Sk的基本分解,而另一个是如下的商的中间 分解:

R k = ( 7 - k ) ! Π i = 0 q - 1 ( w k i ! )

如上所示,比根据对应于(7-k)!和的(q+1)个基本分解确定 中间分解更优选的是,根据Rk+1的中间分解和(7-k)和的两个基本分 解确定该中间分解。该中间分解的四个指数存储在表R中。

表11:用于位置k的部分秩的项的分解并用于8维置换码的ml或ml!的 最大值

本发明利用上表11中每个位置显示的和的最大值以及m(7-k)! 的知识,从而不用计算索引大于这些限制的素因数的指数。

附录A-12给出了相应的过程。要注意的是,在这些位置上的循环被 展开。还要注意的是,商的素因数pi的指数存储在具有4个单元的表R 的单元R[i-1]中。

第二示例性实施(编码)

在3GPPAMR-WB+编码器的变体中,基本分解以紧凑的方式表示。 将包含其指数的字存储在两个具有9(=(8+1))个单元的表中。参考附 录A-21,表D′l包含用于整数l(0≤l≤8)的分解的字(因而具有对l=0 的分解的哑存储),并且表D′l!包含用于其秩的分解的字。

3、5和7的幂也存储在具有12个单元(具有用于未使用的幂的0的 空存储)的表Pow[12]中。

部分秩的分解根据三个中间分解确定,其中两个是整数Sk和秩(7-k)! 的基本分解,而第三个是如下所示的、部分秩的分母的中间分解:

P k = Π i = 0 q - 1 ( w k i ! )

如前所述,比根据的q个基本分解确定Pk的中间分解更优 地,根据Pk+1的中间分解和的基本分解确定该分解。包含该中间分解 的四个指数的紧凑字在附录A-22中记为“eP”。同样,“el”表示包含部分 秩的分解的四个指数的紧凑字。

这里,再次应用m(7-k)!的知识,以仅抽取表示部分秩的分解的、紧凑 字的m(7-k)!个指数。

相应的处理是附录A-22的主题。这里,在所述位置上的循环也是展 开的。

第三示例性实施(解码)

第三示例性实施处理在3GPP AMR-WB+解码中进行的置换的秩的 解码。

如在第一示例性实施例中一样,优选地使用基本分解的展开表示, 并如在第二示例性实施例中一样,优选地使用部分秩的三项分解。但是, 在位置上的循环是未展开的。

如前所述,Pk的中间分解是根据的Pk-1的中间分解以及的基本分 解来确定,而不是根据基本分解来确定。此中间分解的四个指数都被存 储于表P中。与此相似,根据Pk的中间分解和(7-k)!的基本分解,能 计算另一个中间分解(商的中间分解),其指数存储于表R中。

相应的处理是附录A-3的主题。应当注意的是,商(或乘积)的素 因数pi的指数存储于具有四个单元的表R的单元R[i-1]中(或表P的单元 P[i-1])。

因此,以上第一示例在两项(包括商)中使用了部分秩的分解,另 外两个示例在三项中(分子两项,分母一项)使用了分解。用于解码的 模式仅使用了m8!(=4)项,但是用于编码的两个模式使用了单独的位置处 理以使用ml!或ml个项,所述ml!或ml项不被读取,但却通过在Gosset网络 的断点的八个位置上打破循环而“硬连线”于算法中。

TDAC解码器的示例性实施

最终的示例性实施涉及申请人的TDAC感知式频率解码器,所述解 码器用于对以16kHz(多种频率)采样的数字音频信号进行解码,以下 将说明所述解码器的原理。

TDAC解码器使用最大维数为15的、具有可变的维数和分辨率的统 计矢量量化。

关于8维常规断点网络RE8的置换码,本发明基本上可以降低复杂 性。但是,就使用维数大于12的置换码的TDAC解码器而论,本发明显 示出极大的优势,因为其不仅允许降低复杂性,还能使解码器在最大精 度限制为无符号32位整数的定点处理器上的实现。如果没有本发明,这 种实现将是非常复杂的。

此解码器的原理如下。

将带宽被限定为7kHz且以16kHz采样的声频信号再分为具有320 个(20ms的)采样的。将改进的离散余弦变换(MDCT)应用于具有 50%的重叠的640个采样的输入信号块(相当于每20ms刷新一次MDCT 分析)。通过将最后31个系数都设置为零(因此仅有前289个系数不为 零)来将频谱限定为7225Hz。根据此频谱确定屏蔽曲线,并将所有被屏 蔽的系数设置为零。将所述频谱分为32个宽度不相等的频段。任意被屏 蔽的频段都根据信号的变换系数来确定。对于所述频谱的每个频段,计 算MDCT系数的能量(以估计比例因数)。由32个比例因数组成信号的 谱包络,然后在所述帧内进行量化、解码以及传递所述信号。位的动态 分配基于用于根据谱包络的量化形式计算出的每个频段的屏蔽曲线,以 便在编码器和解码器的二进制分配之间后获得兼容性。然后,由矢量量 化器利用在大小上嵌套的字典将每个频段中的标准化的MDCT系数进行 量化,所述字典由II型置换码的并集组成。最终,将语调和声音信息以 及谱包络和编码系数都在帧内多路传输并传送。

此时,用于计算置换的秩(解码)的示例性实施使用分解的紧凑表 示。所使用的置换码的维数是可变的,在所述位置上的循环不是展开的。 此实施例图示出对部分秩的分解的非零指数进行检测的方法。

在此,基本分解被紧凑表示。包括其指数的字被存储于两个具有16 个(=(15+1))单元的表中。在附录B-1中,表包含用于整数 的分解的字,且表包含用于其秩的分解的字。

3的幂也被存储于具有八个单元的表中(表示为Pow3),且5、7、 11以及13的幂被存储于具有二十个单元(具有用于未使用的幂的哑存储) 的表中(表示为Pow)。

相应的处理被重新转录在附录B-2中。

当然,本发明并不局限于以上以示例方式描述的实施例,而是还包 含其它的变形

对于申请人的知识,本发明包括置换码中的素因数幂分解的第一使 用。但是,如同在以置换码进行的矢量量化中一样,当提供组合的表示 计算时,这种使用尤其有利。因此,一般地,本发明的目的在于,在用 一个或多个置换码进行的编码/解码中的、用于任何组合表示(即使不同 于置换的秩)的素因数幂分解的这种使用。

有利地,本发明能够应用于语音信号的编码/解码中,例如在电话终 端中,尤其是蜂窝式电话终端中。但是,本发明也应用于其它任意类型 的信号(尤其是图像或视频信号)的编码/解码以及编码调制。

本发明的目的还在于使用置换码的、设计以存储于数字信号编码/解 码装置的存储器中的计算机程序。因而,此程序包括用于执行本发明意 义上的方法的步骤的指令。特别是,以上描述的图4至图8能够对应于 这种程序可包括的算法流程图

本发明的目的还在于一种数字信号编码/解码装置,参考图9,所述 数字信号编码/解码装置使用置换码并包括:

-存储单元MEM,其用于存储前面提到的类型的计算机程序的指令, 以及预先记录的所选整数的分解的表示,以及

-计算模块PROC,其访问存储单元MEM以执行本发明意义上的方 法。

这些装置MEM、PROC能够被设计为:

●根据所选的码矢量y给出置换的秩t(图9中的实线箭头):

○在信源编码器的索引模块中,或者

○在信道解码器的索引模块中,

●或者根据置换的秩t给出待重构的码矢量y(图9中的虚线箭头):

○在信源解码器的解码模块中,或者

○在信道编码器的编码模块中。

当然,存储器MEM中的预先记录的表示可以是地址内容的形式(展 开表示)或者是位字的形式(紧凑表示)。

附录

A-11

    Dl[36]={

    0,0,0,0,

    0,0,0,0,

    1,0,0,0,

    0,1,0,0,

    2,0,0,0,

    0,0,1,0,

    1,1,0,0,

    0,0,0,1,

    3,0,0,0};

 Dl![36]={

                 0,0,0,0,/*0!*/

                 0,0,0,0,/*1!*/

                 1,0,0,0,/*2!*/

                 1,1,0,0,/*3!*/

                 3,1,0,0,/*4!*/

                 3,1,1,0,/*5!*/

                 4,2,1,0,/*6!*/

                 4,2,1,1,/*7!*/

                 7,2,1,1,/*8!*/

                     };

A-12

Initialization:

 ●  t=0

 ●  w[i]=0,0≤i

 ●  R[0]=0

Processing of the positions

 ● Position k=7:

     ○ d7=d[7];w[d7]=1

 ● Position k=6:

     ○ d=d[6];w[d]=w[d]+1

     ○ If(d=d7)then R[0]=1

             else if(d>d7)t=1

 ● Position k=5:

   ○ d=d[5];w[d]=w[d]+1

   ○ R[0]=R[0]+Dl[4*2]-Dl[4*w[d]]

   ○ R[1]=-Dl[4*w[d]+1]

   ○ S=0;loop from j=0tod-1:S=S+w[j]

   ○ Test if S>0;if yes:

             ■ i2=R[0]+Dl[4*S]

             ■ t=t+(1<

 ● Positions k=4then 3:

   ○ d=d[k];w[d]=w[d]+1

   ○ R[0]=R[0]+Dl[4*(7-k)]-Dl[4*w[d]]

   ○ R[1]=R[1]+Dl[4*(7-k)+1]-Dl[4*w[d]+1]

   ○ S=0;loop from j=0 to d-1:S=S+w[j]

   ○ Test if S>0;if yes:

            ■ i2=R[0]+Dl[4*S]

            ■ i3=R[1]+Dl[4*S+1]

            ■ t=t+pow3[i3]*(1<

 ● R[2]=-Dl[4*w[d]+2]

 ●Positions k=2then 1:

   ○  d=d[k];w[d]=w[d]+1

   ○  R[0]=R[0]+Dl[4*(7-k)]-Dl[4*w[d]]

   ○  R[1]=R[1]+Dl[4*(7-k)+1]-Dl[4*w[d]+1]

   ○  R[2]=R[2]+Dl[4*(7-k)+2]-Dl[4*w[d]+2]

   ○  S=0;loop from j=0 to d-1:S=S+w[j]

   ○  Test if S>0;if yes:

             ■ i2=R[0]+Dl[4*S]

             ■ i3=R[1]+Dl[4*S+1]

             ■ i5=R[2]+Dl[4*S+2]

             ■ t=t+pow5[i5]*pow3[i3]*(1<

 ● R[3]=-Dl[4*w[d]+3]

 ● Position k=0:

   ○  d=d[0];w[d]=w[d]+1

   ○  R[0]=R[0]+Dl[4*7]-Dl[4*w[d]]

   ○ R[1]=R[1]+Dl[4*7+1]-Dl[4*w[d]+1]

   ○ R[2]=R[2]+Dl[4*7+2]-Dl[4*w[d]+2]

   ○ R[3]=R[2]+Dl[4*7+3]-Dl[4*w[d]+3]

   ○ S=0;loop from j=0tod-1:S=S+w[j]

   ○ Test if S>0;if yes:

            ■ i2=R[0]+Dl[4*S]

            ■ i3=R[1]+Dl[4*S+1]

            ■ i5=R[2]+Dl[4*S+2]

            ■ i7=R[3]+Dl[4*S+3]

            ■ t=t+pow7[i7]*pow5[i5]*pow3[i3]*(1<

A-21

D'l={0,0,1,8,2,32,9,128,3}

D'l!={0,0,1,9,11,43,52,180,183}

Pow[12]={

         1,3,9,27,

         1,5,25,0,

         1,7,49,0};

A-22

Initialization:

  ● t=0

  ● w[i]=0,0≤i

  ● eP=0

Position processing

  ● Position k=7:

       ○ d7=d[7];w[d7]=1

  ● Position k=6:

       ○ d=d[6];w[d]=w[d]+1

       ○ If(d=d7)then eP=1

                   else if(d>d7)t=1

  ● Position k=5:

   ○ d=d[5];w[d]=w[d]+1

   ○ eP=eP+D'l[w[d]]

   ○ S=0;loop from j=0 to d-1:S=S+w[j]

   ○ Test if S>0;if yes:

             ■ i2=D'l![2]+D'l[S]

             ■ i2=i2-eP

             ■ t=t+(1<

 ● Positions k=4then 3:

   ○ d=d[k];w[d]=w[d]+1

   ○ eP=eP+D'l[w[d]]

   ○ S=0;loop from j=0 to d-1:S=S+w[j]

   ○ Test if S>0;if yes:

             ■ el=D'l![(7-k)]+D'l[S]

             ■ el=el-eP

             ■ i2=el &(0×7)

             ■ i3=el>>3

             ■ t=t+pow[i3]*(1<

 ● Positions k=2then 1:

    ○ d=d[k w[d]=w[d]+1

    ○ eP=eP+D'l[w[d]]

    ○ S=0;loop from j=0 to d-1:S=S+w[j]

    ○ Test if S>0;if yes:

             ■ el=D'l![7-k)]+D'l[S]

        ■ el=el-eP

        ■ i2=el &(0×7)

        ■ el=el>>3

        ■ i3=el &(0×3)

        ■ el=el>>2

        ■ i5=el &(0×3)

        ■ t=t+pow[4+i5]*pow[i3]*(1<

 ● Position k=0:

    ○ d=d[0];w[d]=w[d]+1

    ○ eP=eP+D'l[w[d]]

    ○ S=0;loop from j=0 to d-1:S=S+w[j]

    ○ Test if S>0;if yes:

             ■ el=D'l![(7)]+D'l[S]

             ■ el=el-eP

             ■ i2=el &(0×7)

             ■ el=el>>3

             ■ i3=el &(0×3)

             ■ el=el>>2

             ■ i5=el &(0×3)

             ■ el=el>>2

             ■ i7=el &(0×3)

             ■ t=t+pow[8+i7]*pow[4+i5]*pow[i3]*(1<

A-3

Initialization:

       ○ Loop from i=0 to 3,P[i]=Dl![4*w[0]+i]

       ○ Loop from d=1 to q-1:

              ■  Loop fromi=0 to 3,P[i]=P[i]+Dl![4*w[d]+i]

Position processing

  ● Loop from k=0 to 7:

     ○ Loop from i=0 to 3:R[i]=Dl![4*(7-k)+i]-P[i]

     ○ l=0

     ○ d=0

     ○ Repeat while w[d]=0,d=d+1

     ○ R[0]=R[0]+Dl[4*(7-k)]-Dl[4*w[d]]

     ○ R[1]=R[1]+Dl[4*(7-k)+1]-Dl[4*w[d]+1]

     ○ R[2]=R[2]+Dl[4*(7-k)+2]-Dl[4*w[d]+2]

     ○ S=0

     ○ Repeat while(t-l>0)

            ■ l'=1

            ■ S=S+w[d]

            ■ i2=R[0]+Dl[4*S]

            ■ i3=R[1]+Dl[4*S+1]

            ■ i5=R[2]+Dl[4*S+2]

            ■ i7=R[3]+Dl[4*S+3]

            ■ l=pow7[i7]*pow5[i5]*pow3[i3]*(1<

            ■ d=d+1

   ○ d=d-1

   ○ l=l′

   ○ t=t-l

   ○ Loop from i=0 to 3,P[i]=P[i]-Dl[4*w[d]+i]

   ○ w[d]=w[d]-1

   ○ x[k]=a[d]

B-1

D'l={0,0,1,16,2,128,17,512,3,32,129,2048,18,8192,513,144};

D'l!={0,0,1,17,19,147,164,676,679,711,840,2888,2906,11098, 11611,11755};

Pow3[8]={1,3,9,27,81,243,729,2187}

Pow[4*5]={1,5,25,125,625,1,7,49,343,0,1,11,121,0,0,1,13, 169,0,0}

B-2

Initialization:

   ●   t=0

   ●   w[i]=0,0≤i

   ●   eP=0

Position processing

   ● Position k=n-1:

      ○dn1=d[n-1];w[dn1]=1

   ● Position k=n-2

      ○ d=d[n-2];w[d]=w[d]+1

      ○ If(d=dn1)then eP=1

      ○ If(d>dn1)t=1

   ● Positions from k=n-3 to 0:

      ○ d=d[k]

      ○ w[d]=w[d]+1

      ○ eP=eP+D'l[w[d]]

      ○ S=0;loop from j=0 to d-1:S=S+w[j]

      ○ Test if S>0;if yes:

                ■ t′=1

                ■ el=D'l![(7-k)]+D'l[S]

                ■ el=el-eP

                ■ Test if(el>0);if yes

                      ● i2=el &(0×F)

                      ● Pow[0]=1;

                      ● ml=0

                      ● i3=(el>>4)& 0×7

                      ● if(i3>0)

                         ○ pow[0]=Pow3[i3]

                        ○ ml=ml+1

                      ● el=el>>7

                      ● if el>0

                             -ml′=(16-norm_s(el))>>1

                             -loop from j=0 to ml′

                                ■ i=el & 0×3

                          ■ if i>0

                          ■ if i>0

                                ● pow[ml]=Pow[i+5*j]

                                ● ml=ml+1

                          ■ el=el>>2

               ●loop from i=0to(ml-1):t′=t′×pow[i]

               ●t′=t′<

          ■t=t+t′

QQ群二维码
意见反馈