⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dit_fft.asm

📁 基于ADSP-219x系列的时间抽取基2FFT代码
💻 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 + -