📄 dit_fft.asm
字号:
/******************************************************************************
FFT计算子程序,包括三个循环:蝶形循环(butterfly loop),组循环(group loop),
级循环(stage loop)
Calling Parameters
Scrambled results in inplacereal and inplaceimag
Return Parameters
Radix-2 DIT FFT stage results in inplacereal and inplaceimag
Altered Registers
I0,I2,I3,I4,I5,AX0,AY0,AR,MX0,MY0,MR,SR,SI,SB,CNTR
Altered Memory
inplacereal, inplaceimag, twid_real, twid_imag
*******************************************************************************/
#define N 128 //the pointer of FFT
#define M 8 //the numner of the input data
#define L 16 // N/M
#define log2N 7
#define log2M 3
#define log2L 4 //L=log2N-log2M
.EXTERN twid_real;
.EXTERN twid_imag;
.EXTERN inplacereal;
.EXTERN inplaceimag;
.EXTERN bfp_adj;
.EXTERN groups;
.EXTERN bflys_per_group;
.EXTERN node_space;
.GLOBAL fft_strt;
.section/pm program;
fft_strt: CNTR=M;
M0=0;
M1=1;
M2=L;
I0=inplacereal;
I2=inplaceimag;
L1=0;
L2=0;
L3=0;
L4=0;
L5=0;
DO group_loop1 UNTIL CE; //copy memory for simplify the arithmatic
I1=I0;
MODIFY(I1,M1); //I1=x1 of 1st group in stage
I3=I2;
MODIFY(I3,M1);
MX0=DM(I0,M2);
MX1=DM(I2,M2);
AX0=L;
AR=AX0-1;
CNTR=AR;
DO bfly_loop1 UNTIL CE;
DM(I1,M1)=MX0;
bfly_loop1:DM(I3,M1)=MX1;
group_loop1:nop;
SI=M;
SR=ASHIFT SI BY -1(LO);
DM(groups)=SR0;
AX0=L;
DM(bflys_per_group)=AX0;
DM(node_space)=AX0;
CNTR=log2M;
DO stage_loop UNTIL CE;
I0=inplacereal;
I2=inplaceimag;
SB=-2;
SI=DM(groups);
CNTR=SI; //CNTR=group counter
M4=SI; //M4=twiddle factor modifier
M2=DM(node_space); //M2=node space modifier
I1=I0;
MODIFY(I1,M2); //I1=x1 of 1st group in stage
I3=I2;
MODIFY(I3,M2); //I3=y1 of 1st grp in stage
DO group_loop UNTIL CE;
I4=twid_real; //I4=C of W0
I5=twid_imag; //I5=(-S) of W0
SI=DM(bflys_per_group);
CNTR=SI;
MY0=PM(I4,M4);
MX0=DM(I1,M0); //MY0=C,MX0=x1
MY1=PM(I5,M4);
MX1=DM(I3,M0); //MY1=-S,MX1=y1
DO bfly_loop UNTIL CE;
MR=MX0*MY1(SS),AX0=DM(I0,M0); //MR=x1(-S),AX0=x0
MR=MR+MX1*MY0(RND),AX1=DM(I2,M0);
AY1=MR1,MR=MX0*MY0(SS); //AY1=y1(C)+x1(-S),MR=x1(C)
MR=MR-MX1*MY1(RND); //MR=x1(C)-y1(-S)
AY0=MR1,AR=AX1-AY1; //AY0=x1(C)-y1(-S)
SB=EXPADJ AR,DM(I3,M1)=AR; //Check for bit growth
AR=AX0-AY0,MX1=DM(I3,M0);
MY1=PM(I5,M4);
SB=EXPADJ AR,DM(I1,M1)=AR; //Check for bit growth
AR=AX0+AY0,MX0=DM(I1,M0),MY0=PM(I4,M4);
SB=EXPADJ AR,DM(I0,M1)=AR; //Check for bit growth
AR=AX1+AY1; //AR=y0+[y1(C)+x1(-S)]
bfly_loop:SB=EXPADJ AR,DM(I2,M1)=AR; //Check for bit growth
MODIFY(I0,M2); //I0=1st x0 in next group
MODIFY(I1,M2); //I1=1st x1 in next group
MODIFY(I2,M2); //I2=1st y0 in next group
group_loop: MODIFY(I3,M2); //I3=1st y1 in next group
CALL bfp_adj; //Compensate for bit growth
SI=DM(bflys_per_group);
SR=ASHIFT SI BY 1(LO);
DM(node_space)=SR0; //node_space=node_space*2
DM(bflys_per_group)=SR0; //bflys_per_groupnode_space*2
SI=DM(groups);
SR=ASHIFT SI BY -1(LO);
stage_loop: DM(groups)=SR0; //groups=groups/2
I0=inplacereal;
I1=inplacereal;
I2=inplaceimag;
I3=inplaceimag;
CNTR=N;
AX0=SB;
AR=0-AX0;
SE=AR;
DO shift_loop UNTIL CE;
SI=DM(I0,M1);
SR=ASHIFT SI(HI);
DM(I1,M1)=SR1;
SI=DM(I2,M1);
SR=ASHIFT SI(HI);
shift_loop:DM(I3,M1)=SR1;
RTS;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -