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

📄 pclsp.asm

📁 文件为美军4800bps语音压缩编码标准在TI的DSP芯片TMS320C5X上的实时实现源代码。
💻 ASM
字号:
;	.version        50
;	.mmregs
;	.GLOBAL STATUS,ACCBUF,SINCOR,SIGNFLAG,HP10,LSPFLAG,LSP,FL,FR,FM,PXR
;	.BSS STATUS,2
;	.BSS ACCBUF,2
;	.BSS ACCBBUF,2
;	.BSS SIGNFLAG,1
;	.bss LSPFLAG,1
;	.BSS LSPPQ,5
;	.BSS LSP,11
;	.BSS FL,1
;	.BSS FR,1
;	.BSS FM,1
;	.GLOBAL PXL,TFR,TPXR,PXM,IBUF,MINPQ,LSPEPS
;	.BSS PXR,1
;	.BSS PXL,1
;	.BSS TFR,1
;	.BSS TPXR,1
;	.BSS PXM,1
;	.BSS IBUF,1
;	.BSS MINPQ,2
;	.BSS QXL,1
;	.BSS QXR,1
;	.BSS QXM,1
;	.BSS TQXR,1

;P10	.SET 10
;P10_1	.SET P10-1
;P10P	.SET P10+1
;HP10	.SET P10/2
;HP10_1	.SET HP10-1
;N128	.SET 128
;NBP	.SET 10
;NBQ	.SET 10
;LSPEPS	.SET 1
;	.data
;LSPJC	.INT 11,9,7,5,3,1
;COSCOR  .INT 0e216H,2078H,0fd54H,1eH,0ffffH
;LPC0	.INT 02000h
;LPC	.INT 0ef06h,0f496h,0f84ch,0604h,0fefeh
;	.INT 0166h,0f7c6h,0f420h,0fdf5h,013e3h
;	;38h,38dh,f9ah,107bh,1ea7h,209bh,2aceh,2dd1h,33cfh,3908h
;	;.int 0fc89h, 0fc59h, 0dbb8h, 0f8ddh, 0aeh
;	;.int 0181fh, 0566h, 0585h, 0f3aeh, 02cbh
;	;389H,534H,c8bH,1acfH, 2096H,23eaH, 2980H,2b87H, 3352H,3692H
;=================================
;LSPCOS	.COPY "LSPCOS.DAT"	;cos(i* pi * 0.5*(11.0-2*j)/N) *0x8000u
	;----------
	.BSS FL,1
	.BSS FR,1
	.BSS FM,1
	.BSS TFR,1
	;-----------
	.BSS PXR,1
	.BSS PXM,1
	.BSS PXL,1
	.BSS TPXR,1
	;------------
	.BSS QXL,1
	.BSS QXR,1
	.BSS QXM,1
	.BSS TQXR,1

;=================================
PCLSP
	.COPY LSPP.ASM
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PCLSP_GETQ0
;=============================
;for (i = 0; i < mh; i++)
;  { q[i] = a[i+1] - a[m-i];
;    if(fabs(q[i]>0x7fff))
;      { for (j = 0; j < m; j++)  freq[j] = lastfreq[j];
;	return;  } }
;==================================
	LACC #LSP+10
	SAMM ARCR
	LAR AR1,#LSPPQ
	LAR AR3,#LPC
	LAR AR6,#LPC+P10_1
	MAR *,AR3
	LACC #HP10_1
	SAMM BRCR
	LACL #0
	SACL CORFLAG
	RPTB PCLSP_Q_Q-1
	  LACC *+,0,AR6
	  SUB *-,0,AR1
	  ;PUSH
	  SACL ACC_PUSH
	  ABS
	  SUB #7FFFH
	  NOP
	  XC 2,GT
	   LACL #1
	   SACL CORFLAG
	  ;POP
	  LACC ACC_PUSH
	  SACL *+,0,AR3
PCLSP_Q_Q
	LACC CORFLAG
	BCND PCLSP_END1,GT 	;if >0x7fff last lsp used.
;============================================
;  freq[m] = 0.5*0x8000u;
;  fl = freq[0];
;  p32=wsin(mp*2*fl)>>2;
;============================================
	LACC #4000H
	SACL LSP+10
	;-----------
	LAR AR0,#LSP
	MAR *,AR0
	LACC *0+
	SACL FL
	;------------
	LACC #P10P
	SAMM TREG0
	SUB #2
	SAMM AR5
	MPY FL
	PAC
	SFL
	CALL WSIN
	SFR             	;1.15->>3.13
	SFR
	SACB
