📄 fft.txt
字号:
.bss _nom,1 // 当 _nom=1时, FFT需要归一化处理,为0时则不需要
.global _fft
.global _sintab
.global _input
.global _nom
.text
_fft:
// --------------------------------------
// 与C语言兼容的代码部分
// --------------------------------------
POPD *+ // 存储返回地址ADDRESS
SAR AR6,*+ // 存储 AR6
SAR AR7,*+ // 存储 AR7
SAR AR0,*+ // 存储 AR0
SAR AR1,* // 堆栈分布情况:ADDRESS/AR6/AR7/AR0/AR1
// ARP=AR1, AR1:AR1
LAR AR0,#08h
LAR AR3,*0+,AR3 // AR3:FP, SP=SP+size(size=frame的长度)
// ARP=AR3
LAR AR2,* // AR2:AR1
LAR AR7,#_nom // AR7 指向 _nom
// -----------------------------------------
// 初始化一些寄存器
// -----------------------------------------
SPLK #(N-1),*+
SPLK #(M-1),*+
// 堆栈分布情况:ADDRESS/AR6/AR7
// /AR0/N/M/Y(其中Y为没有确定的量)
// ARP=AR3, AR2:N, AR3:Y
SPLK #1,*+,AR2 // ID=1,ARP=AR2
// 堆栈分布情况:ADDRESS/AR6/AR7/AR0/ // N/M/ID/Y ARP=AR2, AR2:N, AR3:
// -----------------------------------------
// FFT运算处理部分
// -----------------------------------------
SETC OVM // 使能溢出模式
SETC SXM // 符号扩展使能
SPM 1 // PREG寄存器的输出左移一位,
// 自动将两个Q15相乘后化为Q15的格式
LACC *+,AR3
ADD #1
SACL *+,1,AR2 // IW=2*(N+1)
// 堆栈分布情况:ADDRESS/AR6/AR7
// /AR0/N/M/ID/IW/Y
// ARP:AR2, AR2:M, AR3:Y,
LAR AR5,*+ // AR5=M,ARP:AR2, AR2:ID,
// AR3:Y, AR5=M
LOOP3
LAR AR6,#_input // AR6:input-->Ri ,ARP:AR2,
// AR2:ID, AR3:Y, AR5=M, AR6:input
LACC *,1
SACL *+ // ID=ID*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
// 堆栈分布情况:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/Y
// ARP:AR2, AR2:ID, AR3:Y, AR5=M, AR6:input
LAR AR0,* // AR0=ID
LOOP2
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
// 堆栈分布情况: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-->Rj
LOOP1
LACC #0
LT *+,AR6 // TREG=COSαlk
MPY *+,AR4 // Rj* COSαlk,ARP=AR4,AR4:SINαlk,AR6:Ij
LT *,AR6
MPYA *-,AR3 // ACC=ACC+Rj*COSαlk, PREG=Ij*SINαlk
// ARP=AR3, AR4:SINαlk, AR6: Rj
SPAC // ACC=ACC-Ij*SINαlk
SACH *+,AR4 // XT=Rj*COSαlk-Ij*SINαlk
// 堆栈分布情况: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 // Rj*SINαlk,ARP=AR4,AR4:COSαlk,AR6:Ij
LT *,AR6
MPYA *-,AR3 // ACC=ACC+Rj*SINαlk, PREG=Ij*COSαlk
// ARP=AR3, AR4:COSαlk, AR6:Rj
APAC
SACH *-,AR7 // YT=Rj*SINαlk+Ij*COSαlk
// 堆栈分布情况: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 D2,NEQ // 当_nom不为0时,需要在运算过程中进
// 行归一化操作
// ----------------------------------------
// 不进行归一化操作程序部分
// ----------------------------------------
MAR *0- // AR6=AR6-ID-->Ri
LACC *,AR3
ADD *,AR6
SACL *0+,AR3 // Ri=Ri+XT
// ARP:AR3, AR0=ID, AR2:IW, AR3:XT, AR4:COSαlk, AR5=M, AR6:Rj
SUB *+,1,AR6
SACL *+ // Rj= Ri+XT -XT*2=Ri-XT, AR6:Ij, AR3:YT
// ARP:AR6, AR0=ID, AR2:IW, AR3:YT, AR4:COSαlk , AR5=M, AR6:Ij
MAR *0- // AR6:Ii
LACC *,AR3
ADD *-,AR6
SACL *0+,AR3 // Ii= Ii +YT, AR6:Ij
// ARP:AR3, AR0=ID, AR2:IW, AR3:XT, AR4:COSαlk, AR5=M, AR6:Ij
SUB *,1,AR6
SACL *+,0,AR2 // Ij= Ii +YT -YT*2=Ii-YT
// STACK:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/C1/XT/YT
// ARP:AR2,AR0=ID,AR2:IW,AR3:XT,AR4:COSαlk,AR5=M,AR6:NEXT Rj
B D // AR6 指向下一个Rj
// ---------------------------------------
// 归一化处理程序部分
// ---------------------------------------
D2 MAR *0- // AR6-->Ri
LAC *,15,AR3
ADD *,15,AR6
SACH *0+,AR3 // Ri =( Ri +XT)/2
// ARP:AR3, AR0=ID, AR2:IW, AR3:XT, AR4:COSαlk, AR5=M, AR6:Rj
SUB *+,16,AR6
SACH *+ // Rj=Ri-XT, AR6:Ij, AR3:YT
// ARP:AR6, AR0=ID, AR2:IW, AR3:YT, AR4:COSαlk, AR5=M, AR6:Ij
MAR *0- // AR6:Ii
LACC *,15,AR3
ADD *,15,AR6
SACH *0+,AR3 // Ii=(Ii+YT)/2, AR6:Ij
// ARP:AR3, AR0=ID, AR2:IW, AR3:YT, AR4:COSαlk, AR5=M, AR6:Ij
SUB *-,16,AR6
SACH *+,0,AR2 // Ij=Ii-YT
// STACK:ADDRESS/AR6/AR7/AR0/N/M/ID/IW/C2/C1/XT/YT
// ARP:AR2,AR0=ID,AR2:IW,AR3:XT,AR4:COSαlk,AR5=M,AR6:下一个Rj
D
LAR AR0,*-,AR4 // AR0=IW
// ARP=AR4, AR0=IW, AR2:ID, AR3:XT, AR4:COSαlk, AR5=M,AR6:下一个Rj
MAR *0+,AR2 // AR4=AR4+IW-->下一个COSαlk
LAR AR0,* // AR0=ID
ADRK #3 // AR2:C1
// ARP=AR2, AR0=ID, AR2:C1, AR3:XT, AR4: 下一个COSαlk, AR5=M, AR6:Rj
LACC *
SUB #1
SACL *- // C1=C1-1
// ARP=AR2, AR0=ID, AR2:C2, AR3:XT, AR4:COSαlk, AR5=M, AR6:Rj
BCND LOOP4,LEQ // 跳转至LOOP4, IF C1<0
MAR *-,AR4 // AR2:IW
// ARP=AR4, AR0=ID, AR2:IW, AR3:XT, AR4: 下一个COSαlk, AR5=M, AR6:Rj
B LOOP1
LOOP4 LACC *
SUB #1
SACL *-,AR3
MAR *-,AR2
// ARP=AR2, AR0=ID, AR2:IW, AR3:C1, AR4: 下一个COSαlk, AR5=M, AR6:Ri
MAR *-
BCND LOOP2,GT
MAR *,AR3
MAR *-,AR5
// ARP=AR5, AR0=ID, AR2:IW, AR3:C2, AR4下一个COSαlk, AR5=M, AR6:Ri
BANZ LOOP3,*-,AR2
// ------------------------------------
// 与C语言兼容的代码部分
// ------------------------------------
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 + -