微波EDA网,见证研发工程师的成长!
首页 > 应用设计 > 消费类电子 > 基于IPP的嵌入式音频解码器设计与优化

基于IPP的嵌入式音频解码器设计与优化

时间:07-02 来源:微计算机信息 /叶光丰 杨斌 洪艳伟 点击:

解包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音频解码播放器程序流程图

  除解码和播放MP3程序外,还需用户控制部分的程序。MP3播放要求实时性很高,所以不能跟用户控制程序放在一起,需要为它创建一个线程。通过Linux下的Pthread线程,它可以共享内存的数据,这使得线程间通信变得方便。MP3播放的代码就可以放到一个线程里面去,通过共享内存数据由主线程来处理用户操作、启动、暂停和结束播放线程序。引入了多线程操作后,使播放器用户界面的各操作(如按纽按下、鼠标点击等)不必等待MP3解码完成而不能得到及时响应。

  5.3 MP3音频解码关键算法对IPP关键算法的API移植封装接口

  鉴于篇幅关系,不对每一个API移植和具体操作都进行详细阐述,如上所述,IPP最底层的音频解码函数有ippsUnpackFrameHeader_MP3…ippsSynthPQMF_MP3_32s16s等,我们先对上述函数进行第一层移植,形成一批引用更为方便、操作更为简单的API,把这一层的移植操作全都完成在一个MyAudioApi.cpp文件里面,添加到用Qt做图形界面GUI的项目中一起编译。

  这使得最上层的QT图形界面应用程序的各个成员函数可以非常方便地调用利用IPP生成的音频播放各种操作的函数接口。这样仍然可以利用IPP的高效算法进行解码优化而且屏蔽了底层IPP API的复杂性。还为以后的二次开发提供便利。自己定义的音频解码各个函数原型如下:

  void mp3open(char filename);/*打开MP3文件并创建解码线程*/

  void mp3play(void); /*设置ispause共享变量为假,重新进入播放线程循环体*/

  void mp3pause(void);/*设置ispause共享变量为真*/

  void mp3stop(void); /*设置done共享变量为真,等待播放线程结束*

  需要说明的是上述函数完成播放器用户界面中启动音频播放、控制暂停和结束播放功能,通过多线程之间共享内存数据的方式进行线程间的通信,从而在主线程中控制播放线程的暂停和停止。

  void *MP3Start(void *arg) /*针对MP3播放线程主函数进行解释和流程分析*/

  { InitMP3Decoder(&D ecoderState,&bs);/*初始化解码器*/

while(!done)/*停止键或者解码未完成之前循环播放解码*/

   { if(!ispause)/*通过判断线程之间的共享变量ispause判断时候有暂停键按下*/

   switch( DecodeMP3Frame(&bs,pcm,&DecoderState) )

   {/*根据解码函数返回的状态选择下一步操作*/

  case MP3_FRAME_COMPLETE:

   /*缓冲区中已有足够数据来解码一帧流数据*/

   …}}

  /*关闭 I/O 音频设备,此MP3文件播放结束*/

   }

  6 结束语

  IPP能够实现底层的交差平台的软件开发,提供高集成的数据通讯,单信号处理以及多媒体功能等,Intel IPP并且能够帮助优化电力消耗,达到最佳的CPU执行效率。其嵌入式的移植应用更是为实现手持设备上的低功耗,高代码执行效率提供了一种可行的软件优化方案。

  参考文献:

[1] Intel. Sitsang-PXA255 Evaluation Platform Linux User GUIde[S] 2005
[2] Intel. Integrated Performance Primitives for Intel Architecture R eference M annual,develop[S].Inte1.corn 2002.
[3] TrollTec. QT/Embedded 2.3.2 Reference[S]
[4] 濮琼,黄建华. 基于IntelPXA270平台的嵌入式流媒体播放器设计[J],微计算机信息,2005,10-2,31
[5] 白玉霞. 基于Qt/Embedded的GU I移植及应用程序开发[J]. 嵌入式系统,2005.7
[6] Xteam软件技术有限公司[M]. Qt程序设计. 北京:清华大学出版社,2002
[7] Scott.Linux内核源代码分析[M].2004

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

网站地图

Top