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

📄 tpgain.asm

📁 文件为美军4800bps语音压缩编码标准在TI的DSP芯片TMS320C5X上的实时实现源代码。
💻 ASM
字号:
PGAIN_DEBUG	.SET 1
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
	.IF PGAIN_DEBUG
	.version        50
	.mmregs
	.MLIB "mac.lib"
	.SECT "ONCHIP1"
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
	.DATA
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
	LAR AR0,#PG_X_E0+59
	LACC #E0
	SAMM BMAR
	MAR *,AR0
	RPT #59
	 BLDD BMAR,*-
	LACC #30
	SACL PG_LEN
	LACC #20
	SACL PG_M
	LACC #6
	SACL PG_BP
	LACC #1
	SACL PG_FIRST
	LACC #650
	SACL PG_BP_FLAG
	SLAC EMAX
	LAR AR5,#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
	.bss BB,5
	;-------------
PG_X_E0 .USECT "ONCHIP0",60
PG_Y_1	.USECT "DRAM",1		;serve as the y[-1]
PG_Y	.USECT "DRAM",60
PG_Y2	.USECT "DRAM",60

PG_GAIN .USECT "ONCHIP0",256
PG_MATCH	.USECT "ONCHIP0",256*2
	;--------------
	.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]
;AR0(EX),AR1(IMP_H),AR2(PG_Y),AR7(BANZ)
;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
	.BSS PG_LEN_1,1
	.BSS PG_RPTC,1
	.BSS PG_EX,1
	.bss PG_Y_ADDR,1
;-----------------------------------
;=================================
PGAIN
	LACC PG_LEN
	SUB #1
	SACL PG_LEN_1
	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 #PG_Y_1
	;SACL PG_Y_ADDR
	LACC #PS_V0+219
	SUB PG_M
	SAMM AR0
	LACC PG_LEN
	ADD #IMP_H-1
	SAMM AR1
	LACC PG_LEN
	ADD #PG_Y-2
	SAMM AR2
	MAR *,AR0
	LT *,AR1
	MPY *-,AR2
	LACC PG_LEN
	SUB #2
	SAMM BRCR
	RPTB PG_NOT_FIRST_I-1
	  LACC *,13,AR1		;AR0->Y[I-1]
	  MPYA *-,AR2
	  ;BSAR 13
	  ;SACL *-
	  SACH *-,3
PG_NOT_FIRST_I
;==========================================
;    //for (i = l - 1; i > 0; i--)      y[i] = y[i - 1];
;    //y[0] = ex[0] * h[0];
;    y[-1] = (((long)ex[0] * (long)h1[0])>>13);
;  }
;==========================================
	;LAR AR2,#PG_Y+58
	;MAR *,AR2
	;RPT #58
	;  DMOV *-
	LAR AR2,#PG_Y_1
	LAR AR1,#IMP_H
	MAR *,AR1
	MPY *,AR2		;TREG0=PS_V0[0]
	PAC
	BD PG__Y2
	 BSAR 13
	 SACL *
;=================================
;{ 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;     }  }
;=================================
PG__FIRST
;=================================
	LACC #PG_Y_1
	SACL PG_Y_ADDR
	LACC #IMP_H
	SAMM BMAR
	;SAMM AR1
	ZAC
	SACL PG_RPTC
	LACC #59
	SAMM BRCR
	LACC #PS_V0+219
	SUB PG_M
	SAMM AR0	;AR0->EX[0]
	SACL PG_EX
	MAR *,AR0
	LAR AR2,#PG_Y_1
	;-------
	RPTB PG_FIRST_I-1
	  ZAP
	  RPT PG_RPTC   ;AR0 -> EX[I] , BMAR->H[0]
	    ;MAC IMP_H,*-
	    MADS *-
	  APAC
	  BSAR 13
	  MAR *+,AR2	;AR0->H[0]
	  SACL *+,0,AR0
	  LACC PG_RPTC
	  ADD #1
	  SACB
	  LACC PG_LEN_1	;29/59
	  CRLT
	  SACL PG_RPTC
	  LACC PG_EX
	  ADD #1
	  SACL PG_EX
	  SAMM AR0	;AR0->EX[I]
PG_FIRST_I
;=================================
;  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];	}
;=================================
PG__Y2
	LACC PG_M
	SUB #60
	BCNDD PG_COR_MACD,C	;JUMP IF M>=60
	  LAR AR0,#PG_Y_1+59
	  ;=====
PG_M_GEQ_30
	LACC PG_M
	SUB #1
	SACL PG_RPTC		;PG_RPTC=M-1
	SUB #29
	BCNDD PG_M_LT_30,NC	;JUMP IF M<30
	  LAR AR0,#PG_Y2
	  ;-----
	  LACC PG_Y_ADDR
	  SAMM AR1
	  SAMM BMAR
	  MAR *,AR0
	  RPT PG_RPTC
	    BLDD BMAR,*+	;AR0->Y2[M]
	  LACC PG_M
	  SUB #59
	  ABS
	  SAMM BRCR
	  LACC PG_Y_ADDR
	  ADD PG_M
	  SAMM AR2
	  MAR *,AR1		;for (i = m; i < l; i++)
	  RPTB PG_M_GEQ_30_1-1	; y2[i] = y[i-1] + y[i-1 - m];  //WHT
	    LACC *+,0,AR2	;ARP==0-->AR1
	    ADD *+,0,AR0
	    SACL *+,0,AR1
PG_M_GEQ_30_1
	   B PG_COR_MAC
;====================================================
;  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];}
;====================================================
PG_M_LT_30
	;LAR AR0,#PG_Y2          ;BMAR=PG_Y_1=Y[-1]
	LACC PG_Y_ADDR
	SAMM AR1
	ADD PG_M	;AR0: Y2[I] AR3: Y2[I+M] ar1:y[i-1] ar2:y[i-1+m]
	SAMM AR2
	LAMM AR0
	ADD PG_M
	SAMM AR3
	LACC PG_RPTC	;M-1
	SAMM BRCR
	MAR *,AR1		;for (i = m; i < 2*m; i++)
	RPTB PG_M_LT_30_1-1	; y2[i] = y[i-1] + y[i-1 - m];  //WHT
	    LACC *+,0,AR0	;ARP==0-->AR1
	    SACL *+,0,AR2
	    ADD *+,0,AR3
	    SACL *+,0,AR1
PG_M_LT_30_1
	LACC PG_M,1
	SUB #59
	ABS
	SAMM BRCR
	MAR *,AR0
;-----------
;  for (i = 2 * m; i < l; i++) y2[i] = y[i-1] + y[i-1-m] + y[i-1-2 * m];}
;----------AR0:Y2[M], AR3:Y2[2*M], AR2:Y[2*M-1], ARP==1
	RPTB PG_COR_MAC-1
	  LACC *+,0,AR2
	  ADD *+,0,AR3
	  SACL *+,0,AR0
PG_COR_MAC
	MAR *,AR0
	LAR AR0,#PG_Y_1+59
	RPT #59
	  DMOV *-
	LACC PG_BP
	LAR AR0,#PG_Y2
	XC 1,GT		;PIPELINE
	  SPM 3
	ZAP
	RPT #59
	 MAC E0,*+
	APAC
	SACB
	SLAC PG_COR
	BD PG_COR_OVER
	  LAR AR0,#PG_Y2
PG_COR_MACD
	LACC PG_BP
	MAR *,AR0	;AR0=Y[58]
	XC 1,GT		;PIPELINE
	  SPM 3
	 ZAP
	 RPT #59
	    MACD PG_X_E0,*-	;AR0: Y[-2]
	  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
	;SACB   	;AR0: Y2[0]/Y[0]
	ZAP
	RPT #60		;GET ENG :61 times
	  SQRA *+
	SLAC PG_ENG
	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
	;LAMM AR0
	;SAMM TREG1
	;----
	;LACB
	;SACL ACCBUF+1
;=================================
;  acc=(accb<<14)/acc;    pgain=acc<<ax0;
;  acc=pgain;
;  if(labs(acc)>0x7fff) PGAIN=(acc<0) ? -0x8000l : 0x7fff;
;=================================
	CALLD PG_DIV	;ACCBUF+1/ACCBUF ->2.14 RESULT IN ACL & ACCBUF
	  LACB
	  SACL ACCBUF+1
	LACT ACCBUF	;TREG1=AR0
	SACB
	ABS
	SUB #7FFFH
	;LACB
	BCNDD PG_MATCH4,NC
	 LACB
	 SACL BB+2
	 ;---
	  XC 2,GT
	   LACC #7FFFH
	  XC 2,LT
	   LACC #1,15
	  SACL BB+2
PG_MATCH4
	;--------
	.IF PGAIN_DEBUG
	MAR *,AR4	;AR4->PG_GAIN
	SACL *+,0,AR1
	.ENDIF
	;--------
	;SACL BB+2
;=================================
;  if(ax0>4) ax0-=4;  //ACCB<(ACC<<AX0)
;  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; }
;=========================================
	LLAC 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
	  BD PG_MATCH9
	   XC 1,C
	    BSAR 8
	   ;----
PG_MATCH6
	LACC PG_BP_FLAG
	SUB #10
	BCNDD PG_MATCH7,C        ;JUMP IF PG_BP_FLAG>=10
	 LACB
	 BSAR 8
	 ;----
	  LAR AR1,#IMP_H+1
	  MAR *,AR1
	  LACC *,0,AR3	;else if(bp_pflag<10 && fabs(h[1])<1.0 ){accb>>=2;}
	  ABS
	  SUB #2000H
	  LACB
	  XC 1,NC		;SHIFT IF H[1]<1.0
	    BSAR 2
	  ;XC 1,C  		;SHIFT IF H[1]>=1.0
	    ;BSAR 8
	  BD PG_MATCH9
	    XC 1,C  		;SHIFT IF H[1]>=1.0
	     BSAR 8
	  ;---
PG_MATCH7		;else { accb>>=8; }//acc>>=4; }
	;LACB
	;BSAR 8
PG_MATCH9
;--------------
	SLAC MPY_32
	ABS
	SUB #7FFFH
	BCNDD PG_DO_MPY32,C	;JUMP IF >=0X7FFF
	 LT ACCBUF
	 MPY MPY_32
	 ;-----
	 BD PG_OVER_MPY32
	  PAC
	  SACB
;====================================
;  *match=(float)accb*(acc<<ax0);
;=================================
PG_DO_MPY32
	;SLAC MPY_32
	CALLD MPY16_32
	 LACC ACCBUF
	 SACL MPY_16
	SACB
PG_OVER_MPY32
	LAMM AR0
	SAMM TREG1
	LACB
	SATL
	;---------
	.IF PGAIN_DEBUG
	MAR *,AR5
	SACL *+
	SACH *+
	.ENDIF
	;--------
;=========================================
;  if(*match>EMAX) { PGemax=*match; PGemax_ptr=m-20; }
;=======ACC=*MATCH==================================
	SACB
	LLAC EMAX
	SBB
	BCND PG_OVER_EMAX,C		;JUMP IF EMAX>=*MATCH
	  LACB
	  SLAC EMAX
	  LACC PG_M
	  SUB #20
	  SACL EMAX_PTR
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;
;  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; }
;  while(labs(accb)>0x7fff) { ax0++;  accb>>=1; }
;  *match=(float)accb*(acc<<ax0);
;  acc=pgain;
;  if(labs(acc)>0x7fff) acc=(acc<0) ? -0x8000l : 0x7fff;

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