微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 模拟电路设计 > 基于ADSP-BF533处理器的滤波器的实现及优化

基于ADSP-BF533处理器的滤波器的实现及优化

时间:08-02 来源:互联网 点击:
2 BF533的特点和结构
  
我们的H.264去方块滤波是在ADI公司的Blackfin ADSP-BF533处理器上实现的。Blackfin系列DSP主要具有以下特点:
  
a) 高度并行的计算单元。Blackfin系列DSP体系架构的核心是DAU(数据算术单元),包括2个16位的MAC(乘法累加器)、2个40位的ALU(算术逻辑单元),1个40位单桶形的移位器,4个8位视频ALU。每个MAC能在单一时钟周期内对4个独立的数据操作数执行16位乘16位的乘法运算。40位的ALU可累加2个40位的数字或者4个16位的数字。这种体系架构可灵活地进行8值、16位、32位的数据运算。
  
b) 动态电源管理。处理器可以通过改变电压和工作频率,消耗比其他DSP更少的功耗。Blackfin系列DSP体系架构的允许电压和频率独立调整,使得每一项任务的消耗能量最小,在性能和功耗间有较好的平衡,适合实时视频编/解码器的开发,特别是对功耗有严格要求的实时运动视频处理。
  
c) 高性能的地址产生器。具有2个DAG(数据地址产生器),用于产生支持高级DSP滤波运算的地址的复合装入或存储单元。支持位倒序寻址和循环缓冲以及其他多种寻址方式,提高了编程的灵活性。
  
d) 分层结构的内存。分层结构的内存缩短了内核对内存的访问时间,以获得最大的数据吞吐量、较少的延迟和缩短的处理空载时间。
  
e) 特有的视频操作指令。提供适合DCT(离散余弦变换)、霍夫曼编码等视频压缩标准中常用的操作指令,这些视频指令还消除了主处理器与一个独立的视频编解码器之间的复杂和易混和通信问题。这些特点有助于为终端应用缩短产品上市时间,同时降低了系统的总体成本。
  
我们使用的ADSP-BF533可以实现600 MHz的持续工作,具有:4 GB的统一寻址空间;80 kB SRAM的L1指令指令存储器,其中16 kB可配置成4路的联合Cache;2个32 kB SRAM的L1数据存储器,其中一半可配置为Cache;集成丰富的外围设备和接口。
  
3 基于BF533的H.264去方块滤波优化实现
  
去方块滤波器在Blackfin BF533优化实现主要分为系统级别的优化、算法级别的优化、汇编级别的优化3个级别。
  
3.1 系统级别的优化
  
打开DSP平台中编译器的优化选项并将优化速度设置为最快,打开Automatic Inlining开关(自动内联开关)以及Interprocedural optimization开关(优化过程开关),通过以上的一些设置充分发挥Blackfin BF533的硬件性能。
 
3.2 算法级别的优化
  
将JM8.6参考模型中的去方块滤波部分进行适当的系统修改,移植到原有的基于Blackfin BF533的H.264基本挡次的解码器中,并通过图像序列对其进行耗时分析。选用码率为400 kbit/s左右的Paris.cif、Mobile.cif、Foreman.cif、Claire.cif序列,去方块滤波所耗费的时钟周期约为1 600 MHz~1 800 MHz,即使在经过系统优化后,计算复杂度仍然相当大,效率很低,对于Blackfin BF533处理器600 MHz的持续工作频率是相当大的负担。
  
通过分析JM8.6中去方块滤波程序,其效率低下的主要原因是:
  
a) 算法中的函数逻辑关系复杂,判断、跳转、函数调用等情况特别多;
  
b) 最耗时的部分,即函数循环的内部存在大量的重复计算,造成计算复杂度剧增;
  
c) 算法中用到的不少数据,例如运动矢量、图像的亮度和色度数据等存放在速度较慢的片外SDRAM中,但在滤波过程中的频繁调用,使数据搬运时间剧增。
  
针对耗时的原因,对算法进行了以下改进:
  
3.2.1 将原程序中复杂的函数及循环简单化
  
指令长度和运算速度是相互制约的,往往将代码通过条件判断可以进行高度精简,但由于增加了机器的判断工作量而使得速度变慢;反之,将代码中的判断去除,程序进行展开,往往可以减少耗费的指令周期,但代码长度会增加。JM8.6中的去方块滤波代码较短,将其中的函数间关系简单化,以代码长度增加换取执行速度的增加。
  
对于系统运行最耗时的循环体,采取适当改写循环形式、多重循环体展开等方法有效地减少运算的复杂度。此外,减少调用函数次数,改写if-else语句也是有效的优化手段。
  
3.2.2 去除参考代码中的大量冗余代码和重复计算
  
a) 因为使用的参考代码是JM8.6中的去方块滤波模块,该模块可以对H.264的各种挡次和级别的码流进行滤波,而解码器是基于基本挡次的,仅仅涉及到I帧、P帧的滤波操作,因此可以将参考代码中的关于B帧、SP/SI帧、场模式和帧场自适应模式的相关滤波部分去除。
 
b) 程序在获取滤波强度BS和进行亮度/色度的滤波过程中,都要获取当前子块所在的宏块的相邻宏块的可达性的信息(即这个宏块能否被使用,通过调用GetNeighbour 函数实现),由于滤波是按照宏块中的边缘先垂直后水平进行的,对于一条边缘获取的信息是相同的,因此这个操作可以对每条边缘获取一次即可,不必在循环内部反复判断。同时在滤波算法中,仅需要获取在当前宏块上面和左边的宏块的可达性信息,可将获取当前宏块的左上及右上角宏块信息的冗余操作去除。同时,获取水平方向的滤波强度的函数调用getNeighbour时,getNeighbour参数的取值分别是luma为定值1,xN是[-1,3,7,11],yN是[0-15],此时函数getNeighbour中的很多if-else语句是无效的判断,这些冗余判断占用了大量的时钟周期。此外,对各个分支的概率进行分析,将概率最大的判断分支放在前面执行,也提高了函数执行的速度。
  
以下是精简后的GetNeighbour函数代码,仅有数条语句,大大减少了运算量。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top