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

📄 fft.asm

📁 通过visual DSP
💻 ASM
字号:
/* Include for symbolic definition of system register bits */
#include "def21161.h"
#include "asm_sprt.h"

/*_________The constants below must be changed for different length FFTs______
N        = number of points in the FFT, must be a power of 2
STAGES   = log2(N)
BRMODIFY_DM = bitrev(32 bit N/2)
BRMODIFY_PM = bitrev(24 bit N/2)
ORE      = bitrev(32 bit addr of input real in dm), addr is 0,N,2N,3N,...
OIM      = bitrev(24 bit addr of input imag in pm), addr is 0,N,2N,3N,...
____________________________________________________________________________*/

#define N               2048

#define STAGES          11
#define BRMODIFY_DM     0x00200000
#define BRMODIFY_PM     0x00200000
/*
#define ORE             0x000ca000
#define OIM             0x000c2000
*/
/*________These constants are independent of the number of points___________*/
#define BFLY8           4       /*Number of bttrfly in a group of 8*/

.SEGMENT/DM             seg_sram;
.VAR    sine[N/2]= "ts2.dat";   
.ENDSEG;
.SEGMENT/DM             seg_sram;
.VAR    cosine[N/2]= "tc2.dat"; 
.ENDSEG;

.SEGMENT/PM             seg_pmco;
.GLOBAL _fft;

//.extern sine;
//.extern cosine;

.extern _refft;
.extern _imfft;
/*_______________________________begin FFT__________________________________*/
_fft:
    leaf_entry;
	bit set mode1 BR0;  /* enable bit reverse of i0 */
	bit set mode1 BR8;	/* enable bit reverse of i8 */
	i4=r8;
    bitrev(i4,0);
    m8=i4;
    i9=r4;
    bitrev(i9,0);
    m0=i9;
	b8=m8;//OIM;				/* Points to input imaginary array */
	b0=m0;//ORE;     
	l8=0;
	l0=0;
	m0=BRMODIFY_DM;        /* Modifier for bitreverse counter*/
	m8=BRMODIFY_PM;		   /* Modifier for bitreverse counter*/
			/* bit reversed order */
	b2=_refft;
	l2=N;       /* Circ pointer limits loopend pointer overflow */
	m1=1;       /* This loop increments forward +1*/

	b10=_imfft;
	l10=N;      /* Circ pointer limits loopend pointer overflow */
	m10=1;
    
	/*Do the first two stages (actually a radix-4 FFT stage)*/

						f0=dm(i0,m0),   f1=pm(i8,m8);
						f2=dm(i0,m0),   f3=pm(i8,m8);
		f0=f0+f2,       f2=f0-f2,       f4=dm(i0,m0),   f5=pm(i8,m8);
		f1=f1+f3,       f3=f1-f3,       f6=dm(i0,m0),   f7=pm(i8,m8);
		f4=f6+f4,       f6=f6-f4;
		f5=f5+f7,       f7=f5-f7;
		f8=f0+f4,       f9=f0-f4;
		f10=f1+f5,      f11=f1-f5;

lcntr=N/4-1,  do FSTAGE until lce;    /* do N/4 simple radix-4 butterflies */
		f12=f2+f7,      f13=f2-f7,      f0=dm(i0,m0),   f1=pm(i8,m8);
		f14=f3+f6,      f15=f3-f6,      f2=dm(i0,m0),   f3=pm(i8,m8);
		f0=f0+f2,       f2=f0-f2,       f4=dm(i0,m0),   f5=pm(i8,m8);
		f1=f1+f3,       f3=f1-f3,       f6=dm(i0,m0),   f7=pm(i8,m8);
		f4=f6+f4,       f6=f6-f4,       dm(i2,m1)=f8,   pm(i10,m10)=f10;
		f5=f5+f7,       f7=f5-f7,       dm(i2,m1)=f12,  pm(i10,m10)=f14;
		f8=f0+f4,       f9=f0-f4,       dm(i2,m1)=f9,   pm(i10,m10)=f11;
FSTAGE: f10=f1+f5,      f11=f1-f5,      dm(i2,m1)=f13,  pm(i10,m10)=f15;


		f12=f2+f7,      f13=f2-f7; /* change on 5/26/93, drain pipe*/
		f14=f3+f6,      f15=f3-f6; /* without out of range dm xfer*/
						dm(i2,m1)=f8,   pm(i10,m10)=f10;
						dm(i2,m1)=f12,  pm(i10,m10)=f14;
						dm(i2,m1)=f9,   pm(i10,m10)=f11;
						dm(i2,m1)=f13,  pm(i10,m10)=f15;

    /*middle stages loop */

	bit clr mode1 BR0|BR8;     /*finished with bitreversal*/
//	bit clr mode1 BR8;	   /*finished with bitreversal*/
    bit set mode1 CBUFEN;

	b8=_imfft;
	l8=N;
	
	b0=_refft;
	l0=N;       /* Circ pointer limits loopend pointer overflow */
	b1=sine;
	l1=@sine;

	b9=cosine;
	l9=@cosine;
	b11=_imfft;
	l11=N;      /* Circ pointer limits loopend pointer overflow */

	m0=-BFLY8;
	m1=-N/8;
	m2=-BFLY8-1;
	m9=-N/8;
	m11=-1;

	r2=2;
	r3=-BFLY8;           /*initializes m0,10 - incr for butterf branches*/
	r5=BFLY8;            /*counts # butterflies per a group */
	r9=(-2*BFLY8)-1;     /*initializes m12 - wrap around to next grp + 1*/
	r10=-2*BFLY8;        /*initializes m8 - incr between groups */
	r13=-BFLY8-1;        /*initializes m2,13 - wrap to bgn of 1st group */
	r15=N/8;             /*# OF GROUPS IN THIRD STAGE*/

	f1=dm(i1,m1),   f7=pm(i9,m9); /*set pointers to tables to 1st coeff. */

lcntr=STAGES-4, do end_stage until lce; /*# OF STAGES TO BE HANDLED = LOG2N-4*/
	m8=r10;
	m10=r3;
	m12=r9;
	i0=_refft+N-1;
	i2=_refft+N-1;
	i8=_imfft+N-1;
	i10=_imfft+N-1;
	i11=_imfft+N-1;
	r15=r15-r2,     m13=r13;        /*CALCULATE # OF CORE */
					/*BFLIES/GROUP IN THIS STAGE*/

										f0=dm(i1,m1),   f7=pm(i8,m8);
f12=f0*f7,                              f6=dm(i0,m0),   f1=pm(i9,m9);
f8=f1*f6,                                               modify(i11,m10);
f11=f1*f7,                                              f7=pm(i8,m8);
f14=f0*f6,  f12=f8+f12,                 f8=dm(i0,m0);
f12=f0*f7,  f13=f8+f12, f10=f8-f12,     f6=dm(i0,m0);   

/*Each iteration does another set of bttrflys in each group*/

lcntr=r5,   do end_group until lce;    /*# OF BUTTERFLIES/GROUP IN THIS STAGE*/

/*core butterfly loop*/

lcntr=r15,  do end_bfly until lce;     /*Do a butterfly in each group - 2*/
    f8=f1*f6,   f14=f11-f14,                    dm(i2,m0)=f10,  f9=pm(i11,m8);
    f11=f1*f7,  f3=f9+f14,      f9=f9-f14,      dm(i2,m0)=f13,  f7=pm(i8,m8);
    f14=f0*f6,  f12=f8+f12,                     f8=dm(i0,m0),   pm(i10,m10)=f9;
end_bfly:
    f12=f0*f7,  f13=f8+f12,     f10=f8-f12,     f6=dm(i0,m0),   pm(i10,m10)=f3;

/*finish up last bttrfly and set up for next stage*/

f8=f1*f6,               f14=f11-f14,    dm(i2,m0)=f10,  f9=pm(i11,m8);
f11=f1*f7,  f4=f9+f14,  f9=f9-f14,      dm(i2,m0)=f13,  f14=pm(i8,m11);
f14=f0*f6,  f12=f8+f12,                 f8=dm(i0,m2),   pm(i10,m10)=f9;
f13=f8+f12, f10=f8-f12,   			    f0=dm(i1,m1),   f7=pm(i8,m8);/*dm:sin*/
			f14=f11-f14,   			    dm(i2,m0)=f10,  f9=pm(i11,m12);
  /*start on next butterfly in each group*/
f12=f0*f7,  f3=f9+f14,  f9=f9-f14,      f6=dm(i0,m0),   f1=pm(i9,m9);/*pm:cos*/
f8=f1*f6,                               dm(i2,m2)=f13,  pm(i10,m10)=f4;
f11=f1*f7,                                              pm(i10,m10)=f9;
f14=f0*f6,  f12=f8+f12,                 f8=dm(i0,m0),   f7=pm(i8,m8);
end_group:
f12=f0*f7,  f13=f8+f12, f10=f8-f12,     f6=dm(i0,m0),   pm(i10,m13)=f3;

					
	    r4=r15+r2,          i1=b1;       /*PREPARE R4 FOR #OF BFLIES CALC*/
	    r15=ashift r4 by -1;             /*# OF BFLIES/GRP IN NEXT STAGE*/
	    r4=-r15,            i9=b9;
	    m1=r4;                                /*update inc for sin & cos */
	    m9=r4;
	    r5=ashift r5 by 1,  f1=dm(i1,m1);     /*update # bttrfly in a grp*/
	    r3=-r5;                               /*   inc for bttrfly branch*/
	    r13=r3-1,           m0=r3;            /*   wrap to 1st grp       */
	    r10=ashift r3 by 1, f7=pm(i9,m9);     /*   inc between grps      */
end_stage:  r9=r10-1,           m2=r13;           /*   wrap to grp +1        */

/*_________ next to last stage__________*/
	m1=-2;                  /*modifier to sine table pntr    */
	m8=r10;                 /*incr between groups            */
	m9=-2;                  /*modifier to cosine table pntr  */
	m10=r3;                 /*incr between bttrfly branches  */
	m12=r9;                 /*wrap around to next grp + 1    */
	m13=r13;                /*wrap to bgn of 1st group       */

	i0=_refft+N-1;
	i1=sine+(N/2)-2;        /*pntr to 1st sine coeff         */
	i2=_refft+N-1;
	i8=_imfft+N-1;
	i9=cosine+(N/2)-2;      /*pntr to 1st cosine coeff       */       
	i10=_imfft+N-1;
	i11=_imfft+N-1;
										f0=dm(i1,m1),   f7=pm(i8,m8);
f12=f0*f7,                              f6=dm(i0,m0),   f1=pm(i9,m9);
f8=f1*f6,                                               modify(i11,m10);
f11=f1*f7,                                              f7=pm(i8,m12);
f14=f0*f6, f12=f8+f12,                  f8=dm(i0,m0);
f12=f0*f7, f13=f8+f12,  f10=f8-f12,     f6=dm(i0,m0);                           

/*Do the N/4 butterflies in the two groups of this stage*/

lcntr=N/4,  do end_group2 until lce;    
    f8=f1*f6,                   f14=f11-f14,    dm(i2,m0)=f10,  f9=pm(i11,m8);
    f11=f1*f7,  f3=f9+f14,      f9=f9-f14,      dm(i2,m0)=f13,  f1=pm(i9,m9);
    f14=f0*f6,  f12=f8+f12,                     f8=dm(i0,m2),   pm(i10,m10)=f9;
	f13=f8+f12, f10=f8-f12,  				    f0=dm(i1,m1),   f7=pm(i8,m8);
    f12=f0*f7,                  f14=f11-f14,    f6=dm(i0,m0),   f9=pm(i11,m12);

    f8=f1*f6,   f3=f9+f14,      f9=f9-f14,      dm(i2,m0)=f10,  pm(i10,m10)=f3;
    f11=f1*f7,                                  dm(i2,m2)=f13,  pm(i10,m10)=f9;
    f14=f0*f6, f12=f8+f12,                      f8=dm(i0,m0),   f7=pm(i8,m12);
