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

📄 psearch.asm

📁 文件为美军4800bps语音压缩编码标准在TI的DSP芯片TMS320C5X上的实时实现源代码。
💻 ASM
字号:
PS_DEBUG	.SET 0
	.IF PS_DEBUG
	.version        50
	.mmregs
	.MLIB "MAC.LIB"
	.BSS ACCBUF,2
	.BSS SIGNFLAG,1
	.BSS FIRST_SUB,1
	.BSS SUBCODE_I,1
	.BSS BB,5
	.BSS PINDEX,1
	.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
D1B	.int 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

	.TEXT
	CALL C50_INIT
	LDP #ACCBUF
	ZAP
	SACL FIRST_SUB
	LACC #4
	SACL SUBCODE_I
	CALL PSEARCH

HERE	b $
	.ENDIF
;===============================
;	PS_V0[279]
;========================================
;------E0[60],IMP_H[60],D1B[229]
;====>PG_EMAX,BB[2](PINDEX),BB[0]=EMAX_PTR,PG_MATCH[256*2],PG_GAIN[256]
;========================================
	.BSS PG_FIRST,1
	.BSS MINPTR,1
	.BSS MAXPTR,1
	.bss OLDPTR,1
	.BSS PS_START,1
	.BSS PGAIN_LOOP,1
	.BSS TOPPTR,1
	;.BSS PG_EMAX,2  ;PGAIN
	.BSS PS_I,1
	.BSS TAUPTR,1
	.BSS BIGPTR,1
;=======================
PSEARCH
;================================================================
;  for (i = 0; i < MAXBUFPTR; i++)     v0[i] = 0.0;
;  for (i = 0; i < MAXPD; i++)      g[i] = match[i] = 0.0;
;================================================================
	CLR0 PS_V0,MAXBUFPTR
;================================================================
;  bufptr = MMAX + no + 2*l + MAXNP - 1; //=279    //MMAX=147
;  movefr(idb, d1b, &v0[bufptr - idb - l]);  //idb=209, bufptr-idb-l=10
;================================================================
	MOVEFR IDB,D1B,PS_V0+10
;================================================================
;  if (nseg == 1)
;  { bb[2] = 0.0;    bb[0] = MMIN;  }
;================================================================
	LACC FIRST_SUB
	BCND PS_NOT_FIRST,EQ
	  ZAC
	  ;SACL BB+2
	  SACL TOPPGAIN
	  LACC #MMIN
	  ;SACL BB
	  SACL TOPM
	  B PS_QUANT_TOPPGAIN
