博主最近期末要交課設,分配的任務是用MATLAB實現VVC中的反變換編碼。自己參照VTM代碼完成了MATLAB的代碼編寫,經過了幾天的調試修改,終於測試通過啦!(超級激動滴!不枉我在實驗室奮戰了幾天!切入正題!正經臉)
VVC中反變換編碼主要包括兩個過程,主變換xITrMxN+兩次一維變換inverseTr(水平或豎直變換)。主變換xITrMxN調用兩次inverseTr變換,實現水平和豎直方向的反向變換,最終實現反變換的編碼輸出。以下將從這兩部分進行詳細說明。
主變換xITrMxN函數
相比HEVC的反變換過程,VVC反變換編碼有以下幾點不同:
- 根據幀內幀間變換模式的不同 ,選擇不同的變換種類(DCT2,DCT8 DST7,NUM_TRANS_TYPE,DCT2_EMT),注意默認變換種類爲DCT2(博主剛開始沒注意,導致後面測試的時候出錯有點頭疼);
- 多核變換 ,可選的變換種類有:DCT2,DCT8,DST7,NUM_TRANS_T
YPE,DCT2_EMT; - 處理的輸入塊可不爲方陣 ,例如輸入爲M*N的變換塊,M可不等於N;
- 增加了 2x2 64x64的變換系數矩陣,可對輸入維度2或64的變換塊進行操作(DCT2纔有2x2及64x64的變換系數矩陣,其餘變換種類只有4x4 8x8 16x16 32x32的變換系數矩陣) ;
輸入參數爲:bitDepth,iWidth,iHeight,iQCoef,maxLog2TrDynamicRange,ucMode,ucTrIdx。依次爲像素比特深度,反變換輸入矩陣寬度,反變換輸入矩陣高度,反變換輸入矩陣,數據動態範圍,變換模式,變換種類。
輸出參數爲:
iTCoef,err
對應反變換輸出矩陣,代碼出錯。
函數整體思路如下:
水平或豎直變換inverseTr函數
這個函數難點是要理解VVC區別於HEVC進行的高頻調零操作。高頻調零操作是爲了減少運算數據量,加快運算時間。對於一個輸入寬度爲iWidth和高度爲iHeight的變換塊,當高度或寬度大於32時,iskipline=iHeight-32,iskipline2=iWidth-32,進行對應的調零操作。例如輸入變換矩陣爲16*64,將變換塊的第33列至64列置零再進行水平或豎直變換。(注意:只有DCT2纔可能有調零操作,可以思考一下爲什麼哈哈)
先更到這裏啦,代碼因爲還沒答辯就不公佈啦~
有問題可以留言鴨,大家一起探討!!!開開心心準備跨年啦~