不可分離變換:整個變換就是乙個二維矩陣乘法過程。
可分離變換:將二維矩陣乘法分為水平和垂直方向兩個一維向量乘法,複雜度較低。
二次變換:就是在主變換(primary transform)之後對頻域訊號進行第二次變換,將訊號從乙個變換域轉換至另外乙個變換域,之後再進行量化,熵編碼等操作,其目的是進一步去除統計冗餘。
在vtm5中低頻不可分離變換 (lfnst,low-frequency non-separable transform)被看作是縮減的二次變換。如下圖所示,在編碼端,lfnst用在變換和量化之間。在解碼端,lfnst用在反量化和反變換之間。根據塊的尺寸不同,lfnst可以選擇4x4和8x8的不可分離變換。例如對小尺寸塊(min (width, height) < 8)使用4x4變換,對大尺寸塊(min (width, height) >4)使用8x8變換。
下面是乙個4x4lfnst的例子,輸入x是乙個4x4矩陣:
首先將矩陣x拉伸為乙個一維向量:
然後進行不可分離變換計算:
最後將結果16x1的係數向量轉換成4x4的係數矩陣。
lfnst基於不可分離變換所以只需要一次矩陣乘法就可以完成變換操作。但是為了降低計算複雜度和變換係數的記憶體空間需要將不可分離變換矩陣進行縮減。縮減的不可分離變換(reduced non-separable transform,rst)主要思想是將n維向量對映為另乙個空間的r維向量,其中n/r (r
r是n維空間的r基底。其逆矩陣是正變換矩陣的轉置矩陣。
上面有乙個4x4lfnst的例子,同樣對於8x8lfnst,輸入x是乙個8x8矩陣拉伸為64x1的向量,矩陣t為64x64,使用rst縮減因子是4時t變為16x64,結果是16x1的向量轉換為4x4矩陣,所以8x8二次變換結果只有左上角4x4其他三個4x4塊變換係數都是0。
void trquant::fwdlfnstnxn( int* src, int* dst, const uint32_t mode, const uint32_t index, const uint32_t size, int zerooutsize )
//!《剩餘元素置零
::memset( out, 0, ( trsize - zerooutsize ) * sizeof( int ) );
}
//!《將結果一維向量轉換成二維矩陣
const scanelement * scanptr = scan;
int lfnstcoeffnum = ( sbsize == 4 ) ? sbsize * sbsize : 48;
for( y = 0; y < lfnstcoeffnum; y++ )
在vtm5中,8x8lfnst變換矩陣進一步縮減從16x64變為16x48,逆矩陣為48x16,輸入x只取左上角三個4x4塊展開成48維向量,如下圖所示。由於維度縮減儲存所有lfnst矩陣的空間由10kb減少到8kb而效能未下降太多。
為了減少tu(4x4或8x8)在方面最壞情況下的乘法運算數量,對8x8和4x4tu分別使用8x
48和8x16矩陣。對於尺寸大於8x8的塊由於不會發生最壞情況所以使用16x48的矩陣。對於8x4或4x8的tu只對其左上角4x4塊使用4x4lfnst(16x16矩陣)。對4xn或nx4的tu(n≧16)只對其左上角兩個鄰接4x4塊使用4x4lfnst。經過這些簡化,最壞情況下每個畫素只需要做8次乘法運算。
lfnst中預設了4個變換集,每個變換集有2個不可分離變換。
const int8_t g_lfnst8x8[ 4 ][ 2 ][ 16 ][ 48 ]
const int8_t g_lfnst4x4[ 4 ][ 2 ][ 16 ][ 16 ]
使用哪個變換集由其所使用的幀內**模式決定,幀內**模式和變換集對應關係如下:
;對於每個變換集還需要傳輸乙個標誌位表示使用的不可分離變換矩陣索引。在碼流中這個索引位於變換係數之後,且每個cu都需要乙個索引。
8x8 lfnst在前向變換中使用16x48的矩陣,所以在這個8x8塊中只有左上角4x4塊才有非零值。換句話說,如果8x8塊使用了lfnst那麼除了左上角4x4塊外其他係數都為0。所以如果在8x8塊除左上角區域外檢測到非零值則表明未使用lfnst則不需要傳輸lfnst index,這種情況下預設lfnst index=0。如果lfnst index=0表示不使用lfnst模式,否則表示使用lfnst模式。此外,lfnst index進行上下文編碼時不依賴於幀內**模式,且僅第乙個bin是上下文編碼。
當滿足以下兩個條件時使用逆lfnst:
如果w>4&&h>4,那麼對左上角8x8區域進行8x8lfnst。否則對左上角min(8, w) × min(8, h)區域進行 4x4 lfnst。
lfnst只用於幀內和幀間slice內的幀內cu。對亮度和色度分量都適用。如果允許使用對偶樹亮度和色度的lfnst indices分開傳輸。對於幀間slice(不允許使用對偶樹)亮度和色度使用同乙個lfnst indices。
如果使用isp模式則不允許使用lfnst且rst index也不需要傳輸。因為即使將rst應用於每個可行的分塊,效能提公升也很有限。不對isp**殘差使用rst還能減少編碼複雜度。對mip模式也不允許使用lfnst和傳輸rst index。
變換編碼(DCT)基本理解
影象變換編碼是指將以空間域中畫素形式描述的影象轉換至變換域,以變換係數的形式加以表示。大部分影象是平坦區域和內容變換緩慢的區域,即大部分是直流和低頻,高頻比較少,所以適當的變換可以使影象能量在空間域的分散分布轉換為在變換域的相對集中分布,以達到去除冗餘的目的,結合量化,z 掃瞄和熵編碼等其他編碼技術...
DCT變換編碼及C語言實現
離散余弦變換 discrete cosine transform,簡稱dct變換 是一種與傅利葉變換緊密相關的數 算。在傅利葉級數展開式中,如果被展開的函式是實偶函式,那麼其傅利葉級數中只包含余弦項,再將其離散化可匯出余弦變換,因此稱之為離散余弦變換。3 具有較強的抗干擾能力,傳輸過程中的誤碼對影象...
VVC編碼工具之Intra Prediction
1.intra mode coding with 67 intra prediction modes 1 vtm4將幀內角度 模式從33擴充套件到了65種,新增的mode為圖9中的紅色虛線 2 對於矩形塊,傳統的角度 模式會被wide angle intra prediction modes代替,見...