⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ffta.s

📁 dsp AD公司ADSP21的代码,里面有FFT FIR IIR EQULIZER G722_21F 等可以在项目中直接应用的代码.此代码的来源是ADI公司自己出版的书籍,此书在美国购得
💻 S
字号:
/************************************************************/
/* Routine source file: ffta.s                              */
/* from DSP32/DSP32C Application Software Library           */
/*
Modified to not use do instructions because they can't be
interupted 11-26-94 PME
*/
/************************************************************/
@T
    .align 4
.global ffta
/*
               ffta (N,M,C)
       const   int  N, M;
               int  *C;        
       scratch register short r1 to r18;
       scratch register float a0,a1,a2,a3;
*/
#include <dspregs.h> /* Translates DSP32C keywords to DSP32 *
                      *   keywords.  See Section 2.3        */ 

ffta:
@B
        r10e = param(-4)
        r10e = *r10               /* N */
        r12e = param(-8)
        r12e = *r12               /* M */
        r5e = param(-12)
        nop
        r2e = *r5                 /* points to _fftIO */
        r1e = *r5                 /* points to _fftIO */
        r6e = *r5                 /* points to _fftIO */
        r16e = r10 * 2            /* N * 2 */
        r16e = r16 * 2            /* N * 4 */

/* In place bit reversal ----------------------------- */

#if DSP32C
        r8e = r10 - 3             /* NM3 = N -3 */

        r3 = r1 - r6
        r4 = r2 - r6

_fabitA:r3 - r4
        if (ge) pcgoto _fabitB
        r5e = r1

        *r1++ = a0 = *r2++
        *r1-- = a0 = *r2--
        *r2++ = a0 = *r5++
        *r2-- = a0 = *r5--
_fabitB:r1e = r1 + 8
        r3 = r3 + 8
        r4 = r4#r16
        if (r8-- >=0) pcgoto _fabitA
        r2e = r4 + r6

#else
        r5 = r10 - 3           /* NM3 = N -3 */

_fftaA: r1 - r2 
        if (ge) goto _ffta5
        r4e = r1               /* temp. pointer */

        *r1++ = a0 = *r2++     /* Begin complex exchange  */
        *r1-- = a0 = *r2--     /*    T = _fftaIO(J)       */
        *r2++ = a0 = *r4++     /*  _fftaIO(J) = _fftIO(I) */
        *r2-- = a0 = *r4--     /*  _fftaIO(I) = _fftIO(J) */

_ffta5: r3e = r16              /* N4 = N * 4 */
        r2e = r2-r6  
_ffta6: r3 - r2        
        if (gt) goto _ffta7     
        nop

        r2e = r2 - r3
        goto _ffta6
        r3e = r3/2

_ffta7: r2e = r2 + r6  
        r2e = r2 + r3
        if (r5-- >= 0) goto _fftaA
        r1e = r1 + 8
#endif

/* Begin FFT calculation ----------------------------- */

        r16e = r16 * 2       /* 8N */
        r16e = r16 - 8       /* 8N - 8 */

/* Stage 1 and 2 use N/4 radix-4 butterflies */

        r1e = param(-12)/* address of _fftIO */
        r1e = *r1
        r10 = r10/2     /* N/2 */
        r10 = r10/2     /* N/4 */
        r2e = r1 + 8    /* data item B */
        r3e = r1 + 16   /* data item C */
        r4e = r1 + 24   /* data item D */

        r5e = r1        /* pointer for new A (A') */
        r6e = r2        /* B' */
        r7e = r3        /* C' */
        r8e = r4        /* D' */
        
        r15 = 28        /* increment for next group of four  */
#if DSP32CDO
        r11 = r10-1     /* loop counter for radix-4 */
        do 15, r11
#else
        r11 = r10-2     /* loop counter for radix-4 */
#endif

