DSP常见算法的实现.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
DSP常见算法的实现

3.6 常见的算法实现 在实际应用中虽然信号处理的方式多种多样,但其算法的基本要素却大多相同,在本节中介绍几种较为典型的算法实现,希望通过对这些例子(单精度,16bit)的分析,能够让大家熟悉DSP编程中的一些技巧,在以后的工作中可以借鉴,达到举一反三的效果。 函数的产生 在高级语言的编程中,如果要使用诸如正弦、余弦、对数等数学函数,都可以直接调用运行库中的函数来实现,而在DSP编程中操作就不会这样简单了。虽然TI公司提供的实时运行库中有一些数学函数,但它们所耗费的时间大多太长,而且对于大多数定点程序使用双精度浮点数的返回结果有点“大材小用”的感觉,因此需要编程人员根据自身的要求“定制”数学函数。实现数学函数的方法主要有查表法、迭代法和级数逼近法等,它们各有特点,适合于不同的应用。 查表法是最直接的一种方法,程序员可以根据运算的需要预先计算好所有可能出现的函数值,将这些结果编排成数据表,在使用时只需要根据输入查出表中对应的函数值即可。它的特点是速度快,但需要占用大量的存储空间,且灵活度低。当然,可以对上述查表法作些变通,仅仅将一些关键的函数值放置在表中,对任意一个输入,可根据和它最接近的数据采用插值方法来求得。这样占用的存储空间有所节约,但数值的准确度有所下降。 迭代法是一种非常有用的方法,在自适应信号处理中发挥着重要的作用。作为函数产生的一种方法,它利用了自变量取值临近的函数值之间存在的关系,如时间序列分析中的AR、MA、ARMA等模型,刻画出了信号内部的特征。因为它只需要存储信号模型的参量和相关的状态变量,所以所占用的存储空间相对较少,运算时间也较短。但它存在一个致命的弱点,由于新的数值的产生利用了之前的函数值,所以它容易产生误差累积,适合精度要求不高的场合。 级数逼近法是用级数的方法在某一自变量取值范围内去逼近数学函数,而将自变量取值在此范围外的函数值利用一些数学关系,用该范围内的数值来表示。这种方法最大的优点是灵活度高,且不存在误差累积,数值精度由程序员完全控制。该方法的关键在于选择一个合适的自变量取值区间和寻找相应的系数。 下面通过正弦函数的实现,具体对上述三种方法作比较。 查表法较简单,只需要自制一张数据表,也可以利用C5400 DSP ROM内的正弦函数表。 迭代法的关键是寻找函数值间的递推关系。假设函数采样时间间隔为T,正弦函数的角频率为,那么可以如下推导: 令 等式的左边展开为 等式的右边展开为 对比系数,可以得到。令,便可以得到如下的递推式: 令,逐一迭代就能够获得采样间隔为T的正弦序列了。从迭代公式可以更清楚地看出,这种方法存在误差累积。 再来看级数逼近法,首先需要寻找一个合适的自变量取值区间和寻找相应的系数。从正弦函数的对称性可知,只需要计算取值在内的函数就可以推断出所有取值范围内的函数。接下来寻找系数,对于可以作如下变换,那么y的取值范围在内,而sin_new( )与sin( )同构,所以在下面的分析中将sin_new( )替代sin( ),提到的正弦函数即指sin_new( )。若汇编编程时采用的数据为Q15格式,那么取值与实际的弧度的对应关系如下图所示。 图3- 算法取值与弧度的对应关系 在内,正弦函数的修正级数(五次)展开如下式: 根据上式,可以写出正弦函数的生成程序。 ;compute polynomial stlm A, T ;T=x stm #SinePolyCoeff, AR2 ld *AR2+, 16, A ;AH=c5 ld *AR2+, 16, B ;BH=c4 poly *AR2+ ;A=c5*x+c4 poly *AR2+ ;A=c5*x^2+c4*x+c3 poly *AR2+ ;A=c5*x^3+c4*x^2+c3*x+c2 poly *AR2+ ;A=c5*x^4+c4*x^3+c3*x^2+c2*x+c1 mpya A sfta A, 3 ;adjust AH to Q15 SinePolyCoeff: ;in Q12 format .word 0x1cce ; 1.800293 (coef for x^5 = c5) .word 0x08b7 ; 0.5446778 (coef for x^4 = c4) .word 0xaacc ; -5.325196 (coef for x^3 = c3) .word 0x0053 ; 0(coef for x^2 = c2) .word 0x3240 ; 3.140625 (coef for x^1 = c1) 在编程过程中,使用到了POLY语句,它能够使多项式的计算简洁快速地完成。该函数的结果可以通过实验X来验证。

文档评论(0)

shenlan118 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档