CN104683817B - 基于avs的并行变换和反变换方法 - Google Patents
基于avs的并行变换和反变换方法 Download PDFInfo
- Publication number
- CN104683817B CN104683817B CN201510076289.XA CN201510076289A CN104683817B CN 104683817 B CN104683817 B CN 104683817B CN 201510076289 A CN201510076289 A CN 201510076289A CN 104683817 B CN104683817 B CN 104683817B
- Authority
- CN
- China
- Prior art keywords
- data
- matrix
- transposition
- horizontal
- transformation
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Landscapes
- Compression Or Coding Systems Of Tv Signals (AREA)
- Compression, Expansion, Code Conversion, And Decoders (AREA)
Abstract
本发明公开了基于AVS的并行变换和反变换方法,变换方法包括以下步骤:将八个当前像素值减去八个预测像素值得到八个残差值并保存于一个寄存器中;重复7次得到八行共64个残差值,八行残差值分别保存于八个寄存器中;对残差矩阵进行转置得到转置残差矩阵;对转置残差矩阵进行水平变换部分的蝶形运算得到水平变换运算矩阵;对水平变换运算矩阵进行转置得到转置水平变换运算矩阵;对转置水平变换运算矩阵进行垂直变换部分的蝶形算法的运算得到垂直变换运算矩阵;对垂直变换运算矩阵进行如下运算:rij=(hij+24)>>5,得到变换结果矩阵。本发明使用SIMD指令,分别将变换和反变换中的参数并行放进寄存器中进行处理,实现高效率地得到变换结果和反变换结果。
Description
技术领域
本发明涉及数字视频编解码技术领域,具体涉及基于AVS(Audio Video codingStandard)标准中,使用SIMD(Single Instruction Multiple Data)指令优化变换和反变换的方法。
背景技术
随着AVS标准在广播电视、互联网、机顶盒、监控等大规模产业化,在PC和嵌入式设备上播放和录制AVS文件要求越来越多,且都希望实时,由于AVS采用高复杂度算法获得高编码效率,因此,需要对编解码器进行有效的程序优化,才可能达到实时,画面流畅,播放和录制达到25fps,甚至30fps。
对编解码AVS码流分析,QUANT/DEQUANT耗时占很大比重,特别的,如果量化后的数据都为0,将可以不需要进行许多运算,优化好它们就能有效的提高编解码效率。现在的PC和嵌入式处理器芯片有SIMD指令,如:intel的mmx、sse和AMD的3D Now!,ARM的NEON,使用好这些SIMD指令,能有效地提高编解码速度。
DCT即为变换,是将当前像素与预测像素相减,以8x8变换为例,得到8x8的残差系数矩阵,然后进行8x8整数正离散余弦变换,步骤如下:
1.将样本点精度为8位的无符号的当前像素值与预测像素值进行相减,得到精度为16位的有符号的残差值,形成8x8的残差矩阵。
2.对残差矩阵进行水平变换:H’=ResidualMatrix*T8,ResidualMatrix为残差矩阵,T8是AVS标准规定的变换矩阵,H’表示水平变换后的中间结果矩阵。
3.对H’进行垂直变换:H”=T8 T*H’,其中,T8 T为T8的转置矩阵,H”为垂直变换后的中间结果矩阵。
4.将上面得到的垂直变换后的中间结果矩阵H”进行调整:rij=(hij”+24)>>5,得到变换的最终结果矩阵,其中,hij”为H”中的数据,rij为变换的最终结果矩阵中的数据,i和j的取值范围为0-7。
IDCT即为反变换,是将经过变换、量化和反量化得到的反量化矩阵转换为残差矩阵,加上预测值,得到反变换后的结果,步骤如下::
1.对反量化矩阵进行水平反变换:H’=CoeffMatrix*T8 T,其中CoeffMatrix为反量化矩阵,T8 T为T8的转置矩阵,H’为水平反变换的中间结果矩阵。
2.对H’中的数据进行如下计算:hij”=clip3(-2n+7,2n+7-1,(hij’+4))>>3,得到水平反变换的调整矩阵H”,hij’为水平反变换的中间结果矩阵中的数据,hij”为H”中的数据,i和j的取值范围为0-7,n为样本点精度,一般取值为8,clip3为取三个值的中间值。
3.对H”进行垂直反变换:H=T8*H”,H为垂直反变换的中间结果矩阵。
4.对H中的数据进行调整,得到残差矩阵中的残差值:rij=clip3(-2n+7,2n+7-1,(hij+64))>>7,hij为矩阵H中的数据,rij为残差矩阵中的数据。
5.将残差值和变换前的预测值pij相加,再与255进行比较,取最小值调整:cij=min(rij+pij,255),预测值pij为预测值矩阵中的数据,cij为反变换结果矩阵中的数据。
上述的变换和反变换过程中,每计算一个像素点都需要16次乘法和14次加法,即使采用蝶形算法能一定程度地优化运算过程,但耗时还是很大。
发明内容
为了克服现有技术的不足,本发明的目的在于提供基于AVS的并行变换和反变换方法,使用SIMD指令,分别将变换和反变换中的参数并行放进寄存器中进行处理,实现高效率地得到变换结果和反变换结果。
为解决上述问题,本发明所采用的技术方案如下:
方案一:
基于AVS的并行变换方法,包括以下步骤:
步骤A:利用两个寄存器分别并行读入八个当前像素值和八个预测像素值,利用低位交叉指令使当前像素值与预测像素值进行交叉得到第一交叉结果,以及使预测像素值与自身进行交叉得到第二交叉结果,将第一交叉结果减去第二交叉结果得到八个残差值并送进一个寄存器中,其中,当前像素值与预测像素值为8位数据,残差值为16位数据;
步骤B:重复执行七次步骤A,得到64个残差值,组成8*8的残差矩阵,其中,每执行一次步骤A所得到的八个残差值为残差矩阵中的其中一行数据,八行数据分别保存于八个寄存器中;
步骤C:结合低位交叉指令和高位交叉指令对残差矩阵进行转置得到转置残差矩阵,所述八个寄存器中的数据分别替换为转置残差矩阵中的八行数据;
步骤D:针对转置残差矩阵中的数据进行水平变换部分的蝶形算法的运算,得到水平变换运算矩阵,所述八个寄存器中的数据分别替换为水平变换运算矩阵中的八行数据;
步骤E:结合低位交叉指令和高位交叉指令对水平变换运算矩阵进行转置得到转置水平变换运算矩阵,所述八个寄存器中的数据分别替换为转置水平变换运算矩阵中的八行数据;
步骤F:针对转置水平变换运算矩阵中的数据进行垂直变换部分的蝶形算法的运算,得到垂直变换运算矩阵,所述八个寄存器中的数据分别替换为垂直变换运算矩阵中的八行数据;
步骤G:针对垂直变换运算矩阵进行如下运算:rij=(hij+24)>>5,得到变换结果矩阵,其中,hij为垂直变换运算矩阵中的数据,rij为变换结果矩阵中的数据,i和j的取值范围为0-7。
优选地,在步骤F中包括如下子步骤:
步骤F0:将转置水平变换运算矩阵中的数据由16位转为32位,将转置水平变换运算矩阵中的每一行数据的前四个数据分别送入对应的寄存器中,转置水平变换运算矩阵中的每一行数据的后四个数据暂存于内存中;
步骤F1:针对已经保存至八个寄存器中的数据进行垂直变换部分的蝶形算法的运算,得到垂直变换运算矩阵中的左半部分数据,然后将垂直变换运算矩阵中的左半部分数据暂存于内存中;
步骤F2:将转置水平变换运算矩阵中的暂存于内存中的数据分别从内存中送进所述八个寄存器中;
步骤F3:针对已经保存至八个寄存器中的数据进行垂直变换部分的蝶形算法的运算,得到垂直变换运算矩阵中的右半部分数据,将垂直变换运算矩阵中的左半部分数据和右半部分数据组合得到垂直变换运算矩阵。
优选地,在水平变换部分的蝶形算法的运算和垂直变换部分的蝶形算法的运算中,针对需要分别进行相加和进行相减的两组保存于各自寄存器中的数据,执行如下运算步骤:将两个寄存器分别记为xmm0和xmm7,将xmm0中的数据记为x0,将xmm7中的数据记为x7,首先将xmm0与xmm7相加保存于xmm0中,然后将xmm0与xmm0相加保存于xmm7中,最后将xmm7减去xmm0保存于xmm7中;经过运算步骤后,x0+x7的结果保存于xmm0中,x0-x7的结果保存于xmm7中。
优选地,在水平变换部分的蝶形算法的运算和垂直变换部分的蝶形算法的运算中,将需要与10相乘的保存于寄存器中的数据记为y,则针对y*10这一乘法运算执行如下运算步骤:将保存有数据y的寄存器记为xmm1,首先将数据y复制至另一寄存器中,将另一寄存器记为xmm2,然后将xmm2中的数据左移两位后与xmm1中的数据相加,相加结果保存于xmm1中,再将xmm1与自身相加;经过该运算步骤,使y*10的结果保存于xmm1中。
方案二:
基于AVS的并行反变换方法,包括以下步骤:
步骤a:利用八个寄存器分别保存反量化矩阵中的八行数据,反量化矩阵中的数据为16位数据;
步骤b:结合低位交叉指令和高位交叉指令对反量化矩阵进行转置得到转置反量化矩阵,所述八个寄存器中的数据分别替换为转置反量化矩阵中的八行数据;
步骤c:针对转置反量化矩阵中的数据进行水平反变换部分的蝶形算法的运算,得到水平反变换运算矩阵,所述八个寄存器中的数据分别替换为水平反变换运算矩阵中的八行数据;
步骤d:针对水平反变换运算矩阵中的数据进行如下运算:hij”=clip3(-2n+7,2n+7-1,(hij’+4))>>3,得到水平反变换中间矩阵,其中,hij”为水平反变换中间矩阵中的数据,hij’为水平反变换运算矩阵中的数据,n的取值为8,i和j的取值范围为0-7,clip3为取三个值的中间值,所述八个寄存器中的数据分别替换为水平反变换中间矩阵中的八行数据;
步骤e:结合低位交叉指令和高位交叉指令对水平反变换中间矩阵进行转置得到转置水平反变换中间矩阵,所述八个寄存器中的数据分别替换为转置水平反变换中间矩阵中的八行数据;
步骤f:针对转置水平反变换中间矩阵中的数据进行垂直反变换部分的蝶形算法的运算,得到垂直反变换运算矩阵,所述八个寄存器中的数据分别替换为垂直反变换运算矩阵中的八行数据;
步骤g:针对垂直反变换运算矩阵进行如下运算:rij=clip3(-2n+7,2n+7-1,(hij+64))>>7,得到残差运算矩阵,其中rij为残差运算矩阵中的数据,hij为垂直反变换运算矩阵中的数据,n的取值为8,i和j的取值范围为0-7,clip3为取三个值的中间值;
步骤h:针对残差运算矩阵进行如下运算:cij=min(rij+pij,255),得到反变换结果矩阵,其中,cij为反变换结果矩阵中的数据,rij为残差运算矩阵中的数据,pij为预测像素矩阵中的数据,i和j的取值范围为0-7,min为取最小值。
优选地,在步骤F中包括以下子步骤:
步骤f0:将转置水平反变换中间矩阵中的数据由16位转为32位,将转置水平反变换中间矩阵中的每一行数据的前四个数据分别送入对应的寄存器中,转置水平反变换中间矩阵中的每一行数据的后四个数据暂存于内存中;
步骤f1:针对已经保存至八个寄存器中的数据进行垂直反变换部分的蝶形算法的运算,得到垂直反变换运算矩阵中的左半部分数据并将其暂存于内存中;
步骤f2:将转置水平反变换中间矩阵中的暂存于内存中的数据分别从内存中送进所述八个寄存器中;
步骤f3:针对已经保存至八个寄存器中的数据进行垂直反变换部分的蝶形算法的运算,得到垂直反变换运算矩阵中的右半部分数据,将垂直反变换运算矩阵中的左半部分数据和右半部分数据组合得到垂直反变换运算矩阵。
优选地,在水平反变换部分的蝶形算法的运算和垂直反变换部分的蝶形算法的运算中,针对需要分别进行相加和进行相减的两组保存于各自寄存器中的数据,执行如下运算步骤:将两个寄存器分别记为xmm0和xmm7,将xmm0中的数据记为x0,将xmm7中的数据记为x7,首先将xmm0与xmm7相加保存于xmm0中,然后将xmm0与xmm0相加保存于xmm7中,最后将xmm7减去xmm0保存于xmm7中;经过运算步骤后,x0+x7的结果保存于xmm0中,x0-x7的结果保存于xmm7中。
优选地,在水平反变换部分的蝶形算法的运算和垂直反变换部分的蝶形算法的运算中,将需要与10相乘的保存于寄存器中的数据记为y,则针对y*10这一乘法运算执行如下运算步骤:将保存有数据y的寄存器记为xmm1,首先将数据y复制至另一寄存器中,将另一寄存器记为xmm2,然后将xmm2中的数据左移两位后与xmm1中的数据相加,相加结果保存于xmm1中,再将xmm1与自身相加;经过该运算步骤,使y*10的结果保存于xmm1中。
相比现有技术,本发明的有益效果在于:将数据并行放进寄存器中进行运算,每次能同时运算多个数据,极大地提高了运算效率;另外,在水平变换/反变换部分和垂直变换/反变换部分的蝶形运算中,对于需要分别进行相加和进行相减运算的两个数据,通过巧妙的设置使相加和相减运算只需要在对应的两个寄存器中便可完成,不需要将数据导进导出内存,提高了运算速度,对于需要进行乘法运算的数据,将乘法运算转换为加法运算,也提高了运算速度。
附图说明
图1为本发明基于AVS的并行变换方法的流程图。
图2为本发明基于AVS的并行反变换方法的流程图。
图3为本发明的矩阵转置的过程示意图。
具体实施方式
下面,结合附图以及具体实施方式,对本发明做进一步描述:
实施例1:
参考图1为基于AVS的并行变换方法,包括以下步骤:
步骤A:利用两个寄存器分别并行读入八个当前像素值和八个预测像素值,利用低位交叉指令使当前像素值与预测像素值进行交叉得到第一交叉结果,以及使预测像素值与自身进行交叉得到第二交叉结果,将第一交叉结果减去第二交叉结果得到八个残差值并送进一个寄存器中;其中,当前像素值与预测像素值为8位数据,残差值为16位数据。
其中,八个当前像素值指在当前采样矩阵中的一行8个数据,八个预测像素值为在预测像素矩阵中的一行8个数据。因为当前像素值和预测像素值为8位,一个寄存器具有128位,因此8个数据保存于寄存器中的低64位,高64位为0。使用低位交叉指令和减法指令后,便得到8个16位的残差值。利用寄存器可以一次针对8个数据进行并行运算,效率大大增加。
上述步骤可以使用如下伪代码表示:
movq xmm0,[ecx];//取当前像素的8个值放入xmm0
movq xmm7,[edx];//取预测像素的8个值放入xmm7
punpcklbw xmm0,xmm7;//当前像素值和预测值低位交叉
punpcklbw xmm7,xmm7;//预测像素值和自己低位交叉
psubw xmm0,xmm7;//进行相减,得到8个16位的残差值。
步骤B:重复执行七次步骤A,得到64个残差值,组成8*8的残差矩阵,其中,每执行一次步骤A所得到的八个残差值为残差矩阵中的其中一行数据,八行数据分别保存于八个寄存器中。
步骤C:结合低位交叉指令和高位交叉指令对残差矩阵进行转置得到转置残差矩阵,所述八个寄存器中的数据分别替换为转置残差矩阵中的八行数据。
在步骤C中,针对分别保存有一行残差数据的八个寄存器结合低位交叉指令和高位交叉指令对残差矩阵进行转置,使残差矩阵中的列数据变为行数据保存在寄存器中。具体的转置过程如图3所示,使用了punpcklwd,punpckhwd,punpckldq,punpckhdq,punpcklqdq和punpckhqdq指令使残差矩阵转置,在转置前,a0a1a2a3a4a5a6a7为其中一行残差数据,经过上述指令得到转置后,a0b0c0d0e0f0g0h0为转置残差矩阵中的其中一行数据,即残差矩阵中的其中一列数据。
步骤D:针对转置残差矩阵中的数据进行水平变换部分的蝶形算法的运算,得到水平变换运算矩阵,所述八个寄存器中的数据分别替换为水平变换运算矩阵中的八行数据。
在该步骤中,水平变换部分的蝶形算法所对应的代码部分如下:
#define DCT8_Horizontal_1D{
const int s07=SRC(0)+SRC(7);
const int s16=SRC(1)+SRC(6);
const int s25=SRC(2)+SRC(5);
const int s34=SRC(3)+SRC(4);
const int a0=s07+s34;
const int a1=s16+s25;
const int a2=s07-s34;
const int a3=s16-s25;
const int d07=SRC(0)-SRC(7);
const int d16=SRC(1)-SRC(6);
const int d25=SRC(2)-SRC(5);
const int d34=SRC(3)-SRC(4);
const int a4=((d07-d34)<<1)+d07;
const int a5=((d16+d25)<<1)+d16;
const int a6=((d16-d25)<<1)-d25;
const int a7=((d07+d34)<<1)+d34;
DST(0)=(a0+a1)<<3;
DST(4)=(a0-a1)<<3;
DST(2)=(a2*10)+(a3<<2);
DST(6)=(a2<<2)-(a3*10);
DST(1)=((a4+a5+a7)<<1)+a5;
DST(3)=((a4-a5+a6)<<1)+a4;
DST(5)=((-a5-a6+a7)<<1)+a7;
DST(7)=((a4-a6-a7)<<1)-a6;
}
在上述代码中,SRC(0)至SRC(7)对应转置残差矩阵中的八行数据,即对应八个寄存器,DST(0)至DST(7)对应水平变换运算矩阵中的八行数据,即执行代码后,DST(0)至DST(7)所表示的数据分别保存在对应的寄存器中。
在上述运算代码中,存在两个数据需要分别进行相加和进行相减操作,例如,s07=SRC(0)+SRC(7),d07=SRC(0)-SRC(7)。如果按照正常的运算方式,先计算s07则需要先将s07放进内存,因为假如计算了s07后将其放进SRC(0)所对应的寄存器中,则后面的d07则无法计算,因为SRC(0)已经被s07覆盖。因此,对于这种情况,为了避免将数据频繁导出至内存,和从内存导入到寄存器,可以使用下面的伪代码:
paddw xmm6,xmm7;//xmm6=SRC(0)+SRC(7)
paddw xmm7,xmm7;//xmm7=SRC(0)+SRC(0)=2*SRC(0)
psubw xmm7,xmm6;//xmm7=2*SRC(0)-(SRC(0)+SRC(7))=SRC(0)-SRC(7)
通过上述伪代码,加减运算都在寄存器中运行,不需要将数据导进导出内存,提高了运行速度。
另外,在蝶形算法的代码中,还涉及到某个数据乘10的运算,例如,代码中有a2*10,由于在寄存器中进行乘法运算耗时较多,远大于加减法和移位的运算时间,因此,可以通过下面的伪代码将乘法变为加法运算:
movdqa xmm0,xmm6;//xmm0=xmm6=a2;
psllw xmm6,2;//xmm6=(a2<<2)=4a2;
paddw xmm0,xmm6;//xmm0+=xmm6=5a2;
paddw xmm0,xmm0;//xmm0+xmm0=10a2;
通过上述的伪代码,将乘法运算替换为加法运算和移位运算,提高了运算速度。
步骤E:结合低位交叉指令和高位交叉指令对水平变换运算矩阵进行转置得到转置水平变换运算矩阵,所述八个寄存器中的数据分别替换为转置水平变换运算矩阵中的八行数据。转置原理在步骤C中已经详细描述,在此不再赘述。
步骤F:针对转置水平变换运算矩阵中的数据进行垂直变换部分的蝶形算法的运算,得到垂直变换运算矩阵,所述八个寄存器中的数据分别替换为垂直变换运算矩阵中的八行数据。
由于经过水平变换部分的蝶形算法的运算,再进行该步骤中的垂直变换部分的蝶形算法的运算的话,得到的数据可能超出16位,如果继续用寄存器保存8个数据,则可能出现数据错误的情况,因此需要将寄存器中的数据调整为32位,以避免数据记录错误。具体包括以下子步骤:
将转置水平变换运算矩阵中的数据由16位转为32位,将转置水平变换运算矩阵中的每一行数据的前四个数据分别送入对应的寄存器中,转置水平变换运算矩阵中的每一行数据的后四个数据暂存于内存中;
步骤F1:针对已经保存至八个寄存器中的数据进行垂直变换部分的蝶形算法的运算,得到垂直变换运算矩阵中的左半部分数据,然后将垂直变换运算矩阵中的左半部分数据暂存于内存中;
步骤F2:将转置水平变换运算矩阵中的暂存于内存中的数据分别从内存中送进所述八个寄存器中;
步骤F3:针对已经保存至八个寄存器中的数据进行垂直变换部分的蝶形算法的运算,得到垂直变换运算矩阵中的右半部分数据,将垂直变换运算矩阵中的左半部分数据和右半部分数据组合得到垂直变换运算矩阵。
步骤G:针对垂直变换运算矩阵进行如下运算:rij=(hij+24)>>5,得到变换结果矩阵,其中,hij为垂直变换运算矩阵中的数据,rij为变换结果矩阵中的数据,i和j的取值范围为0-7。
步骤F中的垂直变换部分的蝶形算法和步骤G中的运算所对应的代码如下:
#define DCT8_Vertical_1D{
const int s07=SRC(0)+SRC(7);
const int s16=SRC(1)+SRC(6);
const int s25=SRC(2)+SRC(5);
const int s34=SRC(3)+SRC(4);
const int a0=s07+s34;
const int a1=s16+s25;
const int a2=s07-s34;
const int a3=s16-s25;
const int d07=SRC(0)-SRC(7);
const int d16=SRC(1)-SRC(6);
const int d25=SRC(2)-SRC(5);
const int d34=SRC(3)-SRC(4);
const int a4=((d07-d34)<<1)+d07;
const int a5=((d16+d25)<<1)+d16;
const int a6=((d16-d25)<<1)-d25;
const int a7=((d07+d34)<<1)+d34;
DST(0)=(((a0+a1)<<3)+(1<<4))>>5;
DST(4)=(((a0-a1)<<3)+(1<<4))>>5;
DST(2)=((a2*10)+(a3<<2)+(1<<4))>>5;
DST(6)=((a2<<2)-(a3*10)+(1<<4))>>5;
DST(1)=(((a4+a5+a7)<<1)+a5+(1<<4))>>5;
DST(3)=(((a4-a5+a6)<<1)+a4+(1<<4))>>5;
DST(5)=(((a7-a5-a6)<<1)+a7+(1<<4))>>5;
DST(7)=(((a4-a6-a7)<<1)-a6+(1<<4))>>5;
}
其中,由于寄存器中的数据位变为32位后,每个寄存器只能保存4个32位的数据,因此SRC(0)至SRC(7)对应转置垂直变换运算矩阵中的左半部分数据或者右半部分数据,DST(0)至DST(7)对应的是变换结果矩阵中的左半部分数据或者右半部分数据。上述代码需要运算两次,第一次运行得到变换结果矩阵中的左半部分数据,第二次运行得到变换结果矩阵中的右半部分数据。另外,在执行上述运算代码时,也存在两个数据需要分别进行相加和进行相减操作,以及乘10运算,对应地也使用水平变换部分的蝶形算法中的处理方式,使加减运算都在寄存器中运行,不需要将数据导进导出内存,以及将乘法运算替换为加法运算和移位运算,均能提高运算速度,具体的处理方式在步骤D中已详述,在此不再赘述。
需要说明的是,在实施例1中的步骤执行过程中,当前步骤执行完毕得到的矩阵数据分别保存于八个寄存器中,由于占用了全部寄存器,因此在进行下一步骤的运算中,需要将其中一个寄存器中的数据导出至内存中,空出一个寄存器进行运算。
在实施例1中,通过上述的步骤进行变换有如下优点:将数据并行放进寄存器中进行运算,每次能同时运算多个数据,极大地提高了运算效率;另外,在水平变换部分和垂直变换部分的蝶形运算中,对于需要分别进行相加和进行相减运算的两个数据,通过巧妙的设置使相加和相减运算只需要在对应的两个寄存器中便可完成,不需要将数据导进导出内存,提高了运算速度,对于需要进行乘法运算的数据,将乘法运算转换为加法运算,也提高了运算速度。
实施例2:
参考图2为基于AVS的并行反变换方法,包括以下步骤:
步骤a:利用八个寄存器分别保存反量化矩阵中的八行数据,反量化矩阵中的数据为16位数据。
因为编解码的过程是变换、量化、反量化和反变换,因此反变换流程所读取的数据为8*8的反量化矩阵中的数据。
步骤b:结合低位交叉指令和高位交叉指令对反量化矩阵进行转置得到转置反量化矩阵,所述八个寄存器中的数据分别替换为转置反量化矩阵中的八行数据。具体的转置原理在实施例1的步骤C中已详细描述,在此不再赘述。
步骤c:针对转置反量化矩阵中的数据进行水平反变换部分的蝶形算法的运算,得到水平反变换运算矩阵,所述八个寄存器中的数据分别替换为水平反变换运算矩阵中的八行数据。
其中,水平反变换部分的蝶形算法所对应的运算代码部分如下:
#define IDCT8_Horizontal_1D{
int a0=SRC(0);
int a1=SRC(4);
int a2=SRC(2);
int a3=SRC(6);
int a4=SRC(1);
int a5=SRC(3);
int a6=SRC(5);
int a7=SRC(7);
int b0=((a4-a7)<<1)+a4;
int b1=((a5+a6)<<1)+a5;
int b2=((a5-a6)<<1)-a6;
int b3=((a4+a7)<<1)+a7;
int b4=((b0+b1+b3)<<1)+b1;
int b5=((b0-b1+b2)<<1)+b0;
int b6=((-b1-b2+b3)<<1)+b3;
int b7=((b0-b2-b3)<<1)-b2;
int t0=(a2*10)+(a3<<2);
int t1=(a0+a1)<<3;
a3=(a2<<2)-(a3*10);
a1=(a0-a1)<<3;
a2=t0;
a0=t1;
b0=a0+a2;
b1=a1+a3;
b2=a1-a3;
b3=a0-a2;
a0=((b0+b4)+(1<<2));
a1=((b1+b5)+(1<<2));
a2=((b2+b6)+(1<<2));
a3=((b3+b7)+(1<<2));
a7=((b0-b4)+(1<<2));
a6=((b1-b5)+(1<<2));
a5=((b2-b6)+(1<<2));
a4=((b3-b7)+(1<<2));
a0=((a0<-32768)?-32768:((a0>32767)?32767:a0))>>3;
a1=((a1<-32768)?-32768:((a1>32767)?32767:a1))>>3;
a2=((a2<-32768)?-32768:((a2>32767)?32767:a2))>>3;
a3=((a3<-32768)?-32768:((a3>32767)?32767:a3))>>3;
a7=((a7<-32768)?-32768:((a7>32767)?32767:a7))>>3;
a6=((a6<-32768)?-32768:((a6>32767)?32767:a6))>>3;
a5=((a5<-32768)?-32768:((a5>32767)?32767:a5))>>3;
a4=((a4<-32768)?-32768:((a4>32767)?32767:a4))>>3;
DST(0,a0);
DST(1,a1);
DST(2,a2);
DST(3,a3);
DST(7,a7);
DST(6,a6);
DST(5,a5);
DST(4,a4);
}
其中,水平反变换部分的运算结果为DST(0,a0)、DST(1,a1)、DST(2,a2)、DST(3,a3)、DST(7,a7)、DST(6,a6)、DST(5,a5)和DST(4,a4)并保存至相应的寄存器中。在上述的运算代码中,亦存在两个数据需要分别进行相加和进行相减运算,以及乘10运算,对应地也使加减运算都在寄存器中运行,以及将乘法运算替换为加法运算和移位运算,使运行速度提高,具体的处理方式在实施例1中已详细描述,在此不再赘述。
步骤d:针对水平反变换运算矩阵中的数据进行如下运算:hij”=clip3(-2n+7,2n+7-1,(hij’+4))>>3,得到水平反变换中间矩阵,其中,hij”为水平反变换中间矩阵中的数据,hij’为水平反变换运算矩阵中的数据,n的取值为8,i和j的取值范围为0-7,clip3为取三个值的中间值,所述八个寄存器中的数据分别替换为水平反变换中间矩阵中的八行数据。
步骤e:结合低位交叉指令和高位交叉指令对水平反变换中间矩阵进行转置得到转置水平反变换中间矩阵,所述八个寄存器中的数据分别替换为转置水平反变换中间矩阵中的八行数据。转置原理在实施例1中已经详细描述,在此不再赘述。
步骤f:针对转置水平反变换中间矩阵中的数据进行垂直反变换部分的蝶形算法的运算,得到垂直反变换运算矩阵,所述八个寄存器中的数据分别替换为垂直反变换运算矩阵中的八行数据。
由于经过水平反变换部分的蝶形算法的运算,再进行该步骤中的垂直反变换部分的蝶形算法的运算的话,得到的数据可能超出16位,如果继续用寄存器保存8个数据,则可能出现数据溢出的情况,因此需要将寄存器中的数据调整为32位,以避免数据溢出。具体包括以下子步骤:
步骤f0:将转置水平反变换中间矩阵中的数据由16位转为32位,将转置水平反变换中间矩阵中的每一行数据的前四个数据分别送入对应的寄存器中,转置水平反变换中间矩阵中的每一行数据的后四个数据暂存于内存中;
步骤f1:针对已经保存至八个寄存器中的数据进行垂直反变换部分的蝶形算法的运算,得到垂直反变换运算矩阵中的左半部分数据并将其暂存于内存中;
步骤f2:将转置水平反变换中间矩阵中的暂存于内存中的数据分别从内存中送进所述八个寄存器中;
步骤f3:针对已经保存至八个寄存器中的数据进行垂直反变换部分的蝶形算法的运算,得到垂直反变换运算矩阵中的右半部分数据,将垂直反变换运算矩阵中的左半部分数据和右半部分数据组合得到垂直反变换运算矩阵。
步骤g:针对垂直反变换运算矩阵进行如下运算:rij=clip3(-2n+7,2n+7-1,(hij+64))>>7,得到残差运算矩阵,其中rij为残差运算矩阵中的数据,hij为垂直反变换运算矩阵中的数据,n的取值为8,i和j的取值范围为0-7,clip3为取三个值的中间值。
步骤f中的垂直反变换部分的蝶形算法和步骤g中的运算所对应的代码如下:
#define IDCT8_Vertical_1D{
int a0=SRC(0);
int a1=SRC(4);
int a2=SRC(2);
int a3=SRC(6);
int a4=SRC(1);
int a5=SRC(3);
int a6=SRC(5);
int a7=SRC(7);
int b0=((a4-a7)<<1)+a4;
int b1=((a5+a6)<<1)+a5;
int b2=((a5-a6)<<1)-a6;
int b3=((a4+a7)<<1)+a7;
int b4,b5,b6,b7,t0,t1;
int c0,c1,c2,c3,c4,c5,c6,c7;
b4=((b0+b1+b3)<<1)+b1;
b5=((b0-b1+b2)<<1)+b0;
b6=((-b1-b2+b3)<<1)+b3;
b7=((b0-b2-b3)<<1)-b2;
t0=(a2*10)+(a3<<2);
t1=(a0+a1)<<3;
a3=(a2<<2)-(a3*10);
a1=(a0-a1)<<3;
a2=t0;
a0=t1;
b0=a0+a2;
b1=a1+a3;
b2=a1-a3;
b3=a0-a2;
a0=((b0+b4)+64);
a1=((b1+b5)+64);
a2=((b2+b6)+64);
a3=((b3+b7)+64);
a7=((b0-b4)+64);
a6=((b1-b5)+64);
a5=((b2-b6)+64);
a4=((b3-b7)+64);
a0=((a0<-32768)?-32768:((a0>32767)?32767:a0))>>7;
a1=((a1<-32768)?-32768:((a1>32767)?32767:a1))>>7;
a2=((a2<-32768)?-32768:((a2>32767)?32767:a2))>>7;
a3=((a3<-32768)?-32768:((a3>32767)?32767:a3))>>7;
a7=((a7<-32768)?-32768:((a7>32767)?32767:a7))>>7;
a6=((a6<-32768)?-32768:((a6>32767)?32767:a6))>>7;
a5=((a5<-32768)?-32768:((a5>32767)?32767:a5))>>7;
a4=((a4<-32768)?-32768:((a4>32767)?32767:a4))>>7;
DST(0,a0);
DST(1,a1);
DST(2,a2);
DST(3,a3);
DST(7,a7);
DST(6,a6);
DST(5,a5);
DST(4,a4);
}
其中,由于寄存器中的数据位变为32位后,每个寄存器只能保存4个32位数据,因此需要执行两次上述运算代码才能得出残差运算矩阵中的所有数据。另外,对于两个数据需要分别进行相加和进行相减运算,以及乘10运算,对应地使加减运算都在寄存器中运行,以及将乘法运算替换为加法运算和移位运算,使运算速度提高,具体的处理方式在实施例1中已详细描述,在此不再赘述。
步骤h:针对残差运算矩阵进行如下运算:cij=min(rij+pij,255),得到反变换结果矩阵,其中,cij为反变换结果矩阵中的数据,rij为残差运算矩阵中的数据,pij为预测像素矩阵中的数据,i和j的取值范围为0-7,min为取最小值。
需要说明的是,在实施例2中的步骤执行过程中,当前步骤执行完毕得到的矩阵数据分别保存于八个寄存器中,由于占用了全部寄存器,因此在进行下一步骤的运算中,需要将其中一个寄存器中的数据导出至内存中,空出一个寄存器进行运算。
在实施例2中,通过上述的步骤进行反变换有如下优点:将数据并行放进寄存器中进行运算,每次能同时运算多个数据,极大地提高了运算效率;另外,在水平反变换部分和垂直反变换部分的蝶形运算中,对于需要分别进行相加和进行相减运算的两个数据,通过巧妙的设置使相加和相减运算只需要在对应的两个寄存器中便可完成,不需要将数据导进导出内存,提高了运算速度,对于需要进行乘法运算的数据,将乘法运算转换为加法运算,也提高了运算速度。
针对实施例1和实施例2中的方案分别与现有技术进行对比,对比条件是intelcore i7cpu,4G内存,intel vTune使用的时间为60秒,得出如下表格数据:
从表格中的数据可以看出,使用本发明的方法,能够有效的提高编解码速度。本发明的变换运算只有现有技术的变换运算的30%左右;反变换运算只有现有技术的反变换运算的20%左右。
对本领域的技术人员来说,可根据以上描述的技术方案以及构思,做出其它各种相应的改变以及形变,而所有的这些改变以及形变都应该属于本发明权利要求的保护范围之内。
Claims (7)
1.基于AVS的并行变换方法,其特征在于,包括以下步骤:
步骤A:利用两个寄存器分别并行读入八个当前像素值和八个预测像素值,利用低位交叉指令使当前像素值与预测像素值进行交叉得到第一交叉结果,以及使预测像素值与自身进行交叉得到第二交叉结果,将第一交叉结果减去第二交叉结果得到八个残差值并送进一个寄存器中,其中,当前像素值与预测像素值为8位数据,残差值为16位数据;
步骤B:重复执行七次步骤A,得到64个残差值,组成8*8的残差矩阵,其中,每执行一次步骤A所得到的八个残差值为残差矩阵中的其中一行数据,八行数据分别保存于八个寄存器中;
步骤C:结合低位交叉指令和高位交叉指令对残差矩阵进行转置得到转置残差矩阵,所述八个寄存器中的数据分别替换为转置残差矩阵中的八行数据;
步骤D:针对转置残差矩阵中的数据进行水平变换部分的蝶形算法的运算,得到水平变换运算矩阵,所述八个寄存器中的数据分别替换为水平变换运算矩阵中的八行数据;
步骤E:结合低位交叉指令和高位交叉指令对水平变换运算矩阵进行转置得到转置水平变换运算矩阵,所述八个寄存器中的数据分别替换为转置水平变换运算矩阵中的八行数据;
步骤F:针对转置水平变换运算矩阵中的数据进行垂直变换部分的蝶形算法的运算,得到垂直变换运算矩阵,所述八个寄存器中的数据分别替换为垂直变换运算矩阵中的八行数据;
步骤G:针对垂直变换运算矩阵进行如下运算:rij=(hij+24)>>5,得到变换结果矩阵,其中,hij为垂直变换运算矩阵中的数据,rij为变换结果矩阵中的数据,i和j的取值范围为0-7;
在步骤F中包括如下子步骤:
步骤F0:将转置水平变换运算矩阵中的数据由16位转为32位,将转置水平变换运算矩阵中的每一行数据的前四个数据分别送入对应的寄存器中,转置水平变换运算矩阵中的每一行数据的后四个数据暂存于内存中;
步骤F1:针对已经保存至八个寄存器中的数据进行垂直变换部分的蝶形算法的运算,得到垂直变换运算矩阵中的左半部分数据,然后将垂直变换运算矩阵中的左半部分数据暂存于内存中;
步骤F2:将转置水平变换运算矩阵中的暂存于内存中的数据分别从内存中送进所述八个寄存器中;
步骤F3:针对已经保存至八个寄存器中的数据进行垂直变换部分的蝶形算法的运算,得到垂直变换运算矩阵中的右半部分数据,将垂直变换运算矩阵中的左半部分数据和右半部分数据组合得到垂直变换运算矩阵。
2.根据权利要求1所述的基于AVS的并行变换方法,其特征在于,在水平变换部分的蝶形算法的运算和垂直变换部分的蝶形算法的运算中,针对需要分别进行相加和进行相减的两组保存于各自寄存器中的数据,执行如下运算步骤:将两个寄存器分别记为xmm0和xmm7,将xmm0中的数据记为x0,将xmm7中的数据记为x7,首先将xmm0与xmm7相加保存于xmm0中,然后将xmm0与xmm0相加保存于xmm7中,最后将xmm7减去xmm0保存于xmm7中;经过运算步骤后,x0+x7的结果保存于xmm0中,x0-x7的结果保存于xmm7中。
3.根据权利要求1所述的基于AVS的并行变换方法,其特征在于,在水平变换部分的蝶形算法的运算和垂直变换部分的蝶形算法的运算中,将需要与10相乘的保存于寄存器中的数据记为y,则针对y*10这一乘法运算执行如下运算步骤:将保存有数据y的寄存器记为xmm1,首先将数据y复制至另一寄存器中,将另一寄存器记为xmm2,然后将xmm2中的数据左移两位后与xmm1中的数据相加,相加结果保存于xmm1中,再将xmm1与自身相加;经过该运算步骤,使y*10的结果保存于xmm1中。
4.基于AVS的并行反变换方法,其特征在于,包括以下步骤:
步骤a:利用八个寄存器分别保存反量化矩阵中的八行数据,反量化矩阵中的数据为16位数据;
步骤b:结合低位交叉指令和高位交叉指令对反量化矩阵进行转置得到转置反量化矩阵,所述八个寄存器中的数据分别替换为转置反量化矩阵中的八行数据;
步骤c:针对转置反量化矩阵中的数据进行水平反变换部分的蝶形算法的运算,得到水平反变换运算矩阵,所述八个寄存器中的数据分别替换为水平反变换运算矩阵中的八行数据;
步骤d:针对水平反变换运算矩阵中的数据进行如下运算:hij”=clip3(-2n+7,2n+7-1,(hij’+4))>>3,得到水平反变换中间矩阵,其中,hij”为水平反变换中间矩阵中的数据,hij’为水平反变换运算矩阵中的数据,n的取值为8,i和j的取值范围为0-7,clip3为取三个值的中间值,所述八个寄存器中的数据分别替换为水平反变换中间矩阵中的八行数据;
步骤e:结合低位交叉指令和高位交叉指令对水平反变换中间矩阵进行转置得到转置水平反变换中间矩阵,所述八个寄存器中的数据分别替换为转置水平反变换中间矩阵中的八行数据;
步骤f:针对转置水平反变换中间矩阵中的数据进行垂直反变换部分的蝶形算法的运算,得到垂直反变换运算矩阵,所述八个寄存器中的数据分别替换为垂直反变换运算矩阵中的八行数据;
步骤g:针对垂直反变换运算矩阵进行如下运算:rij=clip3(-2n+7,2n+7-1,(hij+64))>>7,得到残差运算矩阵,其中rij为残差运算矩阵中的数据,hij为垂直反变换运算矩阵中的数据,n的取值为8,i和j的取值范围为0-7,clip3为取三个值的中间值;
步骤h:针对残差运算矩阵进行如下运算:cij=min(rij+pij,255),得到反变换结果矩阵,其中,cij为反变换结果矩阵中的数据,rij为残差运算矩阵中的数据,pij为预测像素矩阵中的数据,i和j的取值范围为0-7,min为取最小值。
5.根据权利要求4所述的基于AVS的并行反变换方法,其特征在于,在步骤F中包括以下子步骤:
步骤f0:将转置水平反变换中间矩阵中的数据由16位转为32位,将转置水平反变换中间矩阵中的每一行数据的前四个数据分别送入对应的寄存器中,转置水平反变换中间矩阵中的每一行数据的后四个数据暂存于内存中;
步骤f1:针对已经保存至八个寄存器中的数据进行垂直反变换部分的蝶形算法的运算,得到垂直反变换运算矩阵中的左半部分数据并将其暂存于内存中;
步骤f2:将转置水平反变换中间矩阵中的暂存于内存中的数据分别从内存中送进所述八个寄存器中;
步骤f3:针对已经保存至八个寄存器中的数据进行垂直反变换部分的蝶形算法的运算,得到垂直反变换运算矩阵中的右半部分数据,将垂直反变换运算矩阵中的左半部分数据和右半部分数据组合得到垂直反变换运算矩阵。
6.根据权利要求4所述的基于AVS的并行反变换方法,其特征在于,在水平反变换部分的蝶形算法的运算和垂直反变换部分的蝶形算法的运算中,针对需要分别进行相加和进行相减的两组保存于各自寄存器中的数据,执行如下运算步骤:将两个寄存器分别记为xmm0和xmm7,将xmm0中的数据记为x0,将xmm7中的数据记为x7,首先将xmm0与xmm7相加保存于xmm0中,然后将xmm0与xmm0相加保存于xmm7中,最后将xmm7减去xmm0保存于xmm7中;经过运算步骤后,x0+x7的结果保存于xmm0中,x0-x7的结果保存于xmm7中。
7.根据权利要求4所述的基于AVS的并行反变换方法,其特征在于,在水平反变换部分的蝶形算法的运算和垂直反变换部分的蝶形算法的运算中,将需要与10相乘的保存于寄存器中的数据记为y,则针对y*10这一乘法运算执行如下运算步骤:将保存有数据y的寄存器记为xmm1,首先将数据y复制至另一寄存器中,将另一寄存器记为xmm2,然后将xmm2中的数据左移两位后与xmm1中的数据相加,相加结果保存于xmm1中,再将xmm1与自身相加;经过该运算步骤,使y*10的结果保存于xmm1中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510076289.XA CN104683817B (zh) | 2015-02-11 | 2015-02-11 | 基于avs的并行变换和反变换方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510076289.XA CN104683817B (zh) | 2015-02-11 | 2015-02-11 | 基于avs的并行变换和反变换方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104683817A CN104683817A (zh) | 2015-06-03 |
CN104683817B true CN104683817B (zh) | 2017-12-15 |
Family
ID=53318297
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510076289.XA Active CN104683817B (zh) | 2015-02-11 | 2015-02-11 | 基于avs的并行变换和反变换方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104683817B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105847840B (zh) * | 2015-11-18 | 2018-12-07 | 西安邮电大学 | 一种用于高效视频编码反变换运算的并行结构构造方法 |
CN106254883B (zh) * | 2016-08-02 | 2021-01-22 | 海信视像科技股份有限公司 | 一种视频解码中的反变换方法和装置 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101188761A (zh) * | 2007-11-30 | 2008-05-28 | 上海广电(集团)有限公司中央研究院 | Avs标准中基于并行处理来优化dct快速算法的方法 |
CN104320668A (zh) * | 2014-10-31 | 2015-01-28 | 上海交通大学 | Hevc/h.265的dct变换和反变换的simd优化方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2001309386A (ja) * | 2000-04-19 | 2001-11-02 | Mitsubishi Electric Corp | 画像処理装置 |
-
2015
- 2015-02-11 CN CN201510076289.XA patent/CN104683817B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101188761A (zh) * | 2007-11-30 | 2008-05-28 | 上海广电(集团)有限公司中央研究院 | Avs标准中基于并行处理来优化dct快速算法的方法 |
CN104320668A (zh) * | 2014-10-31 | 2015-01-28 | 上海交通大学 | Hevc/h.265的dct变换和反变换的simd优化方法 |
Non-Patent Citations (2)
Title |
---|
《H.264中变换和量化的SIMD优化》;魏芳等;《计算机工程与应用》;20040630(第17期);正文第24-27页 * |
《H_264的编码器优化及信息在网络中实时传输研究》;于云娣;《中国优秀博硕士学位论文全文数据库(硕士)信息科技辑》;20060815(第8期);正文第20-24页 * |
Also Published As
Publication number | Publication date |
---|---|
CN104683817A (zh) | 2015-06-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106066783A (zh) | 基于幂次权重量化的神经网络前向运算硬件结构 | |
CN102158694B (zh) | 一种基于gpu的遥感图像解压缩方法 | |
CN107766292A (zh) | 一种神经网络处理方法及处理*** | |
CN111583107A (zh) | 一种基于注意力机制的图像超分辨率重建方法和*** | |
Chang et al. | Efficient stereo matching on embedded GPUs with zero-means cross correlation | |
CN104683817B (zh) | 基于avs的并行变换和反变换方法 | |
CN111986132A (zh) | 一种基于DLatLRR与VGG·Net的红外与可见光图像融合方法 | |
DE102022120207A1 (de) | Effiziente Transformationen und Transponierungen zur Optimierung der Ratenverzerrung und Rekonstruktion in Videocodieren | |
CN109389607A (zh) | 基于全卷积神经网络的舰船目标分割方法、***及介质 | |
CN104320668B (zh) | Hevc/h.265的dct变换和反变换的simd优化方法 | |
Xiao et al. | FPGA-based scalable and highly concurrent convolutional neural network acceleration | |
CN102547263B (zh) | 可变复杂度的离散余弦逆变换查表快速算法 | |
CN104572588B (zh) | 矩阵求逆处理方法和装置 | |
CN109416743A (zh) | 一种用于识别人为动作的三维卷积装置 | |
CN116170601B (zh) | 基于四列列向量分块奇异值分解的图像压缩方法 | |
Yang et al. | BSRA: Block-based super resolution accelerator with hardware efficient pixel attention | |
CN104683800B (zh) | 基于avs的并行量化和反量化方法 | |
CN103188487B (zh) | 视频图像中的卷积方法及视频图像处理*** | |
CN115983343A (zh) | 基于FPGA的YOLOv4卷积神经网络轻量化方法 | |
Zheng et al. | Study on a new algorithm for gray image representation | |
CN108184127A (zh) | 一种可配置的多尺寸dct变换硬件复用架构 | |
CN107680126A (zh) | 随机抽样一致性的图像匹配去噪处理***及方法 | |
Naganuma et al. | Accelerating convolutional neural networks using low precision arithmetic | |
CN106454382A (zh) | 一种量子图像制备方法 | |
Barina et al. | Accelerating discrete wavelet transforms on GPUs |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |