第四章 實作與最佳化
4.2 編碼器實作
4.2.4 DSP Encoder Task
DSP Encoder Task 主要的任務是產生 zigzag 掃描後的量化 DCT 係數,並將整個 DPCM/DCT(除了 VLC)了流程完成,最後產生重建的參考影像。它包含了需多部份如 量化、UMV、VLC 等。
4.2.4.1 量化(Quantization)
量化運算時多使用除法,使用除法會讓處理器的執行時間拉長,為了減少量化對 執行時間的影響,必須對量化的方法加以改進。由於量化的部份是由 DSP 所處理,由
於 DSP(TMS320C55x)只支援整數運算且除法運算時間太長,所以把除法用乘法加移位
Scale k Quantizer
Scale k Quantizer Visual[02]附錄中的 VLC 表,它是屬於 Huffman Coding。在實現時必須將使用 zigzag 掃描後的量化 DCT 係數先使用 Run Length Coding 轉成(last,run,level)的格式後,再去 查 VLC 表以產生 bitstream。
圖 四-6 VLC 流程圖
查表的好處在於可以快速的將相對應的 bitstream 快速找出,並且不需要把 Code book 傳遞到解碼端;但是缺點就是無法得到最佳的 Entropy,也會發生一些例外情形,
這些例外情形都是發生機率比較低,所以沒有 VLC 表並沒有紀錄。當例外情形發生時 必須加入一個機制,稱為 ESC code。
這裡所使用的是 MPEG-4 standard 中 ESC code 的第一種,它是使用(last,run,level) 中的 last 與 run 去尋找對應的 level 的最大值(LMAX),將目前的 level 減去 LMAX 後,
得到新的 level_new,再用(last,run,level_new)去查表找出對應的碼。必須注意的是 (last,run,level_new)還是有可能找不到對應的碼,這時候就必須再使用一次 ESC code 的機制,直到(last,run,level_new)落入表的範圍內,最後產生的編碼就會類似下圖。
圖 四-7 VLC ESC CODE
4.2.4.3 Intra-prediction
Inter-frame 並不作 DC and AC prediction,因為 inter-frame 拿來作 DCT 的是它的 residual frame,residual frame 本身值就很接近 0,若用來預估的區塊 DC 不為 0 但是目 前的區塊 DC 為 0 將會造成做完 VLC 之後的輸出內容大小比原來的大,所以 ac and dc
prediction 並不用在 inter-frame 上。在 Cb 與 Cr 之上也有類似的情形。
在做 intra-prediction 必須由最後一個 block reverse 運算回來(先算 Group2),若是 由前到後,由上到下計算(先算 Group 1),將會造成下一次預估時的 DC 值並非原來的 值,無法達成 intra-prediction 原先的目的。
圖 四-8 intra-prediction 計算順序
加上 intra-prediction 後,I-frame 的編碼長度由 2335.8 變成 2001.7,編碼長度減少 約 14.3%。
4.2.4.4 UMV
使用 UMV 可以讓影像中的移動物件由影像內往外移時的 Motion Estimation 更有 效率,且使用 UMV 在程式架構上由於不用考慮邊界條件,所以程式複雜度也會降低。
使用以上演算法後,P-frame 的壓縮內容的長度(不含移動向量)為 837.5bytes。影 像移動劇烈時會留下殘影,原因是因為最佳的預估區塊超出搜索範圍,所以無法產生 最佳的預估影像,以至產生殘影,且 P-frame 的壓縮內容長度會增加為原來的 1.71 倍。
在影像移動緩慢的情況下,壓縮比大約為 20 倍。下圖為剩餘影像、預估影像與剩餘影 像與輸入的自相關性。
圖 四-9 預估影像(QCIF - predict frame)
圖 四-10 剩餘影像(QCIF - residual frame)
圖 四-11 原始影像的自相關矩陣係數
圖 四-12 剩餘影像的自相關矩陣係數
由圖 4-12 與圖 4-11 相比,移動預估與補償的確達到讓影像的相關性與能量減少 的目的,以達到大量資料壓縮的目的。