日历

2008 7.24 Thu
  12345
6789101112
13141516171819
20212223242526
2728293031  
«» 2008 - 7 «»

文章搜索

日志文章

2007年12月24日 13:50:34

在Blackfin上MPEG-4编码算法的实现及优化


BlackfinDSP简介
Blackfin DSPADIIntel公司联合开发的体现高性能体系结构的第四代定点DSP产品。Blackfin系列DSP是一种基于微信号架构(MSA)的DSP,它具有两个MAC,集成了大量的外围设备和存储器接口,每秒运算速度最高达到3000MMACs(兆次乘加运算)。该DSP具有正交的类似RISC的微处理器指令集,使单指令多数据(SIMD)和多媒体操作都引入单指令结构。正因为这些特点使得BlackfinDSP适用于各种视频、音频及通信领域产品的实现。ADSP-BF532Blackfin系列DSP中具有代表性的一款,该DSP具有如下特点:

  • 提供PPI视频接口,支持ITU-R656接口,能够直接处理ITU-R601数据;
       
  • 采用双16位乘法累加器的改进型哈佛结构,每秒运算速度最高达到800MMACs
       
  • 在一个时钟周期内能够并行完成两个操作数的运算,并同时完成两个操作数的存取;
       
  • 支持视频像素运算指令;
       
  • 工作主频最高达400MHz
       
  • 具有大容量(84KB)的片上内存,片上内存可在一个指令周期内完成数据的读写;
       
  • 价格便宜。
由以上分析可看出ADSP-BF532是一款性价比相当高的DSP,非常适合于多媒体产品的开发。下文将对基于ADSP-BF532MPEG4编码的具体实现方案进行详细说明。
实现MPEG-4视频编码的硬件平台方案
1介绍了一种基于ADSP-BF532MPEG-4编码的硬件平台方案。

[list=1]
  •     基于IP的视频服务器的硬件平台方案
  • 在图1中,视频信号由SAA7113采集,ADSP-BF532通过PPI接口从SAA7113接收采集的原始视频数据,再对其进行MPEG-4编码处理。图1中的硬件平台还提供了RS232异步通信串口及两个同步通信串口(SPORT0SPORT1),可方便地进行应用扩展。SDRAM容量为32MB,用于存储数据,Flash的容量为1MB(或2MB),用于存储DSP程序。
    MPEG-4编码器软件架构
    要实现一个实时MPEG-4编码器,需要从两大方面下手,一是设计一个适合于在DSP上运行的软件架构,另一个就是优化编码器中运算量较大的关键模块。
    MPEG-4编码器的架构可参考目前公开源代码的MPEG-4CODEC(编解码器)。但是目前公开源代码的MPEG-4编码器均是基于PC平台的,DSP虽然具有运算能力强的优点,但是由于各方面的原因,其外设访问速度远远没有PC上的CPU快。因此基于PC平台的软件架构不适用于DSP,要在DSP上实现MPEG-4实时编码,还需要对其软件架构进行调整。
    BlackfinMPEG-4编码器的架构设计主要包括:内存分配设计、流水线架构设计和内存拷贝优化设计。
    内存分配设计
    好的存储结构设计能够大大提高程序的运行效率,对于MPEG-4编码器这种大运算量的程序而言更是如此。由于Blackfin片上内存的访问速度与指令执行速度一样,从片上内存到寄存器只需要一个指令周期。而Blackfin所有的运算均是在寄存器中进行的,因此在运算时需要把数据读取到寄存器中来进行。考虑到片上内存的速度,在实现MPEG-4编码器时应尽量把数据放到片上内存中进行运算。但片上内存的容量相对图像数据来说相当小,远远不能存储一帧数据,因而只能把数据存储到片外内存中,在每次运算开始之前把数据从片外内存拷入到片内内存当中。这样在设计编码器架构时,除了分配好外存以存储视频等数据外,更重要的还需要合理地分配片上内存来提高数据的访问速度。
    ADSP-BF532片上内存中48KB是指令内存,32KB是数据内存,而另外4K则是Scratchpad内存。此外,48KB指令内存中的16KB可配置为指令Cache使用,32KB的数据内存则可把其中的16KB32KB配置为数据Cache。在设计MPEG-4编码器软件架构时,可把片上内存配置为:48KB片上指令内存,16KB片上数据内存,16KB数据Cache4KBScratchpad内存作为堆栈空间。由于MPEG-4编码器经过优化后所占的代码空间很小,因此在这里没有使用代码Cache的功能。这样设计是为了让编码器能够同时使用DMACache两种方式访问外部存储器。当编码器中使用的数据是确定的,并且每帧图像编码只使用一次的,就可以使用DMA方式把它从外部存储器中拷贝到片上内存来运算。例如对图像进行DCT/IDCT、及量化/反量化运算,就可以宏块为单位把数据从片外内存拷入到片内内存。而当编码器中使用的数据具有一定的随机性,在编码器中会随机访问到,就应该使用Cache方式来访问。使用Cache方式与DMA方式相比具有更大的灵活性,当使用恰当时能够极大地减少对片外数据的拷贝次数。根据这个特点,MPEG-4编码器中的VLC编码就可把码表存储在片外内存当中,使用Cache方式来访问。
    为了能够提高Cache的命中率,在片外内存分配时需要注意内存对齐的问题。只有当内存按照Cache的行进行对齐时,才能保证较高的Cache命中率,从而提高片外数据的访问速度。
    流水线架构设计
    由于使用了DMA方式进行数据拷贝,DMA引擎在进行数据拷贝时CPU是空闲的,这时就可让CPU进行其他模块的运算工作来提高其利用率。这样在设计MPEG-4编码器架构时,可对编码器的各个模块采用流水线的方式来进行调度,以充分利用CPU访问外部数据的延迟来提高编码器的效率。因此在编码器的内存分配完成之后,还需要对编码器的架构进行流水线设计。例如在帧内编码时,可在读取下一宏块的数据时,进行上一宏块的DCT、量化等运算。
    内存拷贝优化设计
    使用前面的方法对编码器架构进行设计可使DSP内核尽量避免或减少等待外设数据访存的时间,从而提高编码器的效率。但由于MPEG-4编码器访问外存的数据量相当大,在设计编码器的架构时还应尽量减少DSP内核对外存的访问,只有这样编码器的效率才能从本质上得到提高。例如在编码器中数据进行变换处理之前需要先进行抽样处理,即把数据从720×576的分辨率抽样为352×288的分辨率,再把数据扩展成16位进行运算,这样对一帧图像数据就会有两次读/写操作。为了能够减少数据的读写次数,我们可利用DMA操作同时进行这两个处理,即在抽样的同时进行数据的扩展操作,这样就只需要一次对外存的读/写操作了。
    关键模块的优化
    在完成MPEG-4编码器的架构设计及所有模块的编写工作后,需要对其中运算量较大的关键模块作进一步的优化工作,以满足编码器实时的要求。通过Profile工具分析,在MPEG-4编码器中运算量较大的模块有:DCT/IDCT模块、运动估计模块、运动补偿模块和量化/反量化模块。对这些模块的优化可以利用Blackfin提供的视频运算指令、向量运算指令提高算法的并行程度来进行。此外还可根据算法本身的特点使用短指令周期的指令来替换长指令周期的指令来提高运算速度。以下介绍对其中几个模块的具体优化方法来说明这几种优化技巧的应用。
    DCT模块的优化
    这里介绍陈氏算法的优化。Blackfin在一个指令周期内可并行完成:单指令累加器或算术逻辑单元的操作;两个32位数据的传送;两个指针的更新;两个硬件循环的内容更新。并且Blackfin还提供了向量运算指令,这样还可在一个指令周期内完成更多的运算。根据这一特点,我们可如此优化陈氏算法中的蝶形运算:
    输入:R0.H=f(0)R0.L=f(1)R1.L=f(2)R1.H=f(3)R2.L=f(4)R2.H=f(5)R3.H=f(6)R3.L=f(7)
    输出:R2.H=F(1)R2.L=F(7)R4.H=F(5)R4.L=F(3)R5.H=F(4)R5.L=F(0)R6.H=F(2)R6.L=F(6)
    第一级蝶形运算:
    R0= R0+|+R3 , R3 =R0 -|- R3 (ASR) | | R1.L= W[I0++]
    R1= R1 +|+ R2 , R2=R1 -|- R2(ASRCO)| | NOP | | R7 = [ I3 ++ ];
    其他三级蝶形运算均可采用类似的方法来优化,使用这种方法一个8×8块的二维DCT运算仅仅需要293个指令周期。
    量化模块的优化
    在图像数据经过DCT变换后需要对其进行量化处理,量化的本质就是除法运算。由于Blackfin提供的除法指令不是一个单周期指令,进行一次16位的除法运算需要16个指令周期,这样就会造成量化模块的运算量增大。注意到量化运算时使用的量化系数均为常整数,我们可以把除法运算改为乘法运算来进行。例如a÷2改为a×0.5,乘法指令在Blackfin中是一个单周期指令,远远比除法运算快,这样改写后的量化模块运算速度将得到大幅度提高。另外,由于量化运算是16位的乘法运算,而Blackfin提供了两个16位的MAC,因此还可使用向量运算指令,在一个指令周期中进行两次乘法运算来提高算法的并行度,从而把量化模块的运算速度再提高一倍。使用乘法指令改写量化模块时,在循环体中会使用分支结构进行求模运算来实现四舍五入,这样不利于减少循环体的指令周期数,也不利于向量运算的运用。为了能够避免在循环体中的分支结构,并使用向量运算指令,在量化模块中可使用补码来进行运算。综合以上几点,我们可写出如下的量化模块:
    I2指向量化前的变换数据的地址,i3指向量化后数据的地址,r0保存量化前的变换数据,r5保存量化系数,R0中的变换数据在进入到循环体之前需要提前取出。量化模块的循环体如下:
            r1= r0 >>> 15 (v);    
            r2= r0 ^ r1;
            r2= r2 -|- r1;
            r3= r6 -|- r2;
            r3= r3 >>> 15 (v);
            r2= r2 & r3;
            r2= r2.l * r5.l, r3 = r2.h * r5.h (is);
            r2= pack(r3.h, r2.h);
            r2= r2 ^ r1;
            r2= r2 -|- r1 || r0 = [i2++];
            [i3++]= r2;
    充分利用Blackfin提供的视频运算指令
    运动估计是MPEG-4编码中运算量非常大的模块,无论使用的是传统的三步搜索法还是PMVFAST算法,其基本原理都是在编码图像中根据参考帧进行块匹配,在其中会大量使用SAD运算。SAD运算的公式如下:

    SAD值是运动估计的判决准则,SAD值越小,运动估计就越准确。Blackfin对于SAD的计算,有专门的硬件指令对应,利用该指令可使运动估计搜索的速度大大加快。Blackfin提供的指令为SAA( src_reg_0, src_reg_1 ),其完成的运算如下表:
    [list=1]
  •     SAA指令
  •                                                                                                                                                                        
                  Src_reg_0
           
                  a(i,j+3)
           
                  a(i,j+2)
           
                  a(i,j+1)
           
                  a(i,j)
           
                  Src_reg_1
           
                  b(i,j+3)
           
                  b(i,j+2)
           
                  b(i,j+1)
           
                  b(i,j)
           
                 
                 
           
                  A1.h=|a(i,j+3)-b(i,j+3)|
           
                  A1.l=|a(i,j+2)-b(i,j+2)|
           
                  A0.h=|a(i,j+1)-b(i,j+1)|
           
                  A0.l=|a(i,j)-b(i,j)|
           
    根据上表,我们可以使用如下形式的指令来完成SAD运算:
    SAA(r1:0,r3:2)| | r0=[I0++] | | r2=[I1++];
    这样SAA指令只使用一个指令周期就可完成四个像素点的运算,并且同时还可完成四个当前图像帧和参考图像帧的数据的读取,从而大大提高运动估计算法的效率。
    类似的,运动补偿模块也可使用BYTEOP16M来进行优化,其他的运算模块也可采用相应的视频运算指令来优化以提高效率。
    优化结果及结论
    整个MPEG-4编码器使用VisualDSP++进行开发,ADSP-BF532的工作主频为378MHz,系统时钟为126MHz,用仿真器通过JTAG接口进行仿真测试。编码器在CIF(分辨率为352×288像素)视频下进行视频编码时的平均编码速度达到了37毫秒/帧(帧内编码间隔为30帧),满足了25帧/秒的实时编码要求。从中可得出结论,使用本文所述的方法在Blackfin上实现一个实时MPEG-4编码器的方案是可行的,利用该方案可实现一个很经济的,并且功能很强大的多媒体终端产品,目前利用该方案本公司已成功地研制出了基于IP的视频服务器。

    Tags: MPEG4   Blackfin   SIMD   优化  

    类别: 多媒体技术 |  评论(1) |  浏览(1635) |  收藏
    发表评论