?? fft.asm
字號:
;-------------------------------------------------------------------------------------------------
;重慶大學DSP實驗室
;函數名:void fft(void)
;功能:實現32、64或128采樣點的快速傅立葉變換
;入口條件:Q15
; _sintab 存放FFT運算中用到的sin
; 和cosin函數值
; _input 存放FFT運算中用到的數據,
; 包括實部和虛部,按二進制
; 反序排列
; 注意:由于“*BR0+”間接尋
; 址方式對_input的地址有特殊
; 的要求,所以最好將數組_input
; 放置在一個獨立的塊中,如B1塊。
; _nom 當_nom=0時,本函數將不對運算
; 結果進行歸一化。反之,將對每
; 一步運算結果進行歸一化處理,
; 避免溢出,但是,它會使運算精度降低。
; N 常數,參與FFT運輸的點數,用戶
; 可根據需要選擇,例如,需要進行
; 128點FFT時,請在本函數中做出如
; 下選擇:
; N .set 128
; M .set 7
; 依此類推。
;出口條件:Q15
; _input 存放FFT的運算結果
;本函數可供C調用,請用戶在C主程序前作以下聲明:
; extern void fft(void);
; const int sintab[N]={...}; N為128、64或32
; extern int _input[2*N];
; extern int nom;
;程序員:冼成瑜
;2002.3.24
;--------------------------------------------------------------------------------------------------
.def _fft
;128 points DIT Radix-2 complex FFT
;N .set 128 ;number of points
;M .set 7 ;N=2**M
;64 points DIT Radix-2 complex FFT
;N .set 64 ;number of points
;M .set 6 ;N=2**M
;32 points DIT Radix-2 complex FFT
N .set 32 ;number of points
M .set 5 ;N=2**M
_input .usect ".usect",2*N ;INPUT DATA
; .bss _sintab,N ;SIN AND COSIN TABLE
.bss _nom,1 ;WHEN _nom=1, FFT IMPLEMENT NORMALIZATION
.global _fft
.global _sintab
.global _input
.global _nom
_adresult .usect ".ad",16
.global _adresult
.text
_fft:
;--------------------------------------
;C COMPATIBLE
;--------------------------------------
POPD *+ ;STORE RETURN ADDRESS
SAR AR6,*+ ;STORE AR6
SAR AR7,*+ ;STORE AR7
SAR AR0,*+ ;STORE AR0
SAR AR1,* ;STACK:ADDRESS/AR6/AR7/AR0/AR1
;ARP=AR1, AR1:AR1
LAR AR0,#08h
LAR AR3,*0+,AR3 ;AR3:FP, SP=SP+size of frame
;ARP=AR3
LAR AR2,* ;AR2:AR1
LAR AR7,#_nom ;AR7 POINT TO _nom
;-----------------------------------------
;INITIALIZING AUTO REGISTER
;-----------------------------------------
SPLK #(N-1),*+ ;N=127
SPLK #(M-1),*+ ;M=6
;STACK:ADDRESS/AR6/AR7/AR0/N/M/Y
;ARP=AR3, AR2:N, AR3:Y
SPLK #1,*+,AR2 ;ID=1
;STACK:ADDRESS/AR6/AR7/AR0/N/M/ID/Y
;ARP=AR2, AR2:N, AR3:
;-----------------------------------------
;IMPLEMENTATION OF FFT
;-----------------------------------------
SETC OVM ;OVERFLOW MODE ENABLE
SETC SXM ;SIGN EXTENTION
SPM 1 ;PREG OUTPUT SHIFT 1
LACC *+,AR3
ADD #1
SACL *+,1,AR2 ;IW=2*(N+1)=256
;STACK:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/Y
;ARP:AR2, AR2:M, AR3:Y,
LAR AR5,*+ ;AR5=M=6
;ARP:AR2, AR2:ID, AR3:Y, AR5=M
FFT3 LAR AR6,#_input ;AR6:input-->P.X
;ARP:AR2, AR2:ID, AR3:Y, AR5=M, AR6:input
LACC *,1
SACL *+ ;ID=ID*2=2
;ARP:AR2, AR2:IW, AR3:Y, AR5=M, AR6:input
LACC *,15
SACH * ;IW=IW/2
LACC *-,15,AR3
SACH *+,AR2 ;C2=IW/2
;STACK:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/Y
;ARP:AR2, AR2:ID, AR3:Y, AR5=M, AR6:input
LAR AR0,* ;AR0=ID
FFT2 LAR AR4,#_sintab ;AR4:sintab
;ARP:AR2, AR0=ID, AR2:ID, AR3:Y, AR4:sintab, AR5=M, AR6:input
LACC *+,15,AR3
SACH *+,AR6 ;C1=ID/2=1
;STACK:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/C1/Y
;ARP:AR6, AR0=ID, AR2:IW, AR3:Y, AR4:sintab, AR5=M, AR6:input
MAR *0+,AR4 ;ARP:AR4, AR0=ID, AR2:IW, AR3:Y, AR4:sintab, AR5=M, AR6=AR6+ID-->Q.X
FFT1 LACC #0
LT *+,AR6 ;TREG=COSX
MPY *+,AR4 ;Q.X*COSX
;ARP=AR4, AR4:SINX, AR6:Q.Y
LT *,AR6
MPYA *-,AR3 ;ACC=ACC+Q.X*COSX, PREG=Q.Y*SINX
;ARP=AR3, AR4:SINX, AR6:Q.X
SPAC ;ACC=ACC-Q.Y*SINX
SACH *+,AR4 ;XT=Q.X*COSX-Q.Y*SINX
;STACK:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/C1/XT/Y
;ARP:AR4, AR0=ID, AR2:IW, AR3:Y, AR4:SINX, AR5=M, AR6:Q.X
LACC #0
LT *-,AR6
MPY *+,AR4 ;Q.X*SINX
;ARP=AR4, AR4:COSX, AR6:Q.Y
LT *,AR6
MPYA *-,AR3 ;ACC=ACC+Q.X*SINX, PREG=Q.Y*COSX
;ARP=AR3, AR4:COSX, AR6:Q.X
APAC
SACH *-,AR7 ;YT=Q.X*SINX+Q.Y*COSX
;STACK:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/C1/XT/YT
;ARP:AR7, AR0=ID, AR2:IW, AR3:XT, AR4:COSX, AR5=M, AR6:Q.X
LACC *,AR6
BCND FFT6,NEQ ;NORMALIZATION WHEN _nom ISN'T ZERO
;----------------------------------------
;DON'T NORMALIZATION
;----------------------------------------
MAR *0- ;AR6=AR6-ID-->P.X
LACC *,AR3
ADD *,AR6
SACL *0+,AR3 ;P.X=P.X+XT
;ARP:AR3, AR0=ID, AR2:IW, AR3:XT, AR4:COSX, AR5=M, AR6:Q.X
SUB *+,1,AR6
SACL *+ ;Q.X=P.X-XT*2, AR6:Q.Y, AR3:YT
;ARP:AR6, AR0=ID, AR2:IW, AR3:YT, AR4:COSX, AR5=M, AR6:Q.Y
MAR *0- ;AR6:P.Y
LACC *,AR3
ADD *-,AR6
SACL *0+,AR3 ;P.Y=P.Y+YT, AR6:Q.Y
;ARP:AR3, AR0=ID, AR2:IW, AR3:XT, AR4:COSX, AR5=M, AR6:Q.Y
SUB *,1,AR6
SACL *+,0,AR2 ;Q.Y=P.Y-YT*2
;STACK:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/C1/XT/YT
;ARP:AR2, AR0=ID, AR2:IW, AR3:XT, AR4:COSX, AR5=M, AR6:NEXT Q.X
B FFT5 ;AR6 POINT TO NEXT Q.X
;---------------------------------------
;NORMALIZATION
;---------------------------------------
FFT6 MAR *0- ;AR6-->P.X
LAC *,15,AR3
ADD *,15,AR6
SACH *0+,AR3 ;P.X=(P.X+XT)/2
;ARP:AR3, AR0=ID, AR2:IW, AR3:XT, AR4:COSX, AR5=M, AR6:Q.X
SUB *+,16,AR6
SACH *+ ;Q.X=P.X-XT, AR6:Q.Y, AR3:YT
;ARP:AR6, AR0=ID, AR2:IW, AR3:YT, AR4:COSX, AR5=M, AR6:Q.Y
MAR *0- ;AR6:P.Y
LACC *,15,AR3
ADD *,15,AR6
SACH *0+,AR3 ;P.Y=(P.Y+YT)/2, AR6:Q.Y
;ARP:AR3, AR0=ID, AR2:IW, AR3:YT, AR4:COSX, AR5=M, AR6:Q.Y
SUB *-,16,AR6
SACH *+,0,AR2 ;Q.Y=P.Y-YT
;STACK:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/C1/XT/YT
;ARP:AR2, AR0=ID, AR2:IW, AR3:XT, AR4:COSX, AR5=M, AR6:NEXT Q.X
FFT5 LAR AR0,*-,AR4 ;AR0=IW
;ARP=AR4, AR0=IW, AR2:ID, AR3:XT, AR4:COSX, AR5=M, AR6:NEXT Q.X
MAR *0+,AR2 ;AR4=AR4+IW-->NEXT COSX
LAR AR0,* ;AR0=ID
ADRK #3 ;AR2:C1
;ARP=AR2, AR0=ID, AR2:C1, AR3:XT, AR4:NEXT COSX, AR5=M, AR6:Q.X
LACC *
SUB #1
SACL *- ;C1=C1-1
;ARP=AR2, AR0=ID, AR2:C2, AR3:XT, AR4:COSX, AR5=M, AR6:Q.X
BCND FFT4,LEQ ;JUMP FFT4, IF C1<0
MAR *-,AR4 ;AR2:IW
;ARP=AR4, AR0=ID, AR2:IW, AR3:XT, AR4:NEXT COSX, AR5=M, AR6:Q.X
B FFT1
FFT4 LACC *
SUB #1
SACL *-,AR3
MAR *-,AR2 ;ARP=AR2, AR0=ID, AR2:IW, AR3:C1, AR4:NEXT COSX, AR5=M, AR6:P.X
MAR *-
BCND FFT2,GT
MAR *,AR3
MAR *-,AR5 ;ARP=AR5, AR0=ID, AR2:IW, AR3:C2, AR4:NEXT COSX, AR5=M, AR6:P.X
BANZ FFT3,*-,AR2
;------------------------------------
;C COMPATIBLE
;------------------------------------
CLRC OVM
SPM 0
MAR *,AR1
SBRK #09
LAR AR0,*-
LAR AR7,*-
LAR AR6,*-
PSHD *
RET
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -