用于计算逆dct的方法和设备的制作方法

文档序号:7608605阅读:229来源:国知局
专利名称:用于计算逆dct的方法和设备的制作方法
技术领域
本发明涉及视频编码/解码并且尤其涉及逆变换的计算,诸如考虑失配控制来快速实现用于MPEG视频解码的离散余弦逆变换。
在诸如MPEG 1和MPEG 2视频编码之类的MPEG(活动图像专家组Moving Picture Expert Group)标准的核心部分中使用二维的8×8离散余弦变换(discrete cosine transform DCT)。已经公布了用于快速计算(在编码期间所使用的)DCT和(在解码期间所使用的)逆DCT的许多方法。然而,这些只描述了用于快速计算结果的数学方法。
MPEG解码包括诸如可变长度解码、IQ/DCT级和运动重构阶段之类的几个部分。依照两种方式来使用IQ和DCT级,一种方式处于所谓的‘内部’宏模块,其中输出图像值直接由DCT的输出来描述,另一种方式处于宏模块“外部”或“之间”,其中通过把输出加到运动重构之上来把DCT输出用作校正项。
逆量化(inverse quantisation IQ)级把在位流中所编码的值变成准备用于输入到逆DCT变换的值。
用于以软件来实现2-D 8×8 IDCT的标准方式为通过使用长度为8的多个1-D IDCT。这首先在一维上进行(例如从上到下作用于每行),然后在另一维上进行(例如从左到右作用于每列)。在此说明书中,我们假定IDCT首先作用于列数据,然后作用于行数据。然而,所述方法也适用于相反工作的实现方式以及使用直接2-D IDCT的实现方式。
IDCT的特性在于零值的输入数据会产生零值的输出数据。此外,系数越接近于第一(即左上方或DC)系数,所述系数越可能是非零的。实际上,正是远离左上角的量化系数可能是零或接近于零的事实才是为什么IDCT在视频编码中是有用的原因。
IDCT实现方式的最简单情况可能是对所有的输入值集进行完全的8×8变换。然而,某些软件实现配置为忽略对已知零输入数据区域的IDCT变换。通常这意味着IQ循环中的某些逻辑能够计算用于确定使用哪个方法的值。
下面将描述两个这种方法。一种方法是循环法,在这种情况下如果列中的系数之一是非零的,那么只计算列IDCT。在这种情况下,存在用于运行来处理一个列的代码部分,并且此代码只为那些具有非零输入系数的列运行。
另一种方法是在运行IDCT之前,判定使用IDCT例程多个高度优化版本中的哪一个。这些例程的不同在于对它们假定为零的系数行/列的配置不同。在这种情况下,给定哪些列具有非零系数的资料,存在将从预定义的例程集中选择可以正确地变换8×8块的最快速例程的过程。
假设存在许多都为零系数的列或行的情况下,这两种示例性方法减少了每个IDCT必须进行的操作的数目(诸如乘法和加法)。
在标准使用中,人们预期运行这些DCT类型中每一种的概率可能相当得高。然而,在MPEG 2视频编码中,被称为失配控制的特定方法改变了在输入数据集的高部中最后系数的最低有效位,即便列占用率非常低的话也是如此。失配控制的影响在于如果在IDCT输入的系数和是偶数,那么编码器将翻转最后系数的最低有效位。
否则在该列中的此系数不大可能包含非零的系数。依照上述第一种方法(在列上的循环),这意味着即便失配位都是被设置的,那么也将完全地处理最终列。
如果使用第二方法,那么解码器常常不能使用优化的例程,所述例程只在最终列都是零的时候才是有用的。由于此列(远离失配控制)最不可能包含非零值,所以根据典型的MPEG流送统计所设计的许多优化例程将只在此列为零的情况下才是有用的。失配位的存在将强迫使用更昂贵的例程。
要求失配控制的实现方式遵循MPEG 2规范。其目的在于防止IDCT舍入误差在一组图像上累积,每个图像根据在运动预测之前的一个图像导出。例如在US6456663和US5604502中包括了失配控制的论述及其实现方式。然而,它们都没有解决上述特定问题。
本发明的目的在于通过考虑失配状态来简化并增加诸如IDCT计算之类的逆变换的速度。
本发明依照第一方面提供了一种用于计算变换编码数据的逆变换的方法,所述编码数据被布置在系数组中,其中有选择地修改至少一个系数以便控制失配,其中有选择地执行所述逆变换以便对完全由零值系数所组成的组应用简化的处理,并且其中为了选择是否应用简化处理,如果数据组中所包含的唯一的非零系数是为失配控制所修改的系数,那么所述数据组被认为是零值组。
所述变换编码数据可以是离散余弦变换编码数据,例如作为MPEG-2编码视频数据的一部分。
所述数据可以被布置在二维(例如8×8)阵列中。可以应用多个1-D逆变换的双道方法,并且取决于是首先执行垂直逆变换还是水平逆变换,每个数据组可以是所述阵列的列或行。
可以根据非零值组的组合来进行第二道逆变换例程。这可以通过预存第二道过程可执行代码的多个变化来实现,每个变化对应于在第一道中所存在的非零组的组合,所述代码确定对哪些系数执行计算。此外,第二道代码可以适于忽略来自未处理的输入组的数据。否则,当一列被假定为零时,可能有必要在第二道之前清除存储器的各列。
作为双道方法的替代,可以使用直接的2-D实现方式,并且被认为是零的组可以是2-D系数块。为了确定是否应用简化处理,可以忽视任何仅用于失配控制的系数集。
优选地是,为失配控制所修改的系数是最后系数,即在阵列右下角的系数。
在优选实施例中,预先计算包含为失配控制所修改的系数的数据组的逆变换并且将其用在计算所述逆变换中。预先计算的逆变换可以根据情况是1-D或2-D的。
在第一实施例中,只对在为失配控制修改之前包括非零系数的数据组,计算所述每个数据组的逆变换,并且其中如果表明了失配,那么所预先计算的输出值被用于具有修改系数的数据组。
以逐组为基础来判定简化计算并不是必需的。判定随后进行哪个过程的成本本身带来了额外开销,因此优选定义确定的预定义例程,随后在条件范围内应用所述例程。
因此在候选实施例中,在对任何数据组执行逆变换之前,确定非零数据组的数目以及所述每个数据组的位置,并且取决于非零组的配置及其位置来从多个可能的例程中选择例程。
在一个这种实施例中-在所述组的子集外面存在至少一个非零组的情况下,所述子集可能包括前三组,对于所有组计算逆变换;并且-在所述子集外没有非零组的情况下,那么对于所述子集而不对于其余组计算逆变换,并且如果所修改的系数是非零的,那么使用预先计算的值来再现所修改的系数在所述逆变换中的影响。
这些例程可以被进一步优化使得-在唯一的非零数据组是第一列的情况下,在二维空间中只对该非零数据组计算逆变换,并且如果所修改的系数是非零的,那么添加所修改的系数对每个输出值的影响的预先计算值;和/或-如果只有DC(左上方)系数是非零的,那么所有输出值被设置为DC系数的值,并且如果所修改的系数是非零的,那么添加所修改的系数对每个输出值的影响的预先计算值。
依照本发明的另一方面提供了解码设备,所述解码设备包括用于计算变换编码数据的逆变换的装置,所述编码数据被布置在系数组中,其中有选择地修改至少一个系数以便控制失配,所述解码设备还包括用于有选择地执行所述逆变换以便对完全由零值系数所组成的组应用简化处理的装置,并且其中为了选择是否应用简化处理,如果数据组中所包含的唯一的非零系数是为失配控制所修改的系数,那么所述数据组被认为是零值组。
在附加权利要求中描述了与此设备有关的进一步的可选特征。
依照本发明的又一方面,提供了一种记录载体,其中记录有用于使可编程处理器执行上述的方法步骤或实现上述设备的程序指令。
现在将仅以举例形式,参考附图来描述本发明的实施例,其中

