以DSP和FPGA协同技术设计实现的高性能视频编码器视频采集设计

可编程逻辑

1334人已加入

描述

采用DSP 和FPGA 协同技术设计实现了一个高性能的MPEG24 视频编码器。FPGA 模块完成视频采集、YUV 分离、数据I/ O 等功能,而使用DSP 专一进行视频压缩编码。针对DSP 片内资源特点设计了片内存储器数据分配方案,并根据该方案优化了MPEG24 视频压缩的数据流模式。提出了基于宏块空间复杂度的宏块类型判断算法,有效地降低了视频压缩算法的计算复杂度。测试结果表明,采用MPEG24 视频标准该视频编码器每秒能够压缩3912 帧CIF 图像。

随着宽带Internet 的快速发展和电子设备计算能力的迅速提高,在Internet 上实时传输高清晰度视频信息成为可能,以Internet 为传输媒介的视频会议、视频监控、Internet 电视台等视频应用方兴未艾。这些应用的一个共同特点是,都需要一个高性能的实时视频编码器,特别是高分辨率的视频应用给视频编码器的计算能力提出了很高的要求。例如,一幅720 ×576 的4∶2∶2 视频格式的画面,包含有3240 个16 ×16 的YUV 宏块(Macro Block ,即MB) 。如果该视频帧按照P 帧或者B 帧进行压缩,那么每一个YUV 宏块都要进行运动估计、运动补偿、DCT (Discrete Cosine Transform) / 反DCT 变换、量化/ 反量化和VLC(Variable Length Coding) 等环节的运算。如果进行实时压缩(每秒钟压缩25 帧) 的话,大致需要316~ 5G IPS ( Inst ruction per second) 的计算能力 。

目前,单一的CPU/ DSP 一般还不具备这样的计算能力。为了解决高清晰画面的实时视频压缩问题, 本文提出了DSP 和FPGA ( Field Pro-grammable Gate Array) 协同设计方案。使用FP-GA 完成视频采集、YUV (视频亮度Y、色度分量

UV) 分离、数据I/ O( Input/ Output) 等所有周边功能,使用高性能的DSP 进行视频压缩编码,因而在视频编码器内DSP 和FPGA 能够进行流水操作,有效地提高了编码器的性能。

为了降低算法的计算复杂度,本文提出了基于宏块空间复杂度的宏块编码类型判别算法(MTJBSC) 。在标准MPEG24 视频运动估计算法中,判别宏块的编码类型是通过计算当前宏块内像素值方差和参考宏块与当前宏块之间的方差来实现的,因此计算量很大。MTJBSC 算法首先计算出当前宏块的空间负责度(MBC) ,然后通过比较当前宏块的MBC 与SAD(Sum of Absolute Difference) 值来判断当前宏块的编码类型,大大降低了算法的计算复杂度。

1  硬件设计方案

基于TI 公司的图像开发工具包( Imaging Developer Kit ,即IDK)  架构,设计了视频编码器的硬件平台。从整体上来讲,视频编码器的硬件实现由DSP 和FPGA 两个模块组成,其逻辑框图如图1 所示。由于视频压缩编码计算量很大,为了尽可能提高视频压缩帧率,由DSP 专门负责视频压缩编码,而视频采集、YUV 转换和编码器I/ O 接口等其它功能则交由FPGA 模块来实现。

FPGA

如图1 所示,用户控制命令(例如视频压缩模式) 由FPGA 模块首先截获,然后FPGA 模块向DSP 模块产生外部中断,DSP 在响应中断时读取存储在FPGA 中的用户控制命令字,然后DSP 解析命令字,并根据用户要求的视频格式、帧图像分辨率和视频压缩码流速率进行视频压缩编码。

模拟视频信号经视频解码器转换为裸视频数据流,该数据流(或从数字摄像机直接获得的数据流) 经FPGA 预处理后送入帧存中。DSP 读取帧存中的数据进行压缩编码,压缩后的视频数据送入FIFO 中,最后FIFO 中的数据通过串口送给信道编码器。

FPGA 模块的逻辑框图见图2 。如图2 所示,视频解码器首先将模拟视频信号量化为复合的YUV 数据,然后经FPGA 进行YUV 分离(和滤波) 后送到帧存(图1 中的SDRAM1) 中,C6201使用DMA 通道(异步方式) 通过FPGA 读取帧存中的YUV 数据进行压缩编码。帧存(SDRAM1)在刷新( ref resh) 或缺页(page miss) 时会引起DMA 读等待,为了平滑这种等待引起的DMA 读数据的抖动,设计时在FPGA 的内部实现了一个高速FIFO。视频帧存采用了乒乓结构,将8M 字节SDRAM 分为两个4M 字节的地址空间(每一个地址空间可以容纳一帧YUV 视频数据(720 ×576 ×115 字节) ) ,一个地址空间用于存储当前正在采集的视频数据,另一个地址空间用于DSP 的数据读取。在压缩CCIR601 格式的视频图像(每秒25 帧) 时,由于DSP 的处理速度(大约每秒10帧) 慢于视频采集的速度,所以FPGA 模块在采集完一帧数据进入等待状态,直到DSP 压缩完上一帧视频数据时,这2 个地址空间才进行互换。

FPGA

DSP 模块接收FPGA 模块送过来的YUV 视频数据,然后进行视频压缩编码,最后将压缩的码流再转交给FPGA 模块,由FPGA 模数据发送出去。DSP 模块的存储单元(图1 中的SDRAM2) 用来存放参考帧数据和中间运算结构。MPEG-4 压缩编码算法指令存放在PROM 中,为缩短取指时间, 编码器在启动时已将指令从PROM 读到片内存储器中。MPEG 压缩码流是变速码流(VBR) ,而当该码流在恒定速率(CBR)的信道上发送时,需要一个FIFO 缓存来平滑编码器输出码率的波动。

该设计的特点主要表现在以下2 个方面:

①可扩展性好。FPGA 模块除了负责数据I/ O功能外,还作为协处理器使用,可根据需要增加FPGA 的门数来实现原来由DSP 完成的功能,例如Huffman 编码、运动估计等; ②灵活的视频压缩编码格式控制,编码器能够实时地根据用户的要求进行压缩编码。

2  视频压缩算法优化

(1) MPEG-4 数据流优化设计

实验表明,如果代码和代码要访问的数据在C6201 片内存储区( PRAM 和DRAM) ,其代码执行速度要比代码和数据在片外同步SDRAM 中平均快17 倍(片内总线宽度为256 位,数据访问为1 个CPU 周期) [3 ] 。因此,将执行代码和数据放到片内将大大提高程序的运行速度。

在MPEG-4 算法中,由于没有考虑存储器的限制,算法每次读入一帧YUV 数据进行压缩编码 。但对于C6201 来说,片内只有64K 字节DRAM ,不可能一次将一帧数据读到片内存储器进行压缩。如果将一帧数据一次读到片外存储器(SDRAM) 中进行压缩,又会大大降低代码的执行速度,因此,我们对视频压缩算法进行了改进,一次对一个切片( slice) 数据进行压缩编码,并将压缩码流数据直接送入到发送缓冲区中。

编码器一次将一个切片的YUV 数据(当前帧) 读入到片内存储器中,然后根据计算决定切片宏块的编码类型(帧内/ 帧间编码) 。如果宏块进行帧内编码,则YUV 数据被分成8 ×8 的像素块(一个宏块包含4 个Y分量像素块和2 个UV 分量像素块) 进行DCT 变化,以消除图像空间冗余信息。DCT 变化后的系数经过量化后进行游程编码( Run Length Coding 即RLC) 和变长编码(Variable Length Coding ,即VLC) ,变长编码的结果送入到视频发送缓冲区中。与此同时,量化后的DCT 系数经过反量化(结果放入内存B 中) 和反DCT 过程形成重建帧,重建帧用作下一帧的参考帧。

如果宏块进行帧间编码,则以宏块为单位进行运动估计,根据运动估计的结果建立预测帧。当前帧和预测帧的差值形成了残差帧( residue frame) ,残差帧的编码过程与帧内编码过程相同。

(2) 宏块编码类型判别算法

在MPEG-4 算法中采用了快速运动估计算法,但是在进行宏块编码类型判别时计算量仍然很大。为此,本文提出了基于宏块空间复杂度的判别算法MTJBSC ,进一步降低了运动估计过程中的计算量。

在编码P 帧宏块的时候,首先要决定宏块是进行帧内编码还是帧间编码。在标准MPEG-4算法中是通过以下方法决定的 :

设参考宏块的像素值( Y 分量值,以下同) 用P( x , y) 表示, 当前宏块的像素值用C ( x , y) 表示, x , y 表示宏块的纵、横坐标, M , N 表示宏块的宽和高。当前宏块像素值的方差用EVAR表示,其值为

参考宏块和当前宏块的方差用EVMC表示,其值为

EVMC值越小(比如EVMC 《 EVAR) ,说明参考宏块和当前两宏块的相关性越大,应该采用帧间编码。另一方面,还要考虑当前宏块方差的大小,如果当前宏块的方差较小(比如EVAR 《 EVMC) 则应该进行帧内编码;但此时如果EVMC足够的小,还是应该采用帧间编码。因此有如下判断准则:

if ( EVMC 》 EVAR and EVMC ≥9) then 帧内编码else帧间编码

显然,在MPEG-4 算法中,为了判断宏块的编码模式进行了大量的计算(对于每一个P 帧宏块都要进行上面的计算) 。为了减少计算复杂度,本文提出了基于宏块空间复杂度( EMBC) 的宏块类型判断(MTJBSC) 算法,用以判断P 帧宏块的帧内/ 帧间编码模式。

定义宏块的空间复杂度为水平方向上相邻像素差值的绝对值之和,即

在基于帧间差原理进行视频压缩的MPEG标准中,一般都是采用绝对差总合( ESAD) 来进行运动估计的。在MPEG 标准中,宏块的ESAD值定义为

式中: m , n 为该宏块的运动向量。

根据上述定义,MTJBSC 算法可简单描述为:

如果宏块的ESAD小于其EMBC ,则该P 帧宏块进行帧间编码;否则进行帧内编码。实验表明,在压缩质量和压缩输出码率均没有大的变动的情况下,该算法有效降低了视频编码器的计算复杂度,编码器的压缩帧率(f/ s) 得到明显提高。

3  测试结果

表1 为编码器进行装载测试的测试结果(1帧的平均值) 。装载测试是首先将视频测试序列装载到编码器的SDRAM 中,然后进行压缩编码。使用的视频序列为标准测试序列mother (CIF 格式,彩色, YUV 4 ∶2 ∶0 , 5 帧) ,DSP 主频设置为200 MHz。

FPGA

表2 为美国TI ( Texas Inst rument) 公司基于DSK 6711 EVM 板开发的H. 263 视频编码器的性能测试数据( 装载测试) , DSP 主频为150MHz。TI 公司针对DSK 6711 对H. 263 做了全面优化,算法关键代码采用了线性汇编语言编写。H. 263 视频编码算法与MPEG 视频编码算法的压缩编码原理、过程和计算复杂度大致相当,因此二者具有可比性。

从表1 和表2 可以看出,研制的视频编码器平均压缩帧率为39. 2f/ s (CIF 图像) ,而TI 公司开发的视频编码器平均压缩帧率为20f/ s (CIF 图像) ,绝对性能提高了96 % ,考虑到DSP 主频的因素,相对性能仍然提高了47 %。

FPGA

4  结 论

采用DSP 和FPGA 协同技术设计实现了一个高性能的MPEG24 视频编码器。使用FPGA完成编码器I/ O 功能,使用DSP 进行视频压缩编码,二者能够很好地并行工作,系统设计结构简捷,硬件工作可靠。同时,针对DSP C6201 片内资源特点优化了视频压缩的数据流模式,采用MTJBSC 算法有效地降低了压缩算法的计算复杂度。测试结果表明,采用MPEG24 视频标准该视频编码器每秒能够每秒压缩39. 2 帧CIF 图像。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分