_fftaC: a0 = *r1++ + *r2++       /* ReA + ReB */
        a1 = *r3++ + *r4++       /* ReC + ReD */
        a2 = *r1-- + *r2--       /* ImA + ImB */
        a3 = *r3-- + *r4--       /* ImC + ImD */

       *r5++= a0 = a0 + a1        /* ReA' = ReA+ReB+ReC+ReD */
        a0 = *r1++ - *r2++        /* ReA - ReB */
       *r7++= a1 = -a1 + a0       /* ReC' = -(ReC+ReD)+(ReA+ReB) */
       *r5++r15=  a2 = a2 + a3    /* ImA' = ImA+ImB+ImC+ImD */ 
        a2 = *r3++ - *r4++        /* ReC - ReD */
       *r7++r15=  a3 = -a3 + a2   /* ImC' = -(ImC+ImD)+(ImA+ImB) */
        a3 = *r1++r15 - *r2++r15  /* ImA - ImB */
        a1 = *r3++r15 - *r4++r15  /* ImC - ImD */
                
        *r6++= a0 = a1 + a0       /* ReB' =  (ImC-ImD)+(ReA-ReB) */
        *r8++= a1 = -a1 + a0      /* ReD' = -(ImC-ImD)+(ReA-ReB) */
        *r6++r15 = a3 = -a2 + a3  /* ImB' = -(ReC-ReD)+(ImA-ImB) */
        *r8++r15 = a2 = a2 + a3   /* ImD' = (ReC-ReD)+(ImA-ImB) */
#ifndef DSP32CDO
        if (r11-- >=0) goto _fftaC
        nop
#endif

/* Stage 3 to M-1 --------------------------------- */

        r9 = 16
        r7 = r12 - 5           /* M - 5 */
        r8 = 4
        r4e = _fftaW
        r6e = _fftatwo         /* points to 2.0 */
        r13e = _fftatwo + 4    /* points to 1.0 */

_ffta30:r10e = r10/2
        r9e = r9*2
        r15e = r9*2
        r15e = r15-4
#if DSP32C
        r17e = r15 - r16
#else
        r17e = r15
        r17e = r17 - r16
#endif
        r2e = param(-12)      /* _fftIO */
        r2e = *r2
                              /* initialize twiddle factors */
        a2 = *r4++            /* Ur = a2 */
        a3 = *r4--            /* Ui = a3 */
        r18 = r8 - 3          /* loop count */
        r8 = r8*2

        r1e = r2
        r11e = r1

#if DSP32CDO
        r3e = r1 + r9
        r12e = r3 
        r5e = r10 - 2
        do 3, r5
#else
        r3e = r1
        r3e = r3 + r9
        r12e = r3 
        r5e = r10 - 3
#endif

/* Butterfly # 1 ----------------------------------------- */
_ffta10d:
      *r11++=a0=*r1 + *r3++            /* RE1 + RE2 */
      *r12++=a0=-a0 + *r1++ * *r6      /* RE1 - RE2 */
   *r11++r15=a0=*r1 + *r3++r15         /* IM1 + IM2 */
   *r12++r15=a0= -a0 + *r1++r15 * *r6  /* IM1 - IM2 */
#ifndef DSP32CDO
      if (r5-- >= 0) goto _ffta10d
      nop
#endif

   *r11++=a0=*r1 + *r3++               /* RE1 + RE2 */
   *r12++=a0=-a0 + *r1++ * *r6         /* RE1 - RE2 */
   *r11++r17=a0=*r1 + *r3++r17         /* IM1 + IM2 */
   *r12++r17=a0= -a0 + *r1++r17 * *r6  /* IM1 - IM2 */

/* Butterfly # 2 ----------------------------------------- */

_ffta20: 
#if DSP32CDO
         do 5, r5
#else
         r5e = r10 - 3
#endif
_ffta10:
   a0 = *r1++ + a2 * *r3++    /* a0=_fftIO(i)r+Ur*_fftIO(k)r */
  *r11++=a0=a0- *r3-- * a3    /* _fftIO(i)r=a0=a0-Ui*_fftIO(k)i */
   a1 = *r1-- + a3 * *r3++    /* a1=_fftIO(i)i+Ui*_fftIO(k)r */
  *r12++=a0=-a0+ *r1++ * *r6  /* _fftIO(k)r=-a0+2*_fftIO(i)r */
  *r11++r15=a1=a1+ *r3++r15 * a2
                              /* _fftIO(i)i=a1=a1+Ur*_fftIO(k)i */
  *r12++r15=a1=-a1+ *r1++r15 * *r6 /* _fftIO(k)i=-a1+2*_fftIO(i)i */
