基于FPGA的四通道视频缩放引擎的研究及设计
数字视频缩小和放大(简称缩放)是视频处理的一个重要分支,是基于对数字视频每帧图像的处理来实现的。常见的缩放算法有最近邻域法、双线性插值法、抛物线插值法、双三次插值法和牛顿插值法等基于多项式的插值算法[1],较容易在FPGA硬件上实现;也有B样条插值法、基于小波插值和有理插值等比较复杂的算法,难以在FPGA上实现。
近年来随着液晶平板显示器件的广泛应用,对于定标器的研究越来越多且研究成果也很丰富。但定标器的缩放比例有限,一般在0.5~4之间,在这个范围内采用2阶或3阶多点插值算法,图像的边缘和细节可以较好保存。但是采用定点插值法,当文字缩小比例较大时,会丢失较多的细节,出现字体笔画断裂或者锯齿现象。而采用低阶算法(例如多点均值插值),参与运算的点较多,可以有效提高文字的显示质量。
1 系统架构
系统架构如图1所示,先对输入视频的分辨率进行检测,将检测值送至MCU,MCU用其确定缩放步长;然后对视频进行缩小操作。如果要对信号进行放大,则绕过该模式;接着将视频数据送至IFIFO缓存,由仲裁器和DDR2控制器实现4个通道数据的帧率变换后,视频数据送至OFIFO模块;接着数据被送至放大模块,完成放大操作。如果要对视频信号进行缩小,则绕过该模式;最后将完成处理的RGB视频信号输出。整个缩放过程所需要的缩放步长、通道选择等配置信号全部由MCU通过本地总线配置FPGA。
其中,f(x,y)为缩小图像某点的像素值,f(xi,yi)为图像子块中各点的像素值。
实现结果如图5所示,较好地保证了文字的正常显示。
4 帧率变换
4.1 输入缓存 IFIFO
每一路IFIFO都需要在FIFO中数据量大于1/2 FIFO深度时向仲裁模块发送占用DDR2总线的请求信号REQ,应答信号AGREE有效时,向DDR2控制器发送数据。当完成一定量的读出数据时,往仲裁模块发送一个发送结束信号END,仲裁模块接收到END信号后将DDR2总线控制权收回,IFIFO等待下一次应答。
4.2 输出缓存OFIFO
其实现原理与IFIFO类似,只是该模块的输入端工作在DDR2工作时钟域,输出模块工作在帧率变换后的视频图像的像素时钟域。
4.3 仲裁
共有4路输入和4路输出占用DDR2带宽,需要划分时间片来保证各个通道能够顺畅地显示,优先级依次为第1、2、3、4通道读,第1、2、3、4通道写。本模块采用状态机控制,状态机在上述8个状态中循环跳转,然后跳回IDEL状态,开始下一轮循环。
仲裁模块的另一个任务就是读写DDR2地址的生成。将DDR2的存储空间划分为4个部分,每个部分存储一路视频信号,每路视频信号存储3帧。同时读DDR2时,命令设置为读操作;写DDR2时,命令设置为写操作。
现就一路视频实现帧率变换讨论如下:创建3个指针分别指向3帧数据的DDR2空间基地址,系统启动时,读指针rd_pointer、当前写指针current_wr_pointer和之前写指针pre_wr_pointer分别按照图6所示的状态图在3个基地址之间跳转。
最近邻域插值法存在很强的波瓣,频率响应较差。当图像中包含像素值有变化的细微结构时,最近邻插值会在图像中产生人为的痕迹,造成图像模糊或产生人为噪声点。
线性插值法频谱的旁瓣远小于主瓣,带阻特性较好。但通带内高频成分衰减过快,会使得插值后的图像变模糊。
四点立方插值通带内高频成分衰减明显变慢,且旁瓣不超过1%,具有较好的高频响应特性,缩放后的图像能够保持更多细节。
六点立方插值算法的频率响应特性更加优越,通带内高频成分衰减更慢且旁瓣更低。
四点立方插值较好地保持了图像的细节,实现难度和占用逻辑资源适中。六点立方插值虽然实现效果更好,但是占用的逻辑资源较多。故本设计采用四点立方插值算法实现视频的放大操作。
5.2 插值基函数
图像插值缩放具有二维可分解的特点,可以将二维图像的插值分解为分别沿x和y方向的一维信号插值[3]。一维方向上,利用插值点的四个临近像素点进行三次插值, Keys将sinc离散函数进行泰勒级数展开后,使三次分段多项式和原始信号的泰勒级数展开式尽可能多项吻合,以此推导出插值基函数表达式[4]。
5.3.1 抽头系数的产生
将插值的系数存在ROM中,这样虽然使用三次方插值,但是不用在FPGA中实现三次方的运算,提高了运算速度。例如原图像一行有3个像素,要求插值后的图像一行有8个像素,则新图像一行的第5个点在原图像中映射的坐标为[(5-1)×2/7]+1=15/7=2+1/7≈
′b0010.1001,整数2为其原图像中左边临近的像素点坐标为2,1/7表示其与坐标为2的原图像像素的距离为1/7。此时将小数部分1001作为地址读出存储在该地址的抽头系数,将其送给卷积器。
5.3.2 插值参考点控制
放大时,对缩放步长进行累加,当小数向个位数进位时,开始读取一个新的数据。例如计算插值后图像某个点时,采用原图像的x4、x5、x6、x7作为插值参考点,则当步长累加器有进位时,读取下一个像素值x8,同时将x5、x6、x7移到x4、x5、x6的寄存器位置,而x8则存入之前x7的位置,这样就可以实现从原图像向目标图像的地址映射,避免从目标图像到原图像地址映射过程出现的乘法运算。
5.4 行缓存
行缓冲存储器的主体为若干个存储容量相同的双口随机存储器(DRAM),每个DRAM存储一行的有效像素数据。
为了确保行缓存不溢出,开辟6个行缓存器,存储时按顺序1-2-3-4-5-6-1循环存放,读取时按循环次序读取。
5.5 垂直方向放大
垂直方向放大滤波器架构和水平方向一样,只是插值参考点来自于不同的行缓存空间里相同地址的数据。
本文采用Xilinx公司的Virtex-5系列XC5VLX50T-1FFG1136C型号的FPGA实现,可用用户IO管脚480个,满足4路视频信号输入、4路视频信号输出和一路16 bit本地总线需求。内部可用Slice 7 200个, Block RAM Blocks最大为2 160 KB,满足4路视频信号每路缓存6行数据需求。输入DVI视频信号用Silicon Image公司的SiI 1161解码成并行RGB数据送至FPGA,输出的并行RGB视频信号用SiI 1160编码成DVI视频信号输出显示。实验结果表明,在4个通道输入均为352×288(CIF格式)分辨率、均放大为1 920×1 080输出显示时,无方块效应,输出稳定顺畅;在4个通道输入均为1 920×1 080分辨率、均缩小为352×288输出显示时,画面质量良好,且文字笔画圆润,无笔画断裂或者模糊不清的现象。
- 在采用FPGA设计DSP系统中仿真的重要性 (06-21)
- 基于 DSP Builder的FIR滤波器的设计与实现(06-21)
- 基于FPGA的快速并行FFT及其在空间太阳望远镜图像锁定系统中的应用(06-21)
- 3DES算法的FPGA高速实现(06-21)
- 用FPGA实现FFT算法(06-21)
- FPGA的DSP性能揭秘(06-16)