DSP编程技巧之22_第1页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、dsp编程技巧之22 假如你嫌自己计算棘手的话,可以借助matlab的指令来求取它们的转换,例如,在matlab的指令窗口中输入: q = quantizer('fixed', 'ceil', 'saturate', 32 30);fixednum=bin2dec(num2bin(q,1.999999999);回车之后就可以看到1.999999999转成q30之后的定点数了。弄清晰了单个浮点数和定点数之间的转换关系,接下来就需要了解一下两个定点数所代表的浮点数举行运算时,是如何转换的了。按照乘法的结合律、分配率,浮点数转换之后的定点数是可以挺直运

2、算的,例如:1. 不同q格式的转换设有定点数fixed1=float1*2q1,假如把它用为q2这个不同精度/表示范围的定点数来表示,则有fixed2=float1*2q2。所以不同的q格式挺直的转换为:fixed2=fixed1*2q2/2q1=fixed1*2(q2-q1)由于fixed1、fixed2都是定点数,所以在c编程的状况下,我们可以用法高效的左移、右移操作来完成这个乘以2(q2-q1)的操作。2. 两个相同q格式的定点数:fixed1=float1*2qfixed2=float2*2q则加法操作为:float1+float2=fixed1/2q+fixed/2q=(fixed1

3、+fixed2)/2q对于上述的加法操作,假如定点数的和fixed1+fixed2超过了32位整数的极值,则会发生溢浮现象,造成结果的不正确,此时我们只能先损失一倍的精度,把float1、float2的q值变为q-1.乘法操作为:float1*float2=fixed1/2q*fixed/2q= fixed1*fixed2/2(2q)同样的道理,假如fixed1*fixed2之后的定点数超过了32位整数的极值,则我们也需要提前对它们举行一下折算,变换一下它们的q值。这就涉及到对结果的一个预估问题,也是定点编程不如浮点编程容易、高效的不足之一。3. 两个不同q格式的定点数:fixed1=floa

4、t1*2q1fixed2=float2*2q2运算的规章是结合了前面的两种状况,只不过多了额外的转换工作:要么把其中的一个q1格式的定点数先转换为另一个q2格式,要么把它们都转换为一个中间值q3格式的定点数,然后再举行运算。这些运算虽然并不复杂,但是假如在数学运算比较多的状况下,一个个的举行手工转换还是比较棘手的,还好在近些年的处理器特殊是芯片中,在其bootrom中都内置了强大的数学表来协助我们完成这些转换工作,我们只要根据一定的格式举行书写,那么编译器就会自动调用相关的库函数来完成了。以ti的c28x系列dsp为例,我们可以用法现成的iqmath库来完成这些繁琐的工作。它的用法办法示例为1

5、)在工程属性中引用iqmath.lib库文件2)在用法iqmath库函数的主程序中引用相关的头文件:includedefine pi 3.14159_iq input, sin_out;void main(void )/* 0.25 x pi radians represented in q29 format*/input=_iq29(0.25*pi);sin_out =_iq29sin(input);其中,我们可以在头文件中指定一个全局的q格式,在不需要特殊指定q值的时候,用法默认的值。例如,在头文件中define q 28,则我们在程序中调用iqmath库函数时,sin_out =_iqs

6、in(input);/用法全局定义的q28格式sin_out =_iq29sin(input); /特殊指定用法q29格式默认状况下,编译器用法的q格式是24,假如追求更高的精度,则可以用法更大的q值,但是相应地表示的浮点数的范围也要小,此时可以考虑用法标么值,使得大部分变量的值都处在-1到1的区间内。此外,在编程时,调用方式是_iqsin(input),在c+编程时,则挺直用法iqsin(input)就可以了。3)在cmd链接文件中指明iqmath数学表的位置:例如,对于281x器件:memorypage 0:pramh0 (rw) : origin = 0x3f8000, length =

7、 0x001000page 1:iqtables (r) : origin = 0x3ff000, length = 0x000b50dramh0 (rw) : origin = 0x3f9000, length = 0x001000sectionsiqmathtables : load = iqtables, type = noload, page = 1iqmathtablesram : load = dramh0, page = 1iqmath : load = pramh0, page = 0对于2833x器件:memorypage 0:praml0 (rw) : origin = 0

8、x008000, length = 0x001000page 1:iqtables (r) : origin = 0x3fe000, length = 0x000b50iqtables2 (r) : origin = 0x3feb50, length = 0x00008cdraml1 (rw) : origin = 0x009000, length = 0x001000sectionsiqmathtables : load = iqtables, type = noload, page = 1iqmathtables2 > iqtables2, type = noload, page =

9、 1iqmath.lib (iqmathtablesram)iqmathtablesram : load = draml1, page = 1iqmath : load = praml0, page = 0对于280x器件:memorypage 0:praml0 (rw) : origin = 0x008000, length = 0x001000page 1:iqtables (r) : origin = 0x3fe000, length = 0x000b50iqtables2 (r) : origin = 0x3feb50, length = 0x00008ciqtables3 (r) :

10、 origin = 0x3febdc, length = 0x0000aadraml1 (rw) : origin = 0x009000, length = 0x001000sectionsiqmathtables : load = iqtables, type = noload, page = 1iqmathtables2 > iqtables2, type = noload, page = 1iqmath.lib (iqmathtablesram)iqmathtables3 > iqtables3, type = noload, page = 1iqmath.lib (iqma

11、thtablesram)iqmath : load = praml0, page = 0为了便利数学运算的高效处理,iqmath库中还包含了常用的数学运算函数,包括:1. 格式转换iqn浮点转定点,iqntof定点转浮点,atoiqn字符串转定点,iqntoa定点转字符串,iqnint返回定点数的整数部分,iqnfrac返回定点数的小数部分,iqtoiqn和iqntoiq为指定q格式与全局q格式的互转,iqtoqn和qntoiq为32位与16位互转,iqmpy2, 4, 8.64即左移,iqdiv2, 4, 8.64即右移2. 算数运算iqnmpy和iqnrmpy:乘法,iqnrsmpy为带饱和的乘法。iqnmpyi32和iqnmpyi32int为定点数与32位整数的乘法,iqnmpyi32frac可返回结果的小数位数。qnmpyiqx:不同q格式的定点数相乘。iqndiv:除法运算。3. 三角运算包括iqnasin,iqnsi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论