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

📄 pgain.asm

📁 文件为美军4800bps语音压缩编码标准在TI的DSP芯片TMS320C5X上的实时实现源代码。
💻 ASM
📖 第 1 页 / 共 2 页
字号:
	  ;========
	  SPM 3
	  SBRK #60
	  RPTZ #59
	    MAC E0,*+
	  BD PG_COR_MAC_NOT_OVERFLOW
	    APAC
	    SACB
PG_COR_MACD
	LACC PG_SHIFT
	MAR *,AR0	;AR0=Y[58]
	XC 1,GT		;PIPELINE
	  SPM 3
	 ;CLRC OV
	 BCND PG_COR_CLR_OV2,OV
PG_COR_CLR_OV2
	 RPTZ #59
	    MACD PG_X_E0,*-	;AR0: Y[-2]
	  APAC
	  ;--------
	  BCND PG_COR_MACD_OVERFLOW,OV
	    SLAC PG_COR
	    BD PG_COR_OVER
	      ADRK #2		;AR0: Y[0]
	      SACB
PG_COR_MACD_OVERFLOW
;==================================
;	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 PG_COR_MACD_OV_OLD1,NC	;JUMP IF >6
	    NEG
	    SAMM TREG1
	    LLAC PG_EMAX
	    SATL
	    LACL #0
	    SACL TOPBP_PG
PG_COR_MACD_OV_OLD1
	  ;========
	  SPM 3
	  SBRK #60
	  RPTZ #59
	    ;MACD PG_X_E0,*+
	    MAC PG_X_E0,*+;!!!!!!!!!!!!!!
	  APAC
	  SLAC PG_COR
	  BD PG_COR_OVER
	    ADRK #2		;AR0: Y[0]
	    SACB
;=================================
;  cor = 0.0;   eng = 0.0;
;=================================
;=================================
;  for (i = 0; i < l; i++)
;  { cor += (((long)y2[i] * (long)e0[i])>>bp_pgain);
;    eng += (((long)y2[i] * (long)y2[i])>>bp_pgain);
;    //cor += y2[i] * e0[i];    eng += y2[i] * y2[i];
;  }
;=========ARP==0=======================
;	if(bp_pgain==6) pm==3
;======================================
PG_COR_OVER
	BCND PG_OVER_EMAX,EQ	;IF COR=0 RET
	;SACB   	;AR0: Y2[0]/Y[0]
	RPTZ #60		;GET ENG :61 times
	  SQRA *+
	BCNDD PG_ENG_NOT_OVERFLOW,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 PG_ENG_OV_OLD1,NC	;JUMP IF >6
	    NEG
	    SAMM TREG1
	    LLAC PG_EMAX
	    SATL
	    LACL #0
	    SACL TOPBP_PG
PG_ENG_OV_OLD1
	  ;========
	  LACB
	  BSAR 6
	  SACB
	  SLAC PG_COR
	  ;----
	  SBRK #61
	  SPM 3
	  RPTZ #60
	    SQRA *+
	  SLAC PG_ENG
PG_ENG_NOT_OVERFLOW
	 SPM 0
;========ACC=ENG ACCB=COR=========================
;  accb=cor;   acc=eng;  p32=cor;
;  ax0=0;
;  while(labs(acc)>0x7fffl) { acc>>=1; ax0++; }
;  if(acc<1l) acc=1l;
;  accb>>=ax0;
;=======ARP--0==========================
	LAR AR0,#16
	RPT #15
	 NORM *-
	BSAR 16		;ACCH->ACCL
	XC 1,LEQ
	 LACL #1
	SACL ACCBUF
	LAMM AR0
	SAMM TREG1
	LACB
	SATL
;=================================
;  ax0=0;
;  while( labs(accb)>= acc ) { accb>>=1; ax0++; }
;=======ARP==0==========================
	LAR AR0,#0
PG_MATCH1
	SACB		;ACCB== SHIFTED COR
	ABS
	SUB ACCBUF
	BCNDD PG_MATCH2,NC	;JUMP IF |ACCB|<ACCBUF
	  LAMM AR0
	  SAMM TREG1
	  ;----
	LACB
	BD PG_MATCH1
	 SFR
	 MAR *+
PG_MATCH2
;=================================
;  acc=(accb<<14)/acc;    acc=acc<<ax0; accb=acc;
;  if(labs(accb)>0x7fff) accb=(accb<0) ? -0x8000 : 0x7fff;
;  pgain=accb;
;============ARP==0=====================
	CALLD PG_DIV	;ACCBUF+1/ACCBUF ->2.14 RESULT IN ACL & ACCBUF
	  LACB
	  SACL ACCBUF+1
	LACT ACCBUF	;TREG1=AR0
	SACB
	SAMM TREG0
	ABS
	SUB #7FFFH
	LACB
	LAR AR0,#16
	BCND PG_MATCH4,NC
	 ADRK #16
	 LACB
	 RPT #15
	   NORM *-
	 BSAR 16
	 SAMM TREG0
	 ;---
	  XC 2,GT
	   LACC #7FFFH
	  XC 2,LT
	   LACC #1,15
PG_MATCH4
	SACL NEW_PGAIN
	;--------
	.IF PGAIN_DEBUG
	MAR *,AR4	;AR4->PG_GAIN
	SACL *+,0,AR0
	.ENDIF
	;--------
;============ACCB=PGAIN=====================
;  bp_pg=0;
;  if(acc<0) while(acc<-0x8000lu) { acc>>=1; bp_pg++;}
;  else while(acc>0x7fff) { acc>>=1; bp_pg++;}
;===========ARP--0=======================
;  accb=cor;
;  if(accb<0) while(accb<-0x8000lu) { accb>>=1; bp_pg++;}
;  else while(accb>0x7fff) { accb>>=1; bp_pg++;}
;==================================
	LLAC PG_COR
	RPT #15
	  NORM *-
	SACH ACCBUF	;ACCBUF=shifted COR, TREG0=shifted COR/ENG
;===================================
	MPY ACCBUF
	PAC
	SACB
;====================================
;  *match=(float)accb*(acc<<ax0);
;  while(*match<(1lu<<30) && bp_pg>0) { *match *=2; bp_pg--; }
;=================================
	LAMM AR0
	BCND PG_MATCH_CMP,EQ
	  SUB #1
	  SACL ACCBUF
	  LACB
	  RPT ACCBUF
	    NORM *-
	  SACB
;=================================
PG_MATCH_CMP
	.IF PGAIN_DEBUG
	MAR *,AR5
	SACL *+
	SACH *+,0,AR0
	.ENDIF
	;--------
;=========================================
;  if( (bp_pg>oldbp_pg) || (bp_pg==oldbp_pg && *match>oldmatch) )
;	{ oldmatch=(long)*match; oldbp_pg=bp_pg;
;	  topm=m; top_pgain=pgain;	}
;=======ACCB=ACC=*MATCH==================================
	LAMM AR0
	SUB TOPBP_PG
	BCND PG_OVER_EMAX,LT	;JUMP IF AR0<TOPBP_PG
	BCND PG_T_EMAX,GT	;JUMP IF AR0>TOPBP_PG
	 LLAC PG_EMAX
	 SBB
	 BCND PG_OVER_EMAX,C		;JUMP IF PG_EMAX>=*MATCH
PG_T_EMAX
	  LACB
	  SLAC PG_EMAX
	  LACC PG_M
	  SACL TOPM
	  LAMM AR0
	  SACL TOPBP_PG
	  LACC NEW_PGAIN
	  SACL TOPPGAIN
PG_OVER_EMAX
;=========================================
	RETD
	  ZAP
	  SACL PG_FIRST
;=========================================
;float wpgain(ex[279], l=60, first=0/1, m, len=30, match[256])
;{ 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-1]=acc>>13;     }
;  }
;  else
;  { //for (i = len - 1; i > 0; i--)    y[i - 1] += ex[0] * h[i];
;    for (i = len - 1; i > 0; i--)
;     {	acc = (long)ex[0] *(long)h1[i];
;	y[i-1] += (acc>>13);     }
;    //for (i = l - 1; i > 0; i--)  y[i] = y[i - 1];
;    //y[0] = ex[0] * h[0];
;    //y[0] = (((long)ex[0] * (long)h1[0])>>13);
;    y[-1] = (((long)ex[0] * (long)h1[0])>>13);
;  }
;  if(m>=l) for (i = 0; i < l; i++)   y2[i] = y[i-1]; do not need y2!
;  else if( m>=l/2)
;	{ for (i = 0; i < m; i++)   y2[i] = y[i-1];
;	  for (i = m; i < l; i++)   y2[i] = y[i-1] + y[i-1 - m];	}
;  else { for (i = 0; i < m; i++)   y2[i] = y[i-1];
;	 for (i = m; i < 2*m; i++)   y2[i] = y[i-1] + y[i-1 - m];
;	 for (i = 2 * m; i < l; i++) y2[i] = y[i-1] + y[i-1-m] + y[i-1- 2 * m];}

; for (i = l - 1; i > 0; i--)  y[i] = y[i - 1];

;  cor = 0.0;   eng = 0.0;
;  acc=0l; accb=0l;
;  for (i = 0; i < l; i++)
;  { cor += (((long)y2[i] * (long)e0[i])>>pg_shift);
;    if( fabs(cor) >=(1lu<<31)  )
;    { pg_shift=6;
;      if(oldbp_pg<=6) { oldmatch>>=(6-oldbp_pg); oldbp_pg==0; }
;      else oldbp_pg-=6;
;      for (cor=0,i = 0; i < l; i++) cor += ((long)(y2[i] * e0[i])>>pg_shift);
;      break; }  }
;  for(i=0;i<l;i++)
;   { eng += ((long)(y2[i] * y2[i])>>pg_shift);
;     if( eng >=(1lu<<31)  )
;     { if(oldbp_pg<=6) { oldmatch>>=(6-oldbp_pg); oldbp_pg==0; }
;       else oldbp_pg-=6;
;	pg_shift=6;
;       cor=(long)cor>>6;
;       for(eng=0,i=0;i<l;i++) eng += ((long)(y2[i] * y2[i])>>pg_shift);
;       break; }     }
;  acc=(long)eng; accb=(long)cor;
;  ax0=0;
;  while(labs(acc)>0x7fffl) { acc>>=1; ax0++; }
;  accb>>=ax0;
;  if(acc<1l) acc=1l;

;  ax0=0;
;  while( labs(accb)>= acc ) { accb>>=1; ax0++; }
;  acc=(accb<<14)/acc;
;  acc<<=ax0; accb=acc;
;  if(labs(accb)>0x7fff) accb=(accb<0) ? -0x7fff-1 : 0x7fff;
;  pgain=accb;
;  bp_pg=0;
;  if(acc<0) while(acc<-0x8000lu) { acc>>=1; bp_pg++;}
;  else while(acc>0x7fff) { acc>>=1; bp_pg++;}
;  accb=cor;
;  if(accb<0) while(accb<-0x8000lu) { accb>>=1; bp_pg++;}
;  else while(accb>0x7fff) { accb>>=1; bp_pg++;}

;  *match=(float)accb*acc;
;  while(*match<(1lu<<30) && bp_pg>0) { *match *=2; bp_pg--; }
;  if( (bp_pg>oldbp_pg) || (bp_pg==oldbp_pg && *match>oldmatch) )
;	{ oldmatch=(long)*match; oldbp_pg=bp_pg;
;	  topm=m; top_pgain=pgain;	}

;  pgain=pgain/0x4000;
;  return (pgain);}
;=================================
	.INCLUDE "MPY16_32.ASM"
	.INCLUDE "pg_div.ASM"

	.IF PGAIN_DEBUG
	.INCLUDE "C50_INIT.ASM"
	.ENDIF

⌨️ 快捷键说明

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