DSP编程技巧之22详解浮点运算的定点编程
浮点运算和定点运算
浮点运算和定点运算
随着计算机技术的不断发展,浮点运算和定点运算在计算机的数
值计算中扮演着重要的角色。
浮点运算常用于科学计算和工程等领域,而定点运算则常用于嵌入式系统和控制系统等领域。
浮点运算,顾名思义,即使用浮点数进行计算的运算方法。
浮点
数包含一个小数和指数两部分,例如1.23E-03即表示1.23乘以10的
负3次方。
浮点运算优点在于精度更高,可以进行精确的小数运算,
但同时需要更高的计算资源和运算时间。
浮点运算一般使用IEEE 754
标准进行规范和实现。
然而,对于实时性要求较高的控制系统来说,定点运算则更为适用。
定点运算即使用固定小数进行计算的运算方法。
定点数同样包含
小数和整数两部分,但是小数点的位置是固定的,例如0.05即表示5
乘以10的负2次方。
定点运算可以用较少的资源完成简单的小数运算,具有精度高、效率高的特点。
总的来说,浮点运算和定点运算相互补充,各自有其应用场景。
在实际开发中,需要根据具体的应用场景选择适合的运算方法,并结
合算法和硬件实现来提高计算性能和精度。
同时,需要注意浮点数计
算的舍入误差和定点数计算的溢出和截断误差,避免对最终计算结果
造成影响。
因此,我们需要在实际应用中进行综合分析,理解和掌握浮点运算和定点运算的原理和实现方法,选择合适的运算方式,提高计算效率和精度,从而实现更加高效、精确的计算。
定点DSP——精选推荐
定点DSP譬≈≯.j§蠹等鼍一≯|鼍毒ll|0誊.定点DSPC55X实现浮点相关逗算■大连海事大学孙兴邦刘亮夏志忠引言DSP结构可以分为定点和浮点型两种.其中,定点型DSP可以实现整数,小数和特定的指数运算,它具有运算速度快,占用资源少,成本低等特点;灵活地使用定点型DSP进行浮点运算能够提高运算的效率.目前对定点DSP结构支持下的浮点需求也在不断增长,主要原因是: 实现算法的代码往往是采用C/C++编写,如果其中有标准型的浮点数据处理,又必须采用定点DSP器件,那么就需要将浮点算法转换成定点格式进行运算.同时,定点DSP结构下的浮点运算有很强的可行性,因为C语言和汇编语言分别具有可移植性强和运算效率高的特点,因此在定点DSP中结合C语言和汇编语言的混合编程技术将大大提高编程的灵活度,以及运算速度.大多数DSP的开发工具只是在C语言的基础上支持标准的浮点运算,而定点DSP硬件一般都是面向定点的运算,不支持标准的浮点运算,缺乏硬件的支持极大地限制了浮点的应用,因而标准的浮点运算在实际定点DSP 应用中并不多见.C55O9是一款16位定点DSP.在本文中,对C55O9输入FTSK信号,用C语言和汇编语言混合编程的方式对输入浮点型的FTSK信号进行相关运算,并输出浮点运算结果.这种方法的特点是:在C语言中方便地进行数据格式转化,在汇编语言中进行乘法和加法运算,既达到很高的运算精度,又极大地提高了运算效率.1定点DSPC语言开发环境中的浮点数据格式在定点DSP中,整型数是用16位二进制格式来存储的,但是DSP的C语言和汇编语言中定义的单精度浮点型数据都是标准C语言浮点表示格式.这种格式在C55X中,符合IEEE754标准.它定义了单精度32位和双精度64位的格式.32位IEEE754单精度标准中,第一位是符号位,其后8位用来存放指数,最后23位用来存放小数尾数,如下:l符号位I指数lMSB尾数LSBll32位I31位一24位l23位一1位l在IEEE754单精度浮点标准中,明确包含了符号位,第32位用作符号位.尾数进行了归一化,以产生一个1.f 格式的数,,是小数部分,占用分配的23位.因为规格化的数最左一位总是1,所以不需要存储该位,在该格式中它是隐式的.这样一个位的尾数实际上存放了一个+1位数.为使尾数规格化,指数被适当增减,来跟踪规格化所需的左右移位数以及小数点.最常用的是用8位指数表示0~255,即0%e%255:z一(一1)×2(1.,)其中:S是符号位,0为正数,1为负数;e是指数位,无符号8位;f是尾数的小数部分,23位.例如:IEEE754格式下浮点正数00110001001111100 000000100000000的十进制表示为:符号位一0(因为它是一个正数)尾数一1+2+2+2+2+2+2一1.48440551758指数一2+2+2一98十进制等值数一1.48440551758×2.'一2.76492073681×l0IEEE754格式下浮点负数11100001010101100000000000000000的十进制表示为:符号位一1(因为它是一个负数)尾数一1+2+2+2+2一1.6875指数一2+2+2一194十进制等值数一一1.6875×2""一一2.49031044995×10.2相关运算的实现2.1数据提取方式在本软件设计中,FTSK输人数据的频率包含800Hz,I200Hz,I600Hz,2020Hz,通过相关运算提取80074《平方机乌嵌入式系惋应冈》l圈匝l田_盈唧***************.cn(F告专用)Hz信号.具体参数是:FTSK输入数据的采样率为8000Hz.相关运算输入数据:每次运算对输入数据先提取1600个点,并分离出这些数据的最后40个点;然后对下一个输入数据提取1600个点,并把刚才取的40个点加在这1600个点后面组成1640长度的数组,作为相关运算的输入.这样做的原因是,最大限度地消除每次提取的1600个点相邻部分的影响,提高相关输出的精准度.相关运算的输入数据都为浮点型,而通过MATLAB仿真计算出来的系数也都为小于1的浮点数.通过在C语言中调用汇编语言,在定点C5509中实现此浮点运算,并输出用800Hz相关运算提取出的波形.2.205509中实现浮点运算方法此相关运算的输入是浮点型数据,相关系数是小于1的单精度浮点型数.对于定点DSP,由于不能直接进行浮点数的乘法运算,因此必须对输入数据进行类型转换.首先,相关运算的输入数据是FTSK浮点数据.在C语言中,单精度浮点数据是以IEEE754标准存储的32位数据,而C5509中C语言调用汇编语言,是通过寄存器AR0 从C语言传递给汇编语言的是数据指针,这个指针是指向16位数据的,所以相关的输入32位浮点数要先转化为l6位整型数据.本文这样实现:C程序中先把浮点数据乘以10后(提高运算精度),强制类型转化为整型数据,然后把此16位数据的指针赋给调用汇编的入口参数,即通过寄存器AR0传递到汇编程序中.然后,在汇编程序中, 相关的系数是小于1的小数;在DSP中,汇编语言直接定义的格式是将其转换为16位二进制2的补码表示形式(例如0.8用8×32768/10来表示).从汇编程序入口进入的,经过强制类型转换的整型数据也是以16位二进制形式存储的,通过与16位的小数相乘得到的是32位数, 存储在累加器A中.其中,前16位是运算结果的整数部分,后16位是小数部分.由于从汇编语言程序返回C程序的参数是16位的,故取运算结果的高16位(此前已经把输入数据乘以10,最大限度地提高了运算精度,这里直接取高16位).把这16位数据返回C程序,得到整型数据,再强制类型转化为单精度浮点型数据,再除以1O,即得到了最后相关运算的结果.经实际运算检验,通过这种方法在C55O9里进行浮点运算,最终结果实现了很高的精度,而且通过调用汇编语言,极大地提高了运算的效率.2.3仿真实际在用户板上用TI公司提供的CCSEmulator调试程序,实现了硬件仿真;而对此DSP算法来说,也可用TI公司提供的软件仿真器(Simulator)实现软件仿真.TI公司提供的软件CCS中有一项强大的探测点功能.它是一个开发算法的工具,将计算机数据文件传送到目标板或计算机的缓冲区中提供DSP软件应用,而且可以通过CCS提供的图形窗口观察输入/输出数据波形. 本次算法设计中利用CCS的断点和探测点进行数据的输入,利用图形窗口观察输入/输出的波形.2.4实际运算的结果分析从输入波形可以看到,有4种不同的频率,可以算出最低频率是800Hz,经过800Hz相关运算得出的输入波形与输出波形对比如图1所示.在图1中,可以看到输入波形中频率最低的波形.2个波峰时间差(即周期)是0.0054—0.00416—0.00124S, 取倒数是806.45,所以此波形是800Hz部分;再看输出波形,4个尖峰正好分别对应输入4个800Hz频率分量. 如果在后面再加上低通滤波器,就可以滤出更平滑的曲线,如图2所示.2.5测试程序运行时间CCS中提供了一种评价器(profiler).它通过收集在图1800Hz相关运算的输入/输出波形图对比...,...一...,蚺擅士田,.........R_—u一十 (75)图2相关运算结果经过低通滤波后的波形图指定代码区间程序执行的统计性能,确定程序中各段所花费的处理器时间,从而识别并消除性能发挥的瓶颈,缩短程序的执行时间,使程序更有效;利用评价器分析可以确定执行某个特殊的函数花费了多少个时钟周期,以及对它调用的频繁度等.本设计中相关浮点运算通过C语言编程和C,汇编语言混合编程两种方式的对比,用CCS提供的评价器可以测出,调用汇编语言的方式比纯C语言编程方式,速度提高了51.2.结语在定点DSP中进行浮点运算,要经过复杂的数据格式转化,因此用定点DSP取代浮点DSP,在降低设备成本的情况下,必定会提高研发的成本.如果直接把IEEE754标准的32位单精度浮点数据转化为16位整型数,要经过相当复杂的过程,在满足一定精度的前提下,可以使用本文的转化方式.使用C语言和汇编语言混合编程的方法,达到了大大提高运算效率的目的,不失为很灵活的编程方法.簟参考文献[1][英]AndrewBateman,lainPaterson—Stephens.TheDSP HandbookAlgorithms,ApplicationsandDesignTechniques,2003.[2]胡庆钟,李小刚,等.TMS320C55XDSP原理,应用和设计I-M].北京:机械工业出版社,2006.r3]程佩青.数字信号处理教程I-M].第2版.北京:清华大学出版社,2002.[4]IEEEStandardforBinaryFloating—PointArithmetic.孙共舞甏硕壬篷妥研宽蠢氟惫逸拣馆恕骞跷.壤1琵x譬薯鼍赣!罄l季|-毫誊曩:秀誊誊叠.一j.孽|叠蘩孽誊鼙{瓤篱2Q鹬篱警警誊鏊罄高线性度620~1100MHz正交调制--器--一凌力尔特公司(LinearTechnologyCorporation)推出的新型高性能正交调制器LT557i,针对850"-965MHzGSM,CDMA200o,舞ISM和RFID调制器应用进行了优化.该器件接受I(同相)和Q(正交相位)基带信号并将其直接调制至射频信号..0或低中频(IF)发射器架构使基站设计师能够实现高性能,同时降低功耗并减少器件数,因此可以缩小系统尺寸并降低系统成本.该器件具有卓越的线性度,在900MHz时OIP3(输出3阶截取点)为21.7dBm,OIP2(输出2阶截取点)为63.8dBm,I~I时在采用5V电源时仅消耗97mA静态电流.LT5571的输出噪声层为一159dBm/Hz,并具有一42dBm的低LO泄漏.它在900MHz时的镜频抑制为一53dBc.LT5571满足或超过了GSM蜂窝基站以及其他高性能无线基础设施发射器所要求的动态范围LT5571是一种高度集成的芯片,内含2个匹配的高线性度混频器,1个5OQL0输入缓冲器,1个精确的O./90.LO移相器和1个工作频带为62O~1100MHz的片上射频输出变压器.这个射频变压器汇总来自I通道扣Q通道混频器的已调制信号,产生一个单端5OQ匹配输出.同样,L0输入也是单端的,从而减少了所需的外部组件数并减轻了设计工作的负担.LT5571的2个片上混频器是内部平衡的,因此其L0泄漏性能非常好.凭借0dBm的L0输入功率,在未经校准的情况下,至RF输出的泄漏达到一42dBm(在900MHz).同样,片内精准移相器的准确度优于0.5.,从而实现了一53dBc 的未校准镜频抑制性能.如果需要,还可以通过校准将镜频抑制并把L0泄漏性能改善到优于一70dBc.LT5571的高阻抗I和Q输入具有0.5VDC共模偏置,允许灵活的AC或DC耦合以及简单连接至多个D/A转换器或基带驱动电路.LT5571用单5V电源电压工作,典型工作电流为97mA.该器件可以用ENABLE引脚关断.在禁止工作时,该芯片消耗的最高静态电流为100A,以降低功耗.就半双工或时分复用工作模式而言,该芯片可以利用ENABLE引脚迅速接通和关断.7《聋卉缸j入:泰刍埔…A~n.+…nfr'-垂击田,。
DSP数的表示:定点小数Q格式表示和加法
DSP数的表示:定点小数Q格式表示和加法•DSP数的表示:定点小数Q 格式表示和加法o在低开销DSP上表示小数o Q格式o小数点位置选择o Q格式举例o符号扩展o Q格式加法o使用保护位(guard bit)防止溢出o总结本文翻译自定点表示是的我们可以在低开销的整数硬件上使用小数运算。
本文首先介绍小数表示方法Q格式,然后给一些定点加法的例子。
在低开销DSP上表示小数为了降低开销,很多数字信号处理器都设计成只能进行整数算术运算。
为了在这些处理器上表示小数,我们可以使用隐含小数点。
例如,8bit字a=010101102a=010101102,单被当做整数时表示86108610。
然而,我们可以假设存在一个隐含的小数点,并把该数理解为一个小数。
假设小数点在第4和第5个bit之间,例如,a=0101.01102a=0101.01102。
我们可以通过以下公式得到该数等价的十进制的值:a=0×23+1×22+0×21+1×20+0×2−1+1×2−2+1×2−3+0×2−4=5.375a=0×23+1×22+0×21+1×20+0×2−1+1×2−2+1×2−3+0×2−4=5.375在这个例子中,我们用4bit表示整数部分,4bit表示小数部分。
从这个例子我们可以看到,小数点右边第一个bit的系数为0.5,第二个为0.25,以此类推。
需要注意这个隐含的小数点并没有在硬件上表达,程序猿需要假设一个合适的缩放因子来正确的解释计算结果。
在上面的例子中,硬件上只存储8bit数a=010101102a=010101102。
如果程序员想要用a表示5.375,就需要记住使用a进行的任何运算结果,都需要乘以一个缩放因子2−42−4。
Q格式小数点位置不同,同一个二进制数可以表示不同的值。
剖析DSP编程优化的7个方法
剖析DSP编程优化的7个方法方法一把浮点运算改成定点运算因为C6x DSP板并不支持浮点运算,但我们的原始程序代码是浮点运算的格式,所以必须改成定点运算,而其修改后的执行速度也会加快很多。
我们采用Q-format 规格来表示浮点运算。
以下将介绍其相关原理。
定点DSP使用固定的小数点来表示小数部份的数字,这也造成了使用上的限制,而为了要分类不同范围的小数点,我们必须使用Q-format的格式。
不同的Q-format表示不同的小数点位置,也就是整数的范围。
Q15数字的格式,要注意在小数点后的每一位,表示下一位为前一位的二分之一,而MSB (most-significant-bit ) 则被指定成有号数( Sign bit )。
当有号数被设成0而其余位设成1时,可得到最大的正数(7FFFH ) ;而当有号数被设成1而其余位设成0时,可得到最大的负数( 8000H ) 。
所以Q15格式的范围从-1到0.9999694 (@1) ,因此我们可以藉由把小数点向右移位,来增加整数部份的范围,Q14格式的范围增为-2.0到1.9999694 (@2) ,然而范围的增加却牺牲了精确度。
方法二建立表格( table )原来程序的设计是除了要读AAC的档案外,在译码时,还要再另外读取一些C语言程序代码的内容再做计算,如读取一些数值做sin、cos、exp的运算,但是为了加快程序的执行速度,故将这这些运算的结果建成表格,内建在程序中,可以不必再做额外的计算动做,以加速程序。
方法三减短程序的长度1.去除Debug的功能原本程序在Debug的阶段时,就加了许多用来侦测错误的部份,程序Debug完后,已经没有错误发生,所以就可以把这些部份给去除,以减少程序的长度,也可以减少程序执行时的时脉数,加快程序的速度。
2.去除计算时脉( clock ) 功能原本程序可以计算执行程序所需的时脉数,我们也可以把这些部份给去除,如果有需要计。
DSP定点与浮点的区别
DSP定点与浮点的区别可能对于入门级的dsp开发者有所帮助。
本文关注定点dsp与浮点dsp的对比,主要从三个方面来分析。
感谢我所引用的资料的作者。
一般来说,定点dsp处理器具有速度快,功耗低,价格便宜的特点;而浮点dsp处理器则计算精确,动态范围大,速度快,易于编程,功耗大,价格高。
1、宏观上的区别从宏观上讲,浮点dsp比定点dsp的动态范围大得多。
定点运算中,程序员必须时刻关注溢出的发生,为了防止溢出,要么不断进行移位定标,要么做截尾。
前者耗费大量时间和空间,后者则带来精度的损失。
相反,浮点运算dsp扩大了动态范围,提高了精度,节省了运算时间和存储空间,因为大大减少了定标,移位和溢出检查。
举个例子(来自/s/blog_518dfe5b0100e17w.html)定点的计算不过是把一个数据当作整数来处理,通常AD采样来的都是整数,这个数相对于真实的模拟信号有一个刻度因子,大家都知道用一个16位的AD去采样一个0到5V的信号,那么AD输出的整数除以2^16再乘以5V就是对应的电压。
在定点DSP中是直接对这个16位的采样进行处理,并不将它转换成以小数表示的电压,因为定点DSP无法以足够的精度表示一个小数,它只能对整数进行计算。
而浮点DSP的优势在于它可以把这个采样得到的整数转换成小数表示的电压,并不损失精度(这个小数用科学记数法来表示),原因在于科学记数法可以表示很大的动态范围的一个信号,以IEEE754浮点数为例,单精度浮点格式: [31] 1位符号 [30-23]8位指数 [22-00]23位小数这样的能表示的最小的数是+-2^-149,最大的数是+-(2-2^23)*2^127.(这里不去研究这个最小最大范围是如何计算出来的)动态范围为20*log(最大的数/最小的数)=1667.6dB 这样大的动态范围使得我们在编程的时候几乎不必考虑乘法和累加的溢出,而如果使用定点处理器编程,对计算结果进行舍入和移位则是家常便饭,这在一定程度上会损失是精度。
DSP学习笔记(二)——DSP中浮点数与定点数格式与运算处理
DSP学习笔记(⼆)——DSP中浮点数与定点数格式与运算处理DSP学习笔记(⼆)——DSP中浮点数与定点数格式与处理1 DSP中的数据表述DSP中数据通常是有定点数与表⽰,其中可以对字长进⾏相关定义,可以选取字长为16位、24位、32位不同字长使⽤。
⽽格式与字长决定了数据的精度与动态范围,同时也⼀定程度上决定了DSP处理器的功耗、成本与编程难度。
定点数:⼩数点位置为确定的。
浮点数:⼩数点位置可以改变。
定点运算的硬件实现较为简单,功耗较⼩,主要注意的是数据的定标、溢出以及误差。
器减结构较为复杂,但是精度较⾼,⾼级语⾔容易⽀持。
2 定点数的格式与相关运算2.1 定点数格式定点数格式:Q n 格式,n为⼩数位数。
即Q15 ,⼩数点右边有15个⼩数位,如果我们定义了⼀个长度为32位的数字,那么⼩数位为15,1位符号位,16位为整数位。
整数⼩数点固定在最后,定点数⼩数位固定使⽤上⽂的Q n 格式表⽰,两者都使⽤⼆进制补码形式表⽰。
例: Q4格式:01010011b=1·22+1·20+1·2-3+1·2-4=83/24=5.1875对于负数(最⾼位MSB为1),要先把它转化为⽆符号⼆进制数,再进⾏计算,最后加上负号。
图2-1 ⼆进制Q格式表⽰定点数与浮点数转化时需要使⽤2n 的关系进⾏转化。
转化关系如下图:图2-2 定点数与浮点数转化关系浮点数转换为定点数时,由于⼩数点后的位数有限,会产⽣截断误差。
2.2 数值范围与精度Qn 格式,字长为N数值范围: -2N-12n~2N-1-12n精度:12n由于符号位占1位,所以数据位为N-1,n越⼤范围越⼩,但精度越⾼。
图2-3 数值范围与精度2.3 动态范围数据格式中最⼤值与最⼩值之⽐即为动态范围。
N位定点数动态范围:分贝表⽰:dsp⼤多采⽤16位定点数,动态范围为90.3db。
Dsp⼤多采⽤16为定点数,运算硬件实现较为简单,更⼤动态范围应⽤可以使⽤拓展字长⽅式。
浮点数定点运算
DSP 芯片的定点运算1.数的定标在定点DSP 芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。
一个整型数的最大表示范围取决于DSP 芯片所给定的字长,一般为16 位或24 位。
显然,字长越长,所能表示的数的范围越大,精度也越高。
如无特别说明,本书均以16 位字长为例。
DSP 芯片的数以 2 的补码形式表示。
每个16 位数用一个符号位来表示数的正负,0 表示数值为正, 1 则表示数值为负。
其余15 位表示数值的大小。
因此二进制数0010000000000011b = 8195二进制数111111111111110019= -4对DSP 芯片而言,参与数值运算的数就是16 位的整型数。
但在许多情况下,数学_运算过程中的数不一定都是整数。
那么,DSP 芯片是如何处理小数的呢?应该说,DSP 芯片本身无能为力。
那么是不是说DSP 芯片就不能处理各种小数呢?当然不是。
这其中的关键就是由程序员来确定一个数的小数点处于16 位中的哪一位。
这就是数的定标。
通过设定小数点在16 位数中的不同位置,就可以表示不同大小和不同精度的小数了。
数的定标有Q 表示法和S 表示法两种。
表 3.1 列出了一个16 位数的16 种Q 表示、S 表示及它们所能表示的十进制数值范围。
从表 3.1 可以看出,同样一个16 位数,若小数点设定的位置不同,它所表示的数也就不同。
例如:16 进制数2000H= 8192,用Q0 表示16 进制数2000H= 0.25,用Q15 表示但对于DSP 芯片来说,处理方法是完全相同的。
从表 3.1 还可以看出,不同的Q 所表示的数不仅范围不同,而且精度也不相同。
Q 越大,数值范围越小,但精度越高;相反,Q 越小,数值范围越大,但精度就越低。
例如,Q0 的数值范围是-32768 到+32767 ,其精度为1 ,而Q15 的数值范围为-1 到0.9999695,精度为1/32768 =0.00003051 。
DSP芯片的定点运算之四非线性运算的定点快速实现
DSP芯片的定点运算之四非线性运算的定点快速实现在数值运算中,除基本的加减乘除运算外,还有其他许多非线性运算,如对数运算、开方运算、指数运算、三角函数运算等,实现这些非线性运算的方法一般有:(1)调用DSP编译系统的库函数;(2)查表法;(3)混合法。
下面分别介绍这三种方法。
1.调用DSP编译系统的库函数TMS320C2X/C5X的C编译器提供了比较丰富的运行支持库函数。
在这些库函数中,包含了诸如对数、开方、三角函数、指数等常用的非线性函数。
在C 程序中(也可在汇编程序中)只要采用与库函数相同的变量定义,就可以直接调用。
例如,在库函数中,定义了以10为底的常用对数log10():#include math.h double log10(double x);在C程序中按如下方式调用:float x,y;x=10.0;y=log10(x);从上例可以看出,库函数中的常用对数log10()要求的输入值为浮点数,返回值也为浮点数,运算的精度完全可以保证。
直接调用库函数非常方便,但由于运算量大,很难在实时DSP中得到应用。
2.查表法在实时DSP应用中实现非线性运算,一般都采取适当降低运算精度来提高程序的运算速度。
查表法是快速实现非线性运算最常用的方法。
采用这种方法必须根据自变量的范围和精度要求制作一张表格。
显然输入的范围越大,精度要求越高,则所需的表格就越大,即存储量也越大。
查表法求值所需的计算就是根据输入值确定表的地址,根据地址就可得到相应的值,因而运算量较小。
查表法比较适合于非线性函数是周期函数或已知非线性函数输入值范围这两种情况,例3.12和例3.13分别说明这两种情况。
例3.12已知正弦函数y=cos(x),制作一个512点表格,并说明查表方法。
由于正弦函数是周期函数,函数值在-1至+1之间,用查表法比较合适。
由于Q15的表示范围为-1至32767/32768之间,原则上讲-1至+1的范围必须用Q14表示。
浮点转定点算法
在定点的DSP或处理器中,实现一个浮点数的运算时一个非常复杂的事情,尤其是非四则运算的函数运算,例如三角函数运算,sin,cos,tan,又比如指数运算,exp,非整数的幂运算等等。
用机器来实现这样复杂的运算,会花费很多的计算指令周期。
在某些程度下,用定点整数去代替浮点运算,会很大程度的节省运算时间,是应用程序达到实时运算的效果。
一DSP定点算数运算1数的定标在定点DSP芯片中,采用定点数进行数值运算,其操作数一般采用整型数来表示。
一个整型数的最大表示范围取决于DSP芯片所给定的字长,一般为16位或24位。
显然,字长越长,所能表示的数的范围越大,精度也越高。
如无特别说明,本书均以16位字长为例。
DSP芯片的数以2的补码形式表示。
每个16位数用一个符号位来表示数的正负,0表示数值为正, l则表示数值为负。
其余15位表示数值的大小。
因此,二进制数0010000000000011b=8195二进制数1111111111111100b=-4对DSP芯片而言,参与数值运算的数就是16位的整型数。
但在许多情况下,数学运算过程中的数不一定都是整数。
那么,DSP芯片是如何处理小数的呢?应该说,DSP芯片本身无能为力。
那么是不是说DSP芯片就不能处理各种小数呢?当然不是。
这其中的关键就是由程序员来确定一个数的小数点处于16位中的哪一位。
这就是数的定标。
通过设定小数点在16位数中的不同位置,就可以表示不同大小和不同精度的小数了。
数的定标有Q表示法和S表示法两种。
表1.1列出了一个16位数的16种Q表示、S表示及它们所能表示的十进制数值范围。
从表1.1可以看出,同样一个16位数,若小数点设定的位置不同,它所表示的数也就不同。
例如,16进制数2000H=8192,用Q0表示16进制数2000H=0.25,用Q15表示但对于DSP芯片来说,处理方法是完全相同的。
从表1.1还可以看出,不同的Q所表示的数不仅范围不同,而且精度也不相同。
DSP-定点和浮点数格式解析
① 小数乘小数(n、m≠0,m≤ n) ② 整数乘小数(n≠0、m=0) ③ 整数乘整数(n=m=0)
① 小数乘小数(n、m≠0,m≤ n)
例:两个8位数相加,有溢出 进位位与最高位(MSB)不同 运算结果发生溢出,8位字长已不能正确地表示结果
10110000b( -80) + 10111111b( -65) 非饱和模式:101101111bቤተ መጻሕፍቲ ባይዱ-145)
00101001b( 41) + 01110011b(115) 非饱和模式:010011100b(156)
2)数值范围与精度
给定字长N,采用Qn格式表示小数
2 N 1 2 N 1 1 数值范围: n ~ 2 2n
精
度:
1
2n
16位字长Qn格式的数值范围与精度
Qn格式 Q15 数值范围 -1~0.999969482421875 精度 0.000030517578125
Q14
饱和模式:110000000b(-128)
饱和模式:001111111b(127)
溢出是由于字长有限,运算结果超出数值的表示范围引 起的
饱和模式
定点数减法运算的原理与加法运算相同
2)定点数的乘法运算
DSP处理器都有硬件乘法器和乘法指令,可实现单周期乘 法运算 二进制乘法运算包含一系列的移位和加法运算 定点数乘法运算不要求相乘数有相同的Qn格式 两个相乘数分别为Qn和Qm格式,字长为N,结果为 Q(n+m)格式,字长为2N 根据n和m的不同取值,定点数乘法运算可以分成三种情况
DSP 运算基础
• 1、 DSP的数据表示
• 2、定点数的格式与运算 • 3、浮点数的格式与运算
DSP编程技巧
DSP编程技巧DSP( Digital Signal Processing,数字信号处理)是一种通过对数字信号进行算法处理来获取信息的技术。
在DSP编程中,有一些技巧可以帮助提高程序的性能和效率。
下面是关于DSP编程的27种技巧。
1.使用定点数表示数据:定点数的运算速度更快,占用的存储空间更少,而且可以更好地适应硬件设计。
2.使用滤波器来处理信号:滤波器可以降低噪声和干扰,并提取出感兴趣的频率成分。
3.使用快速傅里叶变换(FFT):FFT可以将时域信号转换为频域信号,从而更容易分析信号的频率特性。
4.选择合适的窗函数:窗函数可以改善信号的频谱分析效果,减小谱泄露,提高分辨率。
5.使用多通道处理:如果有多个信号通道需要处理,可以使用多线程或并行处理来提高处理速度。
6.使用分块处理:如果信号很长,可以将其分成多个块来处理,以避免内存溢出的问题。
7.避免过量的I/O操作:减少I/O操作可以提高程序的效率,尽量使用缓冲区读写数据。
8.使用循环展开:循环展开可以减少循环的迭代次数,从而提高程序的运行速度。
9.使用矩阵运算:矩阵运算可以简化复杂的运算逻辑,提高程序的可读性和可维护性。
10.合理选择数据类型:合理选择数据类型可以减少存储空间的占用,提高程序的性能。
11.避免复杂的条件语句:复杂的条件语句会降低程序的执行效率,尽量简化条件判断,尽量避免使用浮点数的条件判断。
12.使用平移运算代替乘法运算:平移运算可以用来代替乘法运算,从而提高程序的运行速度。
13.使用循环缓存:循环缓存可以减少内存访问次数,从而提高程序的效率。
14.使用尽可能少的内存:减少内存的使用可以提高程序的性能,避免内存溢出问题,可以使用动态内存分配代替静态内存分配。
15. 使用预处理指令:使用预处理指令可以提高程序的效率和可读性,比如#define、#ifdef和#ifndef等。
16.优化算法:合理选择算法可以提高程序的运行速度和效率,比如使用快速傅里叶变换代替离散傅里叶变换。
DSP浮点运算
(2)使用指令 ST
转 换 要 点
T,EXPONENT
将保存在 T 寄存器中的指数存放到数据存储 器的据存储器 ; e1所指定的单元中。
T,@e1
(3)使用指令NORM
A 。
按T寄存器中的内容对累加器A进行归一化处理。这里 的将定点数转换成浮点数所进行的归一化处理,指通过 左移或右移,使一个二进制数变为一个小数,且小数点 后的第一个数不为零,移动的位数用指数表示。
转 换 要 点
(1)先将定点数放在累加器A或B中, 然后用指令:EXP A 或EXP B。
这是一条提取指数的指令, 所提取的指数保存在 T寄存器中。如果累加器A=0,则0→T;否则,累 加器A的冗余符号位数减8→T。 累加器A中的内容 不变。
例 5-16 提取 A=FF FFFF FFCB 中的指数值。 执行指令: EXP A 执行前 执行后 A=FF FFFF FFCB A=FF FFFF FFCB T= 0000 T= 0019 (25) 本例中,由于 A≠0,需要先求出 A 的冗余符号位并减去 8。 A=F F F F F F F F C B 1111 1111 1111 1111 1111 1111 1111 1111 1100 1011 33 位冗余符号位 1, 33-8=25=0x0019 例 5-17 提取 B=07 8543 2105 中的指数值。 执行指令: EXP B 执行前 执行后 B=07 8543 2105 B=07 8543 2105 T= 0007 T= FFFC (-4) 本例中,由于 B≠0,需要先求出 B 的冗余符号位并减去 8。 A= 0 7 8 5 4 3 2 1 0 5 0000 0111 1000 0101 0100 0011 0010 0001 0000 0101 4 位冗余符号位 0, 4-8=-4=0xFFFC -4=-(0x0004)=(1111 1111 1111 1011+1)补=(0xFFFC) 补
多内核DSP完美整合定点与浮点功能
低功耗:针对所蒋应用的低功耗 充分张胃 T突破性低功耗 s n e l 技术 。并可根据 l 持更低功耗的系统设计 , I ma R f x e 支 可在给定功率预算内实现更离的 环鲢条件动卷调节电潦电压。 处理功能 。 多内核特性:K y t n 架构包括多内核导航器 、改进的存储器架构、H p rn 接口、 e So e y eL k i 可全面使用D P S 内核 外 设 以及 协处 理 器 .减 少 给定 应 用所 PCl xpr sG en 2 S r l a il 以及其它外设等丰富的特性 .可实现内核与存储器存 需的D P E es e a pdO i R S 数量
更 好 ,其 结 构 更 清晰 ,核 之 间 的 管理 得 到极 大 加 强 。C 6 S 系 列采 用T y tn 多 内核 架构 , 6xD P I So e Ke
常快且 能实 时处理 任何任 务时其 灵活性 不足 。
日前 ,德 州 仪 器 ( I 推 出全 新 数 字 信 号 处 理器 不 但 可 最 大 限度 地 提 高 片 上 数 据 流 的 吞吐 量 ,而 T)
图1T多 内核架构 l
引脚 兼 容 型 多 内核 DS ,分 别 为T S 2C 62 P M 30 67、
T S 2 C 6 4 M S 2 C 6 8 以及 一款 4 通 M 3O 6 7 与T 3 0 6 7 , 核
信 片上 系统 ( o S C)T 3 0 6 7 。产 品主要特 MS 2 C 6 0
除 可 能 出现 的 瓶
颈 问题 ,
从 而 帮 助
开 发 人 员 全 面 利 用
新 一代 多内核D P S 整合定点与 浮 点 功 能
T y tn 架 构 第一 次 清晰 地 把 处 理 器 逐 IKe So e
DSP-定点和浮点数格式
0.0625 0.125 0.25
0.5 1
3)动态范围
动态范围:数据表示格式中可以表示的最大值与最小值之比
N位定点数的动态范围:
DR
=
fix
(2N
1
1
1) / 2n
/
2n
2N 1 1
用分贝表示为:
DRfix=20 log10 2N1 1 6.02(N 1) dB
00001000b - 00000110b 商数:00001101 余数:00000010b
⑥ ⑦
00000100b - 00000110b 余数(丢弃):11111110b 商数:00011010 余数:00000100b
00001000b - 00000110b 商数: 00110101 余数:00000010b
① 小数乘小数(n、m≠0,m≤ n)
例:两个相乘数分别为Q7和Q6格式,8位字长
两个定点小数作乘法运算,结果左移一位,保存高位得到 运算结果,结果为Qm(m≤ n)格式
0.1000000b(0.5 Q7 )
01.100000b(1.5 Q6 )
000.1100000000000b(0.75 Q13)
对于负数(最高位MSB为1),要先把它转化为无符号二进制数,再进 行计算,最后加上负号
位
7 MSB
6
5
4
3
2
1
0 LSB
二进制补码 0
1
0
1
0
0
1
1
Q0
符号 26
252423源自222120
Q4
符号 22
21
20
定点DSP如何做浮点运算
定点DSP如何做浮点运算2008-10-16 08:46许多DSP芯片只支持整数运算,如果现在这些芯片上进行小数运算的话,定点小数运算应该是最佳选择了,此外即使芯片支持浮点数,定点小数运算也是最佳的速度选择。
在DSP 世界中,由于DSP芯片的限制,经常使用定点小数运算。
所谓定点小数,实际上就是用整数来进行小数运算。
下面先介绍定点小数的一些理论知识,然后以C 语言为例,介绍一下定点小数运算的方法。
在TI C5000 DSP系列中使用16比特为最小的储存单位,所以我们就用16比特的整数来进行定点小数运算。
先从整数开始,16比特的储存单位最多可以表示0x0000到0xffff,65536种状态,如果它表示C语言中的无符号整数的话,就是从0到 65535。
如果需要表示负数的话,那么最高位就是符号位,而剩下的15位可以表示32768种状态。
这里可以看出,对于计算机或者DSP芯片来说,符号并没有什么特殊的储存方式,其实是和数字一起储存的。
为了使得无论是无符号数还是符号数,都可以使用同样的加法减法规则,符号数中的负数用正数的补码表示。
我们都知道-1 + 1 =0,而0x0001表示1,那么-1用什么来表示才能使得-1 + 1 =0呢?答案很简单:0xffff。
现在就可以打开Windows的计算器,用16进制计算一下0xffff+0x0001,结果是0x10000。
那么 0x10000和0x0000等价麽,我们刚才说过用16比特来表达整数,最高位的1是第17位,这一位是溢出位,在运算寄存器中没有储存这一位,所以结果是低16位,也就是0x0000。
现在我们知道负数的表达方式了。
举个例子:-100。
首先我们需要知道100的16进制,用计算器转换一下,可以知道是0x0064,那么-100就是0x10000 - 0x0064,用计算器算一下得0xff9c。
还有一种简单的转换符号的方法,就是取反加一:把数x写成二进制格式,每位0变1,1变0,最后把结果加1就是-x了。
DSP编程技巧(共27讲)
了在编译程序时 CPU 的模式。补充一点是,cl2000 的帮助里看到的选项都是很长的名字,在 CCS 里面为了书写方
便(因为选项框就那么点面积啊),一般用别名来代替;没有别名的则直接使用选项名字。
处理器选项
别名
含义
--silicon_version=28 -v28
为 C28x 架构的 DSP 产生目标文件;不选择的话模式为 C27x 模式,也
4.归档器 archiver:也可以叫压缩器,看一下我们常用的压缩软件 winrar 的全称 winrar archiver 就不难 理解了。
5.实时支持库:包括标准 C 和 C++的运行支持函数、编译器公用程序函数、浮点运算函数和 C 编译器支持的 I/O 函数。
6.十六进制转换程序:把编译、链接等步骤生成的可执行文件,转换为十六进制文件,例如.HEX 格式,然后 可以烧写到 EEPROM、FLASH 等外部存储器之中。
具体说来,编译器的选项有多大 20 个大类,超过一百个具体的选项。当然这些选项是有轻重之分的,有的是
必须用到的,例如支持一下 FPU 等功能;有的则是不常接触的,例如 MISRA 这样的汽车工业软件可靠性检查,只有
在对软件进行标准化时才会用到。所以我们首先看一下最常用的选项,例如处理器的选项,它们的意义在于定义
2.汇编器的作用是将汇编语言代码转换为机器语言(目标文件),这里的汇编代码包括前面由 C/C++生成的汇 编代码和我们直接编写的汇编代码。
3.链接器是作用是把所有的库文件、目标文件等链接成为一个可执行的目标文件,其中包含程序的机器代码 和数据,以及其他用来链接和加载该程序所需的信息(在 TI DSP 上是 COFF 格式,通俗地讲就是.out 二进制文件), 同时根据内存地址的分配对各目标文件进行重定位,并解析外部参考,例如在一个源程序里引用另一个源程序中 定义的变量就可以理解为外部参考,假如一个目标文件引用了一个未定义的符号 symbol,则链接器搜索其他目标 文件中定义的全局符号,找到匹配的符号修补指令。否则报告一个错误;所以有时候编译所有程序完成在链接的 时候会提示 xxx symbol 为定义,说明对应的文件没有加到工程里面。
DSP中的浮点与定点比较
Q8
S7.8
-128 ≤ X ≤ 127.996 093 8
Abstract:This paper introduces the fixed-point data format and floating-point data format commonly used in DSP, compares the advantages and disadvantages of the two data formats,and puts forward some suggestions on the applicable scenarios and format selection.
1 浮点数据格式与定点数据格式
1.1 浮点数据格式
在计算机系统的发展过程中提出过多种方法表
示实数,但是目前为止使用最广泛的是浮点表示法。
IEEE(Institute of Electrical and Electronics Engineers, 电子电气工程师协会)在 I985 年制定的 IEEE 754(IEEE Standard for Binary Floating-Point Arithmetic,ANSI/IEEE Std 754-1985)二进制浮点运算规范,是浮点运算部件 的工业标准 [1]。
采用以下浮点表示格式表示 16 位浮点数,该格式
为 IEEE 745 标准的子集,除了能够完成要求的实数表 示外,处理上也更为简洁。总位宽 m=16 bit,格式如图 1 所示,用一个三元组 {S,E,M} 来表示一个数 N。
15 14
10 9
0
S
E
M
1 bit
n bit
(m-n-1) bit
图 1 三元组表示法举例
DSP中浮点转定点运算--浮点与定点概述
DSP中浮点转定点运算--浮点与定点概述⼀:浮点与定点概述1.1相关定义说明 定点数:通俗的说,⼩数点固定的数。
以⼈民币为例,我们⽇常经常说到的如123.45¥,789.34¥等等,默认的情况下,⼩数点后⾯有两位⼩数,即⾓,分。
如果⼩数点在最⾼有效位的前⾯,则这样的数称为纯⼩数的定点数,如0.12345,0.78934等。
如果⼩数点在最低有效位的后⾯,则这样的数称为纯整数的定点数,如12345,78934等。
浮点数:⼀般说来,⼩数点不固定的数。
⽐较容易的理解⽅式是,考虑以下我们⽇常见到的科学记数法,拿我们上⾯的数字举例,如123.45,可以写成以下⼏种形式:12.345x1011.2345 x1020.12345 x103……为了表⽰⼀个数,⼩数点的位置可以变化,即⼩数点不固定。
1.2定点数与浮点数的对⽐为了简单的把问题描述清楚,这⾥都是⼗进制数字举例,详细的分析,⼤家可以在后⾯的⽂章中看到。
(1)表⽰的精度与范围不同例如,我们⽤4个⼗进制数来表达⼀个数字。
对于定点数(这⾥以定点整数为例),我们表⽰区间[0000,9999]中的任何⼀个数字,但是如果我们要想表⽰类似1234.3的数值就⽆能为⼒了,因为此时的表⽰精度为1/100=1;如果采⽤浮点数来表⽰(以归整的科学记数法,即⼩数点前有⼀位有效位,为例),则可以表⽰[0.000,9.999]之间的任何⼀个数字,表⽰的精度为1/103=0.001,精度⽐上⼀种⽅式提⾼了很多,但是表⽰的范围却⼩了很多。
也就是说,⼀般的,定点数表⽰的精度较低,但表⽰的数值范围较⼤;⽽浮点数恰恰相反。
(2)计算机中运算的效率不同⼀般说来,定点数的运算在计算机中实现起来⽐较简单,效率较⾼;⽽浮点数的运算在计算机中实现起来⽐较复杂,效率相对较低。
(3)硬件依赖性⼀般说来,只要有硬件提供运算部件,就会提供定点数运算的⽀持(不知道说的确切否,没有听说过不⽀持定点数运算的硬件),但不⼀定⽀持浮点数运算,如有的很多嵌⼊式开发板就不提供浮点运算的⽀持。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DSP编程技巧之22详解浮点运算的定点编程我们使用的处理器一般情况下,要么直接支持硬件的浮点运算,比如某些带有FPU的器件,要么就只支持定点运算,此时对浮点数的处理需要通过编译器来完成。
在支持硬件浮点处理的器件上,对浮点运算的编程最快捷的方法就是直接使用浮点类型,比如单精度的float来完成。
但是在很多情况下,限于成本、物料等因素,可供我们使用的只有一个定点处理器时,直接使用float类型进行浮点类型的运算会使得编译器产生大量的代码来完成一段看起来十分简单的浮点数学运算,造成的后果是程序的执行时间显著加长,且其占用的资源量也会成倍地增加,这就涉及到了如何在定点处理器上对浮点运算进行高效处理的问题。
本文引用地址:/article/263475.htm 既然是定点处理器,那么其对定点数,或者说字面意义上的“整数”进行处理的效率就会比它处理浮点类型的运算要高的多。
所以在定点处理器上,我们使用定点的整数来代表一个浮点数,并规定整数位数和小数位数,从而方便地对定点数和浮点数进行转换。
以一个32位的定点数为例,假设转换因子为Q,即32位中小数的位数为Q,整数位数则为31-Q(有符号数的情况),则定点数与浮点数的换算关系为:定点数=浮点数×2^Q例如,浮点数-2.0转换到Q为30的定点数时,结果为:定点数=-2×2^30=-2147483648 32位有符号数的表示范围是:-2147483648到2147483647。
如果我们把有符号定点数的最大值2147483647转换为Q为30对应的浮点数,则结果为:浮点数2147483647/2^30=1.999999999 从上面的两个计算例子中也可以看出,在Q30格式的情况下,最大的浮点数只能表示到1.999999999,如果我们想把浮点数2.0转换为Q30的定点数,则产生了溢出,即造成了1e-9的截断误差。
在此我们列出Q0到Q30对应的范围和分辨率如下表所示:如果你嫌自己计算麻烦的话,可以借助Matlab的命令来求取它们的转换,例如,在Matlab的命令窗口中输入:q = quantizer('fixed', 'ceil', 'saturate', [32 30]);FixedNum=bin2dec(num2bin(q,1.999999999)); 回车之后就可以看到1.999999999转成Q30之后的定点数了。
弄清楚了单个浮点数和定点数之间的转换关系,接下来就需要了解一下两个定点数所代表的浮点数进行运算时,是如何转换的了。
根据乘法的结合律、分配率,浮点数转换之后的定点数是可以直接运算的,例如: 1. 不同Q格式的转换设有定点数Fixed1=Float1*2^Q1,如果把它用为Q2这个不同精度/表示范围的定点数来表示,则有Fixed2=Float1*2^Q2。
所以不同的Q格式直接的转换为:Fixed2=Fixed1*2^Q2/2^Q1=Fixed1*2^(Q2-Q1) 因为Fixed1、Fixed2都是定点数,所以在C编程的情况下,我们可以使用高效的左移、右移操作来完成这个乘以2^(Q2-Q1)的操作。
2. 两个相同Q格式的定点数:Fixed1=Float1*2^Q Fixed2=Float2*2^Q 则加法操作为:Float1+Float2=Fixed1/2^Q+Fixed/2^Q=(Fixed1+Fixed2)/2^Q 对于上述的加法操作,如果定点数的和Fixed1+Fixed2超过了32位整数的极值,则会发生溢出现象,造成结果的不正确,此时我们只能先损失一倍的精度,把Float1、Float2的Q值变为Q-1. 乘法操作为:Float1*Float2=Fixed1/2^Q*Fixed/2^Q=Fixed1*Fixed2/2^(2Q) 同样的道理,如果Fixed1*Fixed2之后的定点数超过了32位整数的极值,则我们也需要提前对它们进行一下折算,变换一下它们的Q值。
这就涉及到对结果的一个预估问题,也是定点编程不如浮点编程简单、高效的不足之一。
3. 两个不同Q格式的定点数:Fixed1=Float1*2^Q1 Fixed2=Float2*2^Q2 运算的规则是结合了前面的两种情况,只不过多了额外的转换工作:要么把其中的一个Q1格式的定点数先转换为另一个Q2格式,要么把它们都转换为一个中间值Q3格式的定点数,然后再进行运算。
这些运算虽然并不复杂,但是如果在数学运算比较多的情况下,一个个的进行手工转换还是比较麻烦的,还好在近些年的处理器特别是DSP芯片中,在其BootROM中都内置了强大的数学表来帮助我们完成这些转换工作,我们只要按照一定的格式进行书写,那么编译器就会自动调用相关的库函数来完成了。
以TI的C28x系列DSP 为例,我们可以使用现成的IQMath库来完成这些繁琐的工作。
它的使用方法示例为1)在工程属性中引用IQmath.lib库文件2)在使用IQMath库函数的主程序中引用相关的头文件:#include #define 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 =_IQsin(input);//使用全局定义的Q28格式sin_out =_IQ29sin(input); //特别指定使用Q29格式默认情况下,编译器使用的Q格式是24,如果追求更高的精度,则可以使用更大的Q值,但是相应地表示的浮点数的范围也要小,此时可以考虑使用标么值,使得大部分变量的值都处在-1到1的区间内。
此外,在C语言编程时,调用方式是_IQsin(input),在C++编程时,则直接使用IQsin(input)就可以了。
3)在CMD链接文件中指明IQMath数学表的位置:例如,对于281x器件:MEMORY{ PAGE 0: PRAMH0 (RW) : origin = 0x3f8000, length = 0x001000 PAGE 1: IQTABLES (R) : origin = 0x3FF000, length = 0x000b50 DRAMH0 (RW) : origin = 0x3f9000, length = 0x001000 } SECTIONS { IQmathTables : load = IQTABLES, type = NOLOAD, PAGE = 1 IQmathTablesRam : load = DRAMH0, PAGE = 1 IQmath : load = PRAMH0, PAGE = 0 } 对于2833x器件:MEMORY { PAGE 0: PRAML0 (RW) : origin = 0x008000, length = 0x001000 PAGE 1: IQTABLES (R) : origin = 0x3FE000, length = 0x000b50 IQTABLES2 (R) : origin = 0x3FEB50, length = 0x00008c DRAML1 (RW) : origin = 0x009000, length = 0x001000 } SECTIONS { IQmathTables : load = IQTABLES, type = NOLOAD, PAGE = 1 IQmathTables2 > IQTABLES2, type = NOLOAD, PAGE = 1 { IQmath.lib (IQmathTablesRam) } IQmathTablesRam : load = DRAML1, PAGE = 1IQmath : load = PRAML0, PAGE = 0 } 对于280x器件:MEMORY { PAGE 0: PRAML0 (RW) : origin = 0x008000, length = 0x001000 PAGE 1: IQTABLES (R) : origin = 0x3FE000, length = 0x000b50IQTABLES2 (R) : origin = 0x3FEB50, length = 0x00008c IQTABLES3 (R) : origin = 0x3FEBDC, length = 0x0000AA DRAML1 (RW) : origin = 0x009000, length =0x001000 } SECTIONS { IQmathTables : load = IQTABLES, type = NOLOAD, PAGE = 1 IQmathTables2 > IQTABLES2, type = NOLOAD, PAGE = 1 { IQmath.lib (IQmathTablesRam) } IQmathTables3 > IQTABLES3, type = NOLOAD, PAGE = 1 { IQmath.lib (IQmathTablesRam) } 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,IQNsin,IQNsinPU,IQNacos,IQNcos,IQNcosPU,IQNatan2,IQNatan2PU,IQNatan。