方曉科,趙 利,伍耀常,黃繼聰
(桂林電子科技大學信息與通信學院,廣西桂林 541004)
與傳統模擬視頻系統相比,數字視頻系統具有可數字化采集、儲存、處理、傳輸等特點,以及視頻質量高、抗干擾能力強等優勢,已得到廣泛應用。某微波視頻傳輸系統,目前采用模擬技術體制,存在占用帶寬較大,可用頻點較少,而且相鄰信道之間會相互干擾,多系統無法同時工作,在傳輸過程中容易造成顏色的失真等系列問題,需要進行技術改造,實現數字化。
為了解決這些問題,在原系統保留射頻模塊和主要功能不變的基礎上,需要對系統進行數字化改造。新系統以基于Linux的ARM11多媒體處理平臺為核心,實現視頻數字化采集和壓縮處理以及收發處理,實現彩色LCD視頻播放;采用異步串行傳輸方式,減少開發的難度和周期;采用mmap和多線程方式,優化了視頻數據讀取的實時性,保證了視頻的流暢性。采用中頻CP-FSK調制方式,實現高速視頻傳輸。新的數字視頻系統以簡單的結構、低廉的成本,易實現的技術完成了高速視頻的采集、壓縮處理、數字傳輸和實時回放,達到了設計目標。
保留原有微波發射電路的中頻以上部分電路不變,采用中頻FSK調制器,以中頻頻率60 MHz為中心,實現高速FSK調制,調制速率設計為1 Mbaud。FSK調制采用靈活配置的DDS芯片AD9854實現。視頻采集與處理模塊采用基于ARM11的Linux嵌入式系統,完成圖像采集、H.264壓縮處理以及視頻數據的發送,采用觸摸屏顯示采集到的視頻。視頻數據經過壓縮和成幀處理后送到FSK調制器,發送方案如圖1所示。

圖1 視頻采集與發送框圖
串行數據傳輸有同步和異步兩種方式。同步方式性能好,但收發處理復雜,軟硬件成本高,而異步方式實現簡單、方便、成本低。綜合考慮各種因素,方案采用UART異步串行方式。由于現有嵌入式平臺UART所支持的最大速率為115.2 kbit/s,無法滿足設計要求,因此采用USB轉UART方式,提升串口傳輸速率。采用單片CP2102實現USB轉UART,速率最高可達1 Mbit/s,且具有硬件電路簡單,成本較低等特點。
視頻采集與處理模塊可以采用三星公司的多媒體處理器S3C6410。S3C6410處理器集成了視頻處理子系統MPEG-4/H.263/H.264協處理器和ARM內核以及多種外設。開發平臺前期選用廣州友善之臂計算機公司生產的Tiny6410開發板,支持USB攝像頭輸入,支持彩色觸摸屏,滿足各項技術要求[1]。
保留原有微波接收電路的中頻以上部分電路不變,采用中頻FSK解調器,以中頻頻率38 MHz為中心,實現速率1 Mbit/s FSK解調。FSK解調采用集成PLL芯片NE564,單片直接完成FSK解調,接收方案如圖2所示。

圖2 視頻接收與回放方案框圖
與發送端相同,視頻接收與處理模塊亦采用基于ARM11-S3C6410的Linux嵌入式系統,完成視頻接收和H.264解碼處理以及LCD視頻回放。
串行傳輸接口采用的USB轉UART方式,使用CP2102作為橋接器,外圍電路器件較少。S3C6410平臺通過USB實現與CP2102數據交換,經過轉換后通過UART接口實現異步串行發送。該芯片集成了USB收發器和時鐘,USB控制器符合USB2.0規范,內部集成48 MHz時鐘發生器,發送緩沖640 byte,接收緩沖為576 byte,波特率最高可達到 1 Mbaud[2]。
FSK調制方案采用亞德諾(Analog Devices)半導體公司高性能 DDS芯片 AD9854,其工作時鐘可以高達300 MHz,支持FSK,BPSK,PSK,CHIRP,AM 等5 種工作模式[3],串行通信速度達10 Mbit/s。
在FSK模式下,DDS的輸出頻率是頻率調諧字寄存器1、頻率調諧字寄存器2和引腳29(FSK/BPSK/HOLD)邏輯電平的函數,引腳29的邏輯低電平選擇頻率f1,邏輯高電平選擇頻率f2。DDS系統框圖如下圖3。

圖3 DDS系統框圖
AD9854輸出的模擬信號經過D/A處理,含有高次諧波分量,需進行低通濾波改善頻譜純度。為此,采用Elliptic函數,設計輸入輸出阻抗為50 Ω,通帶截止頻率61 MHz,阻帶截止頻率80 MHz,阻帶損耗60 dB,帶內波動為1 dB的7階的LC低通濾波器。設計中采用了村田公司提供的實際電感電容模型替換ADS仿真設計出的理想模型,并不斷對LC參數進行調整后得到了較為滿意的仿真結果。濾波器結構和特性見圖4、圖5。

