📄 rifft.asm
字号:
*********************************************************************************
* (C) COPYRIGHT TEXAS INSTRUMENTS, INC. 1996 *
*********************************************************************************
*********************************************************************************
* *
* FILE NAME: rIFFT.asm *
* *
* AUTHORS: Simon Lau and Nathan Baltz *
* *
* DESCRIPTION: *
* - TMS320C54x 2N-point Real IFFT *
* Radix 2, in-place DIT algorithm *
* - For various input sizes (16 - 1024), simply modify N and LOGN. *
* - Input data is assumed to be in Q0.15 format, stored in natural order, *
* all real, in a data file named "Indata1" *
* - Bit-reversal of input data is done automatically before performing the IFFT*
* - Computation is done in place, so the outputs come in natural order, *
* interleaved real/complex. *
* - Twiddle factors are stored in normal order in two separate tables, *
* one for sine values and the other for cosine. *
* - Total size of twiddle tables is 1024 bytes for IFFT size up to 1024 points.*
* Same twiddle tables are used for IFFT size from 16 to 1024. *
* - For additional information about the implementation of this code refer to *
* the readme.txt file. *
* *
* DATE: Summer 1996 *
* *
*********************************************************************************
.mmregs
.global reset,begin,stage,group,btflyend
N .set 8 ; number of complex points
LOGN .set 3 ; number of stages (=logN/log2)
; Copy input data and twiddle tables from files
.data
DATA .space 2*N*16 ; start addr. of complex output data
INPUT .copy indata1 ; start addr. of complex input data
.sect "twiddle1"
TWI1 .copy twiddle1 ; sine table
.sect "twiddle2"
TWI2 .copy twiddle2 ; cosine table
; Define variables for indexing input data and twiddle tables
.def sav_grp
sav_grp .usect "tempv",3 ; saves (# groups in current stage)-1
sav_sin .set sav_grp+1 ; saves index of twiddle tables
sav_idx .set sav_grp+2 ; saves index of input data table
; Set up stack
BOS .usect "stack",0Fh
TOS .usect "stack",1
; Power up initialization ------------------------------------------------------
.sect "vectors"
reset:
BD begin
STM #TOS,SP
.text
begin:
LD #0,DP ; data page is set to 0
SSBX FRCT ; fractional mode is on
;-------------------------------------------------------------------------------
; P H A S E O N E Bit-Reversal of Input Data
;
; REGISTER USAGE: AR0 index for bit-reversed addressing
; AR2 pointer to R, I (processed data, in bit-reversed order)
; AR3 pointer to XR, XI (original input data)
; AR7 start addr. of data
;-------------------------------------------------------------------------------
STM #INPUT,AR3 ; AR3 points to 1st input XR[0]
STM #DATA,AR7 ; store start addr. of data in AR7
MVMM AR7,AR2 ; AR2 points to 1st processed data R[0]
STM #N-1,BRC
RPTBD p1end-1
STM #N,AR0 ; AR0 := 1/2 the size of circular buffer
MVDD *AR3+,*AR2+
MVDD *AR3-,*AR2+
MAR *AR3+0B ; bitrev(k)
p1end:
;-------------------------------------------------------------------------------
; P H A S E T W O (LogN)-Stage Complex IFFT
;
; Outputs are divided by 2 at each stage to prevent overflow
;
; REGISTER USAGE: AR0 offset to next butterfly
; (stages 1 & 2) AR2 pointer to PR, PI (1st butterfly input data)
; AR3 pointer to QR, QI (2nd butterfly input data)
; AR7 start addr. of data
;
; REGISTER USAGE: AR0 index of twiddle tables
; (remainder) AR1 group counter
; AR2 pointer to PR, PI (1st butterfly input data)
; AR3 pointer to QR, QI (2nd butterfly input data)
; AR4 pointer to WR (cosine)
; AR5 pointer to WI (sine)
; AR6 butterfly counter
; AR7 stage counter
;-------------------------------------------------------------------------------
; Stage 1 ----------------------------------------------------------------------
STM #0,BK ; circular buffer size BK=0
LD #-1,ASM ; outputs divided by 2 at every stage
MVMM AR7,AR2 ; AR2 points to PR
STM #DATA+2,AR3 ; AR3 points to QR
STM #N/2-1,BRC
LD *AR2,16,A ; A := PR
RPTBD s1end-1
STM #3,AR0
SUB *AR3,16,A,B ; B := PR-QR
ADD *AR3,16,A ; A := PR+QR
STH A,ASM,*AR2+ ; PR':= (PR+QR)/2
ST B,*AR3+ ; QR':= (PR-QR)/2
||LD *AR2,A ; A := PI
SUB *AR3,16,A,B ; B := PI-QI
ADD *AR3,16,A ; A := PI+QI
STH A,ASM,*AR2+0 ; PI':= (PI+QI)/2
ST B,*AR3+0% ; QI':= (PI-QI)/2
||LD *AR2,A ; A := PR
s1end:
; Stage 2 ----------------------------------------------------------------------
MVMM AR7,AR2 ; AR2 points to PR
STM #DATA+4,AR3 ; AR3 points to QR
STM #N/4-1,BRC
LD *AR2,16,A ; A := PR
RPTBD s2end-1
STM #5,AR0
; 1st butterfly
SUB *AR3,16,A,B ; B := PR-QR
ADD *AR3,16,A ; A := PR+QR
STH A,ASM,*AR2+ ; PR':= (PR+QR)/2
ST B,*AR3+ ; QR':= (PR-QR)/2
||LD *AR2,A ; A := PI
SUB *AR3,16,A,B ; B := PI-QI
ADD *AR3,16,A ; A := PI+QI
STH A,ASM,*AR2+ ; PI':= (PI+QI)/2
STH B,ASM,*AR3+ ; QI':= (PI-QI)/2
; 2nd butterfly
MAR *AR3+
SUB *AR2,*AR3,A ; A := PR-QI
ADD *AR2,*AR3-,B ; B := PR+QI
STH A,ASM,*AR2+ ; PR':= (PR-QI)/2
ADD *AR2,*AR3,A ; A := PI+QR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -