用C语言进行DSP软件设计的优化考虑.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
用C语言进行DSP软件设计的优化考虑

  ?用C语言进行DSP软件设计的优化考虑 武汉力源电子股份有限公司技术开发部(430010) 刘朝晖 摘 要 讨论了用C语言进行DSP软件设计中常用的一些优化策略。 关键词 C语言?? DSP ?? 优化 TMS320C54x 1 前言 ??? 与单片机相比,DSP多用于算法比较复杂、乘加运算量比较大的场合,如通信、雷达、音视频处理等。为了追求代码的高效,过去一般用汇编语言来编制DSP的应用软件。随着技术的发展,DSP的应用范围不断延伸,且日趋复杂,而单纯的汇编语言程序的可读性、可修改性和可重用性太差,软件需求与软件生产力之间的矛盾日益突出,高级语言(如C语言)的引入,有望解决这一矛盾。与此同时DSP的运算速度大幅度提高,以DSP为平台的C编译器的功能不断完善,这也为C语言的采用提供了可能。 ??? DSP的运算能力差别很大,以TI公司的DSP产品为例,TMS320C64x的运算能力已达4800~8800MIPS,而低端DSP产品的运算能力一般为20~40MIPS。价格上也是天渊之别,从数千元到几十元。涉及到具体应用时,器件的选择要遵循一个合适的性价比。一般而言DSP的运算能力越强,其价格相对较贵。为此软件的实时性不能完全依赖于器件运算性能的无限提升。特别是当采用C语言进行DSP软件设计时,其效率一般比用汇编语言编制的要低,因此,优化工作更为必要。 ??? 鉴于DSP应用的复杂性,在用C语言进行DSP软件开发时,一般先在PC机或工作站上对算法进行仿真,仿真通过后再将C程序移植到DSP平台中。按照开发的顺序,相应的优化工作也包括两部分:一是仿真环境中的优化,二是DSP目标环境中的进一步优化。下面结合TI公司的TMS320C54x 系列DSP的C编译器,具体讨论相关的优化工作。 2 仿真环境中的优化 ??? PC机环境中的优化工作是针对C程序的通用特性来考虑的。这方面的优化工作主要包括采用快速算法、计算表格化、数组指针化和尽可能减少判断转移。 2.1 快速算法 ??? 与直接算法相比,快速算法通常放弃了概念上的清晰度,而追求计算上的高效率,最典型的例子就是DFT与FFT。DCT(离散余弦变换)是另一种常用的正交变换,以一个直接的32×32的DCT变换为例,共需做1024次乘法和992次加法。而采用了Lee提出的快速DCT变换方法后,对于同样的输入条件,只需做384次乘法和432次加法。 ??? 当然,快速算法的采用增加了数据移动的工作量,这也是许多DSP都支持FFT中特殊的位反转寻址的原因。因而在采用快速算法时,通常需要在运算量的减少和数据移动的增多之间作一个折中。总之,适当地采用快速算法,是进行DSP应用软件优化时首先要考虑的问题。 2.2 计算表格化 ??? 为了提高算法的实现效率,减少运行时计算的时间开销,应尽可能把一些运行时计算的参数做成查找表或常数数值,从而将运行时的计算转化为编译时的计算。这不仅适用于一些比较规整的参数表,对于一些并不规整的运行时计算,特别是比较耗时的计算(如浮点除),也应尽量使之表格化。 2.3 数组指针化 ??? 在C语言程序中,对数组的寻址是非常耗时的,特别是对多维数组。因此,首先应降低数组的维数,再进一步使之指针化。 ??? 程序1是未经优化的C程序,它对输入数组in[32]进行蝶型变换,得到两个输出数组even[16]和odd[16]。将数组指针化后,得到程序2中的优化代码。 程序1:采用数组的C程序 void Bufferfly(short *in) { short even[16], odd[16]; short i; for(i = 0; i 16; i++) { even[i] = in[i] + in[31-i]; odd[i] = in[i] - in[31-i]; } } 程序2:采用指针的C程序 void Bufferfly(short *in) { short even[16], odd[16]; short *in_ptr, *even_ptr, *odd_ptr; short i; in_high_ptr = in[31]; even_ptr = even; odd_ptr = odd; for(i = 0; i 16; i++) { *even_ptr++ = (*in) + (*in_high_ptr); *odd_ptr++ = (*in++) - (*in_high_ptr- - ); } } ??? 显然,采用数组的C程序表达清晰,可读性好,但效率很差。与之相反,采用指针的C程序不用计算指针地址,只需将指针增量

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档