;===================================
;  for (j = 0; j < mh; j++)
;  { jc = mp - (j+1) * 2;
;    ax0=wsin(jc*2*fl);
;    p32 += (long)(ax0 * q[j])>>15;  }
;=================================
	LAR AR4,#HP10_1
	LAR AR1,#LSPPQ
	MAR *,AR1
	;----------
PCLSP_Q_QXL_0
	  LAMM AR5
	  SAMM TREG0
	  SUB #2
	  SAMM AR5
	  MPY FL
	  PAC
	  SFL
	  ;-------
	  EXAR
	  SACL ACCBBUF
	  SACH ACCBBUF+1
	  EXAR
	  CALL WSIN
	  EXAR
	  LACC ACCBBUF+1,16
	  OR ACCBBUF
	  EXAR
	  ;---------
	  MAR *,AR1
	  SAMM TREG0
	  MPY *+,AR4
	  PAC
	  SATL
	  ADDB
	  SACB
	BANZ PCLSP_Q_QXL_0,*-
;=================================
;  if(fabs(p32)>0x7fff) p32>>=2;
;  qxl=p32;
;  tqxl=qxl;
;=================================
	CALL INTACC
	SACH QXL
	;SACH TQXL
;=============AR0=freq[2]====================
;  for (i = 2; i < mp; qxl = tqxr, fl = tfr, i += 2)
;  { fr = freq[i];
;    tfr=fr;
;    p32=wsin(mp*2*fr)>>2;
;=================================
	;MAR *,AR0
PCLSP_Q_FOR
	MAR *,AR0
	LACC *-		;AR0>>LSP[1]
	SACL FR
	SACL TFR
	LACC #P10P
	SAMM TREG0
	SUB #2
	SAMM AR5
	MPY FR
	PAC
	SFL
	CALL WSIN
	SFR             	;1.15->>3.13
	SFR
	SACB
;=================================
;   for (j = 0; j < mh; j++)
;    { jc = mp - (j+1) * 2;
;      ax0=wsin(jc*2*fr);
;      p32 += (long)(ax0 * q[j])>>15;  }
;=================================
	LAR AR4,#HP10_1
	LAR AR1,#LSPPQ
	MAR *,AR1
	;----------
PCLSP_Q_QXR
	  LAMM AR5
	  SAMM TREG0
	  SUB #2
	  SAMM AR5
	  MPY FR
	  PAC
	  SFL
	  ;-------
	  EXAR
	  SACL ACCBBUF
	  SACH ACCBBUF+1
	  EXAR
	  CALL WSIN
	  EXAR
	  LACC ACCBBUF+1,16
	  OR ACCBBUF
	  EXAR
	  ;---------
	  MAR *,AR1
	  SAMM TREG0
	  MPY *+,AR4
	  PAC
	  SATL
	  ADDB
	  SACB
	BANZ PCLSP_Q_QXR,*-
;=================================
;  if(fabs(p32)>0x7fff) p32>>=2;
;  qxr=p32;
;  tqxr = qxr;
;=================================
	CALL INTACC
	SACH QXR
	SACH TQXR
;===============================
;   if(fabs(qxl)<fabs(qxr) ){minpxm[0]=qxl; minpxm[1]=fl;}
;   else {minpxm[0]=qxr; minpxm[1]=fr;}
;===============================
	LACC QXL
	ABS
	SACB
	LACC QXR
	ABS
	CRLT
	SACL MINPQ
	BCND PCLSP_Q_MIN_1,C	;jump if fabs(qxr)<fabs(qxl)
	LACC FL
	B PCLSP_Q_MIN_2
PCLSP_Q_MIN_1
	LACC FR
PCLSP_Q_MIN_2
	SACL MINPQ+1
;===================================
;    if(qxl*qxr>=0){printf("qxl*qxr>0 at frame %d last lsps used.\n",frame);
;		 for (j = 0; j < m; j++)  freq[j] = lastfreq[j];
;		 for(i=0;i<=10;i++) a[i]=a[i]/0x2000;
;		 return;}
;===================================
	LT QXL
	MPY QXR
	PAC
	BCND PCLSP_END1,GEQ
;=================================
; mb=0;
; do{ mb++;
;     fm = fl+fr;
;=================================
	LAR AR6,#NBQ-1
PCLSP_Q_DO
	LACC FL
	ADD FR
	SACL FM
;=================================
;       p32=wsin(mp*fm)>>2;
;=================================
	LACC #P10P
	SAMM TREG0
	SUB #2
	SAMM AR5
	MPY FM
	PAC
	CALL WSIN
	SFR             	;1.15->>3.13
	SFR
	SACB
;=================================
;      for (j = 0; j < mh; j++)
;      {jc = mp - (j+1) * 2;
;	ax0=wsin(jc*fm);
;	p32 += (long)(ax0 * q[j])>>15;      }
;=================================
	LAR AR4,#HP10_1
	LAR AR1,#LSPPQ
	MAR *,AR1
	;----------
PCLSP_Q_QXM
	  LAMM AR5
	  SAMM TREG0
	  SUB #2
	  SAMM AR5
	  MPY FM
	  PAC
	  ;-------
	  EXAR
	  SACL ACCBBUF
	  SACH ACCBBUF+1
	  EXAR
	  CALL WSIN
	  EXAR
	  LACC ACCBBUF+1,16
	  OR ACCBBUF
	  EXAR
	  ;---------
	  MAR *,AR1
	  SAMM TREG0
	  MPY *+,AR4
	  PAC
	  SATL
	  ADDB
	  SACB
	BANZ PCLSP_Q_QXM,*-
;----------
;      fm/=2;
;-----------
	LACC FM		;FM/=2
	SFR
	SACL FM
;=======================
;      if(fabs(p32)>0x7fff) p32>>=2;
;      qxm=p32;
;=========================
	LACB
	CALL INTACC
	SACH QXM
;======================
;      if(fabs(qxm)<fabs(minpxm[0])) {minpxm[0]=qxm; minpxm[1]=fm;}
;=======================
	LACC QXM
	ABS
	SACB
	LACC MINPQ
	ABS
	CRLT
	BCND PCLSP_Q_MINQXM, C	;jump if fabs(qxm)>fabs(minpq)
	SACL MINPQ              ;if minpq>=qxm
	LACC FM
	SACL MINPQ+1
PCLSP_Q_MINQXM
;===========================
;     (qxm*qxl > 0.0) ? (qxl = qxm, fl = fm) : (qxr = qxm, fr = fm);
;==========================-
	LACC FM,16
	OR QXM
	SACB
	SAMM TREG0
	MPY QXL
	PAC
	BCND PCLSP_Q_LMR_1,GT
	LACB
	SACL QXR
	SACH FR
	B PCLSP_Q_LMR_2
PCLSP_Q_LMR_1
	LACB
	SACL QXL
	SACH FL
PCLSP_Q_LMR_2
;-----------------------------------------------
;    } while ((fabs(minpxm[0]) > LSPEPS) && (mb < NBQ));
;===============================================
	LACC MINPQ
	SUB #LSPEPS
	BCND PCLSP_Q_GETQ,LEQ
	MAR *,AR6
	BANZ PCLSP_Q_DO,*-
;===========================================
;    freq[i-1]=minpxm[1];
;  }//    for (i = 2; i < mp; qxl = tqxr, fl = tfr, i += 2)
;===========================================
PCLSP_Q_GETQ
	MAR *,AR0
	LACC MINPQ+1
	SACL *+		;INDX=2
	MAR *0+		;AR0 : LSP[1]==>LSP[4]

	CMPR  2			;test if ar0>arcr=#LSP+10
	BCND PCLSP_GOOD_END,TC
	LACC TQXR
	SACL QXL
	LACC TFR
	SACL FL
	B PCLSP_Q_FOR,*,AR0
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
PCLSP_END1
	LACC #1
	SACL LSPFLAG
	LACC #LSP
	SAMM BMAR
	LAR AR0,#LASTLSP
	MAR *,AR0
	RPT #P10_1
	 BLDD *+,BMAR
PCLSP_GOOD_END
;==================================================
;  for (i = 0; i < m; i++)    lastfreq[i] = freq[i];
;==================================================
	MAR *,AR0
	LACC #LSP
	SAMM BMAR
	LAR AR0,#LASTLSP
	RPT #P10_1
	 BLDD BMAR,*+
	RET
;=================================

⌨️ 快捷键说明

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