end_group2:
    f12=f0*f7, f13=f8+f12,      f10=f8-f12,     f6=dm(i0,m0),   pm(i10,m13)=f3;


/*   The last stage      */


	i1=sine;        /*pntr to 1st sine coeff         */	
	i9=cosine;      /*pntr to 1st cosine coeff       */
	m2=N/2;                
	m0=(N/2)+1;		/* modifier */
	m4=1;
	m14=1;
	i0=_refft+N/2;		/*pntr to REAL X0,X1*/
	i2=_refft;			/*pntr to REAL X0',X1'*/
	i8=_imfft+(N/2);		/*pntr to REAL X0,X1*/
	i10=_imfft;			/*pntr to IMAG Y0',Y1'*/
	i11=_imfft;  		/*pntr to IMAG Y0*/
	b3=_refft;
	b4=_refft;
	
	b12=_imfft;			/* base register for 2nd butterfly*/
	b13=_imfft;
	b14=_imfft;	
	i3=_refft+(3*N/4);	/*2nd bttrfly pntr to REAL X0,X1*/
	i4=_refft+(N/4);		/*2nd bttrfly pntr to REAL X0,X1*/
	i12=_imfft+(3*N/4);	/*2nd bttrfly pntr to REAL X0,X1*/
	i13=_imfft+(N/4);	/*2nd bttrfly pntr to IMAG Y0',Y1'*/
	i14=_imfft+(N/4);	/*2nd bttrfly pntr to IMAG Y0*/
	l3=N;
	l4=N;
	l12=N;
	l13=N;
	l14=N;


	/*start first bttrfly*/

f6=dm(i0,m2)/*X1*/		,f7=pm(i8,m14);/*Y1*/
f0=dm(i1,m4)/* sin */	,f1=pm(i9,m14);/* cos */
f8=f1*f6,/*CX1*/  m10=m0;
f12=f0*f7,/*SY1*/ m13=m2;
f11=f1*f7/*CY1*/ ,f12=f8+f12 /*CX1+SY1*/ ,f10=dm(i0,m0)/*X0*/ ,f9=pm(i11,m14);/*Y0*/
f14=f0*f6/*SX1*/ ,f6=dm(i3,m2)/*X1*/ ,f7=pm(i12,m14); /*Y1*/	
f8=f0*f6, f15=f11-f14;
f12=f1*f7, f13=f10+f12 ,f4=f10-f12;	
	
/*do two bttrflys in one loop with single twiddle fetch*/
/*use complex conjugated twiddel pairs N/4 appart	   */
lcntr=N/4 , do last_stage until lce;
f11=f0*f7, 	f3=f9+f15,	f2=f9-f15,		f10=dm(i3,m0),	f9=pm(i14,m14);
f14=f1*f6, 	f12=f8-f12, 				f6=dm(i0,m2),	f7=pm(i8,m14);
/*single twiddel fetch*/				f0=dm(i1,m4), 	f1=pm(i9,m14);
f8=f1*f6, 	f15=f11+f14, 				dm(i2,m2)=f13,	pm(i10,m13)=f3;
f12=f0*f7,	f4=f10+f12 ,f13=f10-f12,	dm(i2,m0)=f4,  	pm(i10,m10)=f2; 
f11=f1*f7,	f2=f9+f15,	f3=f9-f15,		f10=dm(i0,m0),	f9=pm(i11,m14);
f14=f0*f6,	f12=f8+f12,					f6=dm(i3,m2), 	f7=pm(i12,m14);
f8=f0*f6, 	f15=f11-f14, 				dm(i4,m2)=f13,	pm(i13,m13)=f3; 
last_stage: f12=f1*f7, f13=f10+f12 ,f4=f10-f12,		dm(i4,m0)=f4,	pm(i13,m10)=f2;



exit;;
//rts;    /*finished*/
/*_______________________________________________________________________*/
.ENDSEG;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -