📄 cfft32c.asm
字号:
;========================================================================
;
; File Name : cfft.asm
;
; Originator : Advanced Embeeded Control
; Texas Instruments Inc.
;
; Description : This file contain source code for complex FFT
;
; Date : 26/02/2002 (dd/mm/yyyy)
;========================================================================
; Routine Type : C Callable
; Description :
; void FFTC_calc(FFTxxxx_handle)
; This function implements complex FFT using radix-2 DIT algo
;
; void FFT128C_init(void)
; This function copies the Twiddle factors from load time address to
; its run time address
;========================================================================
; COMPLEX FFT MODULES
;-----------------------------------------------------------------------
; typedef struct {
; long *ipcbptr;
; long *tfptr;
; int size;
; int nrstage;
; long *magptr;
; long *winptr;
; long peakmag;
; int peakfrq;
; void (*init)(void);
; void (*izero)(void *);
; void (*calc)(void *);
; void (*mag)(void *);
; void (*win)(void *);
; }FFTxxxC;
;
;========================================================================
.include "sel_q.asm"
.def _CFFT32_calc
COS45K_LSW .set 799Bh
COS45K_MSW .set 5A82h
;===============================================================================
; FFT - Computation Routine (FFT128R_calc)
;===============================================================================
; * This routine takes the 128 point complex data sequence, in bit reversed form
; * It implements Decimation in time FFT algorithm
; * Performs inplace computation
; * Output in-order data "IPCB"----> Xr(0),Xi(0),Xr(1),Xi(1)...Xr(127)&Xi(127)
;===============================================================================
;----------------------------------------------------
; MACRO 'ZEROI'
; Number of WORDS/Number of Cycles 12
; USAGE: Called if the TWIDDLE FACTOR: 1
;
; P=PR+jPI, Q=QR+jQI, W=WR-jWI
; P'=P+W*Q and Q'=P-W*Q
;
; POINTERS AT ENTRY
; AR6->(PR,PI,PR+1,PI+1,PR+2,PI+2,....)
; AR2->(QR,QI,QR+1,QI+1,QR+2,QR+2,....)
; COMPUTATION PERFORMED: INPLACE COMPUTATION
; AR6 -> PR'=(PR+QR)/2
; AR2 -> QR'=(PR-QR)/2
; AR6+1 -> PI'=(PI+QI)/2
; AR2+1 -> QI'=(PI-QI)/2
; PR and PR', PI and PI', QR and QR', QI and QI' are
; stored in the same locations
; POINTERS AT EXIT
; AR6->(PR+1,PI+1,....)
; AR2->(QR+1,QI+1,....)
;------------------------------------------------------
; (Content of REG after exec.)
ZEROI .macro ; AR6 AR2
MOVL ACC,*XAR6 ; ACC:=PR PR QR
SFR ACC,#1 ; ACC:=PR/2 PR QR
MOVL P,*XAR2 ; P=QR PR QR
ADDL ACC,P<<PM ; ACC=PR+QR/2 PR QR
MOVL *XAR6++,ACC ; PR':=(PR+QR)/2 PI QR
SUBL ACC,P ; ACC:=(PR-QR)/2 PI QR
MOVL *XAR2++,ACC ; QR':=(PR-QR)/2 PI QI
MOVL ACC,*XAR6 ; ACC:=PI PI QI
SFR ACC,#1 ; ACC:=PI/2 PI QI
MOVL P,*XAR2 ; P=QI PI QI
ADDL ACC,P<<PM ; ACC:=(PI+QI)/2 PI QI
MOVL *XAR6++,ACC ; PI':=(PI+QI)/2 PR+1 QI
SUBL ACC,P ; ACC:=(PI-QI)/2 PR+1 QI
MOVL *XAR2++,ACC ; QR':=(PI-QI)/2 PR+1 QR+1
.endm
;----------------------------------------------------
; MACRO 'PBY2I'
; Number of WORDS/Number of Cycles 12
; USAGE: Called if the TWIDDLE FACTOR: -j
;
; P=PR+jPI, Q=QR+jQI, W=WR-jWI
; P'=P+W*Q and Q'=P-W*Q
;
; POINTERS AT ENTRY
; AR6->(PR,PI,PR+1,PI+1,PR+2,PI+2,....)
; AR2->(QR,QI,QR+1,QI+1,QR+2,QR+2,....)
; COMPUTATION PERFORMED: INPLACE COMPUTATION
; AR6 -> PR'=(PR+QI)/2
; AR2 -> QR'=(PR-QI)/2
; AR6+1 -> PI'=(PI-QR)/2
; AR2+1 -> QI'=(PI+QR)/2
; PR and PR', PI and PI', QR and QR', QI and QI' are
; stored in the same locations
; POINTERS AT EXIT
; AR6->(PR+1,PI+1,....)
; AR2->(QR+1,QI+1,....)
;------------------------------------------------------
; (Content of REG after exec.)
PBY2I .macro ; AR6 AR2
MOVL XAR5,*XAR2++ ; XAR5=QR PR QI
MOVL ACC,*XAR6 ; ACC:=PR PR QI
SFR ACC,#1 ; ACC:=PR/2 PR QI
MOVL P,*XAR2 ; P:=QI PR QI
ADDL ACC,P<<PM ; ACC:=(PR+QI)/2 PR QI
MOVL *XAR6++,ACC ; PR':=(PR+QI)/2 PI QI
SUBL ACC,P ; ACC:=(PR-QI)/2 PI QI
MOVL *--XAR2,ACC ; QR':=(PR-QI)/2 PI QR
ADDB XAR2,#2 ; PI QI
MOVL ACC,*XAR6 ; ACC:=PI PI QI
SFR ACC,#1 ; ACC:=PI/2 PI QI
MOVL P,XAR5 ; P=QR PI QI
SUBL ACC,P<<PM ; ACC=(PI-QR)/2 PI QI
MOVL *XAR6++,ACC ; ACC:=(PI-QR)/2 PR+1 QI
ADDL ACC,P ; ACC:=(PI+QR)/2 PR+1 QI
MOVL *XAR2++,ACC ; QI':=(PI+QR)/2 PR+1 QR+1
.endm
;----------------------------------------------------
; MACRO 'PBY4I' SPM set to 1bit right shift, XT=w
; Number of WORDS/Number of Cycles 16
; USAGE: Called if the TWIDDLE FACTOR: COS(45)-jSIN(45)=0.707-j0.707
;
; P=PR+jPI, Q=QR+jQI, W=WR-jWI
; P'=P+W*Q and Q'=P-W*Q
;
; POINTERS AT ENTRY
; TREG=W=|SIN(45)|=|COS(45)|=05a82h
; AR6->(PR,PI,PR+1,PI+1,PR+2,PI+2,....)
; AR2->(QR,QI,QR+1,QI+1,QR+2,QR+2,....)
; CALCULATION PERFORMED: INPLACE COMPUTATION
; AR6 -> PR'=(PR+QI*W+QR*W)/2
; AR2 -> QR'=(PR-QI*W-QR*W)/2
; AR6+1 -> PI'=(PI+QI*W-QR*W)/2
; AR2+1 -> QI'=(PI-QI*W+QR*W)/2
; PR and PR', PI and PI', QR and QR', QI and QI' are
; stored in the same locations
; POINTERS AT EXIT
; AR6->(PR+1,PI+1,....)
; AR2->(QR+1,QI+1,....)
;------------------------------------------------------
; (Content of REG after exec.)
PBY4I .macro ; PREG AR6 AR2
; - PR QR
MOVL ACC,*XAR6 ; ACC=PR - PR QR
SFR ACC,#1 ; ACC=PR/2 - PR QR
QMPYL P,XT,*XAR2 ; PREG=W*QR/2 W*QR/2 PR QR
SUBL ACC,P ; ACC=(PR-W*QR)/2 W*QR/2 PR QR
MOVL XAR5,P ; XAR5=W*QR/2
QMPYL P,XT,*+XAR2[2] ; ACC=(PR-W*QR)/2 W*QI/2 PR QR
SUBL ACC,P ; ACC=(PR-W*QI-W*QR)/2 W*QI/2 PR QR
MOVL *XAR2++,ACC ; QR'=(PR-W*QI-W*QR)/2 W*QI/2 PR QI
NEG ACC ; ACC=-(PR-W*QI-W*QR)/2 W*QI/2 PR QI
ADDL *XAR6++,ACC ; PR'=(PR+W*QI+W*QR)/2 W*QI/2 PI QI
MOVL ACC,*XAR6 ; ACC=PI W*QI/2 PI QI
SFR ACC,#1 ; ACC=PI/2 W*QI/2 PI QI
SUBL ACC,P ; ACC=(PI-W*QI)/2 W*QI/2 PI QI
ADDL ACC,XAR5 ; ACC=(PI-W*QI+W*QR)/2 W*QR/2 PI QI
MOVL *XAR2++,ACC ; QI'=(PI-W*QI+W*QR)/2 W*QR/2 PI QR+1
NEG ACC ; ACC=-(PI-W*QI+W*QR)/2 W*QR/2 PI QR+1
ADDL *XAR6++,ACC ; PI'=(PI+W*QI-W*QR)/2 W*QR/2 PR+1 QR+1
.endm
;----------------------------------------------------
; MACRO 'P3BY4I' SPM set to 1bit right shift, XT=w
; Number of WORDS/Number of Cycles 16
; USAGE: Called if the TWIDDLE FACTOR: COS(90+45)-jSIN(90+45)=-0.707-j0.707
;
; P=PR+jPI, Q=QR+jQI, W=WR-jWI
; P'=P+W*Q and Q'=P-W*Q
;
; POINTERS AT ENTRY
; TREG=W=|SIN(135)|=|COS(135)|=05a82h
; AR6->(PR,PI,PR+1,PI+1,PR+2,PI+2,....)
; AR2->(QR,QI,QR+1,QI+1,QR+2,QR+2,....)
; CALCULATION PERFORMED: INPLACE COMPUTATION
; AR6 -> PR'=(PR+QI*W-QR*W)/2
; AR2 -> QR'=(PR-QI*W+QR*W)/2
; AR6+1 -> PI'=(PI-QI*W-QR*W)/2
; AR2+1 -> QI'=(PI+QI*W+QR*W)/2
; PR and PR', PI and PI', QR and QR', QI and QI' are
; stored in the same locations
; POINTERS AT EXIT
; AR6->(PR+1,PI+1,....)
; AR2->(QR+1,QI+1,....)
;------------------------------------------------------
; (Content of REG after exec.)
P3BY4I .macro ; AR5 PREG AR6 AR2
; - PR QR
MOVL ACC,*XAR6 ; ACC=PR - PR QR
SFR ACC,#1 ; ACC=PR/2 - PR QR
QMPYL P,XT,*XAR2 ; PREG=W*QR/2 W*QR/2 PR QR
ADDL ACC,P ; ACC=(PR+W*QR)/2 W*QR/2 PR QR
MOVL XAR5,P ; XAR5=W*QR/2 W*QR/2 PR QR
QMPYL P,XT,*+XAR2[2] ; ACC=(PR+W*QR)/2 W*QI/2 PR QR
SUBL ACC,P ; ACC=(PR-W*QI+W*QR)/2 W*QI/2 PR QR
MOVL *XAR2++,ACC ; QR'=(PR-W*QI+W*QR)/2 W*QI/2 PR QI
NEG ACC ; ACC=-(PR-W*QI+W*QR)/2 W*QI/2 PR QI
ADDL *XAR6++,ACC ; PR'=(PR+W*QI-W*QR)/2 W*QI/2 PI QI
MOVL ACC,*XAR6 ; ACC=PI W*QI/2 PI QI
SFR ACC,#1 ; ACC=PI/2 W*QI/2 PI QI
ADDL ACC,P ; ACC=(PR+W*QI)/2 W*QI/2 PI QI
ADDL ACC,XAR5 ; ACC=(PI+W*QI+W*QR)/2 W*QR/2 PI QI
NOP *,ARP2
MOVL *0++,ACC ; QI'=(PI+W*QI+W*QR)/2 W*QR/2 PI QR+1
NEG ACC ; ACC=-(PI+W*QI+W*QR)/2 W*QR/2 PI QR+1
ADDL *XAR6,ACC ; PI'=(PI-W*QI-W*QR)/2 W*QR/2 PI QR+1
NOP *0++ ; W*QR/2 PR+1 QR+1
.endm
;----------------------------------------------------
; MACRO 'BFLY' SPM set to 1bit right shift
; Number of WORDS/Number of Cycles 21
; USAGE: General Butterfly RADIX 2 -> TWIDDLE FACTOR W=WR-jWI
;
; P=PR+jPI, Q=QR+jQI, W=WR-jWI
; P'=P+W*Q and Q'=P-W*Q
;
; REGISTER USED: XAR0,XAR2,XAR3,XAR4,XAR5,XAR6,ACC,XT,P
;
; POINTERS AT ENTRY
; AR6->(PR,PI,PR+1,PI+1,PR+2,PI+2,....)
; AR2->(QR,QI,QR+1,QI+1,QR+2,QR+2,....)
; AR3-> Real Part of Twiddle Factor: WR(COSx)
; AR4-> Imaginary Part of Twiddle Factor: WI(SINx)
; AR5-> Temporary Variable
; CALCULATION PERFORMED: INPLACE COMPUTATION
; AR6 -> PR'=(PR+QR*WR+QI*WI)/2
; AR2 -> QR'=(PR-QR*WR-QI*WI)/2
; AR6+1 -> PI'=(PI+QI*WR-QR*WI)/2
; AR2+1 -> QI'=(PI-QI*WR+QR*WI)/2
; PR and PR', PI and PI', QR and QR', QI and QI' are
; stored in the same locations
; POINTERS AT EXIT
; AR6->(PR+1,PI+1,....)
; AR2->(QR+1,QI+1,....)
; AR3-> Real Part of Next Twiddle Factor
; AR4-> Imaginary Part ofNext Twiddle Factor
;------------------------------------------------------
BFLY .macro p ; XT AR6 AR2 AR3 AR4
; - PR QR WR WI
MOVL XT,*XAR3 ; XT=WR WR PR QR WR WI
NOP *0++ ; WR PR QR WR+n WI
QMPYL P,XT,*XAR2++ ; P=QR*WR WR PR QI WR+n WI
QMPYL ACC,XT,*,ARP4 ; ACC=QI*WR WR PR QI WR+n WI
MOVL *-SP[TEMP],P ; TEMP=QR*WR WR PR QI WR+n WI
MOVL XT,*0++ ; XT=WI WR PR QI WR+n WI+n
QMPYL P,XT,*--XAR2 ; P=WI*QR WR PR QR WR+n WI+n
SUBL ACC,P ; ACC=(QI*WR-QR*WI) WR PR QR WR+n WI+n
.if(TF_QFMAT==Q30)
LSL ACC,#1 ; ACC=(QI*WR-QR*WI) (Q30)
.endif
MOVL XAR5,ACC ; XAR5=(QI*WR-QR*WI) (Q30)
QMPYL ACC,XT,*+XAR2[2]; ACC=WI*QI WR PR QR WR+n WI+n
ADDL ACC,*-SP[TEMP] ; ACC=(QR*WR+QI*WI) WR PR QR WR+n WI+n
.if(TF_QFMAT==Q30)
LSL ACC,#1 ; ACC=(QR*WR+QI*WI) in Q30
.endif
MOVL P,*XAR6 ; P=PR WR PR QR WR+n WI+n
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -