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

📄 pgain611.asm

📁 文件为美军4800bps语音压缩编码标准在TI的DSP芯片TMS320C5X上的实时实现源代码。
💻 ASM
字号:
PGAIN_DEBUG	.SET 0
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
	.IF PGAIN_DEBUG
	.version        50
	.mmregs
	.MLIB MAC.LIB
	.DATA
PS_V0	.int 0,0,0,0,0,0,0,0,0,0,1451,1316,1600,581,242,1467,1220,270,438,0
	.int -1456,-158,143,-154,-1181,121,-287,-1060,1513,-156,282,-237,127,21,-1458,-1456,0,-18,-40,-1526
	.int 2415,-89,-15,88,-1243,1330,12,949,1215,94,-1037,-209,-188,207,-922,0,-300,-80,-1330,106
	.int -104,324,-2242,-1109,-403,1162,-1017,-846,-188,-304,0,1008,1439,1230,1436,818,-84,1528,2064,-1049
	.int 108,-196,-1166,-89,-15,1010,-322,0,12,-1303,1134,1085,-89,-15,88,87,-1330,-1318,949,22
	.int -1549,-2877,0,-20,-43,-2951,2564,-1425,-16,93,-1321,1412,12,1007,-40,99,-1102,-1552,-200,219
	.int -980,0,-319,-85,-1413,112,1219,-986,-2381,-1178,-428,1233,-2411,-899,1130,-323,0,2400,1528,1306
	.int 1524,868,-1420,1622,2191,-1114,114,1121,-1239,-95,-16,1072,-1672,0,12,-2714,1204,1152,-95,-125
	.int -21,122,-1209,-524,-1838,1322,30,-2160,-4011,0,-1358,1270,-4114,3574,-657,-23,1459,-1842,1968,1346
	.int 1403,-56,-1192,-1537,-2164,-279,305,-37,1330,-445,1211,-1970,156,1699,-1375,-3320,-1643,-597,1718,-3361
	.int -2584,1575,-451,1330,3345,2130,1820,3454,1209,-3310,2261,3054,-223,158,1562,-1728,1197,-23,1494,0
	.int 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.int 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
	.int 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
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 #PG_FIRST
	LACC #20
	SACL PG_M
	LACC #6
	SACL PG_BP
	LACC #1
	SACL PG_FIRST
	LAR AR3,#PG_MATCH
	LAR AR4,#PG_GAIN
LOOP_PG
	CALL PGAIN
	LACC #0
	SACL PG_FIRST
	LACC PG_M
	ADD #1
	SACL PG_M
	SUB #70
       BCND LOOP_PG,NEQ
HERE:	B HERE
	;------------
	.BSS ACCBUF,2
	.BSS SIGNFLAG,1
	.BSS PG_FIRST,1
	.BSS PG_BP,1
	.BSS PG_BP_FLAG,1
	.BSS EMAX_PTR,1
	.BSS EMAX,2
	;-------------
PG_MATCH	.USECT "WARRAY",256*2
PG_GAIN .USECT "WARRAY",256
PG_Y	.USECT "WARRAY",60
PG_Y2	.USECT "WARRAY",60
	;--------------

	.ENDIF
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;ACCBUF*2, SIGNFLAG ,PG_FIRST,PG_M,PG_BP,PG_COR*2,PG_ENG*2,PG_BP_FLAG
;CALL MPY16_32, PG_DIV
;AR3->PG_MATCH[256*2], AR4->PG_GAIN[256]
;PUSH AR0,AR1,AR2,AR7
;ACC,ACCB,PREG,TREG0/1,BRCR
;ARRAY: PG_MATCH[256*2], PG_GAIN[256], PG_Y[60], PG_Y2[60], IMP_H[60], E0[60]
;H: 	3.13,
;PG_Y: 	16.0
	.BSS PG_M,1
	.BSS PG_COR,2
	.BSS PG_ENG,2
	.BSS PG_LEN,1

;-----------------------------------
;=================================
PGAIN
	;LAMM AR0
	;PUSH
	;LAMM AR1
	;PUSH
	;LAMM AR2
	;PUSH
	LACC PG_FIRST
	BCND PG__FIRST,NEQ
;==========================================
;  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);     }
;==========================================
	LACC #PS_V0+219
	SUB PG_M
	SAMM AR0
	;LAR AR0,#PS_V0
	;LAR AR1,#IMP_H+29
	LACC PG_LEN
	ADD #IMP_H-1
	SAMM AR1
	;LAR AR2,#PG_Y+28
	LACC PG_LEN
	ADD #PG_Y-2
	SAMM AR2
	MAR *,AR0
	LT *,AR1
	LACC PG_LEN
	SUB #2
	;LACC #28
	SAMM BRCR
	RPTB PG_NOT_FIRST_I-1
	  MPY *-,AR2
	  PAC
	  BSAR 13
	  ADD *
	  SACL *-,0,AR1
