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

📄 psd.asm

📁 基于ADSP sharc系列的DSP ts201浮点数程序源代码
💻 ASM
字号:
/**************************************************************************
psd.asm         ADSP-2106x

程序功能:利用相关函数计算功率谱
***************************************************************************/

#include "def21060.h"           /* Memory Mapped IOP register definitions */
#define N 64                    /* Constant for number of points in input */
#define M 32 

.SECTION/DM     dm_data;        /* 定义数据存储区中的变量 */
.VAR inputx[M]= "noise32.dat";
.VAR inputy[M]= "noise32.dat";
.VAR output[N]= "zeros64.dat";
.VAR real[N]= "zeros64.dat";
.VAR imag[N]= "zeros64.dat";

.SECTION/PM     pm_data;        /* 定义程序存储区中的变量 */
.VAR sine[N]= "sin64.dat";      /* 正弦旋转因子表 */ 
.VAR modul[N]= "zeros64.dat";

.SECTION/PM     pm_rsti;        /* The reset vector resides in this space */
		NOP;
		USTAT2= 0x108421;  		/* 1st instr. to be executed after reset */
		DM(WAIT)=USTAT2; 		/* Set external memory waitstates to 0 */
		JUMP start;

.SECTION/PM     pm_code;      
start:  M1=1;
		M9=1;
		I0=inputx;
		L0=0;
		I1=inputy;
		L8=0;
		CALL relate;			/* 调用相关性计算子程序 */
		CALL psd;				/* 调用功率谱计算子程序 */
		CALL modl;				/* 调用模计算子程序 */
end:    IDLE;


/******************* 计算时域相关性的子程序 *******************************/ 
relate:	I2=output;
		R1=0;
		I10=0;					/* increment */
		L10=0;
		F15=0;                  /* Zero to clear accumulators */
		LCNTR=M, DO left UNTIL LCE;
				
		I0=inputx;
		I9=inputy+M-1;
		M8=I10;
		MODIFY(I9,M8);
		R1=R1+1;
		F9=PASS F15, F0=DM(I0,M1), F5=PM(I9,M9);
		  
		LCNTR=R1, DO inner1 UNTIL LCE;
		F13=F0*F5;
inner1:	F9=F9+F13, F0=DM(I0,M1), F5=PM(I9,M9);	/* F0=x , F5=y */
		
		DM(I2,M1)=F9;      		/* Write  result */
left:	MODIFY(I10,-1);
           
		I10=0;
		L10=0;
		R1=M;
		F15=0;                  /* Zero to clear accumulators */
		LCNTR=M-1, DO right UNTIL LCE;
		
		I1=inputy;
		I9=inputx+1;
		M8=I10;        			/* Update accessing addr */
		MODIFY(I9,M8);
		R1=R1-1;
		F9=PASS F15, F0=DM(I1,M1), F5=PM(I9,M9);
		  
		LCNTR=R1, DO inner2 UNTIL LCE;
		F13=F0*F5; 
inner2:	F9=F9+F13, F0=DM(I1,M1),F5=PM(I9,M9);	/*F0 = y, F5= x */
		DM(I2,M1)=F9;      		/* Write  result */
right:	MODIFY(I10,M9);

		RTS;

/******************* 计算功率谱的子程序 *********************************/ 
psd:	B0=output;
		L0=@output;              /* 建立循环缓冲区 */
		I1=imag;
		L1=0;
		CALL dft (DB);         	 /* 延迟调用DFT子程序 */
		I2=real;             	 /* 在被调用函数执行前首先执行 */
		L2=0;              
		nop;
		RTS;

/******************* 计算DFT的子程序 *********************************/ 
dft:    B8=sine;                	/* Sine pointer */
		L8=@sine;
		B9=sine;                	/* Derive cosine from sine by */
		I9=sine+N/4;            	/* shifting pointer over 2pi/4 */
		L9=@sine;              		/* and using a circular buffer.*/
		I10=0;                 		/* I10 is used to increment the */
		L10=0;                  	/* frequency of sine lookup.*/
		F15=0;                  	/* Zero to clear accumulators */
		LCNTR=N, DO outer UNTIL LCE;
		F8=PASS F15, M8=I10;        /* Update frequency */
		F9=PASS F15, F0=DM(I0,M1), F5=PM(I9,M8);
		F12=F0*F5, F4=PM(I8,M8);
		LCNTR=N-1, DO inner UNTIL LCE;
		F13=F0*F4, F9=F9+F12, F0=DM(I0,M1), F5=PM(I9,M8);
inner:  F12=F0*F5, F8=F8-F13, F4=PM(I8,M8);
		F13=F0*F4, F9=F9+F12;
		F8=F8-F13, DM(I2,M1)=F9;    /* Write real result */
		MODIFY(I10,M9);             /* Increment frequency */
outer:  DM(I1,M1)=F8;               /* Write imaginary result */
		RTS;


/******************* 计算模的子程序 *********************************/ 
modl:	I0=real;
		L0=0;
		I1=imag;
		L1=0;
		I8=modul;
		L8=0;
		F2=DM(I0,M1);
		F6=F2;
		F3=DM(I1,M1);
		F7=F3;
		F8=F2*F6;
		F13=F3*F7;
			
		LCNTR=N, DO mod_cal UNTIL LCE;
		F8=F2*F6,F13=F8+F13,F3=DM(I1,M1);
		F4=RSQRTS F13, F7=F3;
		F4=F4*F13,F2=dM(I0,M1);
		F13=F3*F7,F6=F2;
mod_cal:PM(I8,M9)=F4;
		nop;
		nop;
		RTS;
			
			
		

⌨️ 快捷键说明

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