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

📄 tdurbin.asm

📁 文件为美军4800bps语音压缩编码标准在TI的DSP芯片TMS320C5X上的实时实现源代码。
💻 ASM
字号:
	.version        50
	.mmregs
	.DEF P10,P10_1,TEMP,CORFLAG,STACK,DIVISOR,SIGNFLAG,ALPHA,BETA,ACCBUF
	.GLOBAL COR,RC,TMP,SIGNAL,FLEN,HFLEN_1,HFLEN,P10_2
	.OPTION X
	.BSS ALPHA,2
	.BSS BETA,2
	.BSS LPC,10
	.bss RC,10
	.BSS COR,11*2		;COR[11] long type
	.BSS TMP,10
	.BSS TEMP,1
	.BSS CORFLAG,1
	.BSS STACK,2
	.BSS DIVISOR,1
	.BSS SIGNFLAG,1

	.bss ACCBUF,2
	.bss SIGNAL,240
	;----------
FLEN	.SET 240
HFLEN   .SET 120	;FLEN/2
HFLEN_1 .SET 120-1
P10	.SET 10
P10_1	.SET 9
P10_2	.SET P10-2
	;-----------
	.data
	.DEF TDURBIN,TCOR,S0,LPC
TCOR	.long 1442262
	.long  1117903,  627731,  397508,  134118,  -237767,  -413527,  -415729,  -399529,  -272490,  -66647
	;----------
	.text
	CALL C50_INIT
	call DURBIN

here:	NOP
	B here
DURBIN
	SPM 0
	LDP #CORFLAG
	LACC #0
	SACL CORFLAG			;CORFLAG=0
	LACC #3
	SAMM INDX			;INDX=3
	LAR AR0,#LPC
	LAR AR1,#COR+1
	LAR AR2,#RC
	LACC #P10_1
	SAMM BRCR
	;---test for c0>fabs(c[i])-----------
	MAR *,AR1			;AR1->high 16 bits
	LACC *-,16
	OR *0+
	SACB
	RPTB DURBIN_1A-1
	  LACC *-,16
	  OR *0+
	  ABS
	  CRGT          		;IF C0<=C THEN C=1
	  BCND DURBIN_1,C
DURBIN_1A
	B DURBIN_2
DURBIN_1
	LAMM PMST
	AND #0FFFEH		;CLR BRAF(block repeat active flag)
	SAMM PMST
	LACC #1
	SACL CORFLAG		;CORFLAG=1
	RET
	;------------
;******  alpha = c0;   *a = rc[0] = -*c / c0;   beta = *c ---******
DURBIN_2
	LAR AR1,#COR+1
	MAR *,AR1
	LACC *-,16
	OR *0+
	SACL ALPHA		;alpha=c0=C[0];
	SACH ALPHA+1
	EXAR
	LACC *-,16		; beta=*c=C[1],AR1=c[1]=C[2]
	OR *0+
	SACL BETA
	SACH BETA+1
	EXAR			;ACC=c0,ACCB=c[1],
				;LONGDIV=ACCB/ACC
	NEG
	CALL LONGDIV
	MAR *,AR2  		;ar0->pc ,ar2->rc
	SACL *,0,AR0            ; *a=rc[0]=-C[1]/C[0]
	SFR
	SFR
	SACL *,0,AR0		;LPC: 3.13
	;--------- for (i = 1; i < n; i++)----------
	;----------alpha = alpha + beta * rc[i - 1];
	;----------beta = *(c+i);
	;---------AR1->*(c+1)-------------------------------
	LAR AR7,#P10_2
	;//alpha = alpha + beta * rc[i - 1],AR2(->RC) +1 AT HERE---------
DURBIN_3
	LACC BETA+1,16
	OR BETA
	CALL AJUST		;AR4 store exponent,  t2>>=bp
	SAMM TREG0
	LACC #15
	SAMM TREG1
	MAR *,AR2		;AR2->RC[0]
	MPY *+,AR1		;AR2->RC[1],ARP->1
	PAC
	SATL			;TREG1=15, ACC>>15
	;-------
	SACB;
	LDP #0
	LAMM AR4;
	BCND DURBIN_3B,NEQ;
	B DURBIN_3C
DURBIN_3B;
	SUB #1			;AR4-1
	SAMM AR4
	LACB;
	RPT AR4
	  SFL
	SACB
DURBIN_3C
	LDP #ALPHA
	LACC ALPHA+1,16
	OR ALPHA
	ADDB
	BCND DURBIN_3A,NEQ
	  LACC #1              	;if(alpha==0) alpha=1	//wht
