📄 psd.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 + -