;================================================================
;  else
;  { if ((nseg % 2) == 0)
;    { minptr = oldptr - (plevel2/2 - 1);  //PLEVEL2==64, PLEVEL1=256
;      maxptr = oldptr + (plevel2/2);
;      if (minptr < 0)
;      { minptr = 0;
;	maxptr = plevel2 - 1;       }
;      if (maxptr > plevel1 - 1)
;      { maxptr = plevel1 - 1;
;	minptr = plevel1 - plevel2;
;      }    }
;================================================================
PS_NOT_FIRST
	BIT SUBCODE_I,15
	BCND PS_ODD,NTC		;JUMP IF SUBCODE_I(0) IS 0
	  LACC OLDPTR
	  ADD #1,5
	  SACL MAXPTR
	  LACC OLDPTR
	  SUB #PLEVEL2_1
	  SACL MINPTR
	  BCND PS_OVER_MINPTR,GEQ
	    SPLK #0,MINPTR
	    BD PS_OVER_ODD
	      SPLK #PLEVEL2_1,MAXPTR
PS_OVER_MINPTR
;=====================================
;      if (maxptr > plevel1 - 1)
;      { maxptr = plevel1 - 1;
;	minptr = plevel1 - plevel2;}
;================================================================
	LACC MAXPTR
	SUB #PLEVEL1_1
	BCND PS_OVER_ODD,LEQ
	  LACC #PLEVEL1_1
	  SACL MAXPTR
	  LACC #PLEVEL1-PLEVEL2
	  SACL MINPTR
	  B PS_OVER_ODD
PS_ODD
;================================================================
;    else
;    { minptr = 0;
;      maxptr = plevel1 - 1;     }
;================================================================
	ZAP
	SACL MINPTR
	LACC #PLEVEL1_1
	SACL MAXPTR
PS_OVER_ODD
;================================================================
;    if (whole)
;    { first = TRUE;
;	emax=0; EMAX_PTR=0;
;      for (i = minptr; i <= maxptr; i++)
;      { m = (int) pdelay[i];
;	 //------------by wht
;	 if(m==oldm) { match[i]=0.; 		      continue; }
;	 else oldm=m;
;	 //------------
;================================================================
	LACC #TRUE
	SACL PG_FIRST
	;----------
	;first = TRUE; pg_shift=0; oldbp_pg=0; oldmatch=0l; topm=minptr+20;
	LACL #0
	SACL PG_SHIFT
	SACL TOPBP_PG
	SLAC PG_EMAX
	LACC MINPTR
	ADD #20
	sacl TOPM
	;---------
	LACC MINPTR
	SACL PGAIN_LOOP
	;ADD #20
	ADD #19
	SACL PG_M
	LACC #30
	SACL PG_LEN
	;------
	LAR AR0,#PG_X_E0+59
	LACC #E0
	SAMM BMAR
	MAR *,AR0
	RPT #59
	 BLDD BMAR,*-
	;------------ALL INTEGER!!!! NO FRAC PART
;================================================================
;	frac = pdelay[i] - m;
;	if (fabs(frac) < 1.e-4)
;	{ lag = start - m;
;	  g[i] = pgain(&v0[lag-1], l, first, m, LEN, &match[i]);
;	  first = FALSE;	}
;	else  match[i] = 0.0;
;      }
;================================================================
PS_LOOP_PGAIN
	LACC PG_M
	CALLD PGAIN	;BB[2]=PGAIN, PG_EMAX=*MATCH, EMAX_PTR=TAUPTR--
	 ADD #1
	 SACL PG_M
	;------
	LACC PGAIN_LOOP
	ADD #1
	SACL PGAIN_LOOP
	SUB MAXPTR
	BCND PS_LOOP_PGAIN,LEQ	;LOOP IF .<=MAXPTR
;================================================================
	LACC TOPM
	SACL PG_M
	SUB #20
	SACL TAUPTR
	SACL OLDPTR
;================================================================
;    m = (int) pdelay[tauptr];
;    lag = start - m;
;    g[tauptr] = pgain(&v0[lag - 1], l, TRUE, m, l, &match[tauptr]);
;    bb[0] = pdelay[tauptr];
;    oldptr = tauptr;
;================================================================
	LACC #60
	SACL PG_LEN
	LACC #TRUE
	SACL PG_FIRST
	;----------
	;first = TRUE; pg_shift=0; oldbp_pg=0; oldmatch=0l;
	LACL #0
	SACL PG_SHIFT
	SACL TOPBP_PG
	SLAC PG_EMAX
	;---------
	CALL PGAIN
;================================================================
;   TOPPGAIN = pitchencode(TOPPGAIN, &pindex);
;================================================================
PS_QUANT_TOPPGAIN
	CALL PTENCODE
	RET
	.INCLUDE "PTENCODE.ASM"
	.INCLUDE "PGAIN.ASM"
	.IF PS_DEBUG
	.INCLUDE "C50_INIT.ASM"
	.INCLUDE "SET_CON.ASM"
	.include "warray.asm"
	.INCLUDE "DATA_SEG.ASM"
	.ENDIF
;================================================================
;    whole = 1;     fraction = 0;
;    sub = 0;
;    neigh = 0;     nrange = 3;
;  for (i = 0; i < MAXBUFPTR; i++)     v0[i] = 0.0;
;  for (i = 0; i < MAXPD; i++)      g[i] = match[i] = 0.0;
;  bufptr = MMAX + no + 2*l + MAXNP - 1;
;  movefr(idb, d1b, &v0[bufptr - idb - l]);  //idb=209, bufptr-idb-l=10
;  if (nseg == 1)
;  { bb[2] = 0.0;    bb[0] = MMIN;  }
;  else
;  { if ((nseg % 2) == 0)
;    { minptr = oldptr - (plevel2/2 - 1);
;      maxptr = oldptr + (plevel2/2);
;      if (minptr < 0)
;      { minptr = 0;
;	maxptr = plevel2 - 1;       }
;      if (maxptr > plevel1 - 1)
;      { maxptr = plevel1 - 1;
;	minptr = plevel1 - plevel2;
;      }    }
;    else
;    {
;      minptr = 0;
;      maxptr = plevel1 - 1;
;    start = bufptr - l + 1;
;    if (whole)
;    { first = TRUE;
;      for (i = minptr; i <= maxptr; i++)
;      {	m = (int) pdelay[i];
;	//------------by wht
;	if(m==oldm) { match[i]=0.; 		      continue; }
;	else oldm=m;
;	//------------
;	frac = pdelay[i] - m;
;	if (fabs(frac) < 1.e-4)
;	{ lag = start - m;
;	  g[i] = pgain(&v0[lag-1], l, first, m, LEN, &match[i]);
;	  first = FALSE;	}
;	else  match[i] = 0.0;
;      }
;    }

;    topptr = minptr;
;    emax = match[topptr];
;    for (i = minptr; i <= maxptr; i++)
;    {
;      if (match[i] > emax)
;      { topptr = i;  emax = match[topptr];
;      }    }

;    tauptr = topptr;
;    m = (int) pdelay[tauptr];
;    frac = pdelay[tauptr] - m;
;    lag = start - m;
;    frac=0.; //by wht
;      g[tauptr] = pgain(&v0[lag - 1], l, TRUE, m, l, &match[tauptr]);
;    bb[2] = g[tauptr];
;   bb[0] = pdelay[tauptr];=TOPM
;    oldptr = tauptr;
;  }

;  /* *pitch quantization bb[2]						 */

;   bb[2] = pitchencode(bb[2], &pindex);=TOPPGAIN

;}

⌨️ 快捷键说明

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