DURBIN_3A
	SACL ALPHA
	SACH ALPHA+1		;alpha = alpha + beta * rc[i - 1];
				;--------beta = *(c+i)  ARP->1
	MAR *,AR1              ;AR1->C[2]
	LACC *-,16
	OR *
	SACL BETA
	SACH BETA+1
	SACB
	;---ACCB=BETA-----------------------------
;------for (j = 0; j <= i - 1; j++)   beta = beta + *(c+j) * *(a+i-j-1);
	;---------------------------------
	LAMM AR0		;AR0->STACK
	PUSH
	LAMM AR7
	SUB #P10_2
	ABS
	SACL TEMP
	SAMM BRCR
	LACC #13
	SAMM TREG1
	;LDP #0
	LAR AR1,#COR+3
	RPTB DURBIN_4-1
	  MAR *,AR1
	  LACC *-,16
	  OR *0+
	  CALL AJUST		;ACCB NOT be modified
	  SAMM TREG0
	  MAR *,AR0		;AR0->LPC[0] AT LAST
	  MPY *-
	  PAC
	  SATL			;TREG1=13, ACC>>13
		LDP #ACCBUF
		SACL ACCBUF
		SACH ACCBUF+1
		LAMM AR4
		BCND DURBIN_3D,EQ
		SUB #1
		SAMM AR4	;AR4-1
		LACC ACCBUF+1,16
		OR ACCBUF
	  LDP #0
	  RPT AR4		;NEED DP=0
	    SFL
	  B DURBIN_3E
DURBIN_3D
		LDP #ACCBUF
		LACC ACCBUF	;ACC<0X7FFF
DURBIN_3E
	  ADDB
	  SACB
DURBIN_4
	MAR *,AR1
	ADRK #2
	LDP #BETA
	SACL BETA
	SACH BETA+1
;----------------------------------------
;---------------------rc[i] = -beta / alpha;
;-------if(|beta|>|alpha|) corflag=1---------------------------------
	ABS
	SACB
	LACC ALPHA+1,16
	OR ALPHA
	ABS
	CRGT
	BCND DURBIN_5,C
	 LACC #1		;|RC[]|>1 CORFLAG=1
	 SACL CORFLAG
	 RET
DURBIN_5
	LACC BETA+1,16
	OR BETA
	SACB
	LACC ALPHA+1,16
	OR ALPHA
	NEG
	CALL LONGDIV
	MAR *,AR2
	SACL *,0,AR0
;-------for (j = 0; j <= i - 1; j++)  tmp[j] = rc[i] * *(a+i-j-1);
	LAR AR6,#TMP		;TMP :3.13
	SAMM TREG0
	LDP #TEMP
	LACC TEMP
	SAMM BRCR
	POP
	SAMM AR0		;AR0->*(a+i-1)
	RPTB DURBIN_6-1
	  MPY *-,AR6
	  PAC
	  SACH *+,1,AR0
DURBIN_6
;-----for (j = 0; j <= i - 1; j++)  *(a+j) = *(a+j) + tmp[j];
;-------ARP=0------------------------------
	LAR AR6,#TMP
	LAR AR0,#LPC
	LACC TEMP
	SAMM BRCR
	RPTB DURBIN_7-1
	  LACC *,0,AR6
	  ADD *+,0,AR0
	  SACL *+
	  ;NOP
	  NOP
DURBIN_7
;-------*(a+i) = rc[i];-------------------
	MAR *,AR2
	LACC *,0,AR0
	SFR
	SFR			;1.15->3.13
	SACL *,0,AR7
DURBIN_8
	BANZ DURBIN_3,*-
	RET
;  if (c0 <= 0.0)
;  { for (i = 0; i < n; i++)   rc[i] = 0.0;
;    return;  }
;  alpha = c0;   *a = rc[0] = -*c / c0;   beta = *c;
;  for (i = 1; i < n; i++)
;  {  alpha = alpha + beta * rc[i - 1];
;     if(alpha==0)alpha=1;//wht
;     beta = *(c+i);
;     for (j = 0; j <= i - 1; j++)   beta = beta + *(c+j) * *(a+i-j-1);
;     rc[i] = -beta / alpha;
;     for (j = 0; j <= i - 1; j++)  tmp[j] = rc[i] * *(a+i-j-1);
;     for (j = 0; j <= i - 1; j++)  *(a+j) = *(a+j) + tmp[j];
;     *(a+i) = rc[i];
;  }
;--------------------------
	.include "c50_init.asm"
	.include "getcor.asm"
	.include "longdiv.asm"
	.INCLUDE "AJUST.ASM"
;	.INCLUDE "DURBIN.ASM"
	.end

⌨️ 快捷键说明

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