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

📄 fftrad2.asm

📁 汇编语言编写的雷达动目标显示源程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
/* 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 + -