JPEG(Joint Photographic Experts Group)標準是一個適用範圍廣泛的通用標準,由聯合圖像專家小組製定。它不僅適用於靜止圖像的壓縮,也適用於電視圖像序列的幀內圖像的壓縮[1]。
近年來,隨著FPGA技術的日益成熟,愈來愈多的曾使用軟件或DSP實現的複雜數字算法開始使用PPCA完成。這當然是由於FPGA的特殊結構和特性,使它可以更加高速和高效地完成這些算法。IPcore技術可以把這些FPGA中的算法設計封裝成包(模塊)。這些包具有智力產權,可以被繼承、共享或購買。
1 視頻壓縮原理和算法實現
視頻壓縮技術主要利用圖像信號的相關、冗餘等特性,通過一些變換算法,保留對人眼視覺最重要的部分,進行編碼傳輸。大部分視頻壓縮利用2D-DCT(二維離散餘弦變換)和2D-IDCT(二維反離散餘弦變換)變換得到圖像的頻譜,高精度保留對人眼重要的高頻部分,低精度保留低頻部分從而對視頻流進行壓縮[1]。其過程如圖1所示。
1.1 DCT變換算法
2D-DCT變換是視頻壓縮中的常用變換[2]。在壓縮過程中,將一幅圖像分成許多8x8的小塊進行變換。
8x8的2D-DCT變換如公式(1)所示:
如果直接使用公式(1)進行2D-DCT變換,運算量將會十分巨大,普通FPGA很難有效完成整個視頻壓縮運算。所以需要先把2D-DCT運算進行一些變換,簡化計算,減少運算量。
2D-DCT具有正交可分解性悶,可以通過對輸入的矩陣先做一維行變換,再做一維列變換實現。即將8x8數據先按行方向進行累加運算,產生中間矩陣,再對中間矩陣按列方向進行累加運算,最後得到變換結果。2D-DCT可以分解成兩個1D-DCT運算,見公式(2)。
將公式(2)展開成矩陣形式,得到公式(3)。計算一個這樣的單元需要64個乘法器和56個加法器,運算量還是很大。利用公式(3)的對稱性進行變換,可以得到公式(4),使乘法器減少到32個,加法器減少到8個。
一個由公式(4)推演出的分布式乘法器如圖2所示。4個乘數(x0…x3)同時與各自的係數(c0…c3)相與,然後相加得到一個和數,這個和數與除2器出來的數相加,得到一個新的累計數。這個新的累加數如果是最後的結果,則輸出;如果不是,送入除2器,進行下一步累加。這樣,分布式乘法器就可以完成係數yj的運算。
由於DCT運算中的係數Cm是常數,對於擁有RAM單元的FPGA,上述運算也可以使用查ROM表的方法實現。將圖2中的虛線內部分,改換ROM單元,如圖3所示。這時,(x0…x3)作為ROM表的地址位,通過查表的方式輸出和數,進行累加運算。ROM表的地址位寬度為4,存儲單元數量DW=24=16。一些生產商提供的綜合軟件帶有IP庫,可以調用這些IP庫中的ROM模塊實現ROM表。例如ALTERA公司的Megafunction Library中的LPM_ROM可以用以下的語句調用(VerilogHDL)[4]。用VC或MATLAB生成一個.mif的ROM表文件。
LPM_ROM U1(
.address(adr),
.inclock(clk),
.q(dat));
defparaln
lpm_rom_component.lpm_width=16,
lpm_rom_component.lpm_widthad=4,
lpm_rom_component.1pm_address_control
="REGISTERED",
lpm_rom_component.ipm_outdata
="UNREGISTERED",
lpm_rom_component.1pm_file="romtable.mif";
這樣,可以得到由這些基本單元構成與矩陣公式(4)相對的1D-DCT的FPGA設計,如圖4所示。其中4RC單元表示圖3的結構。
如前所述,2D-DCT需要兩個1D-DCT共同完成,但是兩個1D-DCT運算的中間變量並不是直接傳遞的,而需要一個矩陣轉置模塊進行耦合。
1.2 轉置RAM
2D-DCT單元由兩個相同的1D-DCT和轉置RAM等組成,如圖5所示。根據公式(2),可以知道1D-DCT先對8x8單元的行進行累加操作,把得到的結果暫存到RAM中,直到8行都運算完成。RAM中的臨時8x8矩陣要先轉置,把列數據變成行數據,經並串轉換後輸入到第2個1D-DCT進行行累加。
轉置RAM是一個8x8的RAM陣列。當數據完成1D-DCT變換後,即由xij到zjl變換,按行順序輸入到轉置RAM,在讀出時按列順序讀出,這樣完成zil到zli的變換;然後將z9並串轉換,輸入到第二個1D-DCT,由zli運算得到ylk。這樣就完成了公式(1)的2D-DCT整個變換,如圖6所示。
1.3 2D-IDCT
2D-IDCT變換如公式(5)所示。
可見公式(5)與公式(1)相同,所以2D-IDCT可以用與2D-DCT的同樣方法實現。
1.4 量化,編碼
量化算法包括一張量化表,它因人眼對各種空間頻率的靈敏度的不同而確定。在表中,較低空間頻率的精度要高於較高頻率的精度,這是由於人眼的低頻分量比較敏感,而對高頻分量不太敏感。
編碼可以采用遊程編碼或熵編碼。單元模塊均可通過FPGA的片上RAM(滿足雙口RAM的特性)設計完成。
圖6
2 結論
整個視頻壓縮IPcore設計可以在FPGA上實現,在27MHz的係統時鍾下工作。根據具體芯片的不同,可以在更高的速率工作。壓縮速率可以達到108Mbps。
實際應用中,數據字長對壓縮效果和比率有較大影響,一般情況下係數Cm取12位,可以滿足大部分的視頻壓縮要求。
整個視頻壓縮IPcore可以直接下載到FPGA上(例如EDIF格式),獨立實現視頻壓縮功能,也可以通過軟件設計與其他的IPcore協同工作。例如,在網絡攝像機的應用上,可以把視頻壓縮IPcore、數字攝像頭控製器、網絡接口一起編譯成新的核。這個核具有視頻采
集、壓縮、傳輸等一係列功能。把核的EDIF文件通過生產廠商的下載軟件下載到FPGA上,就可以在一塊芯片上實現所有網絡攝像機的功能。實現了SoPC(System On a Programmable Chip)的目標