圖4 濾波器結構圖

圖5 濾波器特性圖(截圖)
采用單片鎖相環芯片NE564[4]只需外接少量的輔助電路即可方便構成如圖3所示的FSK解調電路,解調波形如圖6所示。

圖6 NE564解調電路
NE564解調電路的電路參數可設計如下:
NE564的l2/l3端的定時電容CT決定著壓控振蕩器的固有頻率,如式(1)

中心頻率為38 MHz時,計算得CT=11.96 pF,那么就可以選6.8 pF和10 pF的可調電容來調節VCO的中心頻率。
環路濾波電容的選定:當規定環路的ξ=0.5,芯片供電電壓為5 V,且調節2腳電位器使2腳對應電流I2為200 μA后,4、5腳的電容大小,可用如下式子計算得到4、5腳電容約為5 pF。

考慮到Linux操作系統的開源、可移植和裁剪,選用Linux-OS平臺。在ARM11+Linux平臺上,為了實現既定目標,需要開發底層的USB/UART驅動、USB攝像頭驅動、LCD驅動和MFC驅動,以及視頻采集和回放、H.264硬編解碼、異步串行收發、LCD顯示與人機界面等應用軟件。為保證視頻采集、壓縮、傳輸和解碼、回顯的實時性,采用了多線程方式設計。系統軟件架構如圖7所示。

圖7 系統軟件結構圖
3.2.1 視頻的采集模塊的設計
V4L2(Video for Linux 2)是Linux下開發視頻采集設備驅動的一套規范,為驅動程序的開發提供了清晰的模型和統一的接口。應用程序使用統一的API函數來進行操作,視頻采集流程如圖8。
1)使用open函數只讀模式打開攝像頭設備文件。接著調用V4L2接口函數設置視頻設備采集格式,采集視頻分辨率320×240等。相關參數保存在結構體struct v4l2_format fmt中。
2)向驅動申請4個幀緩沖。
3)將申請到的幀緩沖映射(mmap)到用戶空間,用戶可直接獲取幀數據。

圖8 視頻采集流程
4)使用命令VIDIOC_QUERYBUF將申請到的緩沖區入采集消息隊列,系統返回每個緩沖區的首地址和長度,這些參數保存在結構體struct V4L2_requestbuffers中。
5)開始采集視頻,當采集到完整一幀視頻后,使用命令VIDIOC_DQBUF控制緩沖出消息隊列,用戶依據地址和幀長度就可以獲得采集到的視頻數據。
6)將幀緩沖重新入隊列,實現循環采集。
S3C6410 H.264壓縮處理單元進行H.264壓縮編碼時要求輸入原始數據格式必須為YUV420。本文中USB攝像頭采集到的圖像數據格式是JPEG,需要進行格式轉換。配合使用S3C6410 MFC-JPEG處理單元和Post Processor,可以將采集的圖像格式轉換成YUV420。
3.2.2 視頻的編碼與解碼
S3C6410編解碼單元具有高性能的H.264視頻編解碼功能,它還能同時處理圖像的壓縮和解壓,也能同時對不同格式的圖像進行處理。編解碼單元包括BIT處理器和視頻編解碼模塊,BIT處理器能處理比特流和控制視頻編解碼硬件。編解碼單元可以達到全雙工720×480,30 f/s(幀/秒)壓縮和解壓的性能。
1)本文采用H.264編碼格式,對YUV420格式的數據進行壓縮以減小其傳輸所需要的帶寬。H.264硬件壓縮方式,效率高且占用CPU時間少。經測試使用該編碼器可以壓縮掉90%以上原始數據,編碼順序如圖9。
2)H.264視頻格式的解碼同樣采用S3C6410 H.264硬件解碼器,解碼后的數據格式是YUV420,需要將該YUV420格式轉換成RGB格式后才能在LCD屏上預覽,流程如圖10所示。

圖9 H.264編碼流程圖

圖10 H.264解碼流程圖
3.2.3 視頻數據發送與接收幀處理
1)視頻數據幀格式
壓縮后對數據進行拆分,組幀發送,依據驅動buffer大小,以每次發送1 024 byte對數據進行劃分,并定長1 029 byte發送。劃分的每一組數據加入一些標志位進行組幀,幀頭2 byte,數據大小2 byte,幀尾1 byte,拆分組幀如圖11。

圖11 數據劃分處理結構
在進行數據劃分時要考慮兩種情況:一是編碼后的數據可以分成n整數幀,二是編碼后的數據不能整數劃分,能分成n幀和余下不足1 024 byte的數據幀m。
2)UART配置及收發流程
串口參數包括控制模式,波特率,起始位停止位數量等參數,串口主要參數設置是在Linux提供的一個標準接口temios中,該接口在頭文件temios.h中定義。需要注意的是本文使用串口來傳遞二進制數據,所以要關閉軟件流控,發送模式設置為非規范模式,輸入的數據不會被合成一行,不對數據進行加工處理。本設計在此設置串口主要參數如下:

配置好這些關鍵參數后,串口的運行環境就準備就緒了,這時就可以調用write函數將要發送的數據寫入串口設備。
串行數據經過調制過后送如發射機無線傳輸。處理流程見圖12、圖13。

圖12 發送處理流程

圖13 接收處理流程
3)數據接收處理流程
接收機收到數據經過低噪聲放大,下變頻到中心38 MHz頻率和中頻放大之后送入解調模塊恢復出串行數據。在接收上采用中斷方式,當串行接收緩沖區接收到1 029 byte數據通過軟中斷信號告知應用程序讀取,并把數據存在環形緩存區1內。
應用程序讀取接收的數據后,通過一些標志位獲得視頻數據,并將視頻流拷貝到一個視頻暫緩存區域Buf進行數據的拼接,數據的拼接按照接收順序和上一幀數據的大小來偏移本次存視頻的地址實現。
當完整的接收到一幀視頻數據后,將完整的數據轉到共享緩沖2,解碼線程調用MFC提供的接口函數將接收的視頻數據解碼并在LCD上顯示。因為接收線程,數據處理線程和解碼線程是同時運行的,而且共享同一緩沖區進行數據的交互,因此必須采用信號量機制實現同步。進行實際操作之前,進程(或線程)先檢查信號量的值,如果當前值大于0,則進行P操作(P操作使信號量值減1),否則休眠,等待其他進程(或線程)在該信號量上V操作(V操作使信號量值加1)[7]。解碼操作流程和函數如圖14。

圖14 數據處理流程
3.2.4 視頻數據讀取和實時性優化
在數據采集壓縮端,主要有兩個處理任務,一是采集的視頻本地回顯,二是將采集的視頻數據格式轉換后進行H.264壓縮并發送,如圖15所示。考慮到視頻數據流向較為復雜,對實時性要求很高,需要進行優化處理。

圖15 數據流向圖
因此,視頻數據讀取和實時性優化采用了如下措施:
1)視頻采集時采用mmap方式,其具體功能就是直接將物理內存直接映射到用戶虛擬內存,使用戶空間可以直接對物理空間操作,相比較在用戶控件和內核空間互相拷貝數據,效率更高。
2)視頻本地回顯,壓縮和解碼數據流交互采用共享環形緩沖區和多線程機制。在采集視頻端主線程負責視頻采集和LCD本地回顯,子線程實現數據的轉換和H.264壓縮與傳輸。在接收端除接收主線程之外,開辟了一個數據拆幀和數據拼接線程,一個解碼顯示線程,組成了一個類似于三級流水線形式的處理流程,保證了畫面的流暢。
采用了高速串行異步通信方式,實現視頻的無線傳輸和接收,硬軟件實現較為經濟。設計中采用了ARM+Linux平臺,可以根據需要進行軟硬件裁剪,解調采用了NE564,即可在中頻階段實現數據的恢復,在發送接收端采用了多線程,實時性得到了提高,經系統級聯實驗測試,在分辨率為320×240情況下,可以較穩定的傳輸接收并解碼顯示,色彩保持度較好,平均幀率在10 f/s以上,達到了設計要求。
:
[1]廣州友善之臂計算機科技有限公司.Tiny6410硬件手冊[EB/OL].[2013-11-05].http://wenku.baidu.com/link?url=k0kJVn5naeD BCnWsMxg8AH5CPowCDZPsEKmbgWhGWcN727EvOdZkxUNhmhyhTJq WGzI3ehrfjzKYT5ZFKypsjDZ66CFoNCpMPdX7Q16WoyO.
[2]CP2102 single-chip usb to uart bridge datasheet[EB/OL].[2013-11-05].http://www.docin.com/p-214094872.html.
[3]孫文友,胡永紅,劉海川.高速2CPFSK調制器的設計與實現[J].測控技術,2006,12(25):7-9.
[4]Philips Semiconductors NE/SE564 phase-locked loop datasheet[EB/OL].[2013-11-05].http://ne564.chinaicmart.com/.
[5]Video for Linux two api specification revision 0.24[EB/OL].[2013-11-05].http://www.linuxtv.org/downloads/legacy/video4linux/API/V4L2_API/spec-single/v4l2.html.
[6]S3C6400/6410 HW Multimedia Codec(MFC)Use’s Guide REV 3.20.[EB/OL].[2013-11-05].http://wenku.baidu.com/link?url=RLLADCEK1Z6hzCMQ7YUPSeVXAnt-5NqNoFuzzU8GK8h1-Y3jAHl0y 0-AGtCy0qBy3Rs9sDl-ZQutM-0hLBneHQxVsocJ0bwRQSlrHpzBrq.
[7]王社國.Linux信號量通信機制分析與實踐[J].微機發展,2002(6):63-66.