网站公告列表

  没有公告

加入收藏
设为首页
联系站长
您现在的位置: 61IC中国电子在线 >> DSP >> ADI DSP >> ADSP21xx >> 文章正文
  ADSP2116x的几个常用算法库函数         ★★★ 【字体:
ADSP2116x的几个常用算法库函数
作者:61IC    文章来源:本站原创    点击数:    更新时间:2007-1-16    
(1.)  math.asm
#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条。评论内容只代表网友观点,与本站立场无关!)
    站长:61IC 湘ICP备05002478号