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

📄 cgain.asm

📁 文件为美军4800bps语音压缩编码标准在TI的DSP芯片TMS320C5X上的实时实现源代码。
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	  CRLT
	  SACL PG_RPTC
	  LACC CG_EX
	  ADD #1
	  SACL CG_EX
	  SAMM AR0	;AR0->EX[I]
CG_FIRST_I
	LAR AR0,#CG_Y+58
;=================================
CG_GET_COR   ;AR0: Y[58], ARP=0
;==========================================
;  cor = 0;
;  for (i = 0; i < l; i++)    cor +=(((long)y[i] * (long)e0[i])>>6);
;==========================================
	LACC PG_SHIFT
	BCND CG_COR_CLR_OV,OV
CG_COR_CLR_OV
	XC 1,GT
	  SPM 3
	;-----
	;LAR AR0,#CG_Y+58
	;MAR *,AR0	;AR0=Y[58]
	RPTZ #59
	  MACD PG_X_E0,*-	;AR0: Y[-2]
	APAC
	;--------
	BCNDD CG_COR_NOT_OVERFLOW,NOV
	  SLAC PG_COR
;==================================
;	if(oldbp_pg<=6) { oldmatch>>=(6-oldbp_pg); oldbp_pg==0; }
;       else oldbp_pg-=6;
;==================================
	  LACL #6
	  SACL PG_SHIFT
	  SUB TOPBP_PG
	  NEG
	  SACL TOPBP_PG		;TOPBP_PG-=6
	  BCND CG_COR_OV_OLD1,NC	;JUMP IF >6
	    NEG
	    SAMM TREG1
	    LLAC PG_EMAX
	    SATL
	    LACL #0
	    SACL TOPBP_PG
CG_COR_OV_OLD1
	  ;========
	  SPM 3
	  SBRK #60
	  RPTZ #59
	    MAC PG_X_E0,*+	;!!!!!!!!!!!!NOT MACD WITHOUT DMOV
	  APAC
	  SLAC PG_COR
	;=======================
CG_COR_NOT_OVERFLOW
;==========================================
;  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 PG_FIRST
	BCND CG_ENG_NEW,NEQ
	  ZAP
	  SQRA CG_Y59
	  SQRA CG_Y60
	  APAC
	  SACB
	  LLAC PG_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===================================
	LACC PG_SHIFT
	LAR AR0,#CG_Y
	XC 1,GT
	 SPM 3
	RPTZ #60		;GET ENG :61 times
	  SQRA *+
	;-----------
	BCNDD CG_TEST_ENG,NOV
	  SLAC PG_ENG
;==================================
;	if(oldbp_pg<=6) { oldmatch>>=(6-oldbp_pg); oldbp_pg==0; }
;       else oldbp_pg-=6;
;==================================
	  LACL #6
	  SACL PG_SHIFT
	  SUB TOPBP_PG
	  NEG
	  SACL TOPBP_PG		;TOPBP_PG-=6
	  BCND CG_ENG_OV_OLD1,NC	;JUMP IF >6
	    NEG
	    SAMM TREG1
	    LLAC PG_EMAX
	    SATL
	    LACL #0
	    SACL TOPBP_PG
CG_ENG_OV_OLD1
	  ;========
	  LACB
	  BSAR 6
	  SACB
	  SLAC PG_COR
	  ;----
	  SBRK #61
	  SPM 3
	  RPTZ #60
	    SQRA *+
	  SLAC PG_ENG
CG_TEST_ENG
	;=======ACC=ENG
	SPM 0
	;----
	SACB
	LACC #1,15	;1<<16
	SFL
	CRGT
	SLAC PG_ENG
;==========================================
;  y59save = y[l - 2];   y60save = y[l - 1];
;=======ARP==0===================================
	LAR AR0,#CG_Y+58
	LACC *+
	SACL CG_Y59
	LACC *
	SACL CG_Y60
;==========================================
;  ax0=11;
;  while(labs(acc)>0x7fffl) { acc>>=1; ax0--; }
;  if(ax0>0) accb<<=ax0; ACCB=COR
;  else accb>>=-ax0;
;==============ARP==0======ACCB=ENG======================
	LACB		       ;ACCB=ENG
	LAR AR0,#11-16
	RPT #15
	  NORM *+
	SACH ACCBUF		;ACCBUF=shifted ENG
	SFR
	SACH ACCBUF+1		;ACCBUF+1=ACCBUF/2
	LLAC PG_COR
	SACB
	LAMM AR0
	SACL PG_RPTC
	LACC PG_RPTC
	BCND CG_SHIFT11_1,GT
	  NEG
	  SAMM TREG1
	  BD CG_OVER_SHIFT11
	   LACB
	   SATL
CG_SHIFT11_1
	SUB #1
	SACL PG_RPTC
	LACB
	RPT PG_RPTC
	  SFL
CG_OVER_SHIFT11
	;======ACCBUF=ENG, ACC=COR=========
;==========================================
	;  if(accb<0) accb-=acc/2;
	;  else accb+=acc/2;
;==========================================
	xc 1,GT
	  ADD ACCBUF+1
	XC 1,LT
	  SUB ACCBUF+1
;==========================================
;!!!!!!!!!!!!!!!! BE WARN OF OVERFLOW
;  accb=accb/acc;		//-1330 <..<1330
;  acc=accb;		granted as |cgain|<0x7fff!!!!!!!!!!!
;===========ACC/ACCBUF->ACCBUF & ACClow===============================
	CALL CG_DIV
	;-------------
	.IF CGAIN_DEBUG
	MAR *,AR4		;AR4->CG_GAIN[512]
	SACL *+,0,AR0		;AR3->CG_MATCH[512*2]
	.ENDIF
	;-------------
	BCND CG_OVER_EMAX,EQ	;RET if cor/eng==0
	 SACL NEW_PGAIN
	 SAMM TREG0
;====================================================
;  bp_cg=0;
;  accb=cor;
;  if(accb<0) while(accb<-0x8000lu) { accb>>=1; bp_cg++;}
;  else while(accb>0x7fff) { accb>>=1; bp_cg++;}
;====================================================
	lar ar0,#16
	LLAC PG_COR
	RPT #15
	 NORM *-
	SACH ACCBUF	;ACCBUF=shifted COR, TREG0=NEW_PGAIN
	MPY ACCBUF
	PAC
	sacb    	;ACCB=MATCH
;======================================================
;  acc=accb*acc;
;  if(acc<0) {printf("acc=match error <0"); exit(0); }
;  while(acc<(1lu<<30) && bp_cg>0) { acc<<=1; bp_cg--; }
;  *match=acc;
;======================================================
	LAMM AR0
	BCND CG_MATCH_CMP,LEQ
	  SUB #1
	  SACL PG_RPTC
	  LACB
	  RPT PG_RPTC
	    NORM *-
	  SACB
;=================================
CG_MATCH_CMP
	;--------
	.IF CGAIN_DEBUG
	NOP
	NOP
	MAR *,AR3
	SACL *+
	SACH *+,0,AR0
	.ENDIF
	;--------
;===========================================
;  if( (bp_cg>topbp_cg) || (bp_cg==topbp_cg && acc>=cg_emax) )
;	{ cg_emax=acc; topbp_cg=bp_cg;
;	  topcodeword=codeword; topcgain=cgain;	}
;===========ACCB=MATCH=ACC==============================
	LAMM AR0
	SUB TOPBP_PG
	BCND CG_OVER_EMAX,LT	;JUMP IF AR0<TOPBP_PG
	BCND CG_T_EMAX,GT	;JUMP IF AR0>TOPBP_PG
	 LLAC PG_EMAX
	 SBB
	 BCND CG_OVER_EMAX,GT		;JUMP IF PG_EMAX>*MATCH
CG_T_EMAX
	  LACB
	  SLAC PG_EMAX
	  LAMM AR0
	  SACL TOPBP_PG
	  LACC NEW_PGAIN
	  SACL TOPCGAIN
	  LACC #CODEBOOK+1022
	  SUB CG_BOOK
	  SFR
	  SACL TOPCBINDEX
CG_OVER_EMAX
;=========================================
	RETD
	  LACL #0
	  SACL PG_FIRST
;=========================================

;==========================================
	.IF CGAIN_DEBUG
	.INCLUDE "cg_div.ASM"
	.INCLUDE "C50_INIT.ASM"
	.INCLUDE "MPY16_32.ASM"
	.ENDIF
;=================================================
;  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
; {  for(i=l-1;i>=len-1;i--) y[i]=y[i-1];
;    for(i=len-2;i>=1;i--) y[i]=y[i-1] + (((long)ex[1]*h1[i] + (long)ex[0]*h1[i+1])>>2);
;    y[0]=((long)ex[0]*h1[1] + (long)ex[1] * h1[0])>>2;
;    for(i=l-1;i>0;i--) y[i]=y[i-1];
;    y[0]=(int)ex[0]<<11; }

;  cor = 0;
;  for (i = 0;i < l; i++)
;  { cor +=(((long)y[i] * (long)e0[i])>>cg_shift);
;    if( fabs(cor) >=(1lu<<31)  )
;    { if(topbp_cg<=6) { cg_emax>>=(6-topbp_cg); topbp_cg==0; }
;      else topbp_cg-=6;
;      cg_shift=6;
;      for(cor=0,i = 0;i<l;i++)cor+=(((long)y[i] * (long)e0[i])>>cg_shift);
;      break; }
;  }
;  if (ex[0] == 0 && ex[1] == 0 && !first)  eng = eng - (((long)y59save * (long)y59save)>>cg_shift) - (((long)y60save * (long)y60save)>>cg_shift);
;  else
;  { for (eng=0,i = 0; i < l; i++)
;    {  eng += (((long)y[i] * (long)y[i])>>cg_shift);	//14.18
;       if( eng >=(1lu<<31)  )
;       { if(topbp_cg<=6) { cg_emax>>=(6-topbp_cg); topbp_cg==0; }
;	 else topbp_cg-=6;
;	 cg_shift=6;
;	 cor=(long)cor>>6;
;	 for(eng=0,i=0;i<l;i++)eng += ((long)(y[i] * y[i])>>cg_shift);
;       break; }           }  }
;  y59save = y[l - 2];  y60save = y[l - 1];

;  if(eng < (1lu<<16) )         eng=1lu<<16;
;  acc=eng; accb=cor;
;  //eng=acc:16.16 cor=accb:27.5
;  ax0=11;
;  while(labs(acc)>0x7fffl) { acc>>=1; ax0--; }
;  if(ax0>0) accb<<=ax0;
;  else 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; think cgain<=0x7fff
;  cgain=accb;

;  bp_cg=0;
;  accb=cor;
;  if(accb<0) while(accb<-0x8000lu) { accb>>=1; bp_cg++;}
;  else while(accb>0x7fff) { accb>>=1; bp_cg++;}
;  //accb=cor, acc=cgain=cor/eng
;  acc=accb*acc;
;  if(acc<0) {printf("acc=match error <0"); exit(0); }
;  while(acc<(1lu<<30) && bp_cg>0) { acc<<=1; bp_cg--; }
;  *match=acc;
;  if( (bp_cg>topbp_cg) || (bp_cg==topbp_cg && acc>cg_emax) )
;	{ cg_emax=acc; topbp_cg=bp_cg;
;	  topcodeword=codeword; topcgain=cgain;	}
;  return (cgain);}
;=================================================

⌨️ 快捷键说明

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