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

📄 durbin.asm

📁 文件为美军4800bps语音压缩编码标准在TI的DSP芯片TMS320C5X上的实时实现源代码。
💻 ASM
字号:
DUR_DEBUG	.SET 0
;------------------------------
;------ACC,ACCB,INDX==3,AR0,AR1,AR2,AR4,AR6,AR7
;-----TMP[10],LPC[10],RC[10],COR[11]
;CALL LONGDIV , AJUST
;---------AR0->PC[10], AR1->COR[11]; AR2->RC[10],
;---------AR7->LOOP, AR6->TMP, AR4->NORM
;CORFLAG,ACCBUF[2],ALPHA[2],BETA[2],TEMP,DIVISOR,SIGNFLAG,TJ
;====================================
	.IF DUR_DEBUG
	.version        50
	.mmregs
	.MLIB "MAC.LIB"
;====================================
	.BSS TJ,2
	.BSS CORFLAG,1
	.BSS ACCBUF,2
	.BSS TEMP,1
	.BSS DIVISOR,1
	.BSS SIGNFLAG,1
RC	.USECT "ONCHIP1",10
TMP	.USECT "ONCHIP1",10
	.DATA
LPC0	.INT 2000H
LPC	.INT 0,0,0,0,0,0,0,0,0,0
;COR 	.LONG 191bafH,0104605h, 07c0cbh, 068dc4h, 02fac4h, 02c64h, 0fffe133fh, 0fffea6beh, 0fffffcfch, 0fffdde49h, 0fffdd7d8h
;TLPC	.INT 0daf6h, 02086h, 0dafdh, 023a6h, 0e09dh, 01edbh, 0e704h, 0f02h, 0f8beh, 0382h
COR 	.LONG 0e522cH, 06327bh, 0fff8a3bch, 0fff489aeh, 0fffca8aah, 080df9h, 093460h, 0ffff8bffh, 0fff77b67h, 0fff9b95fh, 030cb4h
TLPC 	.INT 0dca9h, 02bdeh, 0e07ah, 02c06h, 0d2b3h, 024c8h, 0e85dh, 01520h, 0f050h, 074bh

	;-------
	.TEXT
	CALL C50_INIT
	LDP #ACCBUF
	CALL DURBIN
HERE	B $
	.ENDIF
	;--------------
	.BSS ALPHA,2
	.BSS BETA,2
	.BSS AR0_PUSH,1
	;-----------------

DURBIN
	LACL #0
	SACL CORFLAG			;CORFLAG=0
	LACL #3
	SAMM INDX			;INDX=3
	LAR AR0,#LPC
	LAR AR1,#COR+1
	LAR AR2,#RC
	LACL #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
	  NOP
	  XC 2,C
	    LACL #1
	    SACL CORFLAG
	  NOP
DURBIN_1A
	LACC CORFLAG
	BCND ENDDURB,GT
	;------------
;******  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]
	BSAR 2
	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
	LACL #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
	SACL TJ;!!!!!!!!!!
	LACB;
	RPT TJ
	  SFL
	SACB
DURBIN_3C
	;LDP #ALPHA
	LACC ALPHA+1,16
	OR ALPHA
	ADDB
	BCND DURBIN_3A,NEQ
	  LACL #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
	SACL AR0_PUSH
	;PUSH
	LAMM AR7
	SUB #P10_2
	ABS
	SACL TEMP
	SAMM BRCR
	LACL #13
	SAMM TREG1
	;LDP #0
	LAR AR1,#COR+3
	MAR *,AR1
	RPTB DURBIN_4-1
	  ;MAR *,AR1
	  LACC *-,16
	  OR *0+,AR4
	  LAR AR4,#16
	  RPT #15
	   NORM *-
	  BSAR 16
	  SAMM TREG0
	  MAR *,AR0		;AR0->LPC[0] AT LAST
	  MPY *-,AR1
	  LAMM AR4
	  SUB #13
	  NEG
	  BCND DURBIN_BETA_1,LT	;JUMP IF AR4>13
	   SAMM TREG1
	   BD DURBIN_BETA_ADD
	    PAC
	    SATL
DURBIN_BETA_1
	  ;----
	    NEG
	    SUB #1
	    SACL TJ
	    PAC
	    RPT TJ
	      SFR
	    ;----
DURBIN_BETA_ADD
	  ADDB
	  SACB
	 ;===================
DURBIN_4
	MAR *,AR1
	ADRK #2
	SLAC BETA
;----------------------------------------
;---------------------rc[i] = -beta / alpha;
;-------if(|beta|>|alpha|) corflag=1---------------------------------
	ABS
	SACB
	LLAC ALPHA
	ABS
	CRLT
	;BCND DURBIN_5,C
	BCND ENDDURB,C
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
	LACC AR0_PUSH
	;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
ENDDURB
	;LDP #CORFLAG
	LACL #1
	SACL CORFLAG		;CORFLAG=1
	LAR AR0,#LPC
	MAR *,AR0
	RPTZ #9
	  SACL *+
	LAR AR0,#RC
	RPTZ #9
	  SACL *+
	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];
;  }
;--------------------------
	.IF DUR_DEBUG
	.include "c50_init.asm"
	.include "longdiv.asm"
	.INCLUDE "AJUST.ASM"
	.INCLUDE "SET_CON.ASM"
	.ENDIF

⌨️ 快捷键说明

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