图1示出了MPEG解码器的框图;图2示出了在使用本发明的第一方法所执行的IDCT之前的8×8离散余弦变换;图3是本发明第一方法的流程图表示;图4a到4d示出了在使用本发明第二方法所执行的IDCT之前的四个8×8离散余弦变换;和图5是本发明第二方法的流程图表示。
图1示出了用于本发明实施例的MPEG解码器。所述解码器由以下功能组成可变长度解码器(variable length decoder VLD)110、逆量化器112、离散余弦逆变换(IDCT)过程114、运动缓冲器116、求和过程118和图片排序过程120。
通常,MPEG编码的视频被馈送到VLD 110(常常经由缓冲器(未示出))并且被解码为量化的DCT系数,所述DCT系数随后被逆量化器112进行逆量化。然后把DCT系数馈送到IDCT过程114,所述IDCT过程114对系数执行逆数字余弦变换因而输出空间像素数据。如果所述空间像素数据是内部帧的话,其被直接发送到图片排序过程120。如果不是内部帧,那么存在由运动缓冲器116和求和过程118所提供的运动补偿。本说明书只涉及IDCT过程114,并且将不再进一步地论述解码器的其它功能。
贯穿本说明书,描述了IDCT的一个实现方式(使用多个1-D IDCT的两级方法)。本专利申请的某些思想适用于其它实现方式(诸如直接2-D IDCT)。
相对图2示出了用于计算IDCT的第一方法的例子。图2示出了在列202、204、206中所布置的8×8变换200((在这种情况下)首先执行垂直变换),每个列由8个系数组成。白色列202是包含至少一个非零系数的列(非零列)。阴影线列204是系数都为零的列(零列)。第八(填充)列206包含第八行中的失配系数(失配由系数[7,7]的最低有效位表明)。
由于DCT的特性,在变换的左上角[1,1]最可能是非零系数,此概率随着接近右下角而降低。从而,许多变换在变换的偏右方,具有整个为零的列。由于零的IDCT还是零,所以零列并不要求完全的IDCT。因此可以通过不对零列执行IDCT来节省计算时间。
在图2中存在四个非零列202和三个零列204(列八将在后面考虑)。当对此变换执行IDCT时,在确定列的输出之前检查该列是否存在任何非零系数。如果遇到非零列202,那么对该列执行IDCT,之后检查下一列。然而如果遇到零列204,那么跳过此列并且不执行IDCT。作为替代,对于此列只把输出设置为零。
现在转向列八206,其包含了失配系数(即由失配控制所设置的系数[7,7])。如果对于此列没有系数数据并且如果存在失配,那么失配系数是第八列中唯一的非零系数。由于对于此位置没有系数数据,所以此值是零或一。对于任何一种情况,都可以预先计算整个列的输出值(并且对于零情况来说所述输出值一般是零)。这意味着即便设置了失配也不必对此列计算IDCT,通常就是如此。这表示由于在没有失配控制时的大多数情况下此列可能趋于零,所以这带来了显著的节省。
图3是以上方法的流程图表示。在步骤400,确定所考虑的列(这里为第一列)是否是零值列。如果不是,那么在402对此列执行IDCT。如果是,那么在404把列输出设置为零。在406,所考虑的列加1。在408,确定所考虑的列是否是最后一列。如果不是,那么对于此下一列重复步骤400-406。然而如果此列是最后一列,那么在步骤410确定此列的状态。如果它具有除失配系数之外的任何非零系数,那么在414,对此列执行IDCT。如果所述列是零,那么在412,把输出设置为零。如果只对此列设置失配系数,那么在416把输出设置为预先计算的值。
可以通过基于实际上存在的列组合(非零的)运行第二道例程来获得进一步的节约。这与完成第一道的上述方法类似,由此第二道是一循环。如果只有列0、3和4是第一道中所处理的列,那么由于我们知道了许多输入值(列1、2、5、6和7的输入值)是零,所以在第二道处理中大部分运算是不必要的。因此对于为第一道实际上存在的不同列组合所存储的循环码,最好具有多种变化。对所有256种情况都存储变化可能是不切实际的,因为如果给出大量的代码那么这可能会导致I高速缓存器问题。由于这么多情况中有很多是非常不可能的,而其它情况可能是常见的,所以可以通过只存储相对少量的变化来获得显著的增益。
此外,如果始终进行完全的行处理,那么可能有必要在第一道期间清除存储器中认为是零的列。如果相反,选择第二道代码以便忽略来自未处理的输入列的数据,那么由于该值决不会再被使用所以不需要清除操作,从而获得进一步的节约。
相对于图4a到4d示出了用于计算IDCT的第二方法。在此方法中确定列占用率作为第一步骤。取决于非零列的数目和位置,使用特定的例程来计算IDCT。这种例程例如可以只处理前三个列。此外,由于只有当失配被设置并且列占用率很低时失配系数一直是1,所以对于多种不同情况可以预先计算这对IDCT的影响,并且当计算IDCT时使用这些预先计算。应当注意,上述的第二道例程也适用于此方法。
在此方法中,确定在前三列外面是否存在任何非零列。如果是的话,那么依照常规方式来计算完全的IDCT。在图4a中描述了这种情况。该图示出了在列三之后存在多个非零列202的情况。从而,即便在列三之后只存在单个非零列,诸如当只有列一和五是非零的时,也计算完全的IDCT。
图4b示出了存在一个以上的非零列202情况下的变换,不过在前三列外面没有非零列,其中列八206可能具有失配设置(在此例子中为[7,7])。这里,通常只计算前三列的IDCT。如果失配被设置的话,那么列4到7只是被简单地设置为零,而列八的系数被设置为预先计算的值。
图4c示出了只有第一列202是非零的情况下的变换。在这种情况下,只有第一(非零)列具有计算的IDCT。然后计算水平IDCT,由于其等于每行中的第一值所以该计算很快且直接。然后如果失配被设置,那么添加失配对每个输出位置的影响的预先计算值;图4d示出了只具有一个非零系数420(在
的DC系数)的变换。在这种情况下,所有像素的IDCT一般等于成比例的输入值。如果这里设置了失配,那么每个输出被设置为此值与所述失配对此值的影响的每个位置的预先计算值的和。
图5是此第二方法的流程图表示。在500,确定在前三列外面是否存在任何非零列(如果一列只包含失配系数=1,那么将该列计为零)。如果是的话,那么在504计算完全的IDCT。如果不是的话,那么在502确定非零列的数目(忽视失配系数)是否大于一。如果大于一的话,那么在506对前三列执行部分IDCT,接下来的四列具有被设置为零的输出。在508,确定是否设置了失配系数。如果没有设置,那么在512把列八的输出设置为零。如果设置了的话,那么在510,此输出被设置为预先计算的值。
然而如果在502非零列的数目为一,那么在步骤514确定在此列中是否只存在单个的非零系数。如果不是的话,那么在步骤516,对此列执行IDCT,随后在518进行水平IDCT。然后在522确定失配系数是否被设置。如果是的话,那么在522如前所述把预先计算的值添加到输出。
然而,如果在514只存在单个的非零系数,那么在524把输出设置为成比例的输入,在526确定是否失配,并且如果发现失配,那么在528把输出设置为此值与先前所述的预先计算的每个位置值的和。
应当注意,以上描述仅仅作为举例,并且在不脱离本发明的精神和范围的情况下可以设想其它例子和实施例。特别地是,计算的次序是任意的,并且可以在列之前先计算行。所示出的第二方法的例程也只是特定的例子,并且可以设想其它例程,或者这些例程只在微小细节方面(诸如为运行特定例程所需要的非零列的数目)不同。
可以使用直接2-D IDCT实现方式来代替上述的多个1-D IDCT的二级方法。这在部分输入系数空间可以被假定为零的情况下产生。这使得大量运算是冗余的(乘以零是很没用的)。从而,如在1-D实现方式,对于各个输出区域可以被假定为零时出现这种情况。然而,在这种情况下它们不必只是省略的行/列,而是作为替代可以是2-D块,诸如(例如)存在于左上方4×4区域的系数。可以依照与相对于1-D实现方式所描述情况类似的方式来选择这些块。从而,就像这些例子可以在位置[7,7]的系数中提供失配设置位。
权利要求
1.一种用于计算变换编码数据(200)的逆变换的方法,所述编码数据被布置在系数组(202,204,206)中,其中有选择地修改至少一个系数以便控制失配,其中有选择地执行所述逆变换以便对完全由零值系数所组成的组(204)应用简化处理,并且其中为了选择是否应用简化处理,如果数据组(206)中所包含的唯一的非零系数是为失配控制所修改的系数,那么所述数据组(206)被认为是零值组。
2.如权利要求1所述的方法,其中所述变换编码数据是离散余弦变换编码数据。
3.如权利要求2所述的方法,其中所述离散余弦变换编码数据形成MPEG-1或MPEG-2编码视频数据的一部分。
4.如先前权利要求中任何一个所述的方法,其中所述数据被布置在二维阵列中。
5.如权利要求4所述的方法,其中所述二维阵列是8×8阵列。
6.如先前权利要求中任何一个所述的方法,其中应用多个1-D逆变换的双道方法。
7.如权利要求6所述的方法,其中取决于是首先执行垂直逆变换还是水平逆变换,每个数据组(202,204,206)是所述阵列的列或行。
8.如权利要求6或7所述的方法,其中根据非零值组(202)的组合来进行第二道逆变换例程。
9.如权利要求8所述的方法,其中预存第二道过程可执行代码的多种变化,每个变化对应于在第一道中所存在的非零组(202)的组合,所述代码确定对哪些系数执行计算。
10.如权利要求9所述的方法,其中第二道代码适于忽略来自未处理的输入组的数据。
11.如权利要求1到5中的任何一个所述的方法,其中使用直接2-D实现方式。
12.如权利要求11所述的方法,其中被认为是零的组是2-D系数块。
13.如权利要求4到12中的任何一个所述的方法,其中为失配控制所修改的系数是最后一个系数,即在阵列右下角的系数。
14.如先前权利要求中任何一个所述的方法,其中包含为失配控制所修改的系数的数据组的逆变换被预先计算并且用在计算所述逆变换中。
15.如先前权利要求中任何一个所述的方法,其中,只对存在非零系数并且忽视任何失配修改的每个数据组(202)计算逆变换,并且其中如果表明了失配,那么对于具有所修改的系数的数据组(206)使用预先计算的输出值。
16.如权利要求1到14中的任何一个所述的方法,其中在对任何数据组执行逆变换之前,确定非零数据组(202)的数目以及所述每个数据组的位置,并且取决于非零组(202)的配置及其位置来从多个可能的例程中选择一个例程。
17.如权利要求16所述的方法,其中-在所述组的子集外面存在至少一个非零组(202)的情况下,对所有组(202,204,206)计算逆变换;并且-在所述子集外面没有非零组(202)的情况下,那么对于所述子集而不对于其余组计算逆变换,并且如果所修改的系数是非零的,那么使用预先计算的值来再现所修改的系数([7,7])在所述逆变换中的影响。
18.如权利要求17所述的方法,其中所述子集包括前三个组。
19.如权利要求17或18所述的方法,其中所述例程被进一步优化使得-在唯一的非零数据组(202)是第一组的情况下,在二维空间中只对该非零数据组计算逆变换,并且如果所修改的系数是非零的,那么添加所修改的系数对每个输出值影响的预先计算值;和/或-如果只有DC系数(420)是非零的,那么所有输出值被设置为DC系数的值,并且如果所修改的系数是非零的,那么添加所修改的系数对每个输出值影响的预先计算值。
20.一种解码设备,所述解码设备包括用于计算变换编码数据的逆变换(114)的装置,所述编码数据被布置在系数组(202,204,206)中,其中有选择地修改至少一个系数以便控制失配,其中还包括用于有选择地执行所述逆变换以便对完全由零值系数所组成的组(204)应用简化处理的装置,并且其中为了选择是否应用简化处理,如果数据组(206)中所包含的唯一的非零系数是为失配控制所修改的系数,那么所述数据组(206)被认为是零值组。
21.如权利要求20所述的设备,其中所述变换编码数据是离散余弦变换编码数据。
22.如权利要求21所述的设备,其中所述离散余弦变换编码数据形成MPEG-2编码视频数据的一部分。
23.如权利要求20到22中任何一个所述的设备,其中所述数据被布置在二维阵列(200)中。
24.如权利要求23所述的设备,其中所述二维阵列是8×8阵列(200)。
25.如权利要求20到24中任何一个所述的设备,其中所述设备应用多个1-D逆变换的双道方法。
26.如权利要求25所述的设备,其中取决于是首先执行垂直逆变换还是水平逆变换,每个数据组是所述阵列的列或行。
27.如权利要求25或26所述的设备,其中所述设备被配置为根据非零值组(202)的组合来进行第二道逆变换例程。
28.如权利要求27所述的设备,其中还包括用于预存第二道过程可执行代码的多个变化的装置,每个变化对应于在第一道中所存在的非零组(202)的组合,所述代码确定对哪些系数执行计算。
29.如权利要求28所述的设备,其中第二道代码适于忽略来自未处理的输入组的数据。
30.如权利要求20到24中任何一个所述的设备,其中所述设备被配置成使用直接2-D实现方式。
31.如权利要求30所述的设备,其中被认为是零的组是2-D系数块。
32.如权利要求23到31中任何一个所述的设备,其中为失配控制所修改的系数是最后一个系数,即在阵列右下角的系数。
33.如权利要求20到32中任何一个所述的设备,其中还包括用于对包含为失配控制所修改的系数的数据组(206)预先计算逆变换的装置,在计算所述逆变换中使用所述预先计算。
34.如权利要求20到33中任何一个所述的设备,其中还提供了用于只有当由于失配控制而忽视任何修改的任何系数是非零时才对数据组(202)计算逆变换的装置,并且其中如果表明了失配,那么将预先计算的输出值用于具有所修改的系数的数据组(206)。
35.如权利要求20到33中任何一个所述的设备,其中还包括用于在对任何数据组执行逆变换之前,确定非零数据组(202)的数目以及所述每个数据组的位置的装置,以及用于取决于非零组(202)的数目及其位置来从多个可能的例程中选择一个例程的装置。
36.如权利要求35所述的设备,其中所述设备被配置为使得在所述组的子集外面存在至少一个非零组(202)的情况下,对所有组(202,204,206)计算逆变换;并且在所述子集外面没有非零组(202)的情况下,那么对于所述子集而不是对于其余组计算逆变换,并且如果所修改的系数是非零的,那么使用预先计算的值来再现所修改的系数([7,7])在所述逆变换中的影响。
37.如权利要求26所述的设备,其中所述子集包括前三个组。
38.如权利要求36或37所述的设备,其中所述设备被配置为使得-在非零数据组(202)的数目是一的情况下,在二维空间中只对该非零数据组计算逆变换,并且如果所修改的系数是非零的,那么添加所修改的系数对每个输出值的影响的预先计算值;和/或-如果只有DC系数(420)是非零的,那么所有输出值被设置为DC系数的值,并且如果所修改的系数是非零的,那么添加所修改的系数对每个输出值的影响的预先计算值。
39.一种其中记录有程序指令的记录载体,所述程序指令用于使可编程处理器执行如权利要求1到19中任何一个所述的方法的步骤,或实现如权利要求20到38中任何一个所述的设备。
全文摘要
描述了一种用于计算变换编码数据的逆变换的方法及相关联的设备。在主要实施例中,8×8离散余弦变换(DCT)(200)被布置在系数列(202,204,206)中,依照已知的方法有选择地修改最后系数以便控制失配。有选择地执行逆DCT以便对完全由零值系数组成的组(204)应用简化处理。为了选择是否应用简化处理,如果数据组中包含的唯一非零系数是为失配控制所修改的系数,那么所述数据组(206)被认为是零值组。此外可以预先计算所修改的系数对输出的影响,使用所述预先计算值来补偿对非零系数的忽略。
文档编号H04N7/26GK1867910SQ200480030421
公开日2006年11月22日 申请日期2004年10月15日 优先权日2003年10月18日
发明者R·M·米勒-史密斯, D·E·彭纳 申请人:皇家飞利浦电子股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1