專利名稱:一種二維離散余弦變換裝置及方法
技術(shù)領(lǐng)域:
本發(fā)明涉及圖像壓縮編碼技術(shù)領(lǐng)域,具體涉及一種二維離散余弦變換裝置及方法。
背景技術(shù):
離散余弦變換(DCT,Discrete Cosine Transform)具有很強(qiáng)的能量聚積特性絕大部分信號(hào)能量被聚集在低頻分量,部分高頻分量在信號(hào)處理和傳輸過(guò)程中可以被忽略。因?yàn)檫@一特性,DCT在圖像處理和數(shù)據(jù)壓縮等領(lǐng)域被廣泛應(yīng)用。運(yùn)動(dòng)圖像編碼標(biāo)準(zhǔn)(MPEG)和靜止圖像編碼標(biāo)準(zhǔn)(JPEG)都采用DCT來(lái)消除空間冗余,DCT也被應(yīng)用在國(guó)際電信聯(lián)盟(ITU)的H.261、H.263及H.26L等視頻編碼標(biāo)準(zhǔn)中。
二維DCT的定義如公式(1)Yu,v=2NAuAvΣi=0N-1Σj=0N-1Xi,jcos(2i+1)uπ2Ncos(2j+1)vπ2N---(1)]]>其中,i,j,u,v=0,1,...,N-1;i,j是采樣域中的空間坐標(biāo),u,v是變換域中的坐標(biāo),Au, 二維DCT一般都采用行列分離法來(lái)實(shí)現(xiàn),即首先依次對(duì)采樣域中每一行的圖像數(shù)據(jù)作一維DCT,這稱作行變換,然后再依次對(duì)每一列的圖像數(shù)據(jù)作一維DCT,這稱作列變換。也可以先作列變換再做行變換。其原理簡(jiǎn)述如公式(2)Yu,v=2NAuAvΣi=0N-1[Σi=0N-1Xi,jcos(2j+1)vπ2N]cos(2i+1)uπ2N---(2)]]>
這種方法的缺點(diǎn)是,每次只能處理一行或一列數(shù)據(jù),運(yùn)算速度較慢,對(duì)于MPEG-4、H.264等視頻編解碼算法,由于這些視頻編碼算法的復(fù)雜度很高,采用現(xiàn)有的DCT算法無(wú)法實(shí)現(xiàn)實(shí)時(shí)的視頻編解碼。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明的主要目的在于提供一種二維DCT裝置,以實(shí)現(xiàn)實(shí)時(shí)的視頻編解碼。
本發(fā)明另一目的在于提供一種二維DCT方法,以提高二維DCT的速度,從而提高圖像編碼算法的效率,實(shí)現(xiàn)實(shí)時(shí)的視頻編解碼。
為達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的一種二維DCT裝置,該裝置包括控制模塊用于啟動(dòng)輸入寄存模塊;輸入寄存模塊用于接收單位圖像子塊,然后將所接收的該單位圖像子塊輸出到并行DCT列變換模塊;并行DCT列變換模塊用于接收輸入寄存模塊輸出的單位圖像子塊,對(duì)該單位圖像子塊的所有列同時(shí)進(jìn)行并行的一維DCT后,將得到的單位圖像子塊輸出到DCT行變換模塊;DCT行變換模塊用于接收并行DCT列變換模塊輸出的單位圖像子塊,對(duì)該單位圖像子塊的每一行依次作一維DCT。
所述DCT行變換模塊進(jìn)一步包括數(shù)據(jù)轉(zhuǎn)換模塊用于接收并行DCT列變換模塊輸出的單位圖像子塊,分別提取并計(jì)算該圖像子塊每一行各元素經(jīng)一維DCT展開(kāi)后的相同運(yùn)算項(xiàng),將相同運(yùn)算項(xiàng)的計(jì)算結(jié)果以矩陣形式輸出到并行加乘模塊;系數(shù)裝載模塊用于保存每一行的行變換系數(shù),在接收到控制模塊的啟動(dòng)指令后,將每一行的行變換系數(shù)以矩陣形式輸出到并行加乘模塊;并行加乘模塊用于接收數(shù)據(jù)轉(zhuǎn)換模塊和系數(shù)裝載模塊的輸出矩陣,分別對(duì)每一行的行變換系數(shù)和數(shù)據(jù)轉(zhuǎn)換模塊輸出矩陣的對(duì)應(yīng)元素,相乘后相加,再將每一行的結(jié)果以矩陣形式輸出到加模塊;加模塊用于接收并行加乘模塊的輸出矩陣,然后將該矩陣的對(duì)應(yīng)元素相加,依次得到二維DCT結(jié)果矩陣的每一行的所有元素;同時(shí),所述控制模塊進(jìn)一步用于,在啟動(dòng)輸入寄存模塊后,啟動(dòng)系數(shù)裝載模塊。
一種二維DCT方法,該方法包括A、將原始圖像數(shù)據(jù)的單位圖像子塊以單位矩陣的形式讀入,然后,對(duì)該單位矩陣的所有列同時(shí)進(jìn)行并行的一維DCT,得到列變換結(jié)果;B、將列變換的結(jié)果以單位矩陣形式讀入,對(duì)矩陣的每一行依次作一維DCT,得到二維DCT的最終結(jié)果。
所述對(duì)單位矩陣的所有列同時(shí)進(jìn)行并行的一維DCT具體為將單位矩陣的行向量進(jìn)行一維DCT展開(kāi),利用三角關(guān)系對(duì)所有向量進(jìn)行優(yōu)化,提取并刪除優(yōu)化后的每個(gè)向量的公因數(shù),然后,對(duì)所有向量同時(shí)進(jìn)行計(jì)算;且,在步驟B之前進(jìn)一步包括,將所述刪除的公因數(shù)與對(duì)應(yīng)的行變換系數(shù)相乘。
所述對(duì)列變換的所有向量進(jìn)行優(yōu)化為,根據(jù)每個(gè)向量中的乘法運(yùn)算最少和向量相互間含相同運(yùn)算最多的原則進(jìn)行優(yōu)化。
步驟B所述對(duì)單位矩陣的每一行作一維DCT具體為分別將每一行的行變換系數(shù)以矩陣形讀入,同時(shí),對(duì)步驟A得到的列變換結(jié)果矩陣的每一行的各個(gè)元素進(jìn)行一維DCT展開(kāi),分別提取并計(jì)算每一行各元素間的相同運(yùn)算項(xiàng),然后將相同運(yùn)算項(xiàng)與對(duì)應(yīng)的行變換系數(shù)同時(shí)進(jìn)行加乘后得到一個(gè)矩陣,再將該矩陣各列的相鄰元素同時(shí)相加,得到二維DCT結(jié)果矩陣的行向量。
與現(xiàn)有技術(shù)相比,本發(fā)明通過(guò)在列變換中減少乘法次數(shù)并增加相同運(yùn)算,以利于對(duì)各列同時(shí)進(jìn)行一維DCT,大大加快了列變換的速度;在行變換中通過(guò)提取每一行各元素的相同運(yùn)算項(xiàng),以利于對(duì)每一行的各元素同時(shí)進(jìn)行一維DCT,從整體上提高了二維DCT的運(yùn)算速度。本發(fā)明提供的方法可以應(yīng)用在圖像壓縮編碼中,實(shí)現(xiàn)實(shí)時(shí)的視頻編解碼。
圖1為本發(fā)明提供的實(shí)現(xiàn)二維DCT列變換的數(shù)據(jù)流程圖;圖2為利用PMADDWD指令實(shí)現(xiàn)數(shù)據(jù)加乘的示意圖;圖3為本發(fā)明提供的實(shí)現(xiàn)二維DCT的裝置圖。
具體實(shí)施例方式
下面結(jié)合附圖及具體實(shí)施例對(duì)本發(fā)明再作進(jìn)一步詳細(xì)的說(shuō)明。
通常,對(duì)圖像作二維DCT是以8*8的子塊為一個(gè)變換單元。圖1是本發(fā)明對(duì)由8*8子塊組成的圖像數(shù)據(jù)實(shí)現(xiàn)二維DCT列變換的數(shù)據(jù)流程圖,為方便起見(jiàn),將8*8的子塊描述成8*8的矩陣,本發(fā)明中,將8*8的子塊作為單位圖像子塊,8*8的矩陣作為單位矩陣。如圖1所示,變換前8*8矩陣X的行向量為X0,...,X7,經(jīng)列變換后得到矩陣Y,其行向量為Y0,...,Y7。為了了解列變換的具體實(shí)現(xiàn)流程,將圖1中各種運(yùn)算結(jié)構(gòu)的具體功能描述如下結(jié)構(gòu)11設(shè)其輸入為I11和I12,輸出為Y0和Y4,則其實(shí)現(xiàn)的功能為Y0=I11+I12,Y4=I11-I12。
結(jié)構(gòu)12設(shè)其輸入為I21和I22,輸出為Y1和Y2,則其實(shí)現(xiàn)的功能為Y1=I22+I21*T1,Y7=I22*T1-I21。
結(jié)構(gòu)13設(shè)其輸入為I31和I32,輸出為Y5和Y3,則其實(shí)現(xiàn)的功能為Y5=I32-I31*T3,Y3=-(I32*T3+I31)。
結(jié)構(gòu)14設(shè)其輸入為I4,輸出為O4,則其實(shí)現(xiàn)的功能為O4=I4*C4。
需要指出的是,在圖1中若有跟以上所述結(jié)構(gòu)之一相同的運(yùn)算結(jié)構(gòu),那么只需改變以上所述結(jié)構(gòu)的輸入或者輸入和系數(shù)就可得到該運(yùn)算結(jié)構(gòu)的輸出。
圖1的設(shè)計(jì)原理如下根據(jù)一維DCT變換公式Y(jié)u=2NAuΣi=0N-1Xicos(2i+1)uπ2N,]]>可得出公式(3)Y0=(X0+X7+X1+X6+X2+X5+X3+X4)*C4/2;Y4=[(X0+X7+X3+X4)-(X1+X6+X2+X5)]*C4/2;Y2={[(X0+X7)-(X3+X4)]*C2+[(X1+X6)-(X2+X5)]*C6}/2;Y6={[(X0+X7)-(X3+X4)]*C6-[(X1+X6)-(X2+X5)]*C2}/2;Y1={[(X0-X7)*C1+(X1-X6)*C3]+[(X2-X5)*C5+(X3-X4)]*C7}/2;Y3={[(X0-X7)*C3-(X1-X6)*C7]-[(X2-X5)*C1-(X3-X4)]*C5}/2;Y5={[(X0-X7)*C5-(X1-X6)*C1]+[(X2-X5)*C7+(X3-X4)]*C3}/2;Y7={[(X0-X7)*C7-(X1-X6)*C5]+[(X2-X5)*C3-(X3-X4)]*C1}/2(3)其中,C1,...,C7分別為cos1π16,...,cos7π16.]]>根據(jù)三角公式tanα=sinα/cosα,sin(α+β)=sinαcosβ+cosαsinβ,sin(α-β)=sinαcosβ-cosαsinβ,cos(α+β)=cosαcosβ-sinαsinβ,cos(α-β)=cosαcosβ+sinαsinβ,sin(π2-α)=cosα,]]>可將公式(3)轉(zhuǎn)換為公式(4)Y2={(X0+X7)-(X3+X4)+[(X1+X6)-(X2+X5)]*T2}*C2/2;Y6={[(X0+X7)-(X3+X4)]*T2-[(X1+X6)-(X2+X5)]}*C2/2;Y1={(X0-X7)+[(X1-X6)+(X2-X5)]*C4+{(X3-X4)+[(X1-X6)-(X2-X5)]*C4}*T1}*C1/2;
Y3={(X0-X7)-[(X1-X6)+(X2-X5)]*C4-{(X3-X4)-[(X1-X6)-(X2-X5)]*C4}*T3}*C3/2;Y5={(X0-X7)-[(X1-X6)+(X2-X5)]*C4}*T3+{(X3-X4)-[(X1-X6)-(X2-X5)]*C4}}*C3/2;Y7={{(X0-X7)+[(X1-X6)+(X2-X5)]*C4}*T1-{(X3-X4)+[(X1-X6)-(X2-X5)]*C4}}*C1/2(4)其中,T1,...,T7分別為tan1π16,...,tan7π16.]]>將公式(3)轉(zhuǎn)換為公式(4)的目的是,減少乘法次數(shù),同時(shí)使得Y1,...,Y7的計(jì)算公式間含有盡可能多的同種運(yùn)算,以利于并行運(yùn)算。
去掉公式(4)中各個(gè)計(jì)算公式的的公因數(shù),將其變?yōu)楣?5)Y0′=X0+X7+X1+X6+X2+X5+X3+X4;Y4′=(X0+X7+X3+X4)-(X1+X6+X2+X5);Y2′=(X0+X7)-(X3+X4)+[(X1+X6)-(X2+X5)]*T2;Y6′=[(X0+X7)-(X3+X4)]*T2-[(X1+X6)-(X2+X5)];Y1′=(X0-X7)+[(X1-X6)+(X2-X5)]*C4+{(X3-X4)+[(X1-X6)-(X2-X5)]*C4}*T1;Y3′=(X0-X7)-[(X1-X6)+(X2-X5)]*C4-{(X3-X4)-[(X1-X6)-(X2-X5)]*C4}*T3;Y5′={(X0-X7)-[(X1-X6)+(X2-X5)]*C4}*T3+{(X3-X4)-[(X1-X6)-(X2-X5)]*C4};Y7′={(X0-X7)+[(X1-X6)+(X2-X5)]*C4}*T1-{(X3-X4)+[(X1-X6)-(X2-X5)]*C4}(5)將公式(5)與公式(4)相比可以看出,公式(5)將公式(4)各個(gè)計(jì)算公式的公因數(shù)省掉了,這些省掉的公因數(shù)將在行變換時(shí)乘上,這樣既可以提高運(yùn)算速度,也可以提高運(yùn)算精度。
以下是本發(fā)明提供的對(duì)由8*8子塊組成的圖像數(shù)據(jù)實(shí)現(xiàn)二維DCT的具體步驟,為方便起見(jiàn),同樣將8*8的子塊描述成8*8的矩陣。
步驟1利用公式(5)對(duì)原始8*8矩陣X的每一列同時(shí)作一維DCT,即作并行列變換。
設(shè)X0,...,X7為矩陣X的行向量,Y0′,...,Y7′為經(jīng)列變換后得到的矩陣Y′的行向量。
在進(jìn)行列變換時(shí),當(dāng)從寄存器讀取或處理向量X0時(shí),實(shí)際上是同時(shí)讀取或處理X0的8個(gè)元素,例如當(dāng)計(jì)算X0+X7時(shí),實(shí)際上是同時(shí)將X0中的8個(gè)元素和X7中的8個(gè)元素對(duì)應(yīng)相加。同時(shí),X0+X7等各向量的相同運(yùn)算項(xiàng)只需計(jì)算一次,之后可供各向量共享。因此,8個(gè)列變換可以同時(shí)進(jìn)行,大大加快了DCT運(yùn)算的速度。
以上列變換可利用Intel處理器集成的第二代流單條指令處理多個(gè)數(shù)據(jù)擴(kuò)展(SSE2,Stream SIMD Extension 2)技術(shù)提供的指令實(shí)現(xiàn),SSE2提供的指令可以同時(shí)處理8個(gè)16位整數(shù)。
步驟2利用一維DCT公式對(duì)列變換結(jié)果矩陣的每一行依次作行變換,得到二維DCT的最終結(jié)果。
在利用一維DCT公式對(duì)列變換結(jié)果矩陣的每一行依次作行變換,具體可采用如下步驟步驟201根據(jù)一維DCT的展開(kāi)公式(6),對(duì)矩陣Y′中的元素作如公式(7)所示的變換。
公式(6)如下wj0=[(yj0+yj7)*C4+(yj1+yj6)*C4+(yj2+yj5)*C4+(yj5+yj4)*C4]/2;wj1={[(yj0-yj7)*C1+(yj1-yj6)*C3]+[(yj2-yj5)*C5+(yj3-yj4)]*C7}/2;wj2={[(yj0+yj7)*C2+(yj1+yj6)*C6]-[(yj2+yj5)*C6+(yj3+yj4)*C2]}/2;wj3={[(yj0-yj7)*C3-(yj1-yj6)*C7]-[(yj2-yj5)*C1+(yj3-yj4)]*C5}/2;
wj4={[(yj0+yj7)*C4-(yj1+yj6)*C4]-[(yj2+yj5)*C4-(yj3+yj4)*C4]}/2;wj5={[(yj0-yj7)*C5-(yj1-yj6)*C1]+[(yj2-yj5)*C7+(yj3-yj4)]*C3}/2;wj6={[(yj0+yj7)*C6-(yj1+yj6)*C2]+[(yj2+yj5)*C2-(yj3+yj4)*C6]}/2;wj7={[(yj0-yj7)*C7-(yj1-yj6)*C5]+[(yj2-yj5)*C3-(yj3-yj4)]*C1}/2,(j=0,...,7)(6)其中,yj0,...,yj7為行變換前的矩陣Y的第j行的元素,wj0,...,wj7為行變換后的結(jié)果矩陣W的第j行的元素。
從公式(6)可以看出,各個(gè)計(jì)算公式間含有很多相同運(yùn)算,例如y′j0+y′j7,y′j0-y′j7,y′j1+y′j6,y′j1-y′j6,y′j2+y′j5,y′j2-y′j5,y′j3+y′j4,y′j3-y′j4,因此,可首先計(jì)算出這些相同運(yùn)算項(xiàng),然后將它們代入各計(jì)算公式中。也就是說(shuō),相同運(yùn)算項(xiàng)只需計(jì)算一次,之后可供同一行的各元素共享。
將公式(6)中的各個(gè)計(jì)算公式間的相同運(yùn)算項(xiàng)用公式(7)表示為mj0=y(tǒng)′j0+y′j7,mj7=y(tǒng)′j0-y′j7,mj1=y(tǒng)′j1+y′j6,mj6=y(tǒng)′j1-y′j6,(7)mj2=y(tǒng)′j2+y′j5,mj5=y(tǒng)′j2-y′j5,mj3=y(tǒng)′j3+y′j4,mj4=y(tǒng)′j3-y′j4其中,y′j0,...,y′j7表示向量Y′j(j=0,...,7)的8個(gè)元素。
將公式(7)代入公式(6)可得到wj0=(C4*mj0+C4*mj1+C4*mj2+C4*mj3)/2;wj1=(C1*mj7+C3*mj6+C5*mj5+C7*mj4)/2;wj2=(C2*mj0+C6*mj1-C6*mj2-C2*mj3)/2;wj3=(C3*mj7-C7*mj6-C1*mj5-C5*mj4)/2;wj4=(C4*mj0-C4*mj1-C4*mj2+C4*mj3)/2;wj5=(C5*mj7-C1*mj6+C7*mj5+C3*mj4)/2;wj6=(C6*mj0-C2*mj1+C2*mj2-C6*mj3)/2;wj7=(C7*mj7-C5*mj6+C3*mj5-C1*mj4)/2,(j=0,...,7) (8)
步驟202給出矩陣Mj和系數(shù)矩陣Pj(j=0,...,7)。
矩陣Mj如公式(9)Mj=mj0mj1mj7mj6mj0mj1mj7mj6mj2mj3mj5mj4mj2mj3mj5mj4---(9)]]>由公式(8)可以看出,公式(8)中的各個(gè)計(jì)算公式實(shí)際上都是由公式(7)中的部分相同運(yùn)算項(xiàng)和一些系數(shù)相乘后再相加得到的,為了實(shí)現(xiàn)相同運(yùn)算項(xiàng)和對(duì)應(yīng)系數(shù)的加乘,將公式(8)中各個(gè)計(jì)算公式的系數(shù)寫成如公式(10)的矩陣形式Pj=p4jp4jp1jp3jp2jp6jp3j-p7jp4jp4jp5jp7j-p6j-p2j-p1j-p5jp4j-p4jp5j-p1jp6j-p2jp7j-p5j-p4jp4jp7jp3jp2j-p6jp3j-p1j,]]>j=0,4時(shí),p1j,p2j,...,p7j分別為C1*C4,C2*C4,...,C7*C4;j=1,7時(shí),p1j,p2j,...,p7j分別為C1*C1,C2*C1,...,C7*C1;j=2,6時(shí),p1j,p2j,...,p7j分別為C1*C2,C2*C2,...,C7*C2;j=3,5時(shí),p1j,p2j,...,p7j分別為C1*C3,C2*C3,...,C7*C3 (10)將公式(10)中的系數(shù)與公式(8)中的相比可以看出,j=0,4時(shí),公式(10)中的p1j,p2j,...,p7j比公式(8)多乘了C4,這是為了將列變換時(shí)省掉的公因數(shù)乘上。同樣,j=1,7,j=2,6,j=3,5時(shí),各個(gè)對(duì)應(yīng)的系數(shù)都要作此處理。
在這里,可暫不考慮列變換時(shí)省掉的公因數(shù) 以及行變換的各計(jì)算公式中的公因數(shù) 可在行變換的最后再將各元素乘上 即可。
步驟203將Pj和M0j的對(duì)應(yīng)向量進(jìn)行加乘。
具體步驟如下設(shè)矩陣Pj的行向量為P0j,P1j,P2j,P3j,矩陣Mj的行向量為M0j,M1j。
a、對(duì)P0j和M0j進(jìn)行加乘運(yùn)算,即將P0j和M0j的對(duì)應(yīng)元素相乘,得到8個(gè)元素,然后將第0和第1個(gè)、第2和第3個(gè)、第4和第5個(gè)、第6和第7個(gè)元素分別相加,得到矩陣Zj的行向量Z0j;b、對(duì)P1j和M1j進(jìn)行加乘運(yùn)算,可得到矩陣Zj的行向量Z1j;c、對(duì)P2j和M0j進(jìn)行加乘運(yùn)算,可得到矩陣Zj的行向量Z2j;d、對(duì)P3j和M1j進(jìn)行加乘運(yùn)算,可得到矩陣Zj的行向量Z3j,最后得到矩陣ZjZj=p4j*mj0+p4j*mj1p1j*mj7+p3j*mj6p2j*mj0+p6j*mj1p3j*mj7-p7j*mj6p4j*mj2+p4j*mj3p5j*mj5+p7j*mj4-p6j*mj2-p2j*mj3-p1j*mj5-p5j*mj4p4j*mj0-p4j*mj1p5j*mj7-p1j*mj6p6j*mj0-p2j*mj1p71*mj7-p5j*mj6-p4j*mj2+p4j*mj3p7j*mj5+p3j*mj4p2j*mj2-p6j*mj3p3j*mj5-p1j*mj4---(11)]]>SSE2提供的加乘指令(PMADDWD)可以實(shí)現(xiàn)8個(gè)16位整數(shù)和另外8個(gè)16位整數(shù)的加乘。其具體功能如圖2所示,設(shè)目標(biāo)寄存器XMM0中存放了8個(gè)16位整數(shù)X0,...,X7,源寄存器XMM1中存放了8個(gè)16位整數(shù)Y0,...,Y7,則對(duì)XMM0和XMM1中的數(shù)據(jù)利用PMADDWD指令后可以得到結(jié)果X7*Y7+X6*Y6,X5*Y5+X4*Y4,X3*Y3+X2*Y2,X1*Y1+X0*Y0,這4個(gè)32位整數(shù)存放在XMM0中。
e、將矩陣Zj的元素z00和z10、z01和z11、z02和z12、z03和z13、z20和z30、z21和z31、z22和z32、z23和z33分別相加,可以得到
sj0=p4j*(mj0+mj1+mj2+mj3);sj1=p1j*mj7+p3j*mj6+p5j*mj5+p7j*mj4;sj2=p2j*(mj0-mj3)+p6j*(mj1-mj2);sj3=p3j*mj7-p7j*mj6-p1j*mj5-p5j*mj6;sj4=p4j*(mj0-mj1-mj2+mj3);sj5=p4j*(mj0-mj1)+p4j*(mj3-mj2);sj6=p5*mj7-p1j*mj6+p7j*mj5+p3j*mj4;sj7=p7j*mj7-p5j*mj6+p3j*mj5-p1j*mj6, (12)其中,zuv,u,v=0,1,2,3為矩陣Zj第u行的第v個(gè)元素,sj0,...,sj7為矩陣S的第j行的元素。
該步驟可以利用SSE2提供的加法指令(PADDD)實(shí)現(xiàn),PADDD指令可同時(shí)作4個(gè)32位整數(shù)的加法。
該步驟實(shí)際上是依據(jù)公式(8),將矩陣Zj各列的相鄰元素同時(shí)相加,這里的相鄰元素指的是矩陣各列的第0個(gè)和第1個(gè)元素,第2個(gè)和第3個(gè)元素,第3個(gè)和第4個(gè)元素,...,即每個(gè)元素只和其相鄰元素作一次加運(yùn)算。
f、將sj0,...,sj7分別乘上 得到二維DCT的結(jié)果矩陣W的第j行的元素wj0,...,wj7。
這是因?yàn)樵谧髁凶儞Q和行變換時(shí)都省掉了公因數(shù) 依次令j=0,...,7,執(zhí)行步驟a~f,即可得到矩陣X經(jīng)二維DCT變換后的結(jié)果矩陣W。
需要指出的是,矩陣Mj和Pj中各個(gè)元素的排列次序并不局限于公式(9)和公式(10)所示的情況,只要它們的排列次序滿足條件將Mj和Pj的對(duì)應(yīng)向量加乘并將加乘后得到的矩陣的各列的相鄰元素相加后可得到公式(8)中的各元素即可。
另外,由于從寄存器讀取數(shù)據(jù)的規(guī)律是每次讀一行,因此,如果行變換采用與列變換相同的并行算法,在進(jìn)行行變換前必須對(duì)列變換的結(jié)果矩陣進(jìn)行轉(zhuǎn)置,即將行列互換,而轉(zhuǎn)置過(guò)程比較耗時(shí),因此從總體運(yùn)算速度考慮,在本發(fā)明中行變換采用了依次對(duì)各行作一維DCT的算法,避免了行列轉(zhuǎn)置過(guò)程,從總體上提高了運(yùn)算速度。
圖3是本發(fā)明提供的實(shí)現(xiàn)二維DCT的裝置圖,以8*8的圖像子塊為例,如圖3所示,該裝置主要包括控制模塊30用于啟動(dòng)輸入寄存模塊31,并在啟動(dòng)輸入寄存模塊時(shí)啟動(dòng)系數(shù)裝載模塊302。
輸入寄存模塊31用于接入8*8的圖像子塊,并在接收到控制模塊的啟動(dòng)指令后將其輸出到并行DCT列變換模塊32。接入或輸出可以矩陣形式,即以每次并行接入或輸出1列數(shù)據(jù)的形式進(jìn)行,每8次接入或輸出為一個(gè)矩陣。
并行DCT列變換模塊32用于接收8*8的矩陣,并對(duì)8*8的矩陣作并行DCT列變換,將列變換結(jié)果以矩陣形式輸出到DCT行變換模塊33。
DCT行變換模塊33用于依次對(duì)并行DCT列變換模塊輸出矩陣的每一行作一維DCT變換,得到二維DCT的最終結(jié)果。
DCT行變換模塊主要包括以下子模塊數(shù)據(jù)轉(zhuǎn)換模塊301用于接收并行DCT列變換模塊32的輸出矩陣,并根據(jù)公式(6)對(duì)該矩陣每一行的各元素進(jìn)行一維DCT展開(kāi),提取并計(jì)算各計(jì)算公式間的相同運(yùn)算項(xiàng),并將計(jì)算得到的結(jié)果以矩陣形式輸出到并行加乘模塊303。
系數(shù)裝載模塊302用于保存行變換的系數(shù),并在接收到控制模塊的啟動(dòng)指令后將系數(shù)以矩陣形式輸出到并行加乘模塊303。系數(shù)矩陣中元素的排列依據(jù)是公式(8)以及數(shù)據(jù)轉(zhuǎn)換模塊301的輸出矩陣。
并行加乘模塊303用于根據(jù)公式(8)實(shí)現(xiàn)系數(shù)裝載模塊302輸出的系數(shù)矩陣和數(shù)據(jù)轉(zhuǎn)換模塊301輸出矩陣的對(duì)應(yīng)行的加乘,并將加乘結(jié)果以矩陣形式輸出到加模塊304。
加模塊304用于根據(jù)公式(8)將并行加乘模塊303的輸出對(duì)應(yīng)相加,得到二維DCT結(jié)果矩陣的行向量。
以上所述僅為本發(fā)明的過(guò)程及方法實(shí)施例,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi)所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種二維DCT裝置,其特征在于,該裝置包括控制模塊用于啟動(dòng)輸入寄存模塊;輸入寄存模塊用于接收單位圖像子塊,然后將所接收的該單位圖像子塊輸出到并行DCT列變換模塊;并行DCT列變換模塊用于接收輸入寄存模塊輸出的單位圖像子塊,對(duì)該單位圖像子塊的所有列同時(shí)進(jìn)行并行的一維DCT后,將得到的單位圖像子塊輸出到DCT行變換模塊;DCT行變換模塊用于接收并行DCT列變換模塊輸出的單位圖像子塊,對(duì)該單位圖像子塊的每一行依次作一維DCT。
2.如權(quán)利要求1所述的裝置,其特征在于,所述DCT行變換模塊進(jìn)一步包括數(shù)據(jù)轉(zhuǎn)換模塊用于接收并行DCT列變換模塊輸出的單位圖像子塊,分別提取并計(jì)算該圖像子塊每一行各元素經(jīng)一維DCT展開(kāi)后的相同運(yùn)算項(xiàng),將相同運(yùn)算項(xiàng)的計(jì)算結(jié)果以矩陣形式輸出到并行加乘模塊;系數(shù)裝載模塊用于保存每一行的行變換系數(shù),在接收到控制模塊的啟動(dòng)指令后,將每一行的行變換系數(shù)以矩陣形式輸出到并行加乘模塊;并行加乘模塊用于接收數(shù)據(jù)轉(zhuǎn)換模塊和系數(shù)裝載模塊的輸出矩陣,分別對(duì)每一行的行變換系數(shù)和數(shù)據(jù)轉(zhuǎn)換模塊輸出矩陣的對(duì)應(yīng)元素,相乘后相加,再將每一行的結(jié)果以矩陣形式輸出到加模塊;加模塊用于接收并行加乘模塊的輸出矩陣,然后將該矩陣的對(duì)應(yīng)元素相加,依次得到二維DCT結(jié)果矩陣的每一行的所有元素;同時(shí),所述控制模塊進(jìn)一步用于,在啟動(dòng)輸入寄存模塊后,啟動(dòng)系數(shù)裝載模塊。
3.一種二維DCT方法,其特征在于,該方法包括A、將原始圖像數(shù)據(jù)的單位圖像子塊以單位矩陣的形式讀入,然后,對(duì)該單位矩陣的所有列同時(shí)進(jìn)行并行的一維DCT,得到列變換結(jié)果;B、將列變換的結(jié)果以單位矩陣形式讀入,對(duì)矩陣的每一行依次作一維DCT,得到二維DCT的最終結(jié)果。
4.如權(quán)利要求3所述的方法,其特征在于,所述對(duì)單位矩陣的所有列同時(shí)進(jìn)行并行的一維DCT具體為將單位矩陣的行向量進(jìn)行一維DCT展開(kāi),利用三角關(guān)系對(duì)所有向量進(jìn)行優(yōu)化,提取并刪除優(yōu)化后的每個(gè)向量的公因數(shù),然后,對(duì)所有向量同時(shí)進(jìn)行計(jì)算;且,在步驟B之前進(jìn)一步包括,將所述刪除的公因數(shù)與對(duì)應(yīng)的行變換系數(shù)相乘。
5.如權(quán)利要求4所述的方法,其特征在于,所述對(duì)列變換的所有向量進(jìn)行優(yōu)化為,根據(jù)每個(gè)向量中的乘法運(yùn)算最少和向量相互間含相同運(yùn)算最多的原則進(jìn)行優(yōu)化。
6.如權(quán)利要求3所述的方法,其特征在于,步驟B所述對(duì)單位矩陣的每一行作一維DCT具體為分別將每一行的行變換系數(shù)以矩陣形讀入,同時(shí),對(duì)步驟A得到的列變換結(jié)果矩陣的每一行的各個(gè)元素進(jìn)行一維DCT展開(kāi),分別提取并計(jì)算每一行各元素間的相同運(yùn)算項(xiàng),然后將相同運(yùn)算項(xiàng)與對(duì)應(yīng)的行變換系數(shù)同時(shí)進(jìn)行加乘后得到一個(gè)矩陣,再將該矩陣各列的相鄰元素同時(shí)相加,得到二維DCT結(jié)果矩陣的行向量。
全文摘要
本發(fā)明公開(kāi)了一種二維DCT裝置,包括控制模塊、輸入寄存模塊、并行DCT列變換模塊和DCT行變換模塊。本發(fā)明同時(shí)公開(kāi)了一種二維DCT方法,本發(fā)明提供的方法包括對(duì)原始輸入圖像的單位子塊的所有列同時(shí)進(jìn)行并行的一維DCT,然后依次對(duì)單位子塊的每一行作一維DCT。本發(fā)明方法通過(guò)在列變換的向量計(jì)算中減少乘法次數(shù)并增加相同運(yùn)算,以利于對(duì)各列同時(shí)進(jìn)行一維DCT,大大加快了列變換的速度;在行變換中通過(guò)提取每一行各元素的相同運(yùn)算項(xiàng),以利于對(duì)每一行的各元素同時(shí)進(jìn)行一維DCT,從整體上提高了二維DCT的運(yùn)算速度。本發(fā)明公開(kāi)的裝置和方法可以應(yīng)用在圖像壓縮編碼中,實(shí)現(xiàn)實(shí)時(shí)的視頻編解碼。
文檔編號(hào)G06T9/00GK1816144SQ200510001649
公開(kāi)日2006年8月9日 申請(qǐng)日期2005年2月3日 優(yōu)先權(quán)日2005年2月3日
發(fā)明者蔣曉華 申請(qǐng)人:聯(lián)想(北京)有限公司