?? fft.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 + -