PG_NOT_FIRST_I
;==========================================
;    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);
;  }
;==========================================
	LAR AR2,#PG_Y+58
	MAR *,AR2
	RPT #58
	  DMOV *-
	LAR AR2,#PG_Y
	LAR AR1,#IMP_H
	MAR *,AR1
	MPY *,AR2		;TREG0=PS_V0[0]
	PAC
	BSAR 13
	SACL *
	B PG__Y2
;=================================
;{ 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>>13;     }  }
;=================================
PG__FIRST
;=================================
	;LAMM AR7
	;PUSH
	LACC #59
	SAMM AR7
	;LAR AR0,#PS_V0
	LACC #PS_V0+219
	SUB PG_M
	SAMM AR0
	LAR AR2,#PG_Y
	LAMM AR0
	PUSH
	MAR *,AR1
PG_FIRST_I
	;-----------
	LAMM AR7
	SUB #59
	ABS
	SACB
	;LACC #29
	LACC PG_LEN
	SUB #1
	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 PG_FIRST_J-1
	   MPYA *-,AR1
	   LT *+,AR0
	   NOP
PG_FIRST_J
	APAC
	BSAR  13		;y[i]=acc>>13;     }  }
	MAR *,AR2
	SACL *+,0,AR7
	POP
	ADD #1
	PUSH
	SAMM AR0
	;MAR *,AR7
	BANZ PG_FIRST_I,*-,AR1
	pop		;pop out AR0
	;POP
	;SAMM AR7
;=================================
;  for (i = 0; i < l; i++)    y2[i] = y[i];
;  if (m < l)
;  { //for (i = m; i < l; i++)      y2[i] = y[i] + y[i - m];
;<--> for (i = m; i < l; i++)    y2[i] = y2[i] + y[i - m];  //WHT
;=================================
PG__Y2
	LACC #PG_Y
	SAMM BMAR
	LAR AR0,#PG_Y2
	MAR *,AR0
	RPT #59
	  BLDD BMAR,*+
	LACC PG_M
	SUB #60
	BCNDD PG_CORENG,C		;JUMP IF PG_M>=60 ,ARP==0
	;------
	LAR AR0,#PG_Y
	ABS
	;------
	SUB #1
	SAMM BRCR
	LACC #PG_Y2		;ARP==0
	ADD PG_M
	SAMM AR1                ;for (i = m; i < l; i++)
	RPTB PG_Y2_1-1		; y2[i] = y2[i] + y[i - m];  //WHT
	  LACC *+,0,AR1		;ARP==0-->AR1
	  ADD *
	  SACL *+,0,AR0
PG_Y2_1
;================================
;    if (m < l / 2)
;     for (i = 2 * m; i < l; i++) y2[i] = y2[i] + y[i - 2 * m];  }
;================================
	LACC PG_M
	SUB #30
	BCNDD PG_CORENG,C
	;------
	LAR AR0,#PG_Y
	ABS
	;------
	SFL
	SUB #1 			;2*(M-L/2)=2*M-L
	SAMM BRCR
	LACC #PG_Y2
	ADD PG_M,1
	SAMM AR1                ;for (i = 2 * m; i < l; i++)
	RPTB PG_CORENG-1		; y2[i] = y2[i] + y[i - m];  //WHT
	  LACC *+,0,AR1		;ARP==0
	  ADD *
	  SACL *+,0,AR0
PG_CORENG
;=================================
;  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
;======================================
	LACC PG_BP
	LAR AR0,#PG_Y2
	XC 1,GT
	  SPM 3
	ZAP
	RPT #60		;GET ENG :61 times
	  SQRA *+
	SACL PG_ENG
	SACH PG_ENG+1
	SACB
	;---ARP==0-------
	LAR AR0,#PG_Y2
	LAR AR1,#E0
	LACC #29
	SAMM BRCR
	ZAP
	RPTB PG_GET_COR-1
	  LT *+,AR1	;cor += (((long)y2[i] * (long)e0[i])>>bp_pgain);
	  MPYA *+,AR0
	  LT *+,AR1
	  MPYA *+,AR0
PG_GET_COR
	APAC
	SACL PG_COR
	SACH PG_COR+1
	SPM 0
;=================================
;  accb=cor;   acc=eng;  p32=cor;
;  ax0=0;
;  while(labs(acc)>0x7fffl) { acc>>=1; ax0++; }
;  if(acc<1l) acc=1l;
;  accb>>=ax0;
;=======ARP--0==========================
	EXAR
	LAR AR0,#16
	RPT #15
	 NORM *-
	NOP
	XC 2,LEQ
	 LACC #1
	SACH 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
	BCND PG_MATCH2,NC	;JUMP IF |ACCB|<ACCBUF
	LACB
	SFR
	MAR *+
	B PG_MATCH1
PG_MATCH2
	LAMM AR0
	SAMM TREG1
	LACB
	;SATL
	SACL ACCBUF+1
;=================================
;  acc=(accb<<14)/acc;    pgain=acc<<ax0;
;  acc=pgain;
;  if(labs(acc)>0x7fff) PGAIN=(acc<0) ? -0x8000l : 0x7fff;
;=================================
	CALL PG_DIV	;ACCBUF+1/ACCBUF ->2.14 RESULT IN ACL & ACCBUF
	LACT ACCBUF	;TREG1=AR0
	SACB
	ABS
	SUB #7FFFH
	LACB
	BCND PG_MATCH4,NC
	  XC 2,GT
	   LACC #7FFFH
	  XC 2,LT
	   LACC #1,15
PG_MATCH4
	MAR *,AR4	;AR4->PG_GAIN
	SACL *+,0,AR1
;=================================
;  if(ax0>4) ax0-=4;
;  else { acc>>=(4-ax0); ax0=0; }
;=========================================
	LAMM AR0
	SUB #4
	SAMM AR0
	BCND PG_MATCH5,C  	;JUMP IF AR0>=4
	  LAR AR0,#0
	  ABS
	  SAMM TREG1
	  LACC ACCBUF
	  SATL
	  SACL ACCBUF
PG_MATCH5
;=========================================
;  accb=cor;
;  if(bp_pflag>100 && bp_pgain==0 ) { accb>>=10; }//acc>>=2;}
;  else if(bp_pflag<10 && fabs(h[1])<1.0 ) { accb>>=2; }//acc>>=4; }
;	else { accb>>=8; }//acc>>=4; }
;=========================================
	LACC PG_COR+1,16
	OR PG_COR
	SACB
	LACC PG_BP_FLAG
	SUB #101
	BCND PG_MATCH6,NC	;JUMP IF bp_flag<=100
	  LACC PG_BP
	  SUB #1
	  LACB
	  XC 1,NC		;SHIFT IF BP_PGAIN==0
	    BSAR 10
	  XC 1,C
	    BSAR 8
	  B PG_MATCH9
PG_MATCH6
	LACC PG_BP_FLAG
	SUB #10
	BCND PG_MATCH7,NC
	  LAR AR1,#IMP_H+1
	  MAR *,AR1
	  LACC *,0,AR3	;else if(bp_pflag<10 && fabs(h[1])<1.0 ){accb>>=2;}
	  ABS
	  SUB #4000H
	  LACB
	  XC 1,NC		;SHIFT IF H[1]<1.0
	    BSAR 2
	  XC 1,C
	    BSAR 8
	  B PG_MATCH9
PG_MATCH7		;else { accb>>=8; }//acc>>=4; }
	LACB
	BSAR 8
PG_MATCH9
;=================================
;  *match=(float)accb*(acc<<ax0);
;=================================
	SACL MPY_32
	SACH MPY_32+1
	LACC ACCBUF
	SACL MPY_16
	CALL MPY16_32
	SACB
	LAMM AR0
	SAMM TREG1
	LACB
	SATL
	MAR *,AR3
	SACL *+
	SACH *+
;=========================================
;if(emax>*match) { emax=*match; emax_ptr=m-20; }
;=========================================
	SACB
	LLAC EMAX
	SBB
	BCND PG_OVER_EMAX,LEQ
	  ADDB
	  SLAC EMAX
	  LACC PG_M
	  SUB #20
	  SACL EMAX_PTR
PG_OVER_EMAX
;=========================================
	;POP
	;SAMM AR2
	;POP
	;SAMM AR1
	;POP
	;SAMM AR0
	RET
;=========================================
;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]=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);
;  }
;  for (i = 0; i < l; i++)    y2[i] = y[i];
;  if (m < l)
;  { for (i = m; i < l; i++)      y2[i] = y[i] + y[i - m];
;    if (m < l / 2)
;     for (i = 2 * m; i < l; i++) y2[i] = y2[i] + y[i - 2 * m];
;  }
;  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];
;  }
;  accb=cor;   acc=eng;  p32=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;    pgain=acc<<ax0;
;  if(ax0>=4) ax0-=4;
;  else { acc>>=(4-ax0); ax0=0; }
;  accb=cor;
;  if(bp_pflag>100 && bp_pgain==0 ) { accb>>=10; }//acc>>=4; }
;  else if(bp_pflag<10 && fabs(h[1])<1.0 ) { accb>>=2; }//acc>>=4; }
;	else { accb>>=8; }//acc>>=4; }

;  *match=(float)accb*(acc<<ax0);
;  acc=pgain;
;  if(labs(acc)>0x7fff) acc=(acc<0) ? -0x8000l : 0x7fff;

;  pgain=pgain/0x4000;
;  if(emax>*match) { PGemax=*match; PGemax_ptr=m-20; }
;  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 + -