#ifndef DSP32CDO
  if (r5-- >= 0) goto _ffta10
  nop
#endif

   a0 = *r1++ + a2 * *r3++    /* a0=_fftIO(i)r+Ur*_fftIO(k)r */
  *r11++=a0=a0- *r3-- * a3    /* _fftIO(i)r=a0=a0-Ui*_fftIO(k)i */
   a1 = *r1-- + a3 * *r3++    /* a1=_fftIO(i)i+Ui*_fftIO(k)r */
  *r12++=a0=-a0+ *r1++ * *r6  /* _fftIO(k)r=-a0+2*_fftIO(i)r */
  *r11++r17=a1=a1+ *r3++r17 * a2
                              /* _fftIO(i)i=a1=a1+Ur*_fftIO(k)i */
  *r12++r17=a1=-a1+ *r1++r17 * *r6
                              /* _fftIO(k)i=-a1+2*_fftIO(i)i */

        a0 = a2 * *r4++       /* Compute new twiddle */
        a2 = a0 - a3 * *r4    /* U = U * _fftaW */
        a0 = a2 * *r4--
        a3 = a0 + a3 * *r4
        if (r18 -- >= 0) pcgoto _ffta20
        r2e = r2 + 8

        if (r7-- >= 0) pcgoto _ffta30
        r4e = r4 + 8

/* Stage M -------------------------------------------- */
        r9 = r9*2
        r1e = param(-12)        /* _fftIO */
        r1e = *r1
        a2 = *r13++             /* a2 = 1.0 */
        a3 = *r13--             /* a3 = 0.0 */
        r11e = r1

#if DSP32CDO
        r3e = r1 + r9
        r12e = r3
        r18 = r8 - 1
        do 10, r18
#else
        r3e = r1
        r3e = r3 + r9
        r12e = r3
        r18 = r8 - 2
#endif

_ffta20A:
   a0 = *r1++ + a2 * *r3++    /* a0=_fftIO(i)r+Ur*_fftIO(k)r */
   nop
  *r11++=a0=a0- *r3-- * a3    /* _fftIO(i)r=a0=a0-Ui*_fftIO(k)i */
   a1 = *r1-- + a3 * *r3++    /* a1=_fftIO(i)i+Ui*_fftIO(k)r */
  *r12++=a0=-a0+ *r1++ * *r6  /* _fftIO(k)r=-a0+2*_fftIO(i)r */
  *r11++ =a1=a1+ *r3++ * a2   /* _fftIO(i)i=a1=a1+Ur*_fftIO(k)i */
  *r12++ =a1=-a1+ *r1++ * *r6 /* _fftIO(k)i=-a1+2*_fftIO(i)i */

        a0 = a2 * *r4++       /* Compute new twiddle */
        a2 = a0 - a3 * *r4    /*   U = U * _fftaW  */
        a0 = a2 * *r4--
        a3 = a0 + a3 * *r4
#ifndef DSP32CDO
        if (r18 -- >= 0) goto _ffta20A
        nop
#endif
/* --------------------------------------------------- */
@E0
@D
    .align 4
/* Constant table ------------------------------------ */

_fftatwo: float 2.0, 1.0, 0.0

/* Twiddle table ------------------------------------- */
_fftaW: 
  float  0.7071068, -0.7071068    /* cos(pi/4),-sin(pi/4) */
  float  0.9238795, -0.3826834    /* cos(pi/8),-sin(pi/8) */
  float  0.9807853, -0.1950903    /*cos(pi/16),-sin(pi/16)*/
  float  0.9951847, -0.0980171    /*cos(pi/32),-sin(pi/32)*/
  float  0.9987955, -4.9067674e-2 /* cos and -sin(pi/64)  */
  float  0.9996988, -2.4541228e-2 /* cos and -sin(pi/128) */
  float  0.9999247, -1.2271538e-2 /* cos and -sin(pi/256) */
  float  0.9999812, -6.1358846e-3 /* cos and -sin(pi/512) */

  float 0.9999952938, -3.067956691e-3 /* cos and -sin(pi/1024) */
  float 0.9999988234, -1.533980094e-3 /* cos and -sin(pi/2048) */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -