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

📄 tcgain.asm

📁 文件为美军4800bps语音压缩编码标准在TI的DSP芯片TMS320C5X上的实时实现源代码。
💻 ASM
字号:
CGAIN_DEBUG	.SET 1
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
	.IF CGAIN_DEBUG
	.version        50
	.mmregs
	.MLIB "MAC.LIB"
	.DATA
CODEBOOK .COPY "CODEBOOK.DAT"
E0	.int 1451,1316,1600,581,242,1467,1220,270,438,0,-1456,-158,143,-154,-1181,121,-287,-1060,1513,-156
	.int 282,-237,127,21,-1458,-1456,0,-18,-40,-1526,2415,-89,-15,88,-1243,1330,12,949,1215,94
	.int -1037,-209,-188,207,-922,0,-300,-80,-1330,106,-104,324,-2242,-1109,-403,1162,-1017,-846,-188,-304
IMP_H	.int 8192,11557,8353,7750,8788,7475,4817,3201,2141,1103,372,-200,-551,-519,-382,-363,-304,-136,-12,27
	.int 52,76,80,69,50,28,13,4,-6,-14,-15,-13,-12,-11,-9,-7,-5,-4,-4,-4
	.int -4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4

	.TEXT
	CALL C50_INIT
	LDP #ACCBUF
	LACC #0
	SACL CG_Y60
	SACL CG_Y59
	LACC #1
	SACL CG_FIRST
	LACC #CODEBOOK+1022
	SACL CG_BOOK
	LAR AR3,#CG_MATCH
	LAR AR4,#CG_GAIN
LOOP_CG
	CALL CGAIN
	LACC #0
	SACL CG_FIRST
	LACC CG_BOOK
	SUB #2
	SACL CG_BOOK
	SUB #CODEBOOK
       BCND LOOP_CG,C
HERE:	B HERE
	.BSS ACCBUF,2
	.BSS SIGNFLAG,1
	.ENDIF
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;-----------------------------------
	;-------------
CG_MATCH .USECT "WARRAY",512*2
CG_GAIN .USECT "WARRAY",512
CG_Y	.USECT "WARRAY",60
	;--------------
	.BSS CG_COR,2
	.BSS CG_ENG,2
	.BSS CG_BOOK,1
	.BSS CG_Y59,1
	.BSS CG_Y60,1
	.BSS CG_FIRST,1
;-----------------------------------
;ACCBUF*2, SIGNFLAG ,CG_FIRST,CG_COR*2,CG_ENG*2,CG_Y59,CG_Y60,CG_BOOK
;CALL MPY16_32, CG_DIV
;AR3->MATCH[512*2], AR4->CG_GAIN[512]
;PUSH AR0,AR1,AR2,AR7
;ACC,ACCB,PREG,TREG0/1,BRCR
;ARRAY: CG_MATCH[512*2], CG_GAIN[512], CG_Y[60], IMP_H[60], E0[60]
; 	CODEBOOK[1082]
;NOTE: H[0]=0X2000!! DMOV CG_Y, |COR/ENG|<0X7FFF
;H: 	3.13,
;CG_Y: 	5.11
;COR:	27.5
;ENG:	16.16
;=================================
CGAIN
	LAMM AR0
	PUSH
	LAMM AR1
	PUSH
	LAMM AR2
	PUSH
	LACC CG_FIRST
	BCND CG__FIRST,NEQ
;==========================================
; else
;  { if (ex[1] != 0)
;    { if (ex[1] == 1)
;	for (i = len - 1; i > 0; i--) 	 y[i - 1] += (h1[i]>>2);
;      else
;	for (i = len - 1; i > 0; i--) 	 y[i - 1] -= (h1[i]>>2);
;    }
;//    y[0] = (((long)ex[1] * (long)h1[0])>>2); STORED IN PREG !!!
;==========================================
	LACC CG_BOOK
	ADD #1
	SAMM AR0
	LAR AR1,#IMP_H+29
	LAR AR2,#CG_Y+28
	MAR *,AR0
	;LT *,AR1
	;MPY *,AR0		;PREG RESERVES Y[0]
	LACC *,0,AR1		;AR0->EX[1]
	BCND CG_EX1_END,EQ
	  BCND CG_EX1_LT,LT
	  LACC #28
	  SAMM BRCR
	   ;-----ARP==1------
	    RPTB CG_EX1_GT-1    ;for (i = len - 1; i > 0; i--)
	      LACC *-,0,AR2        ; y[i - 1] += (h1[i]>>2);
	      BSAR 2
	      ADD *
	      SACL *-,0,AR1
CG_EX1_GT
	  B CG_EX1_END
CG_EX1_LT
	    ;-----ARP==1------
	    LACC #28
	    SAMM BRCR
	    RPTB CG_EX1_END-1    ;for (i = len - 1; i > 0; i--)
	      LACC *-,0,AR2        ; y[i - 1] -= (h1[i]>>2);
	      BSAR 2
	      SUB *
	      NEG
	      SACL *-,0,AR1
CG_EX1_END
;==========================================
;    for (i = l - 1; i > 0; i--)          y[i] =  y[i - 1];
;    //y[0] = (((long)ex[1] * (long)h1[0])>>2);	//h[0]=1?
;    y[0] = (int)ex[1]<<11;	//11=13-2
;================;AR0->EX[1]==========================
	LAR AR2,#CG_Y+58
	MAR *,AR2
	RPT #58
	  DMOV *-
	MAR *,AR0
	LACC *-,11,AR2		;AR0->EX[0]
	LAR AR2,#CG_Y
	SACL *,0,AR0
;==========================================
;    if (ex[0] != 0)
;    { if (ex[0] == 1)
;	for (i = len - 1; i > 0; i--)   y[i - 1] += (h1[i]>>2);
;      else
;	for (i = len - 1; i > 0; i--)   y[i - 1] -= (h1[i]>>2);
;    }
;=================ARP==0=========================
	LAR AR1,#IMP_H+29
	LAR AR2,#CG_Y+28
	;MAR *,AR0		;AR0->EX[0]
	;LT *,AR1
	;MPY *,AR0		;PREG RESERVES Y[0]
	LACC *,0,AR1
	BCND CG_EX0_END,EQ
	  BCND CG_EX0_LT,LT
	  LACC #28
	  SAMM BRCR
	   ;-----ARP==1------
	    RPTB CG_EX0_GT-1    ;for (i = len - 1; i > 0; i--)
	      LACC *-,0,AR2        ; y[i - 1] += (h1[i]>>2);
	      BSAR 2
	      ADD *
	      SACL *-,0,AR1
CG_EX0_GT
	  B CG_EX0_END
CG_EX0_LT
	    ;-----ARP==1------
	    LACC #28
	    SAMM BRCR
	    RPTB CG_EX0_END-1    ;for (i = len - 1; i > 0; i--)
	      LACC *-,0,AR2        ; y[i - 1] -= (h1[i]>>2);
	      BSAR 2
	      SUB *
	      NEG
	      SACL *-,0,AR1
CG_EX0_END
;==========================================
;    for (i = l - 1; i > 0; i--)          y[i] =  y[i - 1];
;    //y[0] = (((long)ex[0] * (long)h1[0])>>2);	//h[0]=1?
;    y[0] = (int)ex[0]<<11;	//11=13-2
;=======;AR0->EX[0]===================================
	LAR AR2,#CG_Y+58
	MAR *,AR2
	RPT #58
	  DMOV *-
	MAR *,AR0
	LACC *,11,AR2
	LAR AR2,#CG_Y
	SACL *
	B CG_GET_COR
;==========================================
CG__FIRST
;==========================================
;  if (first)
;  { for (i = 0; i < l; i++)
;    { acc=0l;
;      for (j = 0; j <= i && j < len; j++)
;      { p32=(long)h1[j] * ex[i - j]; 	acc += p32;       }
;      y[i]=acc>>2;     }
;  }
;=================================
	LAMM AR7
	PUSH
	LACC CG_BOOK
	SAMM AR0
	LACC #59
	SAMM AR7
	LAR AR2,#CG_Y
	LAMM AR0
	PUSH
	MAR *,AR1
CG_FIRST_I
	;-----------
	LAMM AR7
	SUB #59
	ABS
	SACB
	LACC #29
	CRLT
	SAMM BRCR		;for (j = 0; j <= i && j < len; j++)
	LAR AR1,#IMP_H
	;--------------
;=================================
;      { p32=(long)h1[j] * ex[i - j];	acc += p32;      }
;=================================
	LT *+,AR0
	ZAP
	RPTB CG_FIRST_J-1
	   MPYA *-,AR1
	   LT *+,AR0
	   NOP
CG_FIRST_J
	APAC
	BSAR  2			;y[i]=acc>>2;     }  }
	MAR *,AR2
	SACL *+,0,AR7
	POP
	ADD #1
	PUSH
	SAMM AR0
	;MAR *,AR7
	BANZ CG_FIRST_I,*-,AR1
	pop		;pop out AR0
	POP
	SAMM AR7
;=================================
CG_GET_COR
;==========================================
;  cor = 0;
;  for (i = 0; i < l; i++)    cor +=(((long)y[i] * (long)e0[i])>>6);
;==========================================
	SPM 3
	;-----
	MAR *,AR0
	LAR AR0,#CG_Y
	LAR AR1,#E0
	LACC #29
	SAMM BRCR
	ZAP
	RPTB CG_DO_COR-1
	  LT *+,AR1	;cor += (((long)y[i] * (long)e0[i])>>bp_pgain);
	  MPYA *+,AR0
	  LT *+,AR1
	  MPYA *+,AR0
CG_DO_COR
	APAC
	SACL CG_COR
	SACH CG_COR+1
;==========================================
;  if (ex[0] == 0 && ex[1] == 0 && !first)
;   eng = eng - (((long)y59save * (long)y59save)>>6) - (((long)y60save * (long)y60save)>>6);
;============ARP==0==============================
	LAR AR0,CG_BOOK
	LACC *+,16		;LOAD EX[0] & EX[1]
	OR *-
	ABS
	ADD CG_FIRST
	BCND CG_ENG_NEW,NEQ
	  ZAP
	  SQRA CG_Y59
	  SQRA CG_Y60
	  APAC
	  SACB
	  LLAC CG_ENG
	  SBB
	  B CG_TEST_ENG
CG_ENG_NEW
;========ARP==0======================================
;  else
;  { eng = 0;
;    for (i = 0; i < l; i++)  eng += (((long)y[i] * (long)y[i])>>6);  //16.16
;  }
;  if(eng < (1lu<<16) )     eng=1lu<<16; //if eng<1 then eng=1;
;===========ARP=0===================================
	LAR AR0,#CG_Y
	ZAP
	RPT #60		;GET ENG :61 times
	  SQRA *+
	;-----------
CG_TEST_ENG
	SACB
	LACC #1,15	;1<<16
	SFL
	CRGT
	SLAC CG_ENG
	;-------
	SPM 0
;==========================================
;  y59save = y[l - 2];   y60save = y[l - 1];
;=======ARP==0===================================
	LAR AR0,#CG_Y+58
	LACC *+
	SACL CG_Y59
	LACC *
	SACL CG_Y60
;==========================================
;  accb=cor;	//27.5
;  acc=eng;	//14.18 ->16.16
;  if(labs(accb)< (1lu<<20) )       accb<<=11;
;  else if(labs(accb)< (1lu<<25) ) { accb<<=6; acc>>=5; }
;       else   acc>>=11;
;==========================================
	LACC #1,14
	SACL ACCBUF
	LACC ACCBUF,6		;ACC=1<<20
	SACB
	LLAC CG_COR
	ABS
	SBB
	BCNDD CG_COR_11_1,C 	;JUMP IF |COR|>= (1<<20)
	  LLAC CG_COR
	  RPT #10		;accb<<=11;
	    SFL
	  SACB
	  LLAC CG_ENG
	  B CG_COR_11_OVER
CG_COR_11_1
	  ADDB
	  SACB
	  LACC ACCBUF,11	;ACC=1<<25
	  EXAR
	  SBB
	  BCNDD CG_COR_11_2,C	;JUMP IF |COR|>= (1<<25)
	    LLAC CG_COR
	    RPT #5
	     SFL		;{ accb<<=6; acc>>=5; }
	    SACB
	    LLAC CG_ENG
	    BSAR 5
	    B CG_COR_11_OVER
CG_COR_11_2
	  LLAC CG_COR		;else   acc>>=11;
	  BSAR 11
	  SACB
	  LLAC CG_ENG
	  ;-----ACC=CG_ENG.. ACCB=CG_COR----
CG_COR_11_OVER
;==========================================
;  ax0=0;
;  while( acc>0x7ffflu ) { acc>>=1; ax0++; }
;  accb>>=ax0;
;==============ARP==0============================
	LAR AR0,#16
	RPT #15
	 NORM *-
	;NOP
	SACH ACCBUF		;ACCBUF IS shifted eng
	LACC ACCBUF
	BSAR 1
	SACL ACCBUF+1		;ACCBUF+1 =ACCBUF/2
	LAMM AR0
	SAMM TREG1
	LACB
	SATL         		;acc IS SHIFTED COR
