主页(http://www.pttcn.net):基于IPP的嵌入式音频解码器设计与优化
1前言 随着信息技术的飞速发展,形式多样的数字化产品已经开始成为继PC机后的信息处理工具,在这种数字化潮流下,嵌入式系统已成为当前研究和应用的热点之一。嵌入式手持设备的视音频多媒体应用也越来越广泛.由于嵌入式系统的应用要求及成本因素决定了嵌入式系统在系统资源, 包括硬件资源和软件资源方面都是非常精简和高效的。因此通过IPP底层API函数实现针对特定处理器的特定关键算法进行程序结构重组和优化,为嵌入式系统低功耗高代码执行效率提供一种很好的解决方案。 2 Intel IPP简介 Intel集成高性能原件(Intel IPP)是一个交叉架构的跨平台软件库,提供了大量库功能,用于多媒体,音频编码,视频编码,计算机视觉密码系统以及此类处理的数学过程。通过一个跨多种架构上的单一API,可以获得平台兼容性,减少开发成本。提升信号,影像,多媒体处理和矢量计算的执行效率。 利用IPP优化的步骤首先是程序结构的重新设计。由于IPP 提供的接口为固定接口,在原程序基础上以IPP函数代替,这意味着需要额外添加变量和步骤,如果程序结构设计不当将在相当程度上抵消使用IPP而带来的增益。为了避免这种情况,对于原来的程序结构往往不能限于局部的调整,而要围绕利用IPP提供的接口为核心,进行较大规模的调整和安排。 3基于Linux的系统框架和集成开发环境的搭建 3.1开发平台的搭建 由于嵌入式系统本身不具有软件开发能力,采用PC+目标机的开发方式,在运行linux2.4.20内核的PC机上为PXA 255板提供开发和交叉编译环境。利用PXA 255板的FF串口作调试口与PC的串口相连,可方便地进行调试工作,利用PXA255板的以太网接口和PC相连,建立点对点的连结,在PC上建立FTP服务器,将应用程序及内核等文件通过以太网接口传到PXA255板上。 3.2交叉编译环境的建立 要在PC上开发出能运行在PXA255板上的程序,必须在PC上为其建立一个针对ARM芯片的交叉编译环境,为此,将用到交叉编译工具链,包括:交叉编译工具arm-linux-gcc、二进制文件处理工具arm-linux-binutils及链接和运行库arm-linux-blibc。 建立起交叉编译环境后,就可以用此交叉编译器为PXA255板编译其内核和应用程序了。整个开发环境的结构框图如下: 图(1) 开发环境的结构框图
3.3基于QT/Embedded库的GUI开发环境的建立 为使在通用PC上编译连接的程序能在目标平台PXA255板上运行,必须在开发端PC上安装正确的库文件。QT/E安装包只提供所有QT类和一些辅助工具的源文件,针对目标平台PXA255板,还需要为QT/E库增加触摸屏的库文件,以使基于QT/E的应用程序能正确的接收到触摸屏事件。交叉编译工具使用专门针对Xscale系列arm-linux-gcc来编译。 为了提高程序开发的效率,可以为QT/E安装一个生成Makefile的工具Tmake。用它来生成Makefile文件可以节省很多时间。在Makefile文件中增加QT/E库的路径及用于包含触摸屏库的参数(-lts)之后再make。这样QT/E程序就被正确的编译连接成为在PXA 255板上可执行的文件了。 4 MP3音频播放器图形界面GUI设计与实现 本设计用QTE/QTopia作为应用程序图形界面GUI的类库和桌面开发环境。Qt/Embedded是Trolltech公司开发的面向嵌入式系统的Qt版本。采用framebuffer作为底层图形接口。Qt/Embedded类库完全采用C++封装。丰富的控件资源和较好的可移植性是Qt/Embedded最为优秀的一方面,使用X下的开发工具Qt Designer可以直接开发基于Qt/Embedded的UI(用户操作接口)界面。 鉴于篇幅,本文只给出图形界面的类定义和函数接口说明,其中封装和移植IPP低层API操作的成员函数将在文章第5部分作出相应的解释和描述,播放器类在Qt中定义如下: class MediaPlayer:public QWidget { public:/*构造函数初始化播放器各参数*/ MediaPlayer(QWidget *parent=0,const char *name=0); public slots: /*Qt中的消息响应槽函数, 定义播放器的各种操作成员函数*/ void fi leopen(); private:
/*播放状态控制、播放器界面控制和GUI插件*/ int stplayer; /* 0:stop 1:play 2:pause*/ QMenuBar *menu; … } 5 MP3音频解码流程与关键算法移植 5.1 IPP中提供的高效音频处理API介绍 本设计采用了IPP的MP3播放解码过程中的解码相关的高效算法,这样使得MP3播放的任务转向流程控制,而不必编写具体的解码代码。MP3解码函数和功能如下: (1)ippsUnpackFrameHeader_MP3/*解包MP3帧头,输出IppMP3FrameHeader结构体*/ (2)ippsUnpackSideInfo_MP3/*解包MP3枝节信息,输出IppMP3SideInfo结构体*/ (3)ippsUnpackScaleFactors_MP3_1u8s/*解包比列因子,输出比列因子的指针等*/
(4)ippsHuffmanDecode_MP3_1u32s/*哈夫曼解码,输出解码后的数据*/ (5)ippsReQuantize_MP3_32s_I/*量化哈夫曼解码后的码字,输出量化后的采样值的指针*/ (6)ippsMDCTInv_MP3_32s,ippsSynthPQMF_MP3_32s16s/*第一、二阶段合成滤波*/ 5.2 MP3音频解码流程 为了MP3文件能够连续的播放,需要为原始二进制在内存中建立一个FIFO缓冲区,以保证每个时刻都有足够的数据,这个缓冲区要有足够的大小,当缓冲区数据小于某个值时,就要及时写入新的数据,在程序的主循环中需要有段判FIFO数据情况和填入数据的程序。主数据也需要一个缓冲区,用来存放解码时用到的数据,播放MP3文件的大致流程如下: 图(3) MP3音频解码播放器程序流程图
(中国集群通信网 | 责任编辑:陈晓亮) |