📄 fftrad2.asm
字号:
/* Include for symbolic definition of system register bits */
#include "def21161.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 1024
#define STAGES 10
#define BRMODIFY_DM 0x00400000
#define BRMODIFY_PM 0x00400000
#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 dm_data;
.VAR sine[N/2]= "ts2.dat"; /*imag twiddle factors, from TWIDRAD2 */
.VAR refft[N]; /* real result */
.VAR reifft[N];
.GLOBAL refft;
.GLOBAL reifft;
.ENDSEG;
.SEGMENT/DM dm_rdat; /* This segment is an integer multiple of N */
.VAR redata[920]= "real.dat"; /* input real array */
.VAR rezero[N-920];
.GLOBAL redata;
.ENDSEG;
.SEGMENT/DM dm_rcoff;
.VAR recoff[N]="coeff_fft_re.dat";
.GLOBAL recoff;
.ENDSEG;
.SEGMENT/DM dm_mod;
.VAR modual[N];
.GLOBAL modual;
.ENDSEG;
.SEGMENT/DM dm_remti;
.VAR remti[460];
.GLOBAL remti;
.ENDSEG;
.SEGMENT/DM dm_mti_mod;
.VAR mti_modual[460];
.GLOBAL mti_modual;
.ENDSEG;
.SEGMENT/PM pm_idat; /* This segment is an integer multiple of N */
.VAR imdata[920]= "imag.dat"; /* input image array */
.VAR imzero[N-920];
.GLOBAL imdata;
.ENDSEG;
.SEGMENT/PM pm_data;
.VAR cosine[N/2]= "tc2.dat"; /* real twiddle factors, from TWIDRAD2 */
.VAR imfft[N]; /* imag result */
.VAR imifft[N];
.GLOBAL imfft;
.GLOBAL imifft;
.ENDSEG;
.SEGMENT/PM pm_icoff;
.VAR imcoff[N]="coeff_fft_im.dat";
.GLOBAL imcoff;
.ENDSEG;
.SEGMENT/PM pm_imti;
.VAR imti[460];
.GLOBAL imti;
.ENDSEG;
/*_______________ADSP-21060 reset vector test call of fft___________________*/
.SEGMENT/PM pm_rsti; /* program starts at the reset vector */
// pmwait=0x0021; /*pgsz=0,pmwtstates=0,intrn.wtstates only*/
// dmwait=0x8421; /*pgsz=0,pmwtstates=0,intrn.wtstates only*/
call fftrad2;
//============================1024点复数乘,结果进行实虚部的交换,为IFFT准备============================//
call mul;
//======================以下部分分别将信号实,虚部的FFT所在的数组清零,以便存入数据,不清零也可以==================//
b2=refft;
m2=1;
// b3=b2;
b10=imfft;
m10=1;
lcntr=N,do zeroloop until lce;
f0=0;
f8=0;
zeroloop:
dm(i2,m2)=f0,pm(i10,m10)=f8;
//================以上部分分别将信号实,虚部的FFT所在的数组清零==================//
call fftrad2;//对做完复数乘法的并且交换过实,虚部后的数据进行FFT,后除以1024。
call ifft_last;//除以1024
b2=reifft;
l2=N;
m2=1;
// b3=b2;
b10=imifft;
l10=N;
m10=1;
// b11=b10;
b7=modual;
m7=1;
r0=N;
call do_modual;//求模
call mti;
b2=remti;//将mti的实部放入到b2中,以便直接调用modual求mti后的模数值
l2=460;
m2=1;
// b3=b2;
b10=imti;
l10=460;
m10=1;
// b11=b10;
b7=mti_modual;
m7=1;
r0=460;
call do_modual;
stop: idle;
.ENDSEG;
.SEGMENT/PM pm_code;
/*_______________________________begin FFT__________________________________*/
fftrad2:
bit set mode1 BR0; /* enable bit reverse of i0 */
bit set mode1 BR8; /* enable bit reverse of i8 */
b8=OIM; /* Points to input imaginary array */
b0=ORE; /* Points to input real array to be read in */
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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -