引言 隨著多媒體技術及通信技術的快速發展,在嵌入式平臺上實現連續圖像壓縮的需求已變得日益廣泛。常用的系統結構是獨立處理器配和專用圖像壓縮芯片或者是只用一個高主頻的數字信號處理器完成主要功能。 但隨著大規模集成電路技術的發展及市場對產品低成本的要求不斷提高,一種新的在嵌入式平臺上實現連續圖像壓縮的系統結構正逐步成為上述兩種系統結構的替代者。這種新的結構就是Altera公司提出的基于Avalon總線的SOPC結構。SOPC結構可以把處理器,圖像壓縮IP核,通訊單元及控制單元集成到一塊FPGA芯片上。較之以往的結構,不但極大地節約了系統資源和成本,更是減少了系統的復雜度。尤其是可以用硬件電路實現軟件處理極為耗時的運算功能,使得在低主頻,低功耗的嵌入式平臺上實現連續圖像實時壓縮變為可能。連續圖像壓縮IP核也成為整個SOPC系統的一個關鍵部件。現有的MPEG系列,H26X系列IP核對FPGA的芯片資源及性能要求極高,難以滿足系統對低成本,低功耗的要求。所以設計一個適合低成本,低功耗的FPGA芯片的視頻壓縮IP核變得極為重要。這即要求壓縮算法的復雜度不能太高,又要求有適當的壓縮效果,Motion JPEG算法恰好滿足上述要求。 1.Motion JPEG壓縮算法簡介 Motion JPEG是一種基于靜態圖像JPEG壓縮標準的動態圖像壓縮標準,壓縮時將連續圖像的每一個幀視為一幅靜止圖像進行壓縮,從而可以生成序列化運動圖像。壓縮時不對幀間的時間冗余進行壓縮,雖然降低了壓縮比,但也同時降低了復雜度,易于硬件電路實現。Motion JPEG標準所根據的算法是基于離散余弦變換和熵編碼,關鍵技術有二維離散余弦變換、量化、差分編碼、霍夫曼編碼和游程編碼等。單幀的處理過程如下圖所示。 2.IP核的結構設計 2.1二維離散余弦變換模塊 二維離散余弦變換是由一維離散余弦變換衍生而來的,所以可以用兩個級聯的一維離散余弦變換實現。實現時要注意第一級一維離散余弦變換模塊產生的結果不能直接作為第二級一維離散余弦變換模塊的輸入量,而是等到第一級一維離散余弦變換模塊產生的結果形成一個8×8的矩陣后,對這個8×8的矩陣做轉置處理,再把轉置后得到的矩陣按行掃描的順序輸出,這時輸出的數據才能作為第二級一維離散余弦變換模塊的輸入量。 二維離散余弦變換模塊處理的對象是8×8的像素矩陣,來自其前一級模塊預處理模塊。預處理模塊一個時鐘周期只能輸出一個數據,為了滿足二維離散余弦變換模塊中第一級一維離散余弦變換模塊一次運算需要8個輸入數據的要求,利用一個串行轉并行模塊,把每個時鐘周期內預處理模塊輸出的一個數據緩存起來,當數據湊滿8個后再一次傳給二維離散余弦變換模塊。 二維離散余弦變換模塊輸出的數據是8×8的二維離散余弦系數矩陣,傳遞給其后一級模塊量化模塊。量化模塊一個時鐘周期只能接收一個數據,為了滿足二維離散余弦變換模塊中第二級一維離散余弦變換模塊一次運算產生8個輸出數據的條件,使用一個并行轉串行模塊,把每隔8個時鐘周期二維離散余弦變換模塊輸出一次的8個數據緩存起來,在等待下一次二維離散余弦變換模塊輸出數據的8個時鐘周期的等待隔內,把數據串行傳給量化模塊。 2.1.1第一級一維離散余弦變換模塊 根據一維離散余弦變換的定義和cos函數的互補對稱性,參考Weiping Li提出的Skew Circular Convolution的概念,能夠使一維離散余弦變換達到非常精簡的硬件架構。但是考慮到處理的對像是連續幀這個條件,速度就成為主要因素,因此沒有完全依照其提出的方法,而是適當的增加電路面積來夠造新的11階全流水線結構,從而獲得最大的運算速度。處理過程可劃分為4個階段。 階段1:消耗3個時鐘周期,完成8位有符號數的加減運算,結果為9位有符號數。 階段2:消耗2個時鐘周期,完成9位有符號數的固定系數乘法,因為乘的系數是小數,所以要把小數轉換為二進制表示。 階段2中的乘法操作是用EP2C35芯片中的28個嵌入式乘法單元實現的。EP2C35芯片中共有70個嵌入式乘法單元,一個嵌入式乘法單元可以實現兩個9位數的乘法,兩個嵌入式乘法單元并聯可以實現兩個大于9位小于18位數的乘法。根據這一特性,假如在階段1中實現乘法會因輸入量是8位而浪費了一個嵌入式乘法單元的全部能力,假如在階段3或階段4中實現乘法又會因輸入量或系數中每個元素的長度大于9位而耗用兩個嵌入式乘法單元去完成一個乘法操作,又很不經濟。所以在階段2中實現乘法操作是最為合理的,階段2的輸入量為9位,恰好耗用一個個嵌入式乘法單元。這也同時要求乘法中的固定系數的位數為9位,位數的過多或過少都不能充分利用芯片上的硬件資源。 階段3:消耗3個時鐘周期完成9位有符號數的加減運算,結果為9位有符號數。一般的9位有符號數的加減的結果應該用10位有符號數來表示,因為進位操作或借位操作導致結果的位數從9位增長到10位。但是階段3的輸入序列是由9位有符號數乘以固定系數得到的,且固定系數的值都小于0.5,所以序列之間的加減操作不會引起進位操作或借位操作,9位有符號數足夠表示加減操作的結果序列。 階段4:消耗3個時鐘周期完成9位有符號數的加減運算,結果為10位有符號數,也是第一級一維離散余弦變換的最終結果。 2.1.2并行矩陣轉置模塊 常用的8×8矩陣轉置的方法是,先把64個矩陣元素按行掃描的順序一個個串行輸入到一個RAM(64個存儲空間)中,然后按轉置后的矩陣的行掃描順序把RAM中64個矩陣元素逐次輸出。這種方法最少需要128時鐘周期才能完成一個8×8矩陣的轉置。可稱其為串行矩陣轉置。串行矩陣轉置一次接收一個輸入數據與一維離散余弦變換一次產生8個輸入數據在傳輸速率上不匹配,第一級一維離散余弦變換模塊需要在串行矩陣轉置工作期間等待,當串行矩陣轉置完成后再產生新的一維離散余弦變換系數并傳遞給串行矩陣轉置模塊。這也是二維離散余弦變換難以設計為全并行的原因。 本文提出了一種新的矩陣轉置方法,稱為其并行矩陣轉置。用8個RAM(每個RAM有8個存儲空間)代替一個RAM(有64個存儲空間),再增加兩個8通道的旋轉多路器,同時配合對8個RAM的變址讀操作。一次輸入原始矩陣的一列,20個周期后完成一個8×8矩陣的轉置。比串行矩陣轉置節省至少100個時鐘周期。 并行矩陣轉置模塊的寫操作:每個時鐘周期變換一次RAM_BANK的接入順序,每個RAM_BANK每次寫入地址隨時鐘周期而順序遞增從,0增加到7,每次增加1。 并行矩陣轉置模塊的讀操作:每個時鐘周期變換一次RAM_BANK的輸出順序,每個RAM_BANK每次讀出地址隨時鐘周期而變化,且同一時鐘周期內不同的RAM_BANK有不同的讀出地址。 在實際設計時,通過接入旋轉多路器實現每個時鐘周期改變第一級一維離散余弦變換輸出端與RAM_BANK的接入順序,通過輸出旋轉多路器實現每個時鐘周期改變一次RAM_BANK與第二級一維離散余弦變換輸入端的接入順序。這兩個旋轉多路器,都是以8個時鐘周期為1個旋轉周期,在1個旋轉周期內實現8個通道的旋轉接通。每個RAM_BANK的讀寫地址都依靠同一個地址產生器產生,在一個時鐘周期內所有RAM_BANK的寫地址相同,讀地址不同。 在設計具體的硬件電路時,一個RAM_BANK就是一個雙端口RAM,為提高工作效率,每個RAM_BANK實際含有32個存儲單元而不是理論上的8個存儲單元。這樣一個RAM_BANK就可以分為4個區塊,每個區塊8個存儲單元,在寫入一個區塊的同時可以讀出前一個已經寫入數據的區塊,形成一種乒乓緩沖的結構,用電路面積換取運行效率。整個矩陣轉置模塊是一個13階的流水線結構,每階流水耗用一個時鐘周期。 圖5是并行矩陣轉置模塊在ModelSim仿真軟件中的時序仿真結果,仿真的時鐘頻率設定為100Mhz。從輸入數據到開始得到結果,中間間隔了13個時鐘周期。 2.1.3第二級一維離散余弦變換模塊 第二級一維離散余弦變換模塊在計算結構上與第一級一維離散余弦變換模塊一樣也分為4個階段,完成一次運算耗用13個時鐘周期,每個時鐘周期完成一個流水線操作,實際的電路結構是13階的流水線結構。 階段1:消耗3個時鐘周期,完成10位有符號數的加減運算,結果為11位有符號數。 階段2:消耗4個時鐘周期,完成11位有符號數的固定系數乘法。 這個階段與第一級一維離散余弦變換模塊的有所不同,沒有使用嵌入式乘法單元,因為完成一個11位有符號數的固定系數乘法需要2個嵌入式乘法單元并聯,完成整個階段28個乘法操作需要56個嵌入式乘法單元,這占整個芯片嵌入式乘法單元的80%。一個模塊過多的耗用嵌入式乘法單元會造成Cyclone II芯片在布局布線時跨越區域過大,從而導致布線延時過大。 第二級一維離散余弦變換模塊在這個階段中采用Altera的Mega function中的PARALLEL_ADD模塊實現固定系數乘法操作。PARALLEL_ADD模塊可以在4個時鐘周期內完成8個16位有符號數的加法操作。11位有符號數的乘法轉化為8個以內的11位有符號數的加法。固定系數都小于0.5,所以PARALLEL_ADD模塊的結果可取11位。上述方法可理解為用并行加法來實現了一個簡單的陣列乘法器。 這種用并行加法來實現了一個簡單的陣列乘法,在不使用嵌入式乘法單元的條件下,是一種實現固定系數乘法的合理選擇。在后來的驗證中也證明,除了在計算過程比嵌入式乘法單元多兩個時鐘周期,電路面積有所增加以外,其計算精度和運行速度都基本與嵌入式乘法單元相同。運算過程中比使用嵌入式乘法單元多出的多兩個時鐘周期也會因為整個二維離散余弦變換是全流水結構而只增加了流水線的鋪滿時間,流水線一旦鋪滿后,這個兩個時鐘周期的延遲對運算延遲的影響將不再存在。 階段3:消耗3個時鐘周期,完成11位有符號數的加減法操作,結果仍為11位有符號數。結果仍為11位有符號數而不是12位有符號數的原因在第一級一維離散余弦變換模塊的階段3中已說明。 階段4:消耗3個時鐘周期完成11位有符號數的加減運算,結果為12位有符號數,也是二維離散余弦變換的最終結果。 2.1.4并行全流水結構的二維離散余弦變換模塊 在不考慮二維離散余弦變換中輸入數據的串行轉為并行,輸出數據的并行轉為串行的條件下。即假設二維離散余弦變換模塊的前一級模塊可以在每一個時鐘周期內為其提供64位數據,二維離散余弦變換模塊的后一級模塊可以在每一個時鐘周期內接受其產生的96位數據。這時本文提出的并行全流水線結構的二維離散余弦變換模塊只需要43個時鐘周期就可以完成一個8×8矩陣的二維離散余弦變換。 圖6及圖7是該模塊在ModelSim仿真軟件中的時序仿真結果,仿真的時鐘頻率設定為100Mhz,43個時鐘周期完成一次8×8二維離散余弦變換。 相同數據在Matlab中二維離散余弦變換結果見圖8。 二者差值的分析:本文提出的二維離散余弦變換模塊在對小數乘法結果的處理上采取了截尾方式,沒有保留小數參加后續的運算。這與Matlab中64位的浮點運算的運算結果相比在變換系數中的直流系數上和第1個交流系數上相差的數值為8,其它系數可以認為是近似相同的。 對小數乘法結果的處理采取截尾方式的原因有兩點: 1:保留小數位數過多會導致在后續的計算中輸入數據位數過長,特別是對于全8路并行結構更易產生數據偏移或時鐘偏移,同時也會降低模塊的運行頻率。 2:考慮到后續的量化模塊,采用標準的量化表時直流系數的量化步長為16是差值8的2倍,而且量化過程中有對量化結果四舍五入的處理。所以差值8會在量化過程中基本被消除。這一點在后面的實際圖像測試中得到了映證,壓縮后的圖像在視覺上與原始圖像一致。 2.2量化模塊 量化過程就是每個離散余弦變換系數除以各自的量化步長并對結果取整的過程。取整采用的是四舍五入的方式。 為了方便在FPGA中實現,離散余弦變換系數除以各自的量化步長改為乘以量化步長的倒數,量化步長的倒數使用二進制小數表示,選取長度為12位。乘法器用EP2C35中兩個嵌入式乘法單元并聯實現。因為離散余弦變換系數的長度為12位有符號的數,所以乘操作后得到的24位結果,保留高12位,低12位舍去。具體電路在算法結構上分為3個階段,由5階的流水線組成,完成整個量化操作耗時5個時鐘周期。 2.3 ZigZag掃描模塊 經過量化處理后的離散余弦變換系數的高頻分量大部分為零。經過ZigZag掃描后,一個二維的8×8離散余弦變換系數矩陣變為一個一維含64個元素的序列,頻率分量按從低到高排列,一維序列的高頻部分會出現大量的連續零元素。產生這種一維序列的目的是為了使用熵編碼中游程編碼,進一步提高壓縮效率。 從電路功能的角度上看,ZigZag掃描模塊的作用就是把按列順序輸入的量化后的離散余弦變換系數以ZigZag掃描的順序輸出。處理時以一個8×8的離散余弦變換系數矩陣為一個處理單元,在接收一個以列順序輸入的8×8的離散余弦變換系數矩陣的同時,把前一個已經接收完畢的8×8的離散余弦變換系數矩陣以ZigZag掃描的順序輸出。一個擁有128個存儲單元,每個存儲單元長度為9位的雙口RAM可以完成上述功能。RAM的128個存儲單元在使用上分為兩個操作區,每個操作區64個存儲單元,一個操作區用于接收以列順序輸入的8×8的離散余弦變換系數矩陣,同時另一個操作區以ZigZag掃描的順序輸出前一個已經接收完畢的8×8的離散余弦變換系數矩陣。兩個操作區輪換交替,形成一種乒乓操作模式。在這里使用乒乓操作是為了保持整個IP核的整體全流水線設計。 乒乓操作是一種常用于數據流控制的處理技巧。其特點是相互配合切換多個存儲單元并完成數據的處理,把處理后的數據沒有停頓的運送到下一個處理模塊。把一個乒乓操作模塊當作一個整體,從其兩端看數據,輸入數據和輸出數據都是連續不斷的,沒有任何停頓,因此非常適合流水線結構。圖11是ZigZag掃描模塊在ModelSim仿真軟件中的時序仿真結果,仿真的時鐘頻率設定為100Mhz。輸入數據是一個8×8的二維矩陣。按列掃描順序輸入的如下矩陣:
2.4熵編碼模塊 熵編碼與前面介紹的量化都是數據壓縮的手段,但二者有所不同,熵編碼利用信號的統計特征來降低位率,理論上不會丟失信息,量化會丟失信息。實現熵編碼有多種方式,本文根據ISO/IEC10918協議,使用了游程編碼和霍夫曼編碼兩種方式。游程編碼的原理是把沿一定方向排列的等大小量化值的離散余弦變換系數作為連續的整體,用特定碼字替代這種連續的整體就會達到數據量減少的效果。霍夫曼編碼是一種變長編碼,將多次出現的代碼用較短的碼字代表,很少出現的代碼用較長的碼字代表。產生哈夫曼編碼要求掃描兩遍原始數據,第一遍掃描是為了在原始數據中精確地統計每個值出現的頻率,第二遍利用構造的哈夫曼樹得到編碼,兩次掃描耗時巨大,因此數據壓縮難以滿足實時性要求。ISO/IEC10918協議中在對大量8位精度圖像的平均統計基礎上,給出了4個合適大多數應用的個哈夫曼碼表。在實現硬件電路時把哈夫曼碼表存儲在片上ROM中,使用時直接查找。因為離散余弦變換中直流系數和交流系數分別使用不同的碼表,且直流系數不需要進行游程編碼,所以直流系數和交流系數使用不同的模塊來處理。 2.4.1直流系數處理模塊 直流系數是8×8矩陣內64個像素均值的度量,是包含了整個圖像能量的重要部分。利用相鄰的8×8矩陣的直流系數具有很強的相關性,對直流系數使用差分壓縮編碼。前一個8×8矩陣的直流系數作為當前矩陣的直流系數的預測值,求出現實值和預測值之間的差值后,再對差值做霍夫曼編碼。在硬件實現時,直流系數只有一個值,所以不需要做游程編碼,對其處理的第一步就是求得其與預測值之間的差值。根據差值的大小和正負查找存儲在片上ROM的標準霍夫曼碼表,得出前綴代碼和前綴代碼長度,同時根據ISO/IEC10918協議中提出的尾碼產生方式得到對應的尾碼代碼及尾碼代碼長度。上述處理完成之后再經過合并前綴代碼與尾碼代碼為霍夫曼代碼,則直流系數的熵編碼完成,之后等待被變長編碼模塊封裝。具體的實現電路由4階流水線組成,直流系數的熵編碼處理過程耗時4個時鐘周期。 2.4.2交流系數處理模塊 交流系數首先要現經過游程編碼處理。在游程編碼中非零交流系數前的零交流系數的個數是游程長度,前綴代碼及尾碼代碼的含義與直流系數中的一致,只不過在交流系數處理中游程長度和前綴代碼重新組合為一個新的查找索引來查找新的前綴代碼。ISO/IEC10918協議中給出的交流系數標準霍夫曼碼表里有兩個特殊的代碼。 一個特殊代碼ZRL,ZRL代表游程編碼中游程長度大于16,如果游程長度大于32,48,56,分別用1個ZRL,2個ZRL,3個ZRL表示,盈余的游程長度加入下一個游程長度計算中。ZRL代碼只有前綴代碼,沒有尾碼代碼。為了方便實現,直接把ZRL的尾碼代碼長度設為零,起到屏蔽尾碼的作用。另一個特殊代碼EOB,EOB代表最后一個零行程中只有零元素直接代表當前矩陣的游程編碼已經掃描結束,若當前矩陣的最后一個交流系數是非零數的則以正常結束一個游程長度的計數作為當前矩陣游程編碼的結束。同ZRL類似,EOB也沒有尾碼代碼,所以使用同樣的處理手段。具體的實現電路由4階流水線組成,交流系數的熵編碼處理耗時4個時鐘周期。 2.4.3交織模塊和冗余ZRL消除模塊 交織模塊的作用是把前綴代碼和尾碼代碼合并為一個霍夫曼代碼,合并后的代碼易于進行下一階段的變長編碼操作,變長編碼操作過程需要的移位位數由前綴代碼長度加上尾碼代碼長度做和得到,這個求和過程也在交織模塊中實現。該模塊具體實現電路由2階流水線組成。 冗余ZRL消除模塊不是ISO/IEC10918協議的一部分,但它源于標準協議里對EOB的定義。從EOB之前直到最近一個的非零交流系數出現,中間產生的ZRL都是可以消除的。基于全流水線結構的電路設計一般很難滿足這一要求,原因是全流水線結構的電路每級產生的結果都會直接傳遞給下一級,不對結果作保留。唯一的方法就是構造一個同步FIFO來緩存前幾個時鐘周期內產生的結果,根據之前輸入的數據量和當前輸入的數據量是否滿足ZRL的冗余條件而選擇性的對FIFO輸出的結果做屏蔽。屏蔽的手段就是把FIFO輸出數據的對應的霍夫曼代碼長度清零。這樣在下一步的變長編碼中會因ZRL的霍夫曼代碼長度為零而消除冗余的ZRL。 2.4.4變長編碼模塊 變長編碼的作用是把交織編碼輸出的含有不等長有效位的霍夫曼碼字,提取其中的有效位并將其組合為一個連續的32位碼流。 編碼原理是把交織編碼輸出的含有不等長有效位的霍夫曼碼字向右位,移動的位數是前一個霍夫曼碼字的代碼長度。移位完成后的當前霍夫曼碼字與提供移動的位數的前一個霍夫曼碼字做或運算,同時累加兩個霍夫曼碼字的代碼長度。累加和大于24時表明變長編碼的第一步完成。第二步是檢查前一步產生的24位封裝結果中是否有FF字節,若有則直接在FF字節后面添加00字節。并不是所有的24位封裝結果都需要在FF字節后面添加00字節,所以在第二步處理中還有移位處理。移位處理采用的方法與第一步移位處理的方法相同的,把24位封裝結果和添加00字節后的32位封裝結果,統一封裝為32位結果輸出。這個32位數據也是整個IP核輸出的最終壓縮結果。 3.基于SOPC結構的實際驗證系統 經驗證,Motion JPEG IP核可以實時處理由NTSC制式攝像頭采集經ADV7181處理后輸出的CCIR656標準數據,完成對連續視頻幀的實時壓縮。 驗證系統結構如圖15所示,lineswitcher模塊把CCIR656標準數據的亮度分量以跳址寫入的方式通過Multi-Port SDRAM Controller模塊寫入到SDRAM中,亮度分量數據從隔行掃描變為逐行存貯。Multi-Port SDRAM Controller模塊是一個工業級的SDRAM控制器,可以將一個SDRAM數據端口仿真成四個虛擬的數據端口(兩個寫端口+兩個讀端口)。SDRAM在存儲空間使用上劃分為4個區塊,在lineswitcher模塊寫入一個區塊的同時,Motion JPEG IP核讀出前一個已寫入亮度分量的區塊。Motion JPEG IP核輸出端是一個Avalon總線上的具有流控制屬性從端口。DMA控制器與Motion JPEG IP核以流控制的方式進行數據傳輸,并把數據轉移到SRAM中。整個過程無需NIOSII處理器干預,只須等DMA控制器寫滿SRAM后以中斷的方式通知NIOSII處理器以使其掛起Motion JPEG IP核,防止存入SRAM中數據被覆蓋。最后使用DE2_Control_Panel傳輸SRAM中壓縮后的數據到PC中,便可看到采集后圖像經壓縮后的效果。NIOSII處理器的作用是初始化DMA控制器和通過I2C總線設置ADV7181。 考慮到芯片上的資源,驗證時只對ADV7181輸出的亮度分量進行壓縮,舍棄了色差分量。雖然沒有了色差分量,但是仍然可以得到清晰直觀的驗證效果。 4.結論 本設計主要有以下幾個特點。 1:以全流水線結構來實現Motion JPEG視頻壓縮IP核。 雖然流水線技術已經是一種眾所周知的技術,但是現有的Motion JPEG視頻壓縮IP核仍未實現全部流水線結構,一般多以狀態控制模塊為核心來協調各個子模塊。這就導致系統中最慢的子模塊在處理數據時,其它子模塊只能等待,對數據塊訪問的效率低下。同時由于數據塊的被多個子模塊所使用而又需要復雜的仲裁機制。本文提出的全流水線結構把整個處理過程分解為198個小操作,每個時鐘周期內由一階流水線完成一個小操作。當整個流水線鋪滿之后,整個數據處理過程中沒有等待延遲,沒有仲裁協議,大幅提高了系統的運行效率并降低了系統的復雜度。 2:并行矩陣轉置結構的提出及基于并行矩陣轉置的并行二維離散余弦變換結構。 并行矩陣轉置結構較之以往的串行矩陣轉置在處理8×8矩陣上至少節省了100個時鐘周期。二維離散余弦變換在采用了并行矩陣轉置之后,也實現了全部并行處理,43個時鐘周期完成了一次二維離散余弦變換,效率提高顯著。 3:因采用全流水線結構而取得的較高的運行頻率。 本文設計的Motion JPEG視頻壓縮IP核在Quartus II 6.0中進行靜態時序分析,得到的最高運行頻率是150Mhz。 現有IP核與本文設計的IP核的運行頻率比較 實際驗證時不僅對處理CCIR656標準數據的能力給予驗證,同時也為100Mhz的運行頻率進行了驗證,結果證明IP核可以在100Mhz的運行頻率下正常工作。驗證方法是把7幀952×568的亮度分量文件存入SDRAM中作為原始數據,整個驗證系統以100Mhz頻率運行,經過0.05秒完成7幀的壓縮,幀率可達147 frame/s。壓縮后圖像的大小為原來亮度圖像的十分之一。 4:可以在低成本,低功耗,高密度的CycloneII系列FPGA芯片上運行,通過Avalon總線與NIOSII處理器構成SOPC系統,為將來實際產品的設計搭建了一個良好的平臺。 |