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

📄 lsp34.asm

📁 文件为美军4800bps语音压缩编码标准在TI的DSP芯片TMS320C5X上的实时实现源代码。
💻 ASM
字号:
LSP34_DEBUG	.SET 0
	.IF LSP34_DEBUG
	.version        50
	.mmregs
	;--------
	.BSS ACCBUF,2
	.BSS IBUF,1
	.BSS TJ,2
TEMPLSP	.USECT "ONCHIP1",10
FINDEX  .USECT "ONCHIP1",10
	.data
;LSP	.INT 34eh,8ceh,1093h,171eh,24a6h,27b3h,2d4dh,34b3h,39b5h,3b57h
;LSP	.INT 411h,578h,0dc2h,18a7h,1dbfh,205dh,2980h,2b70h,32f3h,3601h
LSP	.INT 61AH,69CH,0D83H,1420H,1C3EH,207BH,27CCH,2BC7H,320DH,3668H
;	;// 2,  10,  10,  10,  15,  6,  7,  7,  7,  6,
LSPTAB	.COPY "LSPTAB.DAT"
BITS_1	.INT 7,15,15,15,15,7,7,7,7,7 ;//{3, 4, 4, 4, 4, 3, 3, 3, 3, 3};
	;----------
	.text
	CALL C50_INIT
	LDP #ACCBUF
	CALL LSP34
HERE        B $
	.ENDIF
	;------------
	.BSS TLSP_0,1		;LSP34
	.BSS TLSP_1,1
	.BSS TLSP_2,1
	.BSS TLSP_0_M,1
	.BSS TLSP_1_M,1
	.BSS LOW,1
	.BSS LEVELS,1
	.BSS ERRORDN,1
	.BSS ERRORUP,1
;=================================
LSP34
	LDP #IBUF
	LAR AR7,#P10_1
	LAR AR0,#FINDEX
	LAR AR1,#LSPTAB
	LAR AR2,#LSP
	LAR AR3,#BITS_1
	LAR AR4,#TEMPLSP
	LACC #2
	SAMM INDX
;=================================
;  for (i = 0; i < no; i++)
;  { levels = (1 << bits[i]) - 1;
;    low = dist = fabs(freq[i] - *newlsptab[i] );
;    findex[i] = 0;
;	TEMPLSP[I]=*newlsptab[i];
;=================================
	LACL #0
	SACL IBUF
	MAR *,AR3
LSP34_FOR
	LACC #LSPTAB
	ADD IBUF,4
	SAMM AR5	;PIPELINE
	;LACC *+,0,AR2
	LACC *+,0,AR5
	SACL LEVELS
	LACC *+,0,AR4
	SACL *,0,AR2;!!!!!!!!!!!!!!!
	SUB *,0,AR0
	ABS
	SACL LOW
	LACL #0
	SACL *,0,AR2
;=========================================
;    for (j = 1; j <= levels; j++)
;    { dist = fabs(freq[i] - newlsptab[i][j]);
;      if (dist < low)
;      { low = dist;  findex[i] = j;   TEMPLSP[i]=newlsptab[i][j]; }  }
;=========ARP=2================================
	LACC LEVELS
	SUB #1
	SAMM BRCR
	RPTB LSP34_FOR_J-1
	   LACC *,0,AR5
	   SUB *+,0,AR0
	   ABS
	   SACB
	   LACC LOW
	   EXAR
	   CRLT
	   BCND LSP34_FOR_J_1,NC	  ;jump if DIST>=LOW.. low<=dist
	   SACL LOW
	   LAMM BRCR
	   SUB LEVELS
	   ABS
	   SACL *,0,AR5
	   MAR *-
	   LACC *+,0,AR4
	   SACL *,0,AR2
LSP34_FOR_J_1
	   MAR *,AR2
	   NOP
LSP34_FOR_J
;=========================================
;    if (i > 0)
;    { if (newlsptab[i][findex[i]] <= newlsptab[i - 1][findex[i - 1]])
;      {tlsp_0=newlsptab[i][findex[i]];
;	tlsp_1=newlsptab[i-1][findex[i-1]];
;	//tlsp_2=newlsptab[i-2][findex[i-2]];
;	tlsp_0_m=newlsptab[i][mmin(findex[i] + 1, levels)];
;	tlsp_1_m=newlsptab[i - 1][mmax(findex[i - 1] - 1, 0)];
;=========================================
	LACC IBUF
	BCND LSP34_NEXT_FOR,EQ
	MAR *,AR4
	LACC *-
	SACL TLSP_0
	SACB
	LACC *+
	SACL TLSP_1
	CRLT				;jump if TLSP_1<TLSP_0
	BCND LSP34_NEXT_FOR,C
	SBRK #2
	LACC *0+			;INDX=2
	SACL TLSP_2
	MAR *,AR0
	;-------------
	LACC *-,0,AR5 	;tlsp_0_m=newlsptab[i][mmin(findex[i] + 1, levels)];
	ADD #1
	SACB
	LACC LEVELS
	CRLT		;TJ=ACCB=mmin(findex[i] + 1, levels)
	SACL TJ

	LACC #LSPTAB
	ADD IBUF,4
	ADDB;!!!!!!!!
	SAMM AR5	;PIPELINE
	NOP
	NOP
	LACC *,0,AR0
	SACL TLSP_0_M
	;------------
	LACC *+,0,AR5 ;tlsp_1_m=newlsptab[i - 1][mmax(findex[i - 1] - 1, 0)];
	SUB #1
	SACB
	LACL #0
	CRGT		;TJ[1]=ACCB=mmax(findex[i - 1] - 1, 0)
	SACL TJ+1

	LACC #LSPTAB-16
	ADD IBUF,4
	ADDB
	SAMM AR5	;PIPELINE
	NOP
	NOP
	LACC *,0,AR2
	SACL TLSP_1_M
;=========================================
;      errorup = fabs(freq[i] - newlsptab[i][mmin(findex[i] + 1, levels)])
;		+ fabs(freq[i - 1] - newlsptab[i - 1][findex[i - 1]]);
;=========================================
	LACC *-,0
	SUB TLSP_0_M
	ABS
	SACB
	LACC *+,0
	SUB TLSP_1
	ABS
	ADDB
	SACL ERRORUP
;=========================================
;	errordn = fabs(freq[i] - newlsptab[i][findex[i]]) +
;	  fabs(freq[i - 1] - newlsptab[i - 1][mmax(findex[i - 1] - 1, 0)]);
;=========================================
	LACC *-,0
	SUB TLSP_0
	ABS
	SACB
	LACC *+,0,AR0
	SUB TLSP_1_M
	ABS
	ADDB
	SACL ERRORDN
;=========================================
;	if (errorup < errordn)
;	{ //findex[i] = mmin(findex[i] + 1, levels);
;=======ARP=0==================================; jump if errorup>=errordn
	LACC ERRORDN
	SACB
	LACC ERRORUP
	CRGT
	BCND LSP34_DN,C
;=========================================
;	{ findex[i] = mmin(findex[i] + 1, levels);
;	  while (newlsptab[i][findex[i]] < newlsptab[i-1][findex[i-1]])
;	    findex[i] = mmin(findex[i] + 1, levels);	}
;=======ARP=0==================================;
LSP34_UP
	MAR *,AR0
	LACC TJ
	SACL *
;=========================================
;	  while (newlsptab[i][findex[i]] < newlsptab[i-1][findex[i-1]])
;	    findex[i] = mmin(findex[i] + 1, levels);	}
;=======ARP=0==================================
LSP34_UP_WHILE
	LACC #LSPTAB	;tlsp_0=newlsptab[i][findex[i]];
	ADD IBUF,4
	ADD *-,0
	SAMM AR5	;PIPELINE
	;--------------------------
	LACC #LSPTAB-16	;tlsp_1=newlsptab[i-1][findex[i-1]];
	ADD IBUF,4
	ADD *+,0,AR5
	SAMM AR6	;PIPELINE
	;-------
	LACC *,0,AR4
	SACL *,0,AR6
	LACC *,0,AR4
	;-------------------------jump if tlsp_0>=tlsp_1
	SACB
	LACC *,0,AR0
	CRGT
	BCND LSP34_NEXT_FOR,C
	 LACC *,0
	 ADD #1
	 SACB
	 LACC LEVELS
	 CRLT
	 ;SACL TJ
	 SACL *,0,AR0
	B LSP34_UP_WHILE

LSP34_DN
;=========================================
;	else if (i == 1)
; {	findex[i - 1] = mmax(findex[i - 1] - 1, 0);
;     templsp[i-1]  =newlsptab[i-1][findex[i-1]];}
;=========================================
	LACC IBUF
	SUB #1
	BCND LSP34_DN_NOT1,GT
LSP34_DN_1
	MAR *,AR0
	MAR *-
	LACC TJ+1
	SACL *,0,AR4
	;---------
	LACC #LSPTAB-16
	ADD IBUF,4
	SAMM AR5
	MAR *-,AR5
	LACC *,0,AR4		;ACC=newlsptab[i-1][findex[i-1]]
	SACL *+
	B LSP34_NEXT_FOR
;=========================================
;      else if(newlsptab[i - 1][mmax(findex[i - 1] - 1, 0)]
;	> newlsptab[i - 2][findex[i - 2]])
;	  findex[i - 1] = mmax(findex[i - 1] - 1, 0);
;=========================================
LSP34_DN_NOT1
	LACC TLSP_1_M
	SACB			;jump if tlsp_2>=tlsp_1_m
	LACC TLSP_2
	CRGT
	BCND LSP34_UP,C
	B LSP34_DN_1
;=========================================
LSP34_NEXT_FOR
	LACC IBUF
	ADD #1
	SACL IBUF
	MAR *,AR0
	MAR *+,AR2
	MAR *+,AR4
	MAR *+,AR7
	BANZ LSP34_FOR,*-,AR3
;=========================================
LSP34_END
	LACC #TEMPLSP
	SAMM BMAR
	MAR *,AR0
	LAR AR0,#LSP
	RPT #P10_1
	  BLDD BMAR,*+
	RET
;=================================
	.IF LSP34_DEBUG
	.INCLUDE "C50_INIT.ASM"
	.INCLUDE "SET_CON.ASM"
	.ENDIF
;=================================
;  for (i = 0; i < no; i++)
;  { levels = (1 << bits[i]) - 1;
;    low = dist = fabs(freq[i] - *newlsptab[i] );     findex[i] = 0;
;    for (j = 1; j <= levels; j++)
;    { dist = fabs(freq[i] - newlsptab[i][j]);
;      if (dist < low)
;      { low = dist;	findex[i] = j;	templsp[i]=newlsptab[i][j];      }
;    }
;   if (i > 0)
;   { if (newlsptab[i][findex[i]] <= newlsptab[i - 1][findex[i - 1]])
;      { errorup = fabs(freq[i] - newlsptab[i][mmin(findex[i] + 1, levels)])
;		+ fabs(freq[i - 1] - newlsptab[i - 1][findex[i - 1]]);
;	errordn = fabs(freq[i] - newlsptab[i][findex[i]]) +
;	  fabs(freq[i - 1] - newlsptab[i - 1][mmax(findex[i - 1] - 1, 0)]);
;	if (errorup < errordn)
;	{ findex[i] = mmin(findex[i] + 1, levels);
;	  while (newlsptab[i][findex[i]] < newlsptab[i-1][findex[i-1]])
;	    findex[i] = mmin(findex[i] + 1, levels);
;	}
;	else if (i == 1)
;       { findex[i - 1] = mmax(findex[i - 1] - 1, 0);
;         templsp[i-1]  =newlsptab[i-1][findex[i-1]];}

;	else if (newlsptab[i - 1][mmax(findex[i - 1] - 1, 0)] >
;		 newlsptab[i - 2][findex[i - 2]])
;	  findex[i - 1] = mmax(findex[i - 1] - 1, 0);
;	else
;	{ findex[i] = mmin(findex[i] + 1, levels);
;	  while (newlsptab[i][findex[i]] < newlsptab[i-1][findex[i-1]])
;	    findex[i] = mmin(findex[i] + 1, levels);
;	}      }    }  }
;    for (i = 0; i < no; i++) freq[i] = newlsptab[i][findex[i]] ;
;}

⌨️ 快捷键说明

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