;==========================================
	;  if(accb<0) accb-=acc/2;
	;  else accb+=acc/2;
;==========================================
	xc 1,GEQ
	  ADD ACCBUF+1
	XC 1,LT
	  SUB ACCBUF+1
;==========================================
;!!!!!!!!!!!!!!!! BE WARN OF OVERFLOW
;  accb=accb/acc;		//-1330 <..<1330
;  acc=accb;
;===========ACC/ACCBUF->ACCBUF & ACClow===============================
	CALL CG_DIV
;==========================================
;  cgain=accb;
;  accb=cor;
;  *match = (float)acc* (accb>>6);
;==========================================
	MAR *,AR4		;AR4->CG_GAIN[512]
	SACL *+,0,AR3		;AR3->CG_MATCH[512*2]
	SACL MPY_16
	LLAC CG_COR
	BSAR 6
	SLAC MPY_32
	CALL MPY16_32
	SACL *+
	SACH *+
;==========================================
	POP
	SAMM AR2
	POP
	SAMM AR1
	POP
	SAMM AR0
	RET
;==========================================
	.IF CGAIN_DEBUG
	.INCLUDE "C50_INIT.ASM"
	.INCLUDE "MPY16_32.ASM"
	.INCLUDE "cg_div.ASM"
	.ENDIF
	.end
;=================================================
;  if (first)
;  { for (i = 0; i < l; i++)
;    { acc=0l;
;      for (j = 0; j <= i && j < len; j++)
;      { p32=(long)h1[j] * ex[i - j]; 	acc += p32;       }
;      y[i]=acc>>2;     }
;  }
; else
;  { if (ex[1] != 0)
;    { if (ex[1] == 1)
;	for (i = len - 1; i > 0; i--) 	 y[i - 1] += (h1[i]>>2);
;      else
;	for (i = len - 1; i > 0; i--) 	 y[i - 1] -= (h1[i]>>2);
;    }
;    for (i = l - 1; i > 0; i--)          y[i] =  y[i - 1];
;    //y[0] = (((long)ex[1] * (long)h1[0])>>2);
;    //y[0] = (((long)ex[1] * (long)h1[0])>>2);	//h[0]=1?
;    y[0] = (int)ex[1]<<11;	//11=13-2
;    if (ex[0] != 0)
;    { if (ex[0] == 1)
;	for (i = len - 1; i > 0; i--)   y[i - 1] += (h1[i]>>2);
;      else
;	for (i = len - 1; i > 0; i--)   y[i - 1] -= (h1[i]>>2);
;    }
;    for (i = l - 1; i > 0; i--) 	y[i] =  y[i - 1];
;    //y[0] = (((long)ex[0] * (long)h1[0])>>2);
;    //y[0] = (((long)ex[1] * (long)h1[0])>>2);	//h[0]=1?
;    y[0] = (int)ex[0]<<11;	//11=13-2
;  }
;  cor = 0;
;  for (i = 0; i < l; i++)    cor +=(((long)y[i] * (long)e0[i])>>6);
;  if (ex[0] == 0 && ex[1] == 0 && !first)
;    eng = eng - (((long)y59save * (long)y59save)>>6) - (((long)y60save * (long)y60save)>>6);
;  else
;  { eng = 0;
;    for (i = 0; i < l; i++)  eng += (((long)y[i] * (long)y[i])>>6);  //16.16
;  }
;  if(eng < (1lu<<16) )     eng=1lu<<16; //if eng<1 then eng=1;

;  y59save = y[l - 2];
;  y60save = y[l - 1];

;  accb=cor;	//27.5
;  acc=eng;	//14.18 ->16.16
;  if(labs(accb)< (1lu<<20) )       accb<<=11;
;  else if(labs(accb)< (1lu<<25) ) { accb<<=6; acc>>=5; }
;       else   acc>>=11;
;  ax0=0;
;  while( acc>0x7ffflu ) { acc>>=1; ax0++; }
;  accb>>=ax0;

;  if(accb<0) accb-=acc/2;
;  else accb+=acc/2;
;  accb=accb/acc;		//-1330 <..<1330
;  acc=accb;

;//  if(labs(accb)>0x7fff)  accb=(accb<0) ? -0x8000l : 0x7fff;
;  cgain=accb;

;  accb=cor;
;  *match = (float)acc* (accb>>6);
;=================================================

⌨️ 快捷键说明

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