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

📄 lsppc.asm

📁 文件为美军4800bps语音压缩编码标准在TI的DSP芯片TMS320C5X上的实时实现源代码。
💻 ASM
字号:
LSPPC_DEBUG	.SET 0
	.IF LSPPC_DEBUG
	.version        50
	.mmregs
	.MLIB "MAC.LIB"
	.BSS ACCBUF,2
	.BSS ACC_PUSH,2
        .BSS SIGNFLAG,1
	;-----------------lsppc
LSPPC_A  .USECT "ONCHIP1",6*2
LSPPC_A1 .USECT "ONCHIP1",6*2
LSPPC_A2 .USECT "ONCHIP1",6*2
LSPPC_B  .USECT "ONCHIP1",6*2
LSPPC_B1 .USECT "ONCHIP1",6*2
LSPPC_B2 .USECT "ONCHIP1",6*2
LSPPC_P  .USECT "ONCHIP1",5
LSPPC_Q  .USECT "ONCHIP1",5
	.DATA
LSP 	.INT 2f0h,952h,1099h,12b8h,17b5h,2000h,2ac2h,2ccdh,3000h,3333h
TLPC	.INT 0e108h,0ee4h,0ea65h,02749h,0d7e9h,0f70h,0f1e5h,0fefh,0f25bh,07e2H
LPC0	.INT 2000H
LPC	.INT 0,0,0,0,0,0,0,0,0,0
COSCOR  .INT 0e216H,2078H,0fd54H,1eH,0ffffH
	;------------
	.TEXT
	CALL C50_INIT
	LDP #ACCBUF
	SPLK #LSP,ADDR_LSP
	CALL LSPPC
HERE	B $
	.ENDIF
	;---------
	.BSS XF,1		;lsppc
	.BSS XX,1
	.BSS ADDR_LSP,1
	;-----------
;=======================================================
LSPPC
	LACL #2
	SAMM INDX
;===================================================
;  for (i = 0; i < noh + 1; i++)
;  { a[i] = 0.;     a1[i] = 0.;    a2[i] = 0.;
;    b[i] = 0.;     b1[i] = 0.;    b2[i] = 0.;  }  //LONG
;===================================================
	MAR *,AR0
	LAR AR0,#LSPPC_A
	RPTZ #11
	  SACL *+
	LAR AR0,#LSPPC_A1
	RPT #11
	  SACL *+
	LAR AR0,#LSPPC_A2
	RPT #11
	  SACL *+
	LAR AR0,#LSPPC_B
	RPT #11
	  SACL *+
	LAR AR0,#LSPPC_B1
	RPT #11
	  SACL *+
	LAR AR0,#LSPPC_B2
	RPT #11
	  SACL *+
;===================================================
;  for (i = 0; i < noh; i++)
;  { acc=(long)freq[2*i]*4l;
;    p[i]=-wcos(acc);		//2.14
;    acc=(long)freq[2*i+1]*4l;
;    q[i]=-wcos(acc);		 }
;===============ARP=0====================================
	;LAR AR0,#LSP
	LACC ADDR_LSP
	SAMM AR0
	LAR AR1,#LSPPC_P
	LAR AR2,#LSPPC_Q
	LAR AR7,#HP10_1
LSPPC_PQ
	  LACC *+,2,AR1
	  CALL WCOS
	  MAR *,AR1
	  NEG
	  SACL *+,0,AR0
	  LACC *+,2,AR2
	  CALL WCOS
	  MAR *,AR2
	  NEG
	  SACL *+,0,AR7
       BANZ LSPPC_PQ,*-,AR0
;===================================================
;  xf = 0.0;
;  for (k = 0; k < no + 1; k++)
;  { xx = 0.0;
;    if (k == 0)  xx = 0x7fff; //1.0; 4.12
;    a[0] = xx + xf;    b[0] = xx - xf;
;    xf = xx;
;===================================================
	LAR AR0,#LPC-1
	LACL #0
	SACL XF
	LAR AR7,#P10
LSPPC_K
	LACL #0
	SACL XX
	LAR AR3,#LSPPC_B
	LAMM AR7
	SUB #P10
	BCND LSPPC_NOTK0,NEQ
	LACC #7FFFH
	SACL XX
LSPPC_NOTK0
	MAR *,AR3
	LACC XX
	SUB XF
	SACL *+	;B[0]
	SACH *-
	LAR AR3,#LSPPC_A
	LACC XX
	ADD XF
	SACL *+
	SACH *-
	LACC XX
	SACL XF
;===================================================
;    for (i = 0; i < noh; i++)
;    { acc=a1[i];       j=0;
;      while(acc>0x7fff || acc<-0x8000l) { acc>>=1;j++;}
;      acc=acc*p[i];	      acc=acc>>(14-j);
;      a[i + 1] = a[i] + acc+ a2[i];
;      a2[i] = a1[i];      a1[i] = a[i];}
;===================================================
	LAR AR1,#LSPPC_P
	LAR AR4,#LSPPC_A1
	LAR AR5,#LSPPC_A2
	LACC #HP10_1
	SAMM BRCR
	MAR *,AR4
	RPTB LSPPC_IA-1
	   MAR *+
	   LACC *-,16
	   OR *,AR6
	   LAR AR6,#-2
	   RPT #15
	    NORM *+
	   SACH ACCBUF
	   NOP
	   NOP
	   MAR *,AR1
	   LT *+,AR3
	   MPY ACCBUF
	   LAMM AR6
	   SAMM TREG1
	   PAC
	   SATL
	   SACB
	   ;---------
	;      a[i + 1] = a[i] + acc+ a2[i];
	   MAR *+
	   LACC *-,16
	   OR *0+,AR5
	   ADDB
	   SACB
	   MAR *+
	   LACC *-,16
	   OR *,AR3
	   ADDB
	   SACL *+
	   SACH *0-,0,AR4	;->A[I]H
	;  ****  a2[i] = a1[i];
	   MAR *+
	   LACC *-,16
	   OR *,AR5
	   SACL *+
	   SACH *+,0,AR3
	;      a1[i] = a[i];}	->A[I]H
	   LACC *-,16
	   OR *0+,AR4
	   SACL *+
	   SACH *+
LSPPC_IA
;===================================================
;    for (i = 0; i < noh; i++)
;    { acc=b1[i];       j=0;
;      while(acc>0x7fff || acc<-0x8000l) { acc>>=1;j++;}
;      acc=acc*q[i];	      acc=acc>>(14-j);
;      b[i + 1] = b[i] + acc+ b2[i];
;      b2[i] = b1[i];      b1[i] = b[i]; }
;===================================================
	LAR AR3,#LSPPC_B
	LAR AR1,#LSPPC_Q
	LAR AR4,#LSPPC_B1
	LAR AR5,#LSPPC_B2
	LACC #HP10_1
	SAMM BRCR
	MAR *,AR4
	RPTB LSPPC_IB-1
	   MAR *+
	   LACC *-,16
	   OR *,AR6
	   LAR AR6,#-2
	   RPT #15
	    NORM *+
	   SACH ACCBUF
	   NOP
	   NOP
	   MAR *,AR1
	   LT *+,AR3
	   MPY ACCBUF
	   LAMM AR6
	   SAMM TREG1
	   PAC
	   SATL
	   SACB
	   ;---------
	;      b[i + 1] = b[i] + acc+ b2[i];
	   MAR *+
	   LACC *-,16
	   OR *0+,AR5
	   ADDB
	   SACB
	   MAR *+
	   LACC *-,16
	   OR *,AR3
	   ADDB
	   SACL *+
	   SACH *0-,0,AR4	;->A[I]H
	;  ****  b2[i] = b1[i];
	   MAR *+
	   LACC *-,16
	   OR *,AR5
	   SACL *+
	   SACH *+,0,AR3
	;      b1[i] = b[i];}	->A[I]H
	   LACC *-,16
	   OR *0+,AR4
	   SACL *+
	   SACH *+
LSPPC_IB
;===================================================
;    acc=(int)(a[noh] + b[noh])>>3;
;    if (k != 0)    pc[k] = acc;
;===================================================
	LAR AR3,#LSPPC_A+11
	LAR AR4,#LSPPC_B+11
	MAR *,AR3
	LACC *-,16
	OR *,AR4
	SACB
	LACC *-,16
	OR *,AR0
	ADDB
	BSAR 3
	;RPT #2
	; SFR
	SACL *+,0,AR7
      BANZ LSPPC_K,*-,AR3
;===================================================
;  pc[0] = 1.0*0x2000;
;===================================================
	MAR *,AR0
	LACC #2000H
	LAR AR0,#LPC0
	SACL *
;===================================================
	RET
;===================================================
	.IF LSPPC_DEBUG
	.INCLUDE "C50_INIT.ASM"
	.INCLUDE "WCOS.ASM"
	.INCLUDE "WCOS1.ASM"
	.INCLUDE "SET_CON.ASM"
	.ENDIF
;================================================
;lsptopc(float *f, float *pc)
;{ noh = no / 2;
;  for (j = 0; j < no; j++)    freq[j] = f[j];
;  for (i = 0; i < noh + 1; i++)
;  { a[i] = 0.;    a1[i] = 0.;    a2[i] = 0.;
;    b[i] = 0.;    b1[i] = 0.;    b2[i] = 0.;  }
;  for (i = 0; i < noh; i++)
;  { acc=(long)freq[2*i]*4l;    p[i]=-wcos(acc);		//2.14
;    acc=(long)freq[2*i+1]*4l;    q[i]=-wcos(acc);		//2.14
;  }
;  xf = 0.0;
;  for (k = 0; k < no + 1; k++)
;  { xx = 0.0;
;    if (k == 0)  xx = 0x7fff; //1.0; 4.12
;    a[0] = xx + xf;
;    b[0] = xx - xf;
;    xf = xx;
;    for (i = 0; i < noh; i++)
;    { //a[i + 1] = a[i] + p[i] * a1[i] + a2[i];	//p:2.14 a:3.13
;      acc=a1[i];
;      j=0;
;      while(acc>0x7fff || acc<-0x8000l) { acc>>=1;j++;}
;      acc=acc*p[i];		//2.14*3.13->4.12
;      acc=acc>>(14-j);
;      a[i + 1] = a[i] + acc+ a2[i];
;      //a[i + 1] = a[i] + ((float)p[i]/0x4000) * a1[i] + a2[i];
;      //--------------
;      acc=b1[i];
;      j=0;
;      while(acc>0x7fff || acc<-0x8000l) { acc>>=1;j++;   }
;      acc=acc*q[i];		//2.14*3.13->4.12
;      acc=acc>>(14-j);
;      b[i + 1] = b[i] + acc+ b2[i];
;     //b[i + 1] = b[i] + ((float)q[i]/0x4000) * b1[i] + b2[i];
;     //---------------
;     a2[i] = a1[i];      a1[i] = a[i];
;     b2[i] = b1[i];      b1[i] = b[i];
;    }
;    acc=a[noh] + b[noh];     acc>>=(1+2);
;    if (k != 0)    pc[k] = acc;
;    //if( k!=0) pc[k]=.5*(a[noh] + b[noh]);
;    if(pc[k]>=4.0*0x2000) printf("pc=%f at lsptopc at frame %d.\n",frame);
;  } }
	;===============
;  noh = no / 2;
;  for (j = 0; j < no; j++)    freq[j] = f[j];
;  for (i = 0; i < noh + 1; i++)
;  { a[i] = 0.;    a1[i] = 0.;    a2[i] = 0.;    b[i] = 0.;
;    b1[i] = 0.;    b2[i] = 0.;  }
;  for (i = 0; i < noh; i++)
;  { p[i] = -2. * cos(2. * pi * freq[2 * i]);
;    q[i] = -2. * cos(2. * pi * freq[2 * i + 1]);  }
; xf = 0.0;
;  for (k = 0; k < no + 1; k++)
;  { xx = 0.0;
;    if (k == 0)      xx = 1.0;
;    a[0] = xx + xf;    b[0] = xx - xf;
;    xf = xx;
;    for (i = 0; i < noh; i++)
;    { a[i + 1] = a[i] + p[i] * a1[i] + a2[i];
;      b[i + 1] = b[i] + q[i] * b1[i] + b2[i];
;      a2[i] = a1[i];      a1[i] = a[i];
;      b2[i] = b1[i];      b1[i] = b[i];
;    }
;    if (k != 0)      pc[k - 1] = -.5 * (a[noh] + b[noh]);
;  }
;  for (i = no - 1; i >= 0; i--)    pc[i + 1] = -pc[i];
;  pc[0] = 1.0;
;}

⌨️ 快捷键说明

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