用于棱椎矢量量化编索引和解索引的方法和装置与流程

文档序号:18221468发布日期:2019-07-19 23:02阅读:179来源:国知局
用于棱椎矢量量化编索引和解索引的方法和装置与流程
所提出的技术大体上涉及音频/视频信号的编码/解码,并具体地涉及用于音频/视频采样矢量的棱椎矢量量化编索引和解索引的方法和装置。
背景技术
:在要发送或存储音频或视频信号时,通常对信号进行编码。在编码器中,将表示音频/视频信号采样的矢量编码为由多个系数或参数来表示。从而可以高效地发送或存储这些系数或参数。在接收到或获取到系数或参数时,执行从系数或参数到音频/视频信号采样的解码,以获取原始音频/视频信号。已将很多不同种类的编码技术用于音频/视频信号。一个方案基于矢量量化(vq)。已知对于某个长度的分组采样(矢量)而言,无约束矢量量化(vq)是最优的量化方法。然而,存储器和搜索复杂度约束已导致了对结构化矢量量化器的开发。在搜索复杂度和存储器要求的意义上,不同结构给出了不同折中。一种这样的方法是增益-形状矢量量化,其中,使用形状矢量vec和增益g来表示目标矢量x:不同于直接量化目标矢量,该概念是量化{vec,g}对。从而使用针对规范化形状输入进行调谐的形状量化器和处理信号动态的增益量化器来编码增益和形状分量。该结构在例如音频编码中使用得很好,因为划分为动态和形状(或精细结构)很好地契合了感知听觉模型。首先使用对结构的了解(例如,l1(绝对幅值)规范化或l2(能量)规范化)来搜索所选择的结构化矢量量化器中的有效条目。在已经找到有效矢量之后,需要高效地创建表示该特定矢量的索引(或码字),然后向接收机发送该索引。索引创建(也称为编索引或枚举)会使用所选择的结构的特性,并在结构化vq中为所找到的矢量创建唯一索引(码字)。在接收侧,解码器需要将索引高效地分解为曾在编码器侧确定的相同矢量。该分解可通过使用大表查找在操作方面以非常低的复杂度进行,然而这是以庞大的所存储的只读存储器(rom)表为代价。备选地,可以对分解(也称为解索引)进行设计,使得其使用对所选择的结构的了解以及潜在地还使用可用目标硬件数值运算来通过算法方式将索引高效地分解为唯一的矢量。以每秒百万次运算(mops)为单位且在所要求的程序rom和动态随机存取存储器(ram)的意义上,以及在表rom的意义上,良好设计的结构化vq在编码器搜索复杂度、编码器编索引复杂度和解码器解索引复杂度之间具有良好的平衡。很多音频编解码(例如,celt、ietf/opus音频和itu-tg.719)使用包络及形状vq以及包络混合型增益-形状vq来编码目标音频信号的频谱系数(在修改离散余弦变换(mdct)域中)。celt/ietfopus音频使用pvq矢量量化器,而g.719针对r=1比特/维度编码使用并轻微扩展re8代数矢量量化器,并针对vq速率高于1比特/维度使用非常低复杂度的d8晶格量化器(latticequantizer)。pvq代表棱椎矢量量化器,其是使用l1范数(∑abs(矢量))来实现快速搜索的vq。还已发现pvq可提供非常高效的编索引。pvq已活跃了一些时日,但最开始是由fischer于1983~86来开发的。pvq量化器还已被用于语音编码器中对时域和线性预测(lp)残留域采样的编码,并用于对频域离散余弦变换(dct)系数的编码。与其他结构化vq相比,pvq的优点在于其可以自然地处理任何矢量维度,而其他结构化vq经常被限制到作为倍数的维度,例如,4的倍数或8的倍数。音频模式下的ietf/opus编解码使用递归pvq编索引和解索引方案,该方案具有被设置为32比特的最大pvq索引/(短)码字大小。如果要被量化的目标矢量要求大于32个比特,则将原始目标矢量递归地对半分割为较低维度,直到所有的子矢量都可容纳在32比特短码字编索引域中。在递归二元维度分割的过程中,存在添加用于编码两个被分割的子目标矢量之间的能量关系(相对能量,其可由量化角度来表示)的添加成本。在opus-音频中,对所产生的已分割的较小维度目标子矢量进行结构化pvq搜索。原始celt编解码(由valin、terribery和maxwell于2009年开发)使用类似的pvq编索引/解索引方案(具有32比特码字限制),然而celt中的二元维度分割是在搜索之后且在建立初始pvq结构化矢量之后在编索引域中进行的。然后,在整数域中将要编索引的整数型pvq矢量递归地减小到小于等于32比特pvq矢量子单元。再次地,这是通过添加用于分割的附加码字来实现的(这次针对“左侧”整数型子矢量和“右侧”整数型子矢量之间的整数关系),使得在解码器中可知道每个子pvq矢量的l1范数。celt搜索后(post-search)整数编索引分割方案产生可变速率(可变的总大小索引),如果介质传输要求固定速率编码,这可能是不利的。在1997年和1998年,hung、tsem和meng研究了少数pvq编索引变型的误差鲁棒性,他们总结了这样的pvq枚举(编索引)问题(1是矢量维度,且k是单位脉冲的数量):“枚举向pvq码本p(l,k)中所有可能的矢量指派唯一的索引,向pvq码本矢量告知排序顺序。”“通过对用于棱椎中矢量数量的公式进行计数,完成对枚举的系统排序;这是对于所有棱椎枚举技术来说共同的概念。”“棱椎码本p(l,k)中的矢量的数量表示为n(l,k)。”这与二元码本索引长度有关,该长度是ceil(log2(n(l,k)))个比特。n(l,k)可被视为:矢量中的l个整数值可具有绝对总和k的方式的数目。”hung等人研究了pvq编索引/枚举方案的几个变型的pvq码字的比特误差鲁棒性,但他们并未将研究关注于高效地实现pvq枚举和实现足够低复杂度的实际硬件实现。假设是基于32比特无符号整数的硬件,但不管与针对比特误差的pvq敏感度如何,pvq编索引的celt和ietf/opus-音频pvq实现强烈关注于提供尽可能低复杂度的枚举(编码和解码这二者)。也在1999年,ashley提出了通过使用对用于大小计算和偏移计算的二项式组合函数的低复杂度确定性近似来降低用于实现乘积码(productcode)pvq枚举的复杂度的方式,ashley等人将该技术称为阶乘脉冲编码(epc),且其已在itu-g.718语音编解码标准中使用。在celt和ietf/opus音频中,pvq码字不受单个比特的粒度的限制。该两个编解码使用更高粒度的方案,使用八分之一(1/8)比特解析度。这是通过使用算术编码器/解码器来作为传输比特流的接口中的中间步骤来实现的(celt/opus音频使用范围编码器/解码器的实现来作为算术编码器/解码器),其中,可将pvq码字所使用的多个比特转变为小数比特。在比特解析度bitres=8(八分之一)的情况下,小数pvq码字长度变为ceil(log2(n(1,k)*bitres))/bitres。例如,如果1=64、k=5且bitres=8,这导致npvq=n(1,k)=286680704、log2(npvq)=28.0948696、且ceil(log2(npvq)*bitres)/bitres=28.125比特。通过使用小数比特,针对n(1,k)个pvq码字大小中的很多码字大小,将会有小得多的截断损耗,且特别是在编解码正使用pvq量化器的很多调用/实例时,这会提高编解码的效率。结构化矢量量化的一个一般性的问题是找到适合的总体折中,包括用于高效搜索、高效码字编索引和高效码字解索引的方法。长索引码字(例如,400比特整数型码字)在编索引和解索引计算中给出了较大的复杂度开销(且在长码字合成和分解中,会需要将特殊的软件例程用于对这些较大整数进行乘法和除法)。短索引码字可使用高效的硬件运算符(例如,32比特数字信号处理器(dsp)中的单指令多数据(simd)指令),然而,这以要求预先分割目标vq矢量(像在ietf/opus音频中一样)或在搜索之后分割整数型pvq搜索结果矢量(像在原始celt中一样)为代价。这些维度分割方法增加了用于分割信息码字的发送成本(分割开销),且可能的索引码字越短,需要越高的分割数量,且结果是用于长索引码字分割的开销增加。例如,与32比特短码字相比,16比特短pvq码字将会导致多得多的分割,并因此导致将更高的开销用于分割。通过l1规范化,pvq(棱椎矢量量化器)容易允许非常高效的搜索。通常,创建绝对总和规范化目标矢量,然后进行矢量值截断(或舍入),然后运行校正迭代的有限集合,以达到pvq矢量(pvq-vec)的目标l1范数(k)。之前提到的celt/opus现有技术短码字编索引方案的问题是:它们被限制为32比特整数范围(无符号32比特整数),以及此外它们不能在仅支持针对有符号32比特整数的快速指令的dsp架构中高效地实现。技术实现要素:在此推出的技术的目的是扩展由pvq编索引的矢量的大小,该pvq可在具有最优运算比特大小的硬件中处理。通过所提出的技术的实施例来实现该目的以及其他目的。根据第一方案,提供了一种用于音频/视频信号的棱椎矢量量化编索引的方法。该方法包括:获得整数型输入矢量,所述整数型输入矢量表示音频/视频信号采样,所述整数型输入矢量具有多个整数取值的系数,从所述整数型输入矢量提取前导符号,所述前导符号是所述整数型输入矢量中的端非零系数的符号,所述端非零系数是所述整数型输入矢量中的第一个非零系数和最后一个非零系数之一,使用棱椎矢量量化枚举方案将所述整数型输入矢量编索引为输出索引,所述输出索引与所述前导符号一起表示所述音频/视频信号采样,其中,所述棱椎矢量量化枚举方案被设计为忽略所述端非零系数的所述符号,以及将作为第一码字的所述输出索引和作为第二码字的所述前导符号输出到输出比特流中。在一个实施例中,该提取发生在枚举之前。在另一实施例中,提取与枚举并发且协作地发生。在一个实施例中,将在本公开中表示为u(n,k)的偏移参数定义为维度为n且l1范数为k的不具有前导零且不具有前导值k、具有正的前导值且具有正的下一前导符号的整数型矢量的数目。在该实施例中,将偏移参数u用于枚举中使用的编索引方案的计算。在另一实施例中,索引计算取决于u参数和在本公开中表示为a(n,k)的偏移参数这二者,a(n,k)被定义为维度为n且l1范数为k的具有正的前导值且不具有前导零的整数型矢量的数目。在又一实施例中,枚举中的索引计算部分取决于基于u或基于u和a的组合的枚举过程。换言之,该枚举可使用初始mpvq前导符号枚举阶段,然后是针对矢量的剩余部分使用任何其他高效的pvq枚举方案。根据第二方案,提供了一种用于音频/视频信号的棱椎矢量量化解索引的方法。该方法包括:从进入比特流接收作为第一码字的前导符号和作为第二码字的输入索引,所述前导符号和所述输入索引表示音频/视频信号采样,所述前导符号是表示所述音频/视频信号采样的要创建的整数型输出矢量中的端非零系数的符号,所述整数型输出矢量具有多个整数取值的系数,所述端非零系数是所述整数型输出矢量中的第一个非零系数和最后一个非零系数之一,根据棱椎矢量量化解枚举方案将所述输入索引解索引为所述整数型输出矢量,其中,通过枚举方案创建的所述输入索引被设计为忽略所述端非零系数的所述符号,根据所接收的前导符号来指派所述整数型输出矢量中的所述端非零系数的符号,并输出所述整数型输出矢量。根据第三方案,提供了一种用于音频/视频信号的通信的方法。该方法包括:根据按照第一方案的方法,在发射机的编码器中编码音频/视频采样,从发射机向接收机发送输出索引和前导符号,其被作为输入索引和前导符号来接收,以及根据按照第二方案的方法,在接收机中的解码器中解码所述输入索引和所述前导符号。根据第四方案,提供了用于通过棱椎矢量量化来对音频/视频信号编索引的编码器。编码器能够操作来:获得整数型输入矢量,所述整数型输入矢量表示所述音频/视频信号采样,所述整数型输入矢量具有多个整数取值的系数,从所述整数型输入矢量提取前导符号,所述前导符号是所述整数型输入矢量中的端非零系数的符号,所述端非零系数是所述整数型输入矢量中的第一个非零系数和最后一个非零系数之一,使用棱椎矢量量化枚举方案将所述整数型输入矢量编索引为输出索引,所述输出索引与所述前导符号一起表示所述音频/视频信号采样,其中,所述棱椎矢量量化枚举方案被设计为忽略所述端非零系数的所述符号,以及将作为第一码字的所述前导符号和作为第二码字的所述输出索引输出到输出比特流中。根据第五方案,提供了用于通过棱椎矢量量化来对音频/视频信号解索引的解码器。所述解码器能够操作来:从进入比特流接收作为第一码字的前导符号和作为第二码字的输入索引,所述前导符号和所述输入索引表示音频/视频信号采样,所述前导符号是表示所述音频/视频信号采样的要创建的整数型输出矢量中的端非零系数的符号,所述整数型输出矢量具有多个整数取值的系数,所述端非零系数是所述整数型输出矢量中的第一个非零系数和最后一个非零系数之一,根据棱椎矢量量化解枚举方案将所述输入索引解索引为所述整数型输出矢量,其中,通过枚举方案创建的所述输入索引被设计为忽略所述端非零系数的所述符号,根据所接收的前导符号来指派所述端非零系数的符号,并输出所述整数型输出矢量。根据第六方案,提供了一种用于音频/视频信号采样的棱椎矢量量化编索引的编码器。所述编码器包括:输入模块,用于获得整数型输入矢量,所述整数型输入矢量表示所述音频/视频信号采样,所述整数型输入矢量具有多个整数取值的系数。所述编码器还包括:提取模块,用于从所述整数型输入矢量提取前导符号。前导符号是整数型输入矢量中的端非零系数的符号。所述端非零系数是所述整数型输入矢量中的第一个非零系数和最后一个非零系数之一。所述编码器还包括:编索引模块,用于使用棱椎矢量量化枚举方案将所述整数型输入矢量编索引为输出索引,所述输出索引与所述前导符号一起表示所述音频/视频信号采样,其中,所述棱椎矢量量化枚举方案被设计为忽略所述端非零系数的所述符号。所述编码器还包括:输出模块,用于将作为第一码字的所述前导符号和作为第二码字的所述输出索引输出到输出比特流中。根据第七方案,提供了一种用于解码音频/视频信号采样的解码器。所述解码器包括:接收机,用于从进入比特流接收作为第一码字的前导符号和作为第二码字的输入索引。所述前导符号和所述输入索引表示音频/视频信号采样。所述前导符号是表示音频/视频信号采样的要创建的整数型输出矢量中的端非零系数的符号。所述整数型输出矢量具有多个整数取值的系数。所述端非零系数是所述整数型输出矢量中的第一个非零系数和最后一个非零系数之一。所述解码器还包括:解索引模块,用于根据棱椎矢量量化解枚举方案将所述输入索引解索引为所述整数型输出矢量,其中,通过枚举方案创建的所述输入索引被设计为忽略所述端非零系数的所述符号。所述解码器还包括:指派模块,用于根据所接收的前导符号来指派所述整数型输出矢量中的所述端非零系数的符号。所述解码器还包括:输出模块,用于输出所述整数型输出矢量。根据第八方案,提供了一种网络节点,所述网络节点包括根据第四或第六方案的编码器和/或根据第五或第七方案的解码器。根据第九方案,提供了一种用户设备,所述用户设备包括根据第四或第六方案的编码器和/或根据第五或第七方案的解码器。根据第十方案,提供了一种包括用于编码音频/视频信号采样的计算机程序,所述计算机程序包括当由至少一个处理器执行时使所述处理器获得整数型输入矢量的指令,所述整数型输入矢量表示所述音频/视频信号采样。所述整数型输入矢量具有多个整数取值的系数。所述计算机程序还包括当由所述处理器执行时使所述处理器从所述整数型输入矢量提取前导符号的指令。前导符号是整数型输入矢量中的端非零系数的符号。所述端非零系数是所述整数型输入矢量中的第一个非零系数和最后一个非零系数之一。所述计算机程序还包括当由所述处理器执行时使所述处理器使用棱椎矢量量化枚举方案将所述整数型输入矢量编索引为输出索引的指令,所述输出索引与所述前导符号一起表示所述音频/视频信号采样。将所述棱椎矢量量化枚举方案设计为忽略所述端非零系数的符号。所述计算机程序还包括当由所述处理器执行时使所述处理器将作为第一码字的所述前导符号和作为第二码字的所述输出索引输出到输出比特流中的指令。根据第十一方案,提供了用于解码音频/视频信号的计算机程序,所述计算机程序包括当由至少一个处理器执行时使所述处理器从进入比特流接收作为第一码字的前导符号和作为第二码字的输入索引的指令。所述前导符号和所述输入索引表示音频/视频信号采样。所述前导符号是表示音频/视频信号采样的要创建的整数型输出矢量中的端非零系数的符号。所述整数型输出矢量具有多个整数取值的系数。所述端非零系数是所述整数型输出矢量中的第一个非零系数和最后一个非零系数之一。所述计算机程序还包括当由所述处理器执行时使所述处理器使用棱椎矢量量化解枚举方案将所述输入索引解索引为所述整数型输出矢量的指令。通过枚举方案创建的输入索引被设计为忽略所述端非零系数的符号。所述计算机程序还包括当由所述处理器执行时使所述处理器根据所接收的前导符号来指派所述端非零系数的符号的指令。所述计算机程序还包括当由所述处理器执行时使所述处理器输出所述整数型输出矢量的指令。根据第十二方案,提供了包括第十方案和第十一方案中的至少一个方案的计算机程序在内的载体。该载体是电子信号、光信号、电磁信号、磁信号、电信号、无线电信号、微波信号或计算机可读存储介质之一。在此推出的技术的一个优点是其降低了针对所需编索引偏移所必需的动态范围,由此降低了对所使用的硬件的所接受比特大小的需求。优选地,编索引算法迭代地将pvq结构和索引分解为前导符号段。分解以下述方式进行:与所找到的要编索引的pvq矢量中的非零元素的数目无关,始终提取一个前导符号。该低复杂度符号提取还实现了针对运行时计算的pvq编索引偏移来创建减小的动态范围。作为一个具体示例,该改进的编索引和解索引算法将在32比特dsp硬件中实现对33比特pvq索引的使用,且在总的mops、ram、rom和程序只读存储器(p-rom)方面存在最低限度的附加成本。此外,该算法将在仅支持有符号32比特算数的dsp硬件中实现对32比特pvq索引的使用。当阅读以下详细描述时将会理解其他优点。附图说明通过参考以下结合附图的描述,能够最佳地理解实施例及其更多的目的和优点,在附图中:图1是示例音频编码系统的示意图;图2是编码器的实施例的示意框图;图3是解码器的实施例的示意框图;图4是偏移的实施例的表格结构视图和其与该结构中矢量的总数的关系;图5是音频/视频采样的棱椎矢量量化编索引方法的实施例的步骤流程图;图6是一般级别的mpvq编索引的实施例的步骤流程图;图7a~图7b是mpvq索引合成方法的实施例的步骤流程图;图8是基本mpvq迭代的实施例的表格高级结构视图;图9是用于增加维度的mpvq-a/u偏移递归的三个实施例的组合的步骤流程图;图10示出了音频/视频采样的棱椎矢量量化解索引方法的实施例的步骤流程图;图11是mpvq解索引的实施例的步骤流程图;图12是用于寻找大小和偏移的过程的实施例的步骤流程图;图13是mpvq索引分解的实施例的步骤流程图;图14是用于寻找下一系数的幅值的实施例的步骤流程图;图15是用于寻找下一前导符号并移除所提取的符号信息的过程的实施例的步骤流程图;图16是用于针对少一个维度进行偏移更新的过程的实施例的步骤流程图;图17a是呈现出针对一些公共硬件比特限制的pvq码字的概览的图;图17b是呈现出针对具有不同比特限制的最优pvq码字量化器的以比特/采样为单位的相关r值的概览的图;图17c是示出了对应的可实现脉冲密度的图,该可实现脉冲密度与作为结果的pvq的形状匹配能力直接相关;图17d是示出了针对采样现有技术方案pvq和针对新方案mpvq的编索引/解索引中的最差情况mops指令折中的图;图18是使用预提取前导符号的mpvq索引合成的实施例的步骤流程图;图19是符号提取功能的实施例的步骤流程图;图20示意性地示出了编码器的实施例;图21示意性地示出了解码器的实施例;图22示意性地示出了编码器的实施例;以及图23示意性地示出了解码器的实施例。具体实施方式通过参考以下结合附图的描述,能够最佳地理解实施例及其其他目的和优点。贯穿附图,相同的附图标记用于相似或对应的元素。编索引算法迭代地将pvq结构和索引分解为前导符号段。分解以下述方式进行:与所找到的要编索引的pvq矢量中的非零元素的数目无关,始终提取一个前导符号。该低复杂度符号提取还实现了针对运行时计算的pvq编索引偏移来创建减小的动态范围。在pvq索引合成和pvq索引分解中使用pvq编索引偏移。因为结构化pvq量化器在本质上可以处理维度(l)和单位脉冲(k)中的较大变化,且因此可处理比特速率中的较大变化,通常仅针对要被编码的当前维度和当前单位脉冲数量来计算偏移。比特速率对应于log2(npvq(l,k),导致大量可能的pvq偏移。将偏移存储在动态ram中。然而,l、k受限的pvq量化器实现可使用表格查找来存储编索引/解索引偏移。为了更好地理解所提出的技术,参考ieft/opus搜索/编索引/解索引现有技术描述的摘录(收集在附录a中)可能是有用的。在图1中,示出了使用本描述中推出的方案的示例音频编码系统。这是具有使用mpvq编索引和解索引的编码器10和解码器60的示例音频编解码系统。第一部分对应于编码器10中包括的部分,且图的第二部分对应于解码器60中包括的部分。向编码器10提供输入采样1。编码器10提供将输入矢量表示为至少mpvq索引和前导符号的比特流2。向解码器60提供优选本质上等于来自编码器10的比特流2的比特流2’,其中,解码器将mpvq索引和前导符号解码为重构采样3。通常,将mpvq索引和前导符号作为单独的码字来提供。图2中更详细地示出了编码器10的实施例。接收表示音频/视频采样x的输入采样1。在范数计算器12中,计算范数因子g。范数量化器14创建表示输入矢量的范数的范数量化比特(normq比特)。通常提供这些比特以被包括在比特流中。通过范数因子将输入矢量规范化为规范化矢量4。范数量化器14还可选地向比特分配部16提供范数因子(例如,normq比特),比特分配部16计算n和k(即,整数型矢量的维度和单位脉冲的总数)的适合值,或从查找表中获取n和k的适合值。可选地,这些值可以在输出比特流中提供,或在接收侧根据比特流中的在先参数来导出。pvq形状搜索部18将规范化矢量4转换为用于pvq的整数型输入矢量5。向其中发生实际的mpvq编索引的mpvq编索引部20提供整数型输入矢量5。这将在下文中更详细进一步讨论。从mpvq编索引部20向比特流复用器mux30输出作为第一个码字的前导符号15和作为第二个码字的输出索引(通常伴随有mpvq大小的mpvq索引25)。在此,将不同的信息量合并为单个比特流2,从比特流复用器(mux)30输出。图3中更详细地示出了解码器60的实施例。向比特流解复用器(demux)80提供输入比特流2’。在此,将信息的不同部分划分为各部分。向比特分配部62提供支持比特分配的信息(例如,n和k值或者normq比特),向大小/偏移计算部64和mpvq解索引部70输出n和k的相关值。大小/偏移计算部64基于n和k值以及从重构的mpvq索引25’的信息25’(其通常伴随有mpvq大小)获得的mpvq大小来计算偏移8,并提供给mpvq解索引部70。还向其中发生实际mpvq解索引的mpvq解索引部70提供作为第二码字的重构的mpvq索引25’和作为第一码字的重构的前导符号15’。这将在下文中更详细地进一步讨论。向确保规范化的单位能量规范化部68输出作为编码器中的整数型输入矢量的重构的整数型输出矢量6’。范数解量化器66使用mormq比特来提供范数因子然后,使用范数因子来形成作为原始音频/视频采样的重构采样3的最终输出矢量应该注意到的是:mpvq方案不限于图2和图3中的具体系统,而是也可被用于任何基于pvq的量化系统的编索引,例如,线性预测(lp)声码器中的时域信号或视频编解码中的变换域系数。例如,在图2和图3中,“比特流复用”和“比特流解复用”框可以可选地分别使用算术编码器和解码器来限制pvq索引截断损耗,其在本公开中的其他地方解释。“复用”和“解复用”框需要知道每个短pvq码字的整数型大小(mpvq大小),以能够针对mpvq(n,k)码字来提取正确数量的比特。在没有算术编码器/解码器的情况下,在针对mpvq(n,k)短码字来解析比特流时,复用/解复用将使用ceil(log2(mpvq-size))个完整的非小数比特。在具有算术编码器/解码器对时,算术编码器/解码器对所使用的比特解析度和分布函数将决定“复用”和“解复用”框使用的小数比特。算术编码器/解码器对还将需要整数型mpvq大小以确定其应该如何解析从比特流解码出的比特(现在是小数的)。这样的操作是本领域技术人员周知的,且在剩余描述中假设是pvq系统的天然部分。在图2中,在编码器中,作为mpvq编索引循环的一部分来计算mpvq大小,然后将其提供给复用器。在图3中,在解码器处,首先调用计算mpvq偏移和mpvq大小的函数,然后使用该整数型大小信息从复用器中提取码字。然后,向mpvq解索引框提供所提取的索引(第二码字)和初始偏移。在一些应用中,可以将图2和图3的编码器部分和/或解码器部分包括在通信网络的节点中或用户设备中。通信网络的节点可例如是无线网络节点,例如基站。可通过有线和/或无线发送来执行编码器部分和解码器部分之间的通信。编码器部分和解码器部分还可单独操作。例如,编码器部分可以是记录设备的一部分,且可存储所产生的比特流以供将来使用。类似地,解码器部分可以是播放设备的一部分,其例如可从存储器获取比特流并将其解码为音频/视频信号。mpvq枚举方法的一个实施例是使用创造性的基于组合量值和单前导符号比特的枚举npvq(l,k)=2*nmpvq(l,k),其中,mpvq方案优选地使用迭代的加性量值枚举,该迭代的加性量值枚举进一步优选地基于剩余矢量中第一个非零元素的已确立的前导符号。现有技术ietf/opus编解码使用原始fischer枚举的优化版本,该优化版本具有改进的逐行直接行偏移计算递归、通过卷乘(wrappingmultiplication)的快速精确整数除法、以及还具有直接非递归等式偏移和大小计算(如果维度1和单元脉冲数量k足够低到允许这样的直接计算)。针对ietf/opus音频pvq实现和opus-c代码参考的rfc文本描述摘录,请参见附录a。为了降低opus中的实现复杂度,将pvq码字的最大索引值限制为232-1(可在无符号32比特整数算术中表示的索引值,其对于很多台式计算机而言是典型格式)。在当前推出的技术的第一部分中,描述了使用前导符号方案的前导符号模块化pvq(mpvq)枚举。该新的改进型mpvq枚举使用相同的通用技术(例如,逐行直接行偏移计算递归、精确的整数除法以及直接非递归等式偏移和大小计算),然而是通过使用另一递归方案来进行的。减少了偏移的动态性和大小计算,使得高效地实现短pvq码字编索引成为可能,其中,可被高效地编索引和解索引的码字中条目的数目的大小可倍增(多1比特)。在具体示例中,该编索引/解索引改进寻求实现针对33比特索引的低复杂度指派过程,该33比特索引将可使用的最大可能pvq扩展1个比特(或备选地,通过修改枚举使得可将有符号算术用于32比特跨度pvq,将其保持为1+31比特)。将偏移参数u(n,k)定义为维度为n且l1范数为k的不具有前导零且不具有前导值k、具有正的前导值且具有正的前导符号的整数型矢量的数目。前导符号是在递归方向上的当前值之后遇到的第一个符号。将偏移参数a(n,k)定义为具有维度n和l1范数k的具有正的前导值且不具有前导零的整数型矢量的数量。然后,其遵循a(n,k)=1+2*u(n,k)。“1”来自于单个初始取值“k”的矢量,且因子“2”是因为下一前导符号的正符号和负符号可能性而得到的。a(n,k)还等于(npvq(n,k-1)+npvq(n-1,k-1))/2,其是在现有技术中被用作编索引偏移的总和。针对u(n,k)的表格结构视图及其与具有nmpvq(n,k)个矢量的mpvq(n,k)结构中的矢量总数量的关系,请参见图4。该图示出了使用对下一前导符号信息的首先lsb(lsbfirst)的“交织”的包括优选的最低有效位(lsb)前导符号枚举变型在内的基本mpvq迭代的实施例的高级示意图。在优选解决方案中,针对每个pos[0]唯一幅值k_delta(例如,k_delta=k-1或k-2块)来执行前导符号交织。针对pos[0]=“k”,在pos[0]中消耗所有的单位脉冲,且可停止迭代。针对作为非零的、正或负的下一前导符号的pos[0]值,首先遇到的非零位置符号要求1比特信息。将其作为lsb比特存储在始终偶数大小“2*u(n-k)”的子段中。针对pos[0]值=“k”,将迭代扩展到pos[0],而无需任何新的前导符号信息。以下描述该第一部分的基本编索引/枚举方案。已知要编索引/枚举的pvq矢量在范围[0...2b+1-1]内,且容纳在b+1个比特中。在此,b=32个比特对于当前的dsp硬件而言是常见的。例如,如果具有pvq(n,k)(即,维度n,k个单位脉冲),索引的数量npvq<=(2b+1-1)。图5示出了用于音频/视频采样的棱椎矢量量化编索引方法的实施例的步骤流程图。在步骤400中开始该方法。在步骤402中,获得表示音频/视频信号采样的整数型输入矢量。该整数型输入矢量具有多个整数取值的系数。在步骤404中,从整数型输入矢量提取前导符号。前导符号是整数型输入矢量中的端非零系数的符号。端非零系数是整数型输入矢量中的第一个非零系数和最后一个非零系数之一。在步骤406中,使用棱椎矢量量化枚举方案将整数型输入矢量编索引为输出索引,该输出索引与前导符号一起表示音频/视频信号采样。将棱椎矢量量化枚举方案设计为忽略所述端非零系数的符号。在备选实施例中,可与步骤404并发地、与步骤404相结合地、或在步骤404之前执行步骤406。在步骤408中,将前导符号和输出索引分别作为第一码字和第二码字输出到输出比特流中。该过程在步骤449中结束。在具体实施例中,通过迭代枚举过程来执行编索引步骤406。在另一具体实施例中,迭代枚举过程包括:对迭代步骤的重复,在迭代步骤中,选择整数型输入矢量的一个当前系数以供考虑。迭代步骤进而包括:寻找与在整数型输入矢量的当前系数之前处理的所述整数型输入矢量的所有系数相关联的偏移参数,并根据该偏移参数来增大累积索引。重复继续将整数型输入矢量的系数逐一选择为当前系数,至少直到整数型输入矢量中的所有系数都被考虑到为止。迭代枚举过程包括终止步骤,在该终止步骤中,输出索引被设置为等于所有迭代步骤已结束之后的累积索引。图6示出了一般级别上的mpvq编索引的实施例。实现mpvq编索引的发送侧方案的详细框图如下所示。mpvq编索引处理在步骤200中开始,在步骤210中,从编解码比特分配循环中获得vq维度n和单位脉冲数量k。在步骤220中,根据pvq搜索来获得pvq矢量“pvq-vec”。在步骤230中,通过寻找前导符号比特和mpvq大小来合成mpvq索引。在步骤240中向比特流发送前导符号,且在步骤245中向比特流发送索引。在步骤249中该过程退出。与图5的流程图相比,可将步骤210和220视为被包括在步骤402中。类似地,将步骤404和406视为被包括在步骤230中。最后,可将步骤240和250视为被包括在步骤408中。图7a~图7b示出了mpvq索引合成的实施例,且例如作为图6的步骤230来提供。在图7a~图7b中,mpvq索引的合成以及对前导符号和mpvq大小的寻找开始于步骤300中。该实施例基于矢量的下一符号在lsb位置处的解决方案。在步骤302中,该处理通过已知的偏移迭代基本情况来初始化。在步骤304中,设置当前位置参数。在该实施例中,从矢量的终点向起点运行编索引。编索引按照与解索引相反的位置顺序运行,进一步参见以下所述。这意味着:当在由前导符号导致的每个迭代步骤中增大累积索引时,根据整数型输入矢量中的先前前导符号,给予累积索引最低有效位。在备选实施例中,在编索引和解索引之间可改变矢量位置顺序。在步骤306中,将累积索引初始化为0。参数k_acc表示被分析的累积单位脉冲,且被初始化为0。标志got_sign_flag指示是否提取符号,且也被初始设置为0。在步骤308中,将来自矢量的当前系数“vec(pos)”视为参数“val”。在步骤310中,如果第一个符号已被找到且当前系数不等于0,则处理继续到步骤312,否则处理继续直接到步骤314。在步骤312中,将来自先前步骤的已保存的前导符号信息置于lsb中。先前步骤中的负符号对应于值next_sign_ind=1,且正符号对应于值next_sign_ind=0。在步骤314中,开始针对当前符号的搜索。如果值等于0,则新符号没有出现,且应将最后一个符号前移,这意味着处理直接继续到(图7b的)步骤324。如果当前系数不是0,则首先在步骤316中设置已找到符号的标志。这真的仅对于第一个符号而言是必须的,然而在当前实施例中,为了简化流程,每次找到非零值时都设置该标志。在步骤318中,next_sign_ind(即,下一符号的指示符)被设置为指示正符号。在步骤320中,检查当前系数的值是否真的是正的。如果发现是这样,则流程继续到步骤324,否则将next_sign_ind(即,下一符号的指示符)改变为指示负符号。在步骤324中,基于所分析的当前维度n和累积单位脉冲,根据偏移值来增大累积索引。换言之,累积索引被计数到与维度为n且l1范数为k_acc的具有正的前导值并不具有前导零的整数型矢量的数量相对应的数量。在当前实施例中,使用a偏移来修改累积索引。如下面将会进一步讨论的,在其他实施例中,可以代之以使用u偏移,或可以使用a偏移和u偏移的组合。在步骤326中,然后通过加上当前系数的值来更新k_acc参数。如果矢量中并非所有的位置都被考虑到,即参数“pos”大于0,且准备下一次重复。在步骤330中,增加维度,并更新偏移,这将在下面更详细地描述。在步骤332中,将当前系数的位置降低一个步长。然后,针对考虑到来自整数型输入矢量的新当前系数的下一次重复,处理返回步骤308(图7a)。如果矢量中所有的位置都已被考虑到,流程继续到步骤334,在步骤334处将前导符号设置为等于当前的下一符号指示。换言之,矢量中的第一个符号未被包括在累积索引中,并被提取来作为不影响编索引的剩余部分的单独参数。这意味着所使用的棱椎矢量量化枚举方案忽略第一个非零系数的符号。相反,该符号被“推”出编索引处理,并被表示为“前导符号”或“lead_sign”。其他符号也通常在迭代期间被提取出,但也会影响索引累积。最后,在步骤336,计算mpvq大小,这在本实施例中可通过两种不同方式执行。累积索引作为mpvq棱椎矢量量化枚举方案的输出索引离开该过程。该过程在步骤349中结束。以上结构操作,以将要编码的非零矢量值的所有符号移位一个步长,到所选择的方向上的下一非零系数。如果不存在下一位置,即,处理在原始矢量之外,则存储该符号作为剩余lead_sign。该符号移位可作为单独的预处理步骤进行(从下可以进一步看到),或在优选实施例中,如上所述在整个维度迭代循环内部进行。现在在比特流中可以将lead_sign(+1或-1)作为单独的比特(作为lead_sign_ind(0或1))发送。利用修改的编索引/枚举方案对原始矢量的剩余移位符号以及幅值进行编码,该修改编索引/枚举方案使用了始终精确地有一个符号已被从原始pvq矢量中提取出/移位出这一事实。该提取与原始pvq目标矢量pvq-vec中非零元素的数量无关。下面描述3个示例,以支持对图7a和图7b的结构的理解。为了使描述保持有限并使得总体示例是直观的,示例具有极低的复杂度。然而,在通常真实示例中,维度以及单位脉冲的数量要高得多。但原理是相同的。在第一示例中,具有维度n=3且单位脉冲的数量k=5,考虑整数型输入矢量[2,2,-1]。执行初始化,且将“pos”设置为“2”,索引k_acc设置为“0”,维度n=1,以及got_sign_flag被复位(=0)。将第一值“val”选择为矢量的系数2,即,-1。(将矢量的系数编号为:0、1以及2。由于还没有求到非零值,尚未提取符号,且流程跳过基于检测到的符号来调整索引。由此,流程直接转到对值“val”求值,值“val”不同于0。这触发(trigs)了对符号标志进行设置。第一个符号已被检测到,且根据检测到的符号来设置next_sign_ind,在本情况下next_sign_ind=1,即,负值(-1)。然后,将累积索引累加与维度为1且l1范数为0的具有正的前导值且不具有前导零的整数型矢量的数目相对应的偏移a(1,0)。a(1,0)等于0。累积索引现在是index=0。然后,通过“val”的绝对值(即,1个单位)来更新所累积的k参数k_acc,即,k_acc=1。通过将数量n增加1(即,n=2)并将位置指示符“pos”减少1(例如,pos=1)来准备下一次重复。流程返回步骤308,且选择位置1的新值,即,在我们的示例中是val=vec(1)=2。符号标志“got_sign_flag”指示检测到符号,且由于当前值“val”不等于0,将“next_sign_ind”与累积索引“index”相加以作为lsb,产生累积索引1(=2*0+1)。流程继续到对值“val”求值,再次地,值“val”不同于0。根据检测到的符号来设置next_sign_ind,在本情况下next_sign_ind=0,即,正值(2)。然后,将累积索引累加与维度为2且l1范数为1的具有正的前导值且不具有前导零的整数型矢量的数目相对应的偏移a(2,1)。a(2,1)等于1。累积索引现在是index=2。然后,通过vec(1)的绝对值(即,2个单位)来更新所累积的k参数k_acc,即,k_acc=3。通过将数量n增加1(即,n=3)并将位置指示符“pos”减少1(例如,pos=0)来准备下一次重复。流程返回步骤308,且选择位置0的新值,即,在我们的示例中是val=vec(0)=2。符号标志“got_sign_flag”指示检测到符号,且由于当前值“val”不等于0,将“next_sign_ind”与累积索引“index”相加以作为lsb,产生累积索引4(=2*2+0)。流程继续到对值“val”求值,再次地,值“val”不同于0。根据检测到的符号来设置next_sign_ind,在本情况下next_sign_ind=0,即,正值(2)。然后,将累积索引累加与维度为3且l1范数为3的具有正的前导值且不具有前导零的整数型矢量的数目相对应的偏移a(3,3)。a(3,3)等于13。累积索引现在是index=17。然后,通过“val”的绝对值(即,2个单位)来更新所累积的k参数k_acc,即,k_acc=5。所累积的k参数k_acc现在等于最大值k=5,且考虑到了矢量的所有位置。因此,输出索引等于当前累积索引,即,输出索引17。最后一个被识别出的符号仍未被包括在累积索引中,并代之以被提取来作为单独的参数,即,前导符号=“+1”(next_sign_ind=0)。在第二示例中,具有维度n=3,且单位脉冲的数量k=5,考虑整数型输入矢量[-4,0,-1]。执行初始化,且将“pos”设置为“2”,索引k_acc设置为“0”,维度n=1,以及got_sign_flag被复位(=0)。将第一值“val”选择为矢量的系数2,即,-1。由于还没有求到非零值,尚未提取符号,且流程跳过基于检测到的符号来调整索引。由此,流程直接转到对值“val”求值,值“val”不同于0。这触发了对符号标志进行设置。第一个符号已被检测到,且根据检测到的符号来设置next_sign_ind,在本情况下next_sign_ind=1,即,负值(-1)。然后,将累积索引累加与维度为1且l1范数为0的具有正的前导值且不具有前导零的整数型矢量的数目相对应的偏移a(1,0)。a(1,0)等于0。累积索引现在是index=0。然后,通过“val”的绝对值(即,1个单位)来更新所累积的k参数k_acc,即,k_acc=l。通过将数量n增加1(即,n=2)并将位置指示符“pos”减少1(例如,pos=1)来准备下一次重复。流程返回步骤308,且选择位置1的新值,即,在我们的示例中是val=vec(1)=0。符号标志“got_sign_flag”指示检测到符号,但由于当前值“val”等于0,保存“next_sign_ind”以用于下一次重复。流程继续到对值“val”求值,值“val”与0相同。因此next_sign_ind未改变。然后,将累积索引累加与维度为2且l1范数为1的具有正的前导值且不具有前导零的整数型矢量的数目相对应的偏移a(2,1)。a(2,1)等于1。累积索引现在是index=1。然后,通过“val”的绝对值(即,0个单位)来更新所累积的k参数k_acc,即,仍然是k_acc=1。通过将数量n增加1(即,n=3)并将位置指示符“pos”减少1(例如,pos=0)来准备下一次重复。流程返回步骤308,且选择位置0的新值,即,在我们的示例中是val=vec(0)=-4。符号标志“got_sign_flag”指示检测到符号,且由于当前值“val”不等于0,将来自矢量位置2的“next_sign_ind”与累积索引“index”相加以作为lsb,产生累积索引3(=2*1+1)。流程继续到对值“val”求值,值“val”不同于0。根据检测到的符号来设置next_sign_ind,在本情况下next_sign_ind=1,即,负值(-4)。然后,将累积索引累加与维度为3且l1范数为1的具有正的前导值且不具有前导零的整数型矢量的数目相对应的偏移a(3,1)。a(3,1)等于1。累积索引现在是index=4。然后,通过“val”的绝对值(即,4个单位)来更新所累积的k参数k_acc,即,k_acc=5。所累积的k参数k_acc现在等于最大值k=5,且考虑到了矢量的所有位置。因此,输出索引等于当前累积索引,即,输出索引4。最后一个被识别出的符号仍未被包括在累积索引中,并代之以被提取来作为单独的参数,即,前导符号=“-1”(next_sign_ind=1)。在第三示例中,具有维度n=3,且单位脉冲的数量k=5,考虑整数型输入矢量[0,5,0]。执行初始化,且将“pos”设置为“2”,索引k_acc设置为“0”,维度n=1,以及got_sign_flag被复位(=0)。将第一值“val”选择为矢量的系数2,即,0。由于还没有求到非零值,尚未提取符号,且流程跳过基于检测到的符号来调整索引。由此,流程直接转到对值“val”求值,值“val”与0相同。这跳过了对符号标志的触发。因此尚未检测第一个符号。然后,将累积索引累加与维度为1且l1范数为0的具有正的前导值且不具有前导零的整数型矢量的数目相对应的偏移a(1,0)。a(1,0)等于0。累积索引现在是index=0。然后,通过“val”的绝对值(即,0个单位)来更新所累积的k参数k_acc,即,仍然是k_acc=0。通过将数量n增加1(即,n=2)并将位置指示符“pos”减少1(例如,pos=1)来准备下一次重复。流程返回步骤308,且选择位置1的新值,即,在我们的示例中是val=vec(1)=5。符号标志“got_sign_flag”指示尚未检测到符号。由此,流程直接转到对值“val”求值,值“val”不同于0。这触发了对符号标志进行设置。现在第一个符号已被检测到,且根据检测到的符号来设置next_sign_ind,在本情况下next_sign_ind=0,即,正值(5)。然后,将累积索引累加与维度为2且l1范数为0的具有正的前导值且不具有前导零的整数型矢量的数目相对应的偏移a(2,0)。a(2,0)等于0。累积索引现在仍然是index=0。然后,通过“val”的绝对值(即,5个单位)来更新所累积的k参数k_acc,即,k_acc=5。通过将数量n增加1(即,n=3)并将位置指示符“pos”减少1(例如,pos=0)来准备下一次重复。流程返回步骤308,且选择位置0的新值,即,在我们的示例中是val=vec(0)=0。符号标志“got_sign_flag”指示检测到符号,但由于当前值“val”等于0,保存“next_sign_ind”以用于下一次重复,或在本示例中,用于最终步骤。流程继续到对值“val”求值,值“val”与0相同。因此next_sign_ind未改变。然后,将累积索引累加与维度为3且l1范数为5的具有正的前导值且不具有前导零的整数型矢量的数目相对应的偏移a(3,5)。a(3,5)等于41。累积索引现在是index=41。然后,通过“val”的绝对值(即,0个单位)来更新所累积的k参数k_acc,即,仍然是k_acc=5。所累积的k参数k_acc现在等于最大值k=5,且已考虑到了矢量的所有位置。因此,输出索引等于当前累积索引,即,输出索引41。最后一个被识别出的符号仍未被包括在累积索引中,并代之以被提取来作为单独的参数,即,前导符号=“+1”(next_sign_ind=0)。在图8中,示出了代之以使用分段前导符号编码的基本mpvq迭代的实施例的高级示意图。该图示出了使用前导符号信息的分段划分的基本mpvq迭代的实施例的高级示意图。在优选解决方案中,针对每个唯一的pos[0]幅值k_delta实现两个符号段,例如,k_delta=[k-1,k-2,...1]。针对pos[0]=“k”,在pos[0]中消耗所有的单位脉冲,且可停止迭代。针对作为非零的、正的下一前导符号的pos[0]值,首先遇到的非零位置符号要求1比特信息。针对作为非零的、负的下一前导符号的pos[0]值,首先遇到的非零位置符号要求1比特信息。针对pos[0]值=“0”,将迭代扩展到pos[0],而无需任何新的前导符号信息。根据以上迭代定义,可以建立:m(n,k)=1+u(n,k)+u(n,k)+m(n-1,k)=1+2*u(n,k)+m(n-1,k)m(n,k)-m(n-1,k)=1+2*u(n,k)通过应用fischer的pvq递归,获得:m(n,k)-m(n-1,k)=m(n-1,k-1)+m(n,k-1)1+2*u(n,k)=m(n-1,k-1)+m(n,k-1)-m(n-1,k-1)+m(n-1,k-1)1+2*u(n,k)=1+2*u(n,k-1)+2*m(n-1,k-1)u(n,k)=u(n,k-1)+m(n-1,k-1)m(n-1,k-1)=u(n,k)-u(n,k-1)导致m(n-1,k)=[u(n,k+1)-u(n,k)]根据递归定义,知道:m(n,k)=1+2*u(n,k)+[u(n,k+1)-u(n,k)]=1+u(n,k)+u(n,k+1)现在可将mpvq大小递归地确定为:nmpvq(n,k)=m(n,k)=1+u(n,k)+u(n,k+1).针对所使用的mpvq递归公式的推导,进一步参见附录b。nmpvq(n,k)=1+2*u(n,k)+nmpvq(n-1,k)在枚举/编索引中,使用以下定义的特性(a~g)中的任一项:a)npvq(n,k)=2*nmpvq(n,k),(递归地应用于高效编索引);b)u(n,k)=1+u(n,k-1)+u(n-1,k-1)+u(n-1,k),具有初始条件u(0,*)=0,u(*,0)=0,u(1,*)=0,u(*,1)=0,且u(a,b)=u(b,a),且进一步地,为了效率,可使用u(2,k)=k-1且u(n,2)=n-1,以及u(3,k)=k*(k-1)且u(n,3)=n(n-1);c)nmpvq(n,k)=1+u(n,k)+u(n,k+1),(最后的mpvq大小计算)d)nmpvq(n,k)=1+floor((a(n,k))/2)+u(n,k+1),(备选的最后大小计算)e)nmpvq(n,k)-nmpvq(n-1,k)=1+2*u(n,k)=a(n,k),(可被用于迭代的幅值索引增加确定)f)a(n,k)=a(n,k-1)+a(n-1,k-1)+a(n-1,k),(该递归(也在例如celt/opus音频中使用)在此也可用于低复杂度幅值编索引偏移更新。)g)迭代地更新pvq偏移=u(n,k=0..k+1)或优选地迭代地更新:a(n,k=0...k)和u(n,k+1)。a(n,k)递归比u(n,k)递归稍快,且最后一个元素u(n,k+1)与a(n,k+1)相比具有较低动态范围。在此,使用c)和d)来计算最终mpvq(n,k)码字的大小,该大小是从比特流获得索引所需的,或该大小被提供给比特流或者与比特流交互的算术编码器/解码器。图9示出了用于增加维度的mpvq-a/u偏移递归的三个实施例的组合。用于更新偏移的过程开始于步骤350中。输入参数是维度n和k_max+1值。该过程将第n-1行的编索引偏移提供给第n行的编索引偏移,包括更新针对k(0...(k_max+1))的偏移。在步骤352中,决定是否仅使用a偏移。如果是该情况,在步骤354中,将a(n,k)计算为:a(n,k)=a(n-1,k)+a(n-1,k-1)+a(n,k-1)。该具体递归也在现有技术中采用,但与较低效的pvq编索引处理一起采用。在步骤397中返回a(n,k)。在步骤356中,决定是否仅使用u偏移。如果是该情况,在步骤358中,将u(n,k)计算为:u(n,k)=1+u(n-1,k-1)+u(n-1,k)+u(n,k-1)。在步骤398中返回u(n,k)。在步骤360中,要使用a偏移和u偏移的组合。在步骤362中,根据以下公式执行针对k=0...(k_max)的递归:a(n,k)=a(n-1,k)+a(n-1,k-1)+a(n,k-1)。该具体递归也在现有技术中采用,但与较低效的pvq编索引处理一起采用。针对最高动态偏移(k_max+1),在步骤364中执行递归。在一个具体实施例中,根据以下公式使用纯粹的u递归:u(n,k_max+1)=1+u(n-1,k_max)+u(n-1,k_max+1)+u(n,k_max)。在另一具体实施例中,根据以下公式使用混合型a/u递归:u(n,k_max+1)=1+(a(n-1,k_max)>>1)+(a(n,k_max)>>)+u(n-1,k_max+1),其中,(y>>1)意味着y=floor(y/2)。在步骤399中返回a(n,k)和u(n,k_max+1)。在接收机侧,必须执行相反的过程,其中,将前导符号和索引变换为整数型输出矢量。图10示出了音频/视频采样的棱椎矢量量化解索引方法的实施例的步骤流程图。在步骤450中开始该方法。在步骤452中,从进入(ingoing)比特流接收作为第一码字的前导符号和作为第二码字的输入索引。前导符号和输入索引表示音频/视频信号采样。所述前导符号是表示音频/视频信号采样的要创建的整数型输出矢量中的端非零系数的符号。该整数型输出矢量具有多个整数取值的系数。端非零系数是所述整数型输出矢量中的第一个非零系数和最后一个非零系数之一。在步骤454中,使用棱椎矢量量化解枚举方案将输入索引解索引为整数型输出矢量。通过枚举方案创建的输入索引忽略端非零系数的符号。在步骤456中,根据接收到的前导符号来指派整数型输出矢量中的端非零系数的符号。在备选实施例中,可与步骤454并发地、与步骤454相结合地、或在步骤454之前执行步骤456。在步骤458中,输出整数型输出矢量。在步骤499中该处理结束。在具体实施例中,通过迭代解枚举过程来执行解索引步骤454。在另一具体实施例中,迭代解枚举过程包括初始化步骤和对迭代步骤的重复,在初始化步骤中,将剩余索引设置为等于输入索引,在迭代步骤中,选择整数型输出矢量的一个当前系数以供考虑。迭代步骤进而包括:寻找与当前系数在整数型输出矢量内的位置兼容并与剩余索引兼容的偏移参数,根据偏移参数来减小剩余索引,以及将整数型输入矢量的当前系数的幅值设置为等于与偏移参数相关联的幅值。重复继续将整数型输入矢量的系数逐一选择为当前系数,至少直到剩余索引变为等于0为止。下面使用实现该处理的实施例的详细框图来示出mpvq解索引的一些接收机侧方案。图11中示出了mpvq解索引的实施例的概览。mpvq解索引开始于步骤250中。在步骤260中,从编解码比特分配循环中获得vq维度n和单位脉冲数量k。在步骤270中,寻找大小和偏移。在步骤280中,从输入比特流中提取前导符号,且在步骤285中,从输入比特流中获得mpvq索引。在对mpvq索引进行分解的步骤290中使用这些量。在步骤299中该处理结束。与图10的流程图相比,可将步骤260、270、280和285视为被包括在步骤452中。类似地,将步骤454和456视为被包括在步骤290中。在图12中示出了寻找大小和偏移的过程的实施例,例如对应于图11的步骤270。解索引中的a(n,k)偏移通常是幅值偏移,但其也考虑到剩余符号。u(n,k)偏移是类似的。其也是幅值偏移。然而,其不包括第一个前导符号(“2”),但包括了剩余前导符号中的所有剩下的前导符号。偏移一般指示幅值和前导符号的剩余可能组合的段大小。有时,这是在具有当前前导符号的情况下执行的(a(n,k)),且有时是在不具有下一前导符号但具有所有剩下的前导符号的情况下执行的(u(n,k)情况)。针对维度n从k=0到k=k+1寻找mpvq大小nmpvq(n,k)和索引偏移a、u的过程开始于步骤500中。注意到:a(n,k)、a(n,k)仅行递归和a基本递归的直接等式在现有技术中本身是已知的。在步骤502中,检查大小和偏移是否存储在rom表中。如果是(如果n和k都较低,这可以是现实的),过程直接继续步骤519。在步骤504中,检查高效的直接计算是否可能。如果是(对于较低的n,这可以是现实的),处理继续到步骤506,在步骤506中,将直接等式用于mpvq大小(n,k)以及幅值偏移a(n,k)。该过程然后继续到步骤519。在步骤508中,检查高效的行递归是否可能。如果是(对于某些k,这可以是现实的),处理继续到步骤510,在步骤510中,将仅行递归等式用于行n,来计算a(n,k=0...k)和u(n,k+1)。该过程然后继续到步骤514。如果在步骤508中发现仅行递归不可行,过程继续到步骤512,在步骤512中,将偏移更新处理用于针对第0行到第n行的基本列和行偏移递归等式,以将偏移计算为a(n,k=0...k)和u(n,k+1)。这对于所有的n和k是可能的。可在例如图9中找到这样的更新偏移例程的一个示例。在步骤514中,可将mpvq大小计算为mpvq-size=1+(a(n,k)>>1)+u(n,k+1),或备选地计算为mpvq-size=1+u(n;k)+u(n,k+1)。在步骤519中,通过返回偏移(a,u)和mpvq大小来结束过程。图13示出了mpvq索引分解的实施例。用于分解mpvq索引的过程开始于步骤520中。提供参数n、k、输入索引和前导符号以及偏移值。将剩余索引设置为等于输入索引。在步骤522中,用0来初始化输出矢量“vec”。在步骤524中,将局部最大k(k_max_local)设置为等于k,矢量中的位置从0开始,且将n设置为n。在步骤526中,调查矢量中是否所有的位置都被考虑到。如果是,在步骤548中返回该矢量作为输出矢量,即,在处理最后一个位置之后的退出。在步骤528中,调查剩余索引是否是0。如果是,不再用非零值来填充矢量位置。过程继续到步骤530,在步骤530中并入前导符号,且在步骤549中返回该矢量作为输出矢量,即,在处理最后一个位置之前快速早期退出。如果剩余矢量大于0,过程继续到步骤532,在步骤532中寻找k_delta(即,所调查的矢量位置的绝对值幅值)和幅值偏移“amp_offset”。下面将对其进行更详细的进一步描述。在步骤534中,将剩余索引减去幅值偏移。如果在步骤536中调查了矢量位置的幅值不是0,过程继续到步骤538,在步骤538中向该矢量位置给出等于幅值乘以前导符号的值。针对第一个非零系数,前导符号是从比特流提取出的前导符号。在步骤540中,推断针对未来位置的下一前导符号。下面对其进行更详细的进一步描述。在步骤542中,局部最大k值减去当前k值“k_delta”。然后,在步骤544中,通过增加维度n,通过更新偏移并通过将矢量中的位置增加一个步长,来准备下一次重复。然后过程返回到步骤526。如图13中所指示的,根据接收到的索引来确定当前位置的幅值“k_delta”。这优选地通过使用可用的a(n,k)偏移和/或u(n,k)偏移来执行。还推断幅值信息偏移,且将剩余索引减去该幅值信息偏移“amp_offset”。图14中示出了这种过程的一个实施例。用于寻找幅值k_delta和幅值偏移amp_offset的过程的实施例开始于步骤550中。换言之,该过程应该寻找当前位置的幅值以及对应的索引偏移。使用偏移a(n,k)的线性搜索或树形搜索在现有技术中本身是可用的。进入参数是局部最大k“k_max_local”、索引以及偏移h(n,k)=a(n,k)。在步骤552中,选择树形搜索或线性搜索。对于线性搜索选项,步骤554将累积k值(k_acc)设置为等于局部最大k,且将幅值偏移设置为等于针对当前n和累积k值的偏移。在步骤556中,检查偏移是否大于索引。如果是这种情况,在步骤558中,将k_acc值减去一个单位,导出新的幅值偏移。然后过程返回到步骤556。对此进行重复,直到找到小于等于剩余索引的最大幅值偏移值为止。然后过程继续到步骤560,在步骤560中,将k_delta(即,当前位置的幅值)计算为局部最大k值减去k_acc值。如果选择树形过程,在步骤562中,定义high(高)参数和low(低)参数,且推断针对n和high参数的幅值偏移。在步骤564中将要搜索的k领域划分为两部分,其中推断针对n和high参数的k_test参数和幅值偏移。取决于步骤566中判定的幅值偏移是大于还是小于索引,在步骤568中改变high参数,或在步骤572中改变low参数。对此进行重复,直到幅值偏移与索引之差变为0或k_test点变得等于high参数为止,如在步骤570和574中分别检查地。在步骤576中,将k_delta(即,当前位置的幅值)计算为局部最大k值减去k_test值。在步骤579中返回幅值k_delta、k_acc和amp_offset,其中,k_acc=k_max_local-k_delta被用于分段符号编码。在图13中,在步骤536中,如果量值非零且小于最大剩余k单位脉冲值,在步骤538中将先前提取(存储)的前导符号应用于当前位置幅值。之后,要从已分解的接收到的mpvq索引提取下一前导符号。在图15中示出了用于寻找下一前导符号并从索引中移除所提取的符号信息(比特或sign_offset)的过程的一个实施例。用于得到下一前导符号的过程开始于步骤580中。输入参数是剩余索引、偏移和累积k值k_acc。在步骤582中,选择符号定位方法。如果选择lsb方案(其当前被认为是优选实施例),在步骤584中将前导符号初始设置为正(+1)。在步骤586中,使用逐比特的“与(and)”运算来确定索引中的最低有效位。如果该比特是“1”,这意味着负符号,且因此在步骤588中将前导符号改变为“-1”。在步骤590中,将索引移位一个位置,即,将符号比特移出。如果选择分段前导符号解码(其复杂度略高),在步骤592中将前导符号初始设置为正(1)。在步骤594中,将k_delta段的大小除以2。如果索引大于等于该符号偏移,符号是负的,且因此在步骤597中改变前导符号。在步骤598中,还将索引减去所找到的符号偏移。然后,在步骤599中返回前导符号和已修改索引。再次返回图13,如果当前位置具有0幅值,保持前导符号,即,记住前导符号以可能在当前位置之后的下一位置中使用。如果量值等于最大剩余k单位脉冲值,应用所存储的前导符号。可选地,快速迭代退出可被用于该最后一个非零条目,且以一系列拖尾0来早期退出。这是可选的,因为有时在dsp-hw中,有条件地退出最优的恒定长度循环的代价比留在该循环中要高。可针对剩余矢量递归地更新偏移a(n,k)(或u(n,k)),且少一个要解索引的维度并少“k_delta”个要解索引的单位脉冲。图16中示出了针对少一个维度的偏移更新的过程的一个实施例。该过程类似于图9中推出的过程,然而在此处,降低维度而不是增加维度。用于更新偏移的过程开始于步骤600中。输入参数是维度n和k_max值。该过程将第n+1行的编索引偏移提供给第n行的编索引偏移,包括更新针对k(0...(k_max))的偏移。在步骤602中,判定是否仅使用a偏移。如果是该情况,在步骤604中,将a(n,k)计算为:a(n,k)=a(n+1,k)-a(n,k-1)-a(n+1,k-1)。该具体递归也在现有技术中采用,但与较低效的pvq编索引处理一起采用。在步骤617中返回a(n,k)。在步骤606中,判定是否仅使用u偏移。如果是该情况,在步骤608中,将u(n,k)计算为:u(n,k)=u(n+1,k)-u(n,k-1)-u(n+1,k-1)-1。在步骤618返回u(n,k)。在步骤610中,要使用a偏移和u偏移的组合。在步骤612中,根据以下公式来执行针对k=0...(k-max-1)的递归:a(n,k)=a(n+1,k)-a(n,k-1)-a(n+1,k-1)。该具体递归也在现有技术中采用,但与较低效的pvq编索引处理一起采用。针对最高动态偏移k_max(其中,k_max=k+1),在步骤614中执行递归。在一个具体实施例中,根据以下公式使用纯粹的u递归:u(n,k_max)=u(n+1,k_max)-u(n,k_max-1)-u(n+1,k_max-1)-1。在另一具体实施例中,根据以下公式使用混合型a/u递归:u(n,k_max)=u(n+1,k_max)-(a(n,k_max-1)>>1)-(a(n+1,k_max-1)>>1)-1,其中,(y>>1)意味着y=floor(y/2)。在步骤619中返回a(n,k)和u(n,k_max)。下面描述3个示例,以支持对图13的结构的理解。为了使描述保持有限并使得全部示例是直观的,示例具有极低的复杂度。然而,在通常真实示例中,维度以及单位脉冲的数量要高得多。但原理是相同的。在第一示例中,具有维度n=3且单位脉冲的数量k=5,考虑输入索引17以及前导符号“+1”,即,正的。执行初始化,且将“pos”设置为“0”(即,解索引从矢量中的第一个系数开始),将k_max_local设置为5,且维度n=3。将输入索引“重命名”为剩余索引。位置低于3,且剩余索引非零。搜索幅值k_delta和偏移amp_offset(例如,根据图14)。如果例如使用a偏移,调查偏移组a(3,0...5),且仍然小于等于剩余索引的最大a偏移是a(3,3)=13。因此,k_acc变为3,k_delta变为2,且amp_offset等于13。剩余索引被减去amp_offset,且现在变为等于4。由于k_delta不等于0,存在要应用的符号。因此,将矢量位置设置为绝对值(k_delta)乘以接收到的并存储的前导符号(其是正的)。现在,输出矢量是[2,0,0]。然后,例如根据图15来执行对下一前导符号的确定。如果假设lsb符号定位,则剩余索引(4)的lsb是0,这对应于正符号。因此将lead_sign设置为“+1”。还通过将剩余索引移位一个步长来减小该索引,即,等于除以2的整数除法。剩余索引现在等于2。最后,更新剩余脉冲单元k_max_local,且其现在是3。通过将数量n减去1(即,n=2)并将位置指示符“pos”增加1(例如,pos=1)来准备下一次重复。还根据新的n来更新可用偏移。流程返回到步骤526,且要寻找新的幅值和偏移(例如,根据图14)。如果例如使用a偏移,调查偏移组a(2,0...3),且仍然小于等于剩余索引的最大a偏移是a(2,1)=1。因此,k_acc变为1,k_delta变为2,且amp_offset等于1。剩余索引被减去amp_offset,且现在变为等于1。由于k_delta不等于0,存在要应用的符号。因此,将矢量位置设置为绝对值(kdelta)乘以最近提取的前导符号(其是正的)。现在,输出矢量是[2,2,0]。然后,例如根据图15来执行对下一前导符号的确定。如果假设lsb符号定位,则剩余索引(1)的lsb是1,这对应于负符号。因此将lead_sign设置为-1。还通过将剩余索引移位1个步长来减小该索引,即等于除以2的整数除法。剩余索引现在等于0。最后,更新剩余脉冲单元k_max_local,且其现在是1。通过将数量n减去1(即,n=1)并将位置指示符“pos”增加1(例如,pos=2)来准备下一次重复。还根据新的n来更新可用偏移。流程返回步骤526。由于剩余索引是0,执行步骤530,以给出最后一个矢量系数。lead_sign等于-1且k_max_local等于1,这给出了输出矢量[2,2,-1]。在第二示例中,具有维度n=3且单位脉冲的数量k=5,考虑输入索引4和负的前导符号。执行初始化,且将“pos”设置为“0”(即,解索引从矢量中的第一个系数开始),将k_max_local设置为5,且维度n=3。将输入索引“重命名”为剩余索引。位置低于3,且剩余索引非零。搜索幅值k_delta和偏移amp_offset(例如,根据图14)。如果例如使用a偏移,调查偏移组a(3,0...5),且仍然小于等于剩余索引的最大a偏移是a(3,1)=1。因此,k_acc变为1,k_delta变为4,且amp_offset等于1。剩余索引被减去amp_offset,且现在变为等于3。由于k_delta不等于0,存在要应用的符号。因此,将矢量位置设置为绝对值(k_delta)乘以接收到的前导符号(其是负的)。现在,输出矢量是[-4,0,0]。然后,例如根据图15来执行对下一前导符号的确定。如果假设lsb符号定位,则剩余索引(3)的lsb是1,这对应于负符号。因此将lead_sign设置为-1。还通过将剩余索引移位1个步长来减小该索引,即等于除以2的整数除法。剩余索引现在等于2。最后,更新剩余脉冲单元k_max_local,且其现在是1。通过将数量n减去1(即,n=2)并将位置指示符“pos”增加1(例如,pos=1)来准备下一次重复。还根据新的n来更新可用偏移。流程返回到步骤526,且要寻找新的幅值和偏移(例如,根据图14)。如果例如使用a偏移,调查偏移组a(2,0...1),且仍然小于剩余索引的最大a偏移是a(2,1)=1。因此,k_acc变为1,k_delta变为0,且amp_offset等于1。剩余索引被减去amp_offset,且现在变为等于1。由于k_delta等于0,保存最后提取的符号以用于下一次重复。输出矢量仍然是[-4,0,0]。通过将数量n减去1(即,n=1)并将位置指示符“pos”增加1(例如,pos=2)来准备下一次重复。还根据新的n来更新可用偏移。流程返回到步骤526,且要寻找新的幅值和偏移(例如,根据图14)。如果例如使用a偏移,调查偏移组a(1,0...1),且仍然小于等于剩余索引的最大a偏移是a(1,1)=1。因此,k_acc变为1,k_delta变为0,且amp_offset等于1。剩余索引被减去amp_offset,且现在变为等于0。由于k_delta不等于0,存在要应用的符号。因此,将矢量位置设置为绝对值(k_delta)乘以先前提取的前导符号(其是负的)。现在,最后的输出矢量是[-4,0,-1]。在第三示例中,具有维度n=3且单位脉冲的数量k=5,考虑输入索引41和正的前导符号。执行初始化,且将“pos”设置为“0”(即,解索引从矢量中的第一个系数开始),将k_max_local设置为5,且维度n=3。将输入索引“重命名”为剩余索引。位置低于3,且剩余索引非零。搜索幅值k_delta和偏移amp_offset(例如,根据图14)。如果例如使用a偏移,调查偏移组a(3,0...5),且仍然小于等于剩余索引的最大a偏移是a(3,5)=41。因此,k_acc变为5,k_delta变为0,且amp_offset等于41。剩余索引被减去amp_offset,且现在变为等于0。由于k_delta等于0,保存符号以用于后面的迭代。输出矢量仍然是[0,0,0]。通过将数量n减去1(即,n=2)并将位置指示符“pos”增加1(例如,pos=1)来准备下一次重复。还根据新的n来更新可用偏移。流程返回到步骤526,且要寻找新的幅值和偏移(例如,根据图14)。如果例如使用a偏移,调查偏移组a(2,0...5),且仍然小于等于剩余索引的最大a偏移是a(2,0)=0。因此,k_acc变为0,k_delta变为5,且amp_offset等于0。剩余索引被减去amp_offset,且现在变为等于0。由于k_delta不等于0,存在要应用的符号。因此,将矢量位置设置为绝对值(k_delta)乘以接收到的并存储的前导符号(其是正的)。现在,输出矢量是[0,5,0]。通过将数量n减去1(即,n=1)并将位置指示符“pos”增加1(例如,pos=2)来准备下一次重复。流程返回步骤526。在步骤528中,发现索引是0,且使用通过步骤530和549的快速退出。本公开中推出的该新编索引方案是改进的低复杂度短码字方案。在设计中,其是基于最优纯量值编索引方案(fischer/hung/opus/celt)的解决方案,然而此外,其高效地利用了任何pvq结构的大小始终是偶数数量个矢量这一事实。将仍然存在对高效地处理非常大的pvq矢量(大于1+b)比特的需求。这可例如通过目标矢量维度分割、pvq矢量维度分割或昂贵的更高动态范围整数计算(例如,n*16或n*32个虚拟的软件定义大整数)来执行。从b比特到b+1比特(例如,从32比特到33比特)的增益可被量化为扩展的r=比特/系数范围能力,其中,针对给定维度,不需要维度分割。例如,对于维度n=8,从r=32/8=4比特/系数(或采样)到r=33/8=4.125比特每系数或采样。通常,针对高质量频域音频pvq方案,需要r=7形状比特/系数(或采样)。图17a呈现了针对一些公共硬件比特限制的pvq码字的概览。曲线900表示pvq(n,k)比特限制(bitlimit)33,曲线901表示pvq(n,k)比特限制32,曲线902表示pvq(n,k)比特限制31,曲线903表示pvq(n,k)比特限制17,曲线904表示pvq(n,k)比特限制16,且曲线905表示pvq(n,k)比特限制15。33个比特可能与新方案和无符号32比特整数一起使用,32个比特对应于无符号32比特整数,31个比特对应于有符号32比特整数,17个比特可能与新方案和无符号16比特整数一起使用,16个比特对应于无符号16比特整数,15个比特对应于有符号16比特整数。图17b呈现出针对具有不同比特限制的最优pvq码字量化器的以比特/采样为单位的相关r值的概览。曲线910表示pvq(n,k)比特限制33,曲线911表示pvq(n,k)比特限制32,曲线912表示pvq(n,k)比特限制31,曲线913表示pvq(n,k)比特限制17,曲线914表示pvq(n,k)比特限制16,且曲线915表示pvq(n,k)比特限制15。使用更高的r值,可实现更高的编码质量。图17c示出对应的可实现脉冲密度,其与增益形状pvq的所产生的形状匹配能力直接相关。曲线920表示pvq(n,k)比特限制33,曲线921表示pvq(n,k)比特限制32,曲线922表示pvq(n,k)比特限制31,曲线923表示pvq(n,k)比特限制17,曲线924表示pvq(n,k)比特限制16,且曲线925表示pvq(n,k)比特限制15。使用更高的r值,可实现更高的编码质量。以不同的比特限制来示出最优pvq码字量化器的可能脉冲密度。利用更高的脉冲密度,可实现更高的编码质量,例如更高的vqsnr。图17d示出了针对样本现有技术方案pvq和针对新方案mpvq的编索引/解索引中的最差情况mops指令折中,为了公平比较,这两个方案都使用最大大小32的pvq码字。曲线930表示mpvq的总复杂度,曲线931表示pvq的总复杂度,曲线932表示mpvq的解索引复杂度,曲线933表示pvq的解索引复杂度,曲线934表示mpvq的编索引复杂度,以及曲线935表示pvq的编索引复杂度。可在有符号32比特架构上实现上述mpvq,而现有技术pvq要求无符号32比特架构。在当前呈现的技术的第二部分中,描述了对偏移的低动态mpvq运行时计算。在附录a中,重复来自opusrfc的高级文本描述以作为
背景技术
。在ietf-opusc代码(cwrs.c)中,将动态运行时计算的编索引偏移a(n,k)用于符号和幅值编索引这二者。然而,注意到在opusc代码中使用不同的偏移变量名。数a(n,k)表示从第一位置中的正非零值开始的矢量pvq(n,k)的数量。在现有技术中已发现a(n,k)=(npvq(n,k-1)+npvq(n-1,k-1))/2,即,数a是pvq大小矩阵n(n,k)中第n行元素与先前的第n-1行元素的加权和。对于a(n,k),表1示出了所使用的现有技术(celt/opus)pvq偏移数据方案的示例,其中,出于存储器效率考虑,针对前向递归中的给定点,在ram存储器中仅存储一行(例如,n=3),然后基于行n=3计算n=4,并依此类推。注意到:在用于语音及音频编码的真实世界pvq实现中,取决于目标dsp能力,维度n可大约是256,且单位脉冲的数量k可大约是512。因此,存储n*k个偏移经常是不可行的。n/k012345k=601111111121357911315132541614172563129231519411293216816111612316811683表1针对例如类ietf-opus音频编索引方案中的pvq解码/编码计算的pvq(n=6,k=5)所需的现有技术a(n,k)偏移然而可改进该动态编索引偏移计算。在此提出的新颖的递归是u(n,k)=u(n,k-1)+u(n-1,k-1)+u(n-1,k)+1,可发现其与先前使用的opus/celt现有技术偏移a(n,k)有关:a(n,k)=2*u(n,k)+1。现在,u(n,k)的整数范围动态始终是a(n,k)范围的至少一半。这意味着例如在32比特字内额外有1比特可用于快速编索引。此外,与a(2,k)和a(3,k)相比,u(2,k)和u(3,k)可被更快地直接计算,因为u(2,k)=k-1,u(3,k)=k*(k-1),且对称地,u(a,b)=u(b,a)。表2针对mpvq(n=6,k=5)计算的新的低动态范围编索引偏移u(n,k)在上述表1和表2中,可以看出:a(n=6,k=6)=1683不能容纳在10个比特中。10个比特对应于1024个条目,例如,值0~1023。然而,新的偏移u(n=6,k=6)将会容纳在10个比特中。因为为了成功地精确地进行编索引/解索引而需要精确地计算编索引偏移,不能允许偏移a(6,6)饱和至1023或绕回到不正确的较低值。先前的(ietf/opus音频pvq现有技术)递归是a(n,k)=a(n,k-1)+a(n-1,k-1)+a(n-1,k)。其具有三个加法项,使得与具有4项加法的新u(n,k)递归相比,计算起来稍快一些,特别是对于高n或高k而言。为了在需要时保持递归效率并维持低动态范围,在另一实施例中,可以定义优选的混合型递归,其中,u(n,kmax)是先前的a(n,较低k)偏移值的函数,且仅用于靠近b比特字的范围限制的动态递归数据。对于基于n行的递归中的最后一列kmax而言,这通常是真的。在表3中,看出与其最后一个条目超出10个比特的表1相比,偏移仍然停留在10个比特内。表3针对高效且范围安全的编索引递归来计算的混合型a(n,k)和最后的第k列u(n,6=kmax)偏移。注意到:通常是最后的第n行nmax(在本情况下,6)且最高的k(在本情况下,k=6)导致动态范围问题。然而,在一些情况下,倒数第二行(nmax-1)也可导致范围问题,例如,在仅行递归的计算中,在除法中的分子接近硬件比特限制时。可在附录b中找到对mpvq方案的上述递归关系的推导。表4中呈现了现有技术pvq编索引方案的示例。在此,最大索引值a(n,k)+a(k+1)-1需要小于例如232。表4中具有开关符号[{+,0}/-]的方案被用在现有技术opus/celt中。评述:a)矢量[-2,-1,1];b)在此,针对索引25~40,对位置p0上的零解索引可最终变为p1上的正值或负值或0;c)p0正判定限制。现有技术pvq编索引与[{+,0}/-]pvq递归解索引方案pvq(n=3,k=4),npvq=66,[{-,0}/+]现有技术编索引(蓝、白)单元px=三维矢量[p0,p1,p2]中的位置,可以编码k=4个单位脉冲,例如,解码索引7->矢量[-2,-1,1],使用偏移a(n,k)来确定符号,且使用关系npvq(n=3,k=4)=a(n,k)+a(n,k+1)来根据这些偏移确定大小。表4示例现有技术pvq编索引方案使用前导符号递归解决方案,针对mpvq(3,5)示例,可从表5中通过图表方式看出a与u的关系。npvq(n=3,k=5)=2*nmpvq(3,5)=2*51=102,其中,“2”对应于现在预提取的前导符号比特。矢量pvq-vec=[p0,p1,p2],例如已解码索引8是[3,-1,1],sum(abs(pvq-vec))=5。在下面的表5中,现在预提取的初始符号是正(+),即,下面的值p0始终大于等于0。在该示例中,将下一前导符号存储在2*u(n,k)段的lsb比特中。表5基于示例mpvq(3,5)lsb的前导符号枚举。表6示出了根据表5的索引构造示例。表6基于示例mpvq(3,5)lsb的前导符号枚举,索引构造示例注意到:现在必须使用nmpvq=1+u(n,k)+u(n,k+1)来计算表5中的pvq大小,因为针对所有的n、k,不能在2*nmpvq(n,k)比特限制(例如,32比特)内安全地计算a(n,k+1)。现有技术使用pvq大小=a(n,k+1)+a(n,k),或者使用mops昂贵的组合函数或rom昂贵的存储值表查找来对非零元素求和。在图5(前导符号的分段定位)和图2(前导符号的lsb定位)的基本递归示意图中,还可发现a(n,k)为1+2*u(n,k)。在当前呈现的技术的另一部分中,描述了通过符号编码位置的预提取来进行的最优mpvq编索引。通过预提取mpvq前导符号到符号编码位置encode_sign[0...n-1]的矢量中,并预提取该位置处要编码的实际符号和剩余的初始前导符号,也有可能优化编码器侧mpvq索引合成内循环。然而,这要求运行预处理符号移位功能,在少量脉冲的情况下,该功能可能是昂贵的。然而,在一些情况下,实现mpvq编索引可以是优选方式,因为索引合成的内循环变得甚至更直观,并且可被例如针对dsp流水线来极大地优化。下面的符号预移位示例利用n=8和k=13。在上述示例中,从右向左进行编码,即,从位置(n-1)到位置0。预移位功能将第一个符号移位到变量“lead_sign”,且将pvq-vec中的剩余符号移位到(向左的)下一非零位置。pvq-vec中的最后一个非零位置在encode_sign矢量中将始终具有0值。图18示出了使用预提取前导符号的mpvq索引合成的实施例。图中示出了该mpvq索引合成实现的详细框图的实施例。利用预提取的前导索引和mpvq大小来合成mpvq索引的过程开始于步骤700中。该实施例基于下一符号在lsb位置中的解决方案。输入参数是n、k和作为“vec”的pvq矢量。步骤702是利用已知的偏移递归基本情况的初始化步骤,且设置n=1。在步骤704中,将位置参数设置为n-1,即,从最后一个位置开始,以从终点到起点的方式分析矢量。在步骤706中将累积索引和累积脉冲设置为0。首先,在步骤708中分析符号,下面将更详细地进一步对其进行描述。由此确定前导符号,且符号矢量是可用的。在步骤710中,将值设置为等于当前输入矢量系数。在步骤712~720中,如果系数非零,在本实施例中,通过加上lsb,针对系数的符号来调整累积索引。在步骤722中,根据与剩余单位脉冲和当前维度相关联的偏移来修改累积索引。如果在步骤724中检查到当前位置非零,即,搜索尚未到达输入矢量的前部,则在步骤726和728中准备新的重复,且过程返回到步骤710。如果搜索了整个矢量,在步骤730中计算mpvq-size,且在步骤739中提供输出索引、前导符号和mpvq大小。图19示出了符号提取功能的实施例。该过程在步骤740中开始。在步骤742中,执行初始化,给出编码符号矢量0系数,假设正的前导符号,给出作为为-1的初始非零系数的临时位置,且以位置编号0开始。在步骤744中,检查是否位置小于最大值且仍然没有找到前导符号。如果是,在步骤746中,检查当前位置的矢量系数是否是0。如果是,在步骤754中将当前位置步进一个步长,且对处理进行迭代。如果当前矢量系数非零,过程继续到步骤748,其中,负系数在步骤750中导致负的lead_sign。在过程继续到步骤754之前,在步骤752中将第一个非零系数的位置记录为initial_pos。如果在步骤744中发现找到前导符号,过程继续到步骤756,在步骤756中初始化符号矢量encode_sign过程。步骤758~766继续搜遍输入矢量以寻找非零系数,且向符号矢量中的对应位置给出后续非零系数的符号。在调查了所有位置时,在步骤769中返回前导符号和符号矢量。该方案的好处在于:前导符号编码位置的预移位或预定位(pre-localization)使得有可能避免编索引内迭代循环中的前导符号打乱次序(shuffling)。当想要在分支(if/else)实现昂贵的某些硬件中优化编码内循环时,这可以是有益的。表7示出了mpvq分段前导符号迭代示例.npvq(n=3,k=5)=2*nmpvq(3,5)=2*51=102,其中,“2”对应于现在预提取的前导符号比特。矢量pvq-vec=[p0,p1,p2],例如,解码索引8是[3,0,2],sum(abs(pvq-vec))=5。在表7中,现在预提取的初始符号是正的,在该示例中,根据2*u(n,k)初始幅值分段的低/高段来导出下一前导符号。表7示例mpvq(3,5)分段前导符号枚举表8示出了根据表7的索引构造示例。在当前呈现的技术的另一部分中,描述了混合型低动态仅行递归。如果k值足够低,有可能使用下面进一步呈现的新的仅行递归公式来计算偏移矩阵a(n,k)中给定的行n所需的偏移。附录b中给出了新递归公式的详细推导。在2012现有技术ietf/opus音频码中使用针对pvq差偏移a(n,k)的给定行n的通用递归等式:a(n,k)=a(n,k-2)+((2*n-1)*a(n,k-1)-a(n,k-2))/(k-1)。表8示例mpvq(3,5)分段前导符号枚举,索引构造示例通过改动(massage)并操控以上等式且使用新的关系u(n,k)=(a(n,k)-1)/2,可以获得新的优选较低动态范围混合递归公式:u(n,k)=u(n,k-2)+(n*a(n,k-1)-nmpvq(n,k-2))/(k-1),其中,nmpvq(n,k)=1+u(n,k)+u(n,k+1),(mpvq(n,k)大小)。在此,与对应的现有技术分子项(2*n-1)*a(n,k-1)相比,新的分子项n*a(n,k-1)具有低得多的动态范围。在优选解决方案中,通过使用针对k>0,a(n,k)是奇数这一事实,可进一步改动该仅行递归,以仅使用针对行n的过去的a(n,k)值。我们获得新的非常高效的混合递归公式:u(n,k)=a(n,k-2)>>1+(n*a(n,k-1)-(1+a(n,k-1)>>1+a(n,k-2)>>1))/(k-1),其中,“>>”是除以2的整数除法,在多数硬件中是低成本的向右移位。这使得与现有技术的仅行递归相比,针对更高的n值和更高的k值在例如64比特或32比特或33比特内能够使用具有有限精度的快速仅行递归。换言之,与旧的项2*n*a(n,k-1)相比,新的n*a(n,k-1)项更晚溢出/绕回,因为针对行递归增加了n或k的范围。在降低动态偏移表2以及在混合递归偏移表3中还可以间接地看出优化的仅行递归的动态好处,因为与先前使用的a(n,k)相比,导致偏移的u(n,k)具有较低的动态。在当前呈现的技术的另一部分中描述了混合型mpvq前导符号迭代以及任何的传统pvq迭代。另一可能的枚举备选是使用初始mpvq前导符号枚举阶段,然后是针对矢量的剩余部分使用任何其他高效的pvq枚举方案。换言之,不管何时要枚举第二个前导符号,都可以将正在使用的pvq枚举方法切换为传统方案。初始前导符号mpvq阶段将使得有可能比传统的短码字方案多使用一个比特,且初始mpvq阶段会将偏移(a,u)的动态降低为在第一mpvq阶段之后至少少一个比特。表9示出了mpvqh的示例解索引结构和结果,以下二者的混合组合:第一mpvq阶段,接着是第二的基于opus/ietf音频量值和(sizepvq(n,k)=a(n,k)+a(n,k+1))的枚举阶段。表9示例mpvqh(3,5)混合型单前导符号枚举。针对(n=3,k=5)的mpvq变型。该混合版本使用单前导符号迭代编索引阶段,后接类现有技术ietf/opus的基于[{-,0}/+])量值的pvq编索引阶段单元(cell)),npvq=2*nmpvqh=2*51=102,其中,“2”对应于单个初始的单个提取出的前导符号比特。在要添加第二个符号时使用第一mpvq(n,k)阶段然后使用另一基于棱椎的pvq枚举阶段(在类ietf/opus的量值阶段之上)的混合型方案(如上面例示的mpvqh)的缺陷是:prom代码大小将会大很多,且迭代循环内部的编索引方法的切换将会要求另一判定逻辑,该另一判定逻辑要求关键迭代循环内部的其他dsp周期。此外,还可能必须维护若干个偏移存储器。然而,后接后续常规pvq方案阶段的混合型mpvq单前导符号阶段也可以提供将总的短码字大小扩展1个比特(例如,从32个比特扩展到33个比特)的益处。在上述实施例中,选择前导符号作为矢量中第一个非零系数的符号。然而,在其他实施例中,也可以选择前导符号作为矢量中的最后一个非零系数。因此,前导符号是整数型输入矢量或整数型输出矢量中的端非零系数的符号。端非零系数是整数型输入矢量或整数型输出矢量中的第一个非零系数和最后一个非零系数之一。提取前导符号的用途在于可以简化剩余的编索引。一个主要原因是可将编索引方案简化为二分之一。在编索引之前,不知道在要处理的矢量中有多少非零系数。然而,始终存在端非零系数。在上述实施例中,还假设了整数型输入矢量的编索引开始于最后一个系数并结束于第一个系数,且解索引开始于整数型输出矢量的第一个系数并结束于最后一个系数。在备选实施例中,编索引可代之以开始于第一个矢量系数并结束于最后一个矢量系数,而解索引开始于最后一个矢量系数且结束于第一个矢量系数。其可以与端非零系数的任何备选进行组合。在其他实施例中,编索引可按照任何预定顺序从整数型输入矢量中选取系数,且对应的解索引因而按照相反方向遍历整数型输出矢量的系数。那么,棱椎矢量量化枚举方案和棱椎矢量量化解枚举方案可相应地适配。在一个具体实施例中,整数型输入/输出矢量中的“位置”可以是按所假设的处理顺序的位置,且不必对应于矢量自身内的实际位置。在具体实施例中,所提出的技术可以应用于可以是有线或无线设备的用户终端或用户设备。如本文中所使用的,非限制性术语“用户设备”(ue)和“无线设备”可以指移动电话、蜂窝电话、配备有无线通信能力的个人数字助理pda、智能电话、膝上型电脑或配备有内部或外部的移动宽带调制解调器的个人计算机pc,具有无线通信能力的平板pc、目标设备、设备到设备ue、机器类型的ue或支持机器到机器通信的ue、ipad、客户住宅设备cpe、膝上型嵌入式设备lee、膝上安装的设备lme、通用串联总线(usb)适配器(dongle)、便携式电子无线通信装置、配备有无线通信能力的传感器设备等。具体地,术语“ue”和术语“无线设备”应当理解为非限制性的术语,包括在蜂窝或移动通信系统中与无线网络节点通信的任意类型无线设备,或配备有用于根据蜂窝或移动通信系统内的任意相关标准进行无线通信的无线电电路的任意设备。如本文所使用的,术语“有线设备”可以指被配置为或准备与网络有线连接的任意设备。具体地,有线设备可以是当配置为用于有线连接时具有或不具有无线电通信能力的上述装置的至少一些。在具体实施例中,所提出的技术可以应用于可以是有线或无线设备的网络节点。在具体实施例中,网络节点可以是无线网络节点。本文中使用的非限制性术语“无线网络节点”可指基站、网络控制节点(例如网络控制器、无线网络控制器、基站控制器)等。具体地,术语“基站”可以包含不同类型的无线基站,其中包括标准基站(例如,节点b或演进节点b(enb)),还可以包括宏/微/微微(pico)无线基站、家庭基站(也称为毫微微(femto)基站)、中继节点、中继器、无线接入点、基础收发机站(bts)、以及甚至控制一个或多个远程无线单元rru的无线控制节点等。在具体实施例中,网络节点可以是有线通信系统中的网络节点。ue或网络节点也可以包括用于与一个或多个其他节点通信(包括发送和/或接收信息)的无线电路。将理解的是,本文所描述的方法和设备可以用各种方式组合和重新布置。例如,实施例可以用硬件,或用由合适的处理电路执行的软件,或其组合来实现。本文所述的步骤、功能、过程、模块和/或框可以使用任何常规技术实现在硬件中,例如分立电路或集成电路技术,包括通用电子电路和专用电路这二者。具体示例包括一个或多个合适配置的数字信号处理器和其他已知电子电路,例如用于执行特别功能的互连的分立逻辑门、或者专用集成电路(asic)。备选地,本文所述步骤、功能、过程、模块和/或框的至少一部分可以实现在软件中,例如由例如一个或多个处理器或处理单元之类的合适处理电路来执行的计算机程序。因此,当由一个或多个处理器执行时,本文提出的流程图可被认为是计算机流程图。对应的装置可被定义为一组功能模块,其中由处理器执行的每个步骤对应于功能模块。在这种情况下,功能模块实现为在处理器上运行的计算机程序。处理电路的示例包括(但不限于):一个或多个微处理器、一个或多个数字信号处理器(dsp)、一个或多个中央处理单元(cpu)、视频加速硬件、和/或任意合适的可编程逻辑电路,例如一个或多个现场可编程门阵列(fpga)或者一个或多个可编程逻辑控制器(plc)。也应当理解,可以重用其中实现了所提出的技术的任意传统设备或单元的通用处理能力。还可以例如通过重新编程现有的软件或者通过添加新的软件组件来重新使用现有的软件。所提出的技术提供配置来编码音频/视频信号的编码器,其中编码器被配置为:获得整数型输入矢量,所述整数型输入矢量表示音频/视频信号采样,所述整数型输入矢量具有多个整数取值的系数,从所述整数型输入矢量提取前导符号,所述前导符号是输入矢量中的端非零系数的符号,所述端非零系数是所述整数型输入矢量中的第一个非零系数和最后一个非零系数之一,使用棱椎矢量量化枚举方案将所述整数型输入矢量编索引为输出索引,所述输出索引与所述前导符号一起表示音频/视频信号采样,其中,所述棱椎矢量量化枚举方案被设计为忽略所述端非零系数的所述符号,以及将作为第一码字的所述前导符号和作为第二码字的所述输出索引输出到输出比特流中。在具体示例中,编码器包括处理器和存储器。存储器包括处理器可执行的指令,由此,编码器/处理器能够操作为:获得整数型输入矢量,所述整数型输入矢量表示音频/视频信号采样,所述整数型输入矢量具有多个整数取值的系数,从所述整数型输入矢量提取前导符号,所述前导符号是输入矢量中的端非零系数的符号,所述端非零系数是所述整数型输入矢量中的第一个非零系数和最后一个非零系数之一,使用棱椎矢量量化枚举方案将所述整数型输入矢量编索引为输出索引,所述输出索引与所述前导符号一起表示音频/视频信号采样,其中,所述棱椎矢量量化枚举方案被设计为忽略所述端非零系数的所述符号,以及将作为第一码字的所述前导符号和作为第二码字的所述输出索引输出到输出比特流中。所提出的技术还提供了被配置为通过棱椎矢量量化解索引为音频/视频采样的解码器,其中,所述解码器被配置为:从进入比特流接收作为第一码字的前导符号和作为第二码字的输入索引,所述前导符号和所述输入索引表示音频/视频信号采样,所述前导符号是表示所述音频/视频信号采样的要创建的整数型输出矢量中的端非零系数的符号,所述整数型输出矢量具有多个整数取值的系数,所述端非零系数是所述整数型输出矢量中的第一个非零系数和最后一个非零系数之一,使用棱椎矢量量化解枚举方案将所述输入索引解索引为所述整数型输出矢量,其中,通过枚举方案创建的所述输入索引被设计为忽略所述端非零系数的所述符号,根据所接收的前导符号来指派所述端非零系数的符号,并输出所述矢量。在具体示例中,解码器包括处理器和存储器。存储器包括处理器可执行的指令,由此,解码器/处理器能够操作为:从进入比特流接收作为第一码字的前导符号和作为第二码字的输入索引,所述前导符号和所述输入索引表示音频/视频信号采样,所述前导符号是表示所述音频/视频信号采样的要创建的整数型输出矢量中的端非零系数的符号,所述整数型输出矢量具有多个整数取值的系数,所述端非零系数是所述整数型输出矢量中的第一个非零系数和最后一个非零系数之一,使用棱椎矢量量化解枚举方案将所述输入索引解索引为所述整数型输出矢量,其中,通过枚举方案创建的所述输入索引被设计为忽略所述端非零系数的所述符号,根据所接收的前导符号来指派所述端非零系数的符号,并输出所述矢量。在下文中,将参照图20来描述计算机实现的示例。编码器10包括处理电路(例如,一个或多个处理器800)和存储器810。在该具体示例中,本文中描述的步骤、功能、过程、模块和/或框的至少一部分实现在计算机程序820~826中,计算机程序被加载到存储器中以供处理电路执行。处理电路和存储器彼此互连,以实现正常软件执行。可选的输入/输出804~808设备还可以与处理电路和/或存储器互连,以实现相关数据(例如,输入参数和/或得到的输出参数)的输入和/或输出。在下文中,将参照图21来描述计算机实现的另一示例。解码器60包括处理电路(例如,一个或多个处理器850)和存储器860。在该具体示例中,本文中描述的步骤、功能、过程、模块和/或框的至少一部分实现在计算机程序870~876中,计算机程序被加载到存储器中以供处理电路执行。处理电路和存储器彼此互连,以实现正常软件执行。可选的输入/输出设备854~858还可以与处理电路和/或存储器互连,以实现相关数据(例如,输入参数和/或得到的输出参数)的输入和/或输出。术语“计算机”应当在一般意义上解释为能够执行程序代码或计算机程序指令以执行具体处理、确定或计算任务的任意系统或设备。在具体实施例中,计算机程序包括在由至少一个处理器执行时使所述处理器执行以下操作的指令:获得整数型输入矢量,所述整数型输入矢量表示所述音频/视频信号采样,所述整数型输入矢量具有多个整数取值的系数,从所述整数型输入矢量提取前导符号,所述前导符号是所述整数型输入矢量中的端非零系数的符号,所述端非零系数是所述整数型输入矢量中的第一个非零系数和最后一个非零系数之一,使用棱椎矢量量化枚举方案将所述整数型输入矢量编索引为输出索引,所述输出索引与所述前导符号一起表示所述音频/视频信号采样,所述棱椎矢量量化枚举方案忽略所述端非零系数的所述符号,以及将作为第一码字的所述前导符号和作为第二码字的所述输出索引输出到输出比特流中。在具体实施例中,计算机程序包括在由至少一个处理器执行时使所述处理器执行以下操作的指令:从进入比特流接收作为第一码字的前导符号和作为第二码字的输入索引,其中,所述前导符号和所述输入索引表示音频/视频信号采样,所述前导符号是表示所述音频/视频信号采样的要创建的整数型输出矢量中的端非零系数的符号,所述整数型输出矢量具有多个整数取值的系数,所述端非零系数是所述整数型输出矢量中的第一个非零系数和最后一个非零系数之一,使用棱椎矢量量化解枚举方案将所述输入索引解索引为所述整数型输出矢量,所述输入索引是通过忽略所述端非零系数的所述符号的枚举方案来创建的,根据所接收的前导符号来指派所述端非零系数的符号,并输出所述整数型输出矢量。所提出的技术还提供了一种包括计算机程序在内的载体,其中所述载体是电子信号、光信号、电磁信号、磁信号、电信号、无线电信号、微波信号或计算机可读存储介质之一。因此,软件或计算机程序可实现为计算机程序产品,其通常携带于或存储在计算机可读介质上。计算机可读介质可包括一个或多个可移除或不可移除的存储设备,包括(但不限于)只读存储器(rom)、随机存取存储器(ram)、高密度盘(cd)、数字多功能盘(dvd)、蓝光碟、通用串行总线(usb)存储器、存储器、硬盘驱动(hdd)存储设备、闪存、磁带、或者任意其他常规存储设备。计算机程序可以因此被加载到计算机或等效处理设备的操作存储器中,以供其处理电路执行。如本文中所指出的,编码器可以备选地定义为功能模块的组,其中功能模块实现为在至少一个处理器上运行的计算机程序。图22是示出了包括一组功能模块830~836在内的编码器10的示例的示意框图。因此,驻留在存储器810中的计算机程序可以被组织为合适的功能模块830~836,功能模块830~836被配置为:当被处理器800执行时,执行本文中所述步骤和/或任务的至少一部分。图22中示出了这些功能模块830~836的示例。如本文所指出的,解码器可以备选地定义为功能模块的组,其中功能模块实现为在至少一个处理器上运行的计算机程序。图23是示出了包括一组功能模块880~886在内的解码器60的示例的示意框图。因此,驻留在存储器860中的计算机程序可以被组织为合适的功能模块880~886,功能模块880~886被配置为:当被处理器850执行时,执行本文中所述步骤和/或任务的至少一部分。图23中示出了这些功能模块880~886的示例。所提出的方案提高了基于短码字的棱椎矢量量化方案的性能。该方案降低了所需编索引偏移的动态范围。降低动态范围的所期望的副作用是针对给定硬件可以使用大1个比特的“短”pvq码字,而没有任何显著的惩罚。这使得有可能在支持b比特无符号算术的dsp硬件上使用b+1比特pvq码字方案,且这使得有可能在仅支持有符号b比特整数算术(具有b-1比特的量值)的dsp硬件上实现b比特pvq码字方案。此外,由于高效地编码大1个比特的码字的能力,用于发送分割边信息(sideinformation)所需的开销将会降低。作为使用的示例,在维度n=128上具有k个均匀分布的脉冲的pvq编码,其中,使用5个比特来编码每个二元维度划分的关系,且通过音频编解码比特分配算法将71个比特在维度n=128上分配给pvq。最优的无约束pvq给出了:log2(npvq(n=128,k=12))=67.2比特,log2(nmpvq(n=128,k=12+1))=71,5比特。67.2<71<71.5,即,在n=128上使用最优无限制pvq,12个单位脉冲是可能的,产生脉冲密度12/128。传统的b=32比特方案要求2次分割,分割为近乎相等的维度([n1=43,n2=43,n3=42]):2*log2(npvq(43,4))+log2(npvq(42,4))+2*5=63.25+2*5=73.25比特73.25大于比特预算71。通过尝试将脉冲的数量减少1以减少到11,获得:2*log2(npvq(43,4))+log2(npvq(42,3))+2*5=58.84+2*5=68.84<71。所产生的脉冲密度变为11/128。传统的b=32比特方案要求2次分割,分割为不均匀划分的维度([n1=64,n2=32,n3=32]):log2(npvq(64,6))+2*log2(npvq(32,3))+2*5=53.34+2*5=73.34比特73.25大于比特预算71。通过尝试将脉冲的数量减少1以减少到11,获得:2*log2(npvq(32,3))+log2(npvq(64,5))+2*5=58.92+2*5=68.9<71。所产生的脉冲密度变为11/128。新的(b+1)=33比特mpvq方案要求1个分割,分割为[n1=64,n2=64]:2*log2(2*nmpvq(64,6))+5=2*32.51+5=70.02比特<71,其中2*nmpvq(64,6)=npvq(64,6)=32.51>b。所产生的脉冲密度变为12/128。换言之,给定向维度n=128的矢量分配的71个比特,旧的32比特码字方案仅可提供11个脉冲,而新的33比特码字方案可提供12个脉冲。由于其33比特的大1比特的编码范围,新方案更适合于根据音频编解码的原始比特分配指令来分配比特,因为(经常)可降低附加矢量分割的开销。可在itu-tg.719规范第7.5.2节或opuusrfc6716第4.3.4.1节中找到示例音频编解码比特分配方案。仅作为示例,提出上述实施例,并且应当理解,所提出的技术不限于此。本领域技术人员将理解,在不脱离由所附权利要求限定的本公开范围的情况下,可以对实施例做出各种修改、组合和改变。具体地,不同实施例中的不同部分的解决方案可在技术上可行的其他配置中进行组合。缩写vq矢量量化器/量化pvq棱椎vqpvq(n,k)具有维度n和k个单位脉冲的pvq结构,pvq(n,k)是具有等于k的l1范数的棱椎结构。mpvq前导符号模块化pvqmpvq(n,k)具有维度n和k个单位脉冲的mpvq结构,mpvq(n,k)结构是划片pvq(n,k)棱椎结构,mpvq(n,k)的l1范数是k。npvq(n,k)pvq(维度n,k个单位脉冲)的大小nmpvq(n,k)mpvq(维度n,k个单位脉冲)的大小simd单指令多数据(dsp指令类)dsp数字信号处理器hw硬件sw软件n,dim维度n,l当前维度k,kpvq(n,k)中和mpvq(n,k)中的单位脉冲的数量kmax最大的k值b目标硬件系统中高效运算的比特限制,在如今的处理器中通常是(16)、32或64比特。r比特每采样,或比特每系数,x目标矢量r,vec形状矢量(有时也称为残留)g用于缩放目标矢量的增益(标量或矢量)ram随机存取存储器ops每秒运算mops每秒百万次运算p-rom程序romrom只读存储器(通常预存储数据)lsb最低有效位msb最高有效位lp线性预测。附录a在该附录中包括来自ietf/opus音频pvq部分的相关摘录,以确立现有技术状态。被细分且优化的opus音频pvq编索引/解索引算法涉及若干优化,其未在rfc6716的文本描述中描述,但作为附件ietf/opus音频rfc6716pvq解索引中的c代码文件(cwrs.c)提供。“pvq解码在decode_pulses()(cwrs.c)中实现对pvq矢量的解码。将唯一的码字索引解码为在0到v(n,k)-1之间的均匀分布的整数值,其中,v(n,k)是n个采样中的k个脉冲的可能组合的数量。然后,通过在[pvq]中规定的相同方式将索引转换为矢量。编索引基于对v(n,k)的计算([pvq]中所表示的n(l,k))。可将组合的数量递归地计算为:v(n,k)=v(n-1,k)+v(n,k-1)+v(n-1,k-1),其中,v(n,0)=1,且v(0,k)=0,k!=0。存在用于计算v(n,k)的很多不同方式,包括预计算表格和对递归公式化的直接使用。参考实现每次一行(或一列)地应用递归公式化以节省存储器使用,将其与交替的单变量递归一起应用以初始化任意行,且针对较小的n应用直接多项式解决方案。所有这些方法都是等效的,并在速度、存储器使用和代码大小上具有不同折中。实现可以使用其喜欢的任何方法,只要它们与数学定义等效即可。如下恢复解码矢量x。令i是利用第4.1.5节中的过程来解码的索引(ft=v(n,k)),使得0<=i<v(n,k)。令k=k。则,针对j=0至(n-1),含首末项,进行:1.令p=(v(n-j-1,k)+v(n-j,k))/2。2.如果i<p,则令sgn=1,否则令sgn=-1,且设置i=i-p。3.令k0=k,且设置p=p-v(n-j-1,k)。4.在p>i时,设置k=k-1,且p=p-v(n-j-1,k)。5.设置x[j]=sgn*(k0-k),且i=i-p。然后,将解码矢量x规范化,使得其l2范数等于1。”ietf/opus音频pvq码字限制和分割“分割解码为了避免在解码pvq码矢量时对多精度计算的需求,码本的最大允许大小是32个比特。当需要更大的码本时,代之以将矢量分割为大小为n/2的两个子矢量。对具有从当前分配导出的精度的量化增益参数进行熵编码,以表示分割的每一侧的相对增益,且递归地应用整个解码处理。可应用多级分割,直到lm+1次分割的限制为止。将相同的递归机制应用于立体声音频的联合编码。”ietf/opus音频rfc-6716pvq搜索“球面矢量量化celt使用棱椎矢量量化器(pvq)[pvq]来对音调预测器(pitchpredictor)尚未预测的每个频带中的频谱的细节进行量化。pvq码本由具有n个采样的矢量中的k个有符号脉冲的所有总和组成,其中,相同位置处的两个脉冲被要求具有相同符号。因此,码本包括满足sum(abs(y(j)))=k的、n维的所有整数型码矢量y。在分配了充足比特的频带中,使用pvq来编码根据第5.3.2节中的规范化直接产生的单位矢量。给定pvq码矢量y,将单位矢量x获得为x=y/||y||,其中,||.||表示l2范数。”“pvq搜索通过alg_quant()(vq.c)来执行对最佳码矢量y的搜索。对于该搜索,存在在质量和复杂度之间具有折中的若干可能的方案。参考实现中使用的方法通过将规范化的频谱x投影到具有k-1个脉冲的码本棱椎上来计算初始码字y1:y0=truncate_towards_zero((k-1)*x/sum(abs(x)))取决于n、k和输入数据,初始码字y0可包含从0到k-1个非零值。使用最小化y和x之间的规范化相关性的贪婪搜索来迭代地寻找除最后一个脉冲之外的所有剩余脉冲:上述搜索被认为在质量和计算成本之间具有良好折中。然而,存在搜索pvq码本的其他可能方式,且该实现可使用任何其他搜索方法。参见celt/vq.c中的alg_quant()。”ietf/opus音频rfc-6716pvq编索引“pvq编码如下将要编码的矢量x转换为索引i,使得0<=i<v(n,k)。令i=0且k=0。从而,针对j=(n-1)降到0,包容首末项,进行:1.如果k>0,设置i=i+(v(n-j-1,k-1)+v(n-j,k-1))/2。2.设置k=k+abs(x[j])。3.如果x[j]<0,设置i=i+(v(n-j-1,k)+v(n-j,k))/2。然后,使用第5.1.4节中的过程来编码索引i,其中ft=v(n,k)。附录bmpvq相关递归等式的推导使用fischer公式来推导u(n,k)和m(n,k)=nmpvq(n,k)大小关系:使用n(n,k)作为npvq(n,k)的简写,npvq(n,k)是维度为n的具有k个单位脉冲的pvq矢量的数量。源自1986年的fischer原始pvq递归:n(n,k)=n(n-1,k)+n(n-1,k-1)+n(n-1,k)(1)定义m(n,k)=n(n,k)/2;(2)下面使用m(n,k)作为nmpvq(n,k)的简写//具有正的初始符号的pvq矢量的数量m(n,k)//是全pvq棱椎n(n,k)中的条目的数量的一半//)将u(n,k)定义为sum(j=1,j=k-1,m(n-1,j)(3)//具有剩余+(正)前导符号的矢量的数量//排除具有初始位置值“k”的矢量,//且//排除具有初始位置值“0”的矢量m(n,k)=1+2*u(n,k)+m(n-1,k);(4)//针对k=kmax,等于1,仅可能有1个这样的前导矢量//针对具有新的/下一前导符号的矢量的数量,2*u(n,k)//(“2”是由于正或负的新/下一前导符号)//(“(u(n,k)”矢量具有初始正幅值//[kmax-1,kmax-2…1])m(n-1,k),//针对剩余的具有前导零值的矢量(等效地,m(n,k)=nmpvq(n,k))nmpvq(n,k)=1+2*u(n,k)+nmpvq(n-1,k);(4b)m(n,k)-m(n-1,k)=1+2*u(n,k)=a(n,k)(5)将(1)(2)(5)进行合并m(n-1,k)=u(n,k+1)-u(n,k)(6)将(4)(6)进行合并m(n,k)=1+u(n,k)+u(n,k+1)(7)现在可将(7)用于大小计算,因为u(n,k)和u(n,k+1)这二者都<m(n,k)(5),差(5),即a(n,k)仍可用于幅值偏移迭代,如果仅用于最大a(n,kmax)的偏移的话,因为a(n,kmax+1)可能超出m(n,kmax),且因此在精度有限的硬件中导致数值问题。推导用于u(n,k)的直接行计算递归u(n,k)=(a(n,k)-1)/2(根据等式(5))在celt/opus音频中使用的针对pvq差行a(n,k)的通用等式a(n,k)=a(n,k-2)+((2*n-1)*a(n,k-1)-a(n,k-2))/(k-1)(8)将(5)(8)进行合并u(n,k)=((2*n-1)*(u(n,k-1)+(k-2)*u(n,k-2)+n-1)/(k-1)(9)或允许混合递归u(n,k)=(a(n,k-2)-1)/2+((2*n-1)*a(n,k-1)-a(n,k-2))/(2*(k-1))(10)由于(8与9、10)的分子的高动态范围,当对该直接函数求值时,特别是在精度有限的算术系统(例如,32比特系统)中,必须要特别关注。(8)用在ietf/opus中,且用在原始celt中。(10)可用在u(n,kmax+1)的mpvq系统计算中,因为现有技术中已知所有先前的a(n,k<kmax+1)都具有足够低的值。甚至可进一步简化(10)(因为对于k>1,a(n,k)始终是奇数)u(n,k)=floor(a(n,k-2)/2)+(n*a(n,k-1)-(floor(a(n,k-1)/2)+floor(a(n,k-2)/2+1)))/(k-1)(11)或u(n,k)=u(n,k-2)+(n*a(n,k-1)-nmpvq(n,k-2))/(k-1)(11.b)mpvqn,k矩阵递归关系根据fischer关系(1)n(n,k)=n(n-1,k)+n(n-1,k-1)+n(n-1,k)合并(7)和(5),可发现这些递归关系:u(n,k+1)=1+u(n-1,k)+u(n-1,k+1)+u(n,k)(12),且具有初始条件u(0,*)=0,u(1,*)=0,以及u(a,b)=u(b,a)a(n,k+1)=a(n-1,k)+a(n-1,k+1)+a(n,k)(13)且具有初始条件a(0,0)=1,a(0,1+)=0,a(1,*)=1,以及a(a,b)=a(b,a)针对a(n,k),现在可使用(13)来根据先前的矢量行n-1,k=0:kmax迭代地计算行n,k=0:kmax,且针对u(n,k),可使用(12)来根据先前的矢量行n-1,k=0:kmax+1迭代地计算行n,k=0:kmax+1。(13)用在ietf-opus音频中。使用(12)以及a(n,k)是奇数这一事实,获得新的高效混合递归公式:u(n,k+1)=1+a(n-1,k)>>1+u(n-1,k+1)+a(n,k)>>1(14)其中,“>>”是除以2的整数除法(右移),因为a(较大n,k+1)可能饱和,使用等式14来停留在给定动态范围(例如针对最后的第(k+1)偏移列,32个比特)内。矢量半径关系,通过乘积的枚举,以及矢量长度递归关系hung、tsern、meng在1998年还总结了pvq(1==n,k)棱椎的一些相关附加关系,大小是n(l,k)=npvq(l,k),下面的矢量半径递归关系“(43)”是针对行l=n的基本的仅行大小关系。下面的通过乘积做出的枚举公式“(44)”是针对pvq大小的基于非零元素的数量的乘积关系。(l-1)n(l,k)=2kn(l-1,k)+(l-1)n(l-2,k)矢量长度递归(42)kn(l,k)=2ln(l,k-1)+(k-2)n(l,k-2)矢量半径递归(43)通过乘积做出的枚举公式(44)。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1