📄 dft_128.asm
字号:
;
; DFT_128 - compute 128 points DFT
;
; Entry T0: AR0: pointer to complex input sample buffer
; AR1: pointer to complex output sample buffer
; Return: None
;
.def _dft_128
.ref _sine_cos
N .set 128
TWOPIN .set 0x7fff>>6 ; 2*PI/N, N=128
.bss Wn,2 ; Wn[0]=Wr, Wn[1]=Wi
.bss angle,1 ; Angle for sine-cosine function
.text
_dft_128
pshboth XAR5 ; Save AR5
bset SATD
mov #N-1,BRC0 ; Repeat counter for loop N times
mov #N-1,BRC1 ; Repeat counter for loop N times
mov XAR0,XAR5 ; AR5 pointer to sample buffer
mov XAR0,XAR3
mov #0,T2 ; k = T2 = 0
rptb outer_loop-1 ; for(k=0;k<N;k++) {
mov XAR3,XAR5 ; Reset x[] pointer
mov #TWOPIN<<#16,AC0; hi(AC0) = 2*PI/N
mpy T2,AC0
mov #0,AC2 ; Xr[k] = 0
mov #0,AC3 ; Xi[k] = 0
mov #0,*(angle)
mov AC0,T3 ; angle=2*PI*k/N
rptb inner_loop-1 ; for(n=0;n<N;n++) {
mov *(angle),T0 ; T0=2*PI*k*n/N
mov *(angle),AC0
add T3,AC0
mov AC0,*(angle) ; Update angle
amov #Wn,XAR0 ; AR0 is the pointer to Wn
call _sine_cos ; sine_cos(angle, Wn)
bset SATD ; sine_cos turn off FRCT & SATD
macm40 *AR5+,*AR0,AC2 ; XR[k]+Xin[n]*Wr
macm40 *AR5-,*AR0+,AC3 ; XI[k]+Xin[n+1]*Wr
masm40 *AR5+,*AR0,AC3 ; XI[k]+Xin[n+1]*Wr-Xin[n]*Wi
macm40 *AR5+,*AR0-,AC2 ; XR[k]+Xin[n]*Wr+Xin[n+1]*Wi
inner_loop ; } end of inner loop
mov hi(AC2<<#-5),*AR1+
mov hi(AC3<<#-5),*AR1+
add #1,T2
outer_loop ; } end of outer loop
popboth XAR5
bclr SATD
ret
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -