![]() |
|
||||||||||||||
| . 网站首页 . 新闻 . 新品 . 方案 . 专访 . 活动 . DSP . EDA . 评测室 . 技术文库 . 会员区 . 商城 . 服务导航 . 邮购 . 资源 . | ||
|
||
|
|||||
| ADSP2116x的几个常用算法库函数 | |||||
作者:61IC 文章来源:本站原创 点击数: 更新时间:2007-1-16 ![]() |
|||||
|
#include "def21160.h" #define pi2 1.570796326794897 .segment/pm pm_data; .var sine_data[10]="ts.dat"; .var cose_data[10]="tc.dat"; .var atan_data[50]="atan_data.dat"; .endseg; .segment/pm pm_code; .global divide; .global isqrt; .global clear_l; .global mode; .global mode_f; .global sine; .global cosine; .global arctan; ///////////////////////////////////////////////////////////////// /*除法: 输入:f0,f12,f11=2.0; 输出:f0=f0/f12; 改变的寄存器:f7,f12;*/ divide: f0=recips f12,f7=f0; f12=f0*f12; f7=f0*f7,f0=f11-f12; f12=f0*f12; f7=f0*f7,f0=f11-f12; rts(db),f12=f0*f12; f7=f0*f7,f0=f11-f12; f0=f0*f7; ////////////////////////////////////////////////////////////////// /*求平方根倒数: 输入:f0,f11=3.0,f1=0.5; 输出:f0=1/sqrt(f0); 改变的寄存器:f4,f12*/ isqrt: f4=rsqrts f0; f12=f4*f4; f12=f12*f0; f4=f1*f4,f12=f11-f12; f4=f4*f12; f12=f4*f4; f12=f12*f0; f4=f1*f4,f12=f11-f12; f4=f4*f12; f12=f4*f4; f12=f12*f0; rts(db),f4=f1*f4,f12=f11-f12; f4=f4*f12; f0=f4; ///////////////////////////////////////////////////////////////////// clear_l: l0=0;l1=0;l2=0;l3=0;l4=0;l5=0;l6=0; l7=0;l8=0;l9=0;l10=0;l11=0;l12=0;l13=0; rts(db); l14=0;l15=0; ////////////////////////////////////////////////////////////////////// /*求一个定点数的余数 input: r0,r12 (r0/r12),f11=2.0 output:r0+r1*r12=r0 infect REGS: f0,f1,f2,f7,f11,f12 */ mode: r2=pass r12,r1=r0; f0=float r0; f12=float r12; f0=recips f12,f7=f0; f12=f0*f12; f7=f0*f7,f0=f11-f12; f12=f0*f12; f7=f0*f7,f0=f11-f12; f12=f0*f12; f7=f0*f7,f0=f11-f12; f0=f0*f7; r0=trunc f0; rts(db); r2=r0*r2(UUI); r1=r1-r2; ////////////////////////////////////////////////////////////////////// /*求一个浮点数的余数 input: f0,f12 (f0/f12),f11=2.0 output:f0+f1*f12=r0 infect REGS: f0,f1,f2,f7,f11,f12 */ mode_f: f2=pass f12,f1=f0; f0=recips f12,f7=f0; f12=f0*f12; f7=f0*f7,f0=f11-f12; f12=f0*f12; f7=f0*f7,f0=f11-f12; f12=f0*f12; f7=f0*f7,f0=f11-f12; f0=f0*f7; r0=fix f0; f0=float r0; rts(db); f2=f0*f2; f0=f1-f2; ///////////////////////////////////////////////////////////////////////////// /* input:f0,f10=pi,f11=2.0 output:f0=sin(f0) infected reg:f0,f1,f2,f7,f10,f11,f12=f10,i15,m15 */ sine: // mode(f0/2*pi) f12=f10+f10; f2=pass f12,f1=f0; f0=recips f12,f7=f0; f12=f0*f12; f7=f0*f7,f0=f11-f12; f12=f0*f12; f7=f0*f7,f0=f11-f12; f12=f0*f12; f7=f0*f7,f0=f11-f12; f0=f0*f7; r0=fix f0; f0=float r0; f2=f0*f2; f0=f1-f2; //sin(f0) f1=pass f0,f12=f0; f12=f12*f12; i15=sine_data; m15=1; lcntr=10,do sine_end until lce; f1=f1*f12,f7=pm(i15,m15); f2=f1*f7; sine_end:f0=f0+f2; rts; ///////////////////////////////////////////////////////////////////////////// /* input:f0,f10=pi,f11=2.0 output:f0=cos(f0) infected reg:f0,f1,f2,f7,f10,f11,f12=f10,i15,m15 */ cosine: // mode(f0/2*pi) f12=f10+f10; f2=pass f12,f1=f0; f0=recips f12,f7=f0; f12=f0*f12; f7=f0*f7,f0=f11-f12; f12=f0*f12; f7=f0*f7,f0=f11-f12; f12=f0*f12; f7=f0*f7,f0=f11-f12; f0=f0*f7; r0=fix f0; f0=float r0; f2=f0*f2; f0=f1-f2; //cos(f0) f12=f0; f0=1.0; f1=f0; f12=f12*f12; i15=cose_data; m15=1; lcntr=10,do cose_end until lce; f1=f1*f12,f7=pm(i15,m15); f2=f1*f7; cose_end:f0=f0+f2; rts; ///////////////////////////////////////////////////////////////////////////// /* input:f6,f7,f11=2.0 output:f0 infected reg:f0,f1,f2,f3,f6,f7,f12 */ arctan: f0=abs f6; f12=abs f7; f1=f7; comp(f0,f12); if gt f12=pass f0,f0=f12; f0=recips f12,f7=f0; f12=f0*f12; f7=f0*f7,f0=f11-f12; f12=f0*f12; f7=f0*f7,f0=f11-f12; f12=f0*f12; f7=f0*f7,f0=f11-f12; f0=f0*f7; f7=pass f1,f12=f0; // f0=1.0; f1=f0; f12=f12*f12; i15=atan_data; m15=1; lcntr=50,do atan_end until lce; f1=f1*f12,f3=pm(i15,m15); f2=f1*f3; atan_end:f0=f0+f2; f3=pi2; f1=abs f6; f2=abs f7; comp(f1,f2); if lt f0=f3-f0; f12=f6*f7; f12=pass f12; if lt f0=-f0; rts; .endseg; (2) module.asm #include "def21160.h" .segment/pm pm_code; .global module; .global divide_complex; .extern isqrt; .extern divide; ///////////////////////////////////////////////////////////////////////// /*求模: 输入:r0--求模存储单元的长度,i0--实部起始地址,i8--虚部起始地址,i1--存储模的单元起始地址,m0,m8--变指针; 输出: 改变的寄存器:f0,f1,f2,f3,f4;i0,i1,i8;m0,m8;*/ module: f1=0.5; f11=3.0; lcntr=r0,do mag until lce; f0=dm(i0,m0),f2=pm(i8,m8); f3=f0*f0; f4=f2*f2; call isqrt(db); f3=f3+f4; f0=f3; f3=f3*f0; mag: dm(i1,m0)=f3; rts; //////////////////////////////////////////////////////////////////////////// /*求复数除法运算 输入:f0,f1,f4,f5 输出:f0+jf1=(f0+jf1)/(f4+jf5) 改变的寄存器:f6,f7,f11,f12;*/ divide_complex: f6=f4*f4; f7=f5*f5; f7=f6+f7; f11=f0*f4; f12=f1*f5; f12=f1*f4,f11=f11+f12; f0=f0*f5,f4=f7; f1=f12-f0,f0=f11; call divide(db); f11=2.0; f12=f7; f6=f0; call divide(db); f0=f1; f12=f4; rts(db); f1=f0; f0=f6; .endseg; |
|||||
| 欢迎点击进入:TI德州中文网 (国内唯一针对TI应用的中文技术网站) 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| C28x 滤波器库 ADSP21160调试经历 ADSP流水线 ADSP系列SHARC与FIFO的典型连… ADSP218x从FLASH引导方式分析 The simple examples for AD… ADSP-218x 加载器指南 ADI DSP的单精度随机斜率滤波… ADI DSP双精度除法的例子 |
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 网站公告 | 管理登录 | | |||
|
|