📄 fft.asm
字号:
***********************************************
* 作者:熊先越 *
* Email: xianyuexiong@163.com *
* *
* DIT,FFT programe *
* filename: fft.asm *
***********************************************
.title "fft.asm"
.mmregs
.def _c_int00
N .set 128
length .set 256
;input data from file
.data
M .word 8
.align length
data .copy input
w .copy w
pow .space length*16
fftdata .space 2*length*16
;define variable for data and twiddle
;defind stack
BOS .usect "stack",0fh
TOS .usect "stack",1
;programe line
.text
_c_int00:
stm #TOS,sp
ld #0,dp
rsbx frct
*********************************************
* step1: bit revers *
* the needed register: *
* ar0-----the index of bit revers *
* ar3-----point to fft_data *
* ar1-----point to data *
*********************************************
stm #length,bk
stm #fftdata,ar3
stm #data,ar2
stm #length-1,brc
rptbd #plend-1
stm #N,ar0
mvdd *ar2,*ar3+
st #0h,*ar3+
mar *ar2+0B
plend:
*********************************************
* step2: fft *
* the needed register: *
* ar2-----point to fftdata *
* ar1-----point to w *
* ar3-----point to pos1 *
* ar4-----point to pos2 *
* ar6-----point to w_pos *
*********************************************
.data
first .word 0h ;i
second .word 0h ;j
third .word 0h ;k
groupnum .word N
cellnum .word 0001h
realin .word 0000h
imagein .word 0000h
.text
fft:
stm w,ar1
stm fftdata,ar2
ld #0h,b
stm first,ar5
st #0h,*ar5
jump3:
stm second,ar5
st #0h,*ar5
jump2:
stm third,ar5
st #0h,*ar5
jump1:
rsbx frct
stm cellnum,ar5 ;get pos1 pos1 = ar2 + (cellnum*2*second + third)*2
nop ;store it in ar3
nop
ld *ar5,t
nop
nop
stm second,ar5
nop
nop
mpy *ar5,a
nop
nop
nop
sftl a,1
nop
nop
stm third,ar5
nop
nop
add *ar5,a
nop
nop
sftl a,1
nop
nop
add ar2,a
nop
nop
stlm a,ar3
stm cellnum,ar5 ;get pos2 pos2 = pop + cellnum*2
nop ;store it in ar4
nop
add *ar5,1,a
nop
nop
stlm a,ar4
stm third,ar5 ;get w_pos,w_pos = ar1 + (third*groupnum)*2
nop
nop
ld *ar5,t
stm groupnum,ar5
nop
nop
mpy *ar5,a
nop
nop
nop
sfta a,1
nop
nop
add ar1,a
nop
nop
stlm a,ar6
nop
nop
ssbx frct
ld *ar6+,t ;w.real
nop
nop
mpy *ar4+,a ;real * w.real
nop
nop
nop
mpy *ar4-,b ;image * w.real
nop
nop
nop
ld *ar6-,t ;w.image
nop
nop
mac *ar4+,b ;real*w.image + image*w.real
nop
nop
nop
mas *ar4-,a ;real*w.real - image*w.image
nop
nop
nop
stm realin,ar5
nop
nop
sth a,1,*ar5
nop
nop
stm imagein,ar5
nop
nop
sth b,1,*ar5
ld *ar3+,a ;fftdata[pos2] = fftdata[pos1] - w*fftdata[pos2]
ld *ar3-,b
stm realin,ar5
nop
nop
sub *ar5,a
nop
nop
stm imagein,ar5
nop
nop
sub *ar5,b
stl a,-1,*ar4+
nop
nop
stl b,-1,*ar4
ld *ar3+,a ;fftdata[pos1] = fftdata[pos1] + w*fftdata[pos2]
stm realin,ar5
nop
nop
add *ar5,a
ld *ar3-,b
nop
nop
stm imagein,ar5
nop
nop
add *ar5,b
stl a,-1,*ar3+
stl b,-1,*ar3
stm third,ar5 ;third++,if third<cellnum,jump1
nop
nop
addm #0001h,*ar5
nop
nop
ld *ar5,a
stm cellnum,ar5
nop
nop
sub *ar5,a,b
nop
nop
bc jump1,blt
stm second,ar5 ;second++,if second<groupnum,jump2
nop
nop
addm #0001h,*ar5
nop
nop
ld *ar5,a
nop
nop
stm groupnum,ar5
nop
nop
sub *ar5,a,b
nop
nop
bc jump2,blt
stm cellnum,ar5 ;cellnum*2
nop
nop
ld *ar5,1,a
nop
nop
stl a,*ar5
stm groupnum,ar5;groupnum/2
nop
nop
ld *ar5,-1,a
nop
nop
stl a,*ar5
stm first,ar5 ;first++,if first<M,jump3
nop
nop
addm #0001h,*ar5
nop
nop
ld *ar5,a
nop
nop
stm M,ar5
nop
nop
sub *ar5,a,b
nop
nop
bc jump3,BLT
*********************************************
* step3: power spectual *
* the needed register: *
* ar5-----point to power *
* ar2-----point to fftdata *
*********************************************
power:
stm pow,ar5
ld #0001h,b
ld #00h,a
jump4:
ld #00h,a
squra *ar2+,a
nop
nop
nop
nop
squra *ar2+,a
nop
nop
nop
nop
sth a,*ar5+
add #01h,b
nop
nop
sub #0100h,0,b,a
nop
nop
bc jump4,alt
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -