📄 ffta.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 + -