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

📄 cl_ltp.asm

📁 基于TMS320F2812的AMR+RS编解码+OFDM调制解调源程序。是stand alone运行版本
💻 ASM
字号:
*****************************************************************************
** Description:     cl_ltp() in cl_ltp.c
**
** Inputs
**
**   	_buffer1:		Word16 frameOffset
**	 	_buffer1+1:		Word16 lsp_flag
**		_buffer1+2:		Word16 T0
**		_buffer1+3:		Word16 T0_frac
**   	_buffer1+4:		Word16 gain_pit
**		_buffer1+5:		Word16 gp_limit
**   	_buffer1+6:		Word16 g_coeff[0]	
**		; _buffer1+6~_buffer1+9: g_coeff[0]~g_coeff[3]
**		_buffer1+10:		Word16 T_op[0]
**		_buffer1+12:		Word16 exc
**		_buffer1+14:		Word16 &xn[0]
**		_buffer1+16:		Word16 h1
**		_buffer1+18:		Word16 &res2[0]
**		_buffer1+20:		Word16 &xn2[0]
**		_buffer1+22:		Word16 &y1[0]
**		_buffer1+24:		Word16 anap
**
** Outputs:
**
**   	clLtpState		*clSt
**		tonStabState	*tonSt
**		_buffer2+12:		Word16 exc
**		_buffer2+18:		Word16 &res2[0]
**		_buffer2+20:		Word16 &xn2[0]
**		_buffer2+22:		Word16 &y1[0]
**		_buffer2+2:		Word16 T0
**		_buffer2+3:		Word16 T0_frac
**		_buffer2+4:		Word16 gain_pit
**		_buffer2+6:		Word16 g_coeff[0]
**		_buffer2+24:		Word16 anap
**		_buffer2+5:		Word16 gp_limit		
**
** Return value:
**
** 		AL:
**
** Attribute:   Cycles: 153586       Pm: 69
**
** Modified Registers:  all                           
**                                                                         
** Programmer: Liu Yang
**
** Complete time: 2003 4 
*****************************************************************************

		.global	_cl_ltp
		.ref	_pitch_fr
		.ref	_Pred_lt_3or6
		.ref	_convolve
		.ref	_g_pitch
		.ref	_check_gp_clipping
		.ref	_buffer1
		.ref	_buffer2
		.ref	GP_CLIP				; cnst = 15565
		.ref	gp

		
_cl_ltp:
		
		; Closed-loop fractional pitch search
		
		; To call _pitch_fr, get ready as:
		; AR1:		Word16 T_op[0]
	 	; XAR2:		Word16 &exc[0]
	   	; XAR3:		Word16 &xn[0]
   		; XAR4:	    Word16 &h[0]
	 	; AR5:		Word16 i_subfr
		; XAR6:		Word16 pit_frac
		
		MOV		@AR5,*(0:_buffer1)		; AR5 = frameOffset
		MOV		@AR1,*(0:_buffer1+10)	; AR1 = T_op[0]
		MOVL	XAR2,@_buffer1+12				; XAR2 = exc
		MOVL	XAR3,@_buffer1+14				; XAR3 = &xn[0]
		MOVL	XAR4,@_buffer1+16
		;MOVL	XAR2,@12				; XAR2 = exc
		;MOVL	XAR3,@14				; XAR3 = &xn[0]
		;MOVL	XAR4,@16				; XAR4 = h1
		MOVL	XAR6,#_buffer1+3			; XAR6 = T0_frac
		
		LCR		_pitch_fr				; AL = lag, AR7 = ana_index
		
		MOV		*(0:_buffer1+2),@AL		; T0 = lag
		MOVL	XAR0,@_buffer1+24				; XAR0 = anap 
		MOV		*XAR0++,AR7				; *anap = ana_index, anap++
		MOVL	@_buffer1+24,XAR0				; @_buffer1+24 = anap
		
		MOV		@AR7,*(0:_buffer1+2) 	; AR7 = T0
		MOV		@AR6,*(0:_buffer1+3)	; AR6 = T0_frac
		MOVL	XAR0,@_buffer1+12				; XAR0 = exc 
		
		LCR		_Pred_lt_3or6
		
		MOVL	XAR1,@_buffer1+12				; XAR1 = exc
		MOVL	XAR2,@_buffer1+16				; XAR2 = h1
		MOVL	XAR3,@_buffer1+22				; XAR3 = &y1[0]
		
		LCR		_convolve
		
		MOV		@AR0,#40				; AR0 = L_subfr = 40
		MOVL	XAR1,@_buffer1+14				; XAR1 = &xn[0]
		MOVL	XAR2,@_buffer1+22				; XAR2 = &y1[0]
		MOVL	XAR3,#_buffer1+6			; XAR3 = &g_coeff[0]
		
		LCR		_g_pitch				; AR1 = gain
		
		MOV		*(0:_buffer1+4),@AR1		; gain_pit = gain
		
		; Check if the pitch gain should be limit due to resonance in LPC filter
		
		MOV		AR0,#0					; AR0 = gpc_flag = 0
		MOV		AL,#0x7FFF				; AL = MAX_16 = #0x7FFF
		MOV		*(0:_buffer1+5),@AL		; gp_limit = MAX_16
		MOV		AL,*(0:_buffer1+1)		; AL = lsp_flag
										; if lsp_flag != 0
		SB		B1,EQ
		CMP		@AR1,#GP_CLIP			; and gain_pit > GP_CLIP
		SB		B1,LEQ
		MOV		@AR2,AR1				; AR2 = gain_pit
		MOVL	XAR1,#gp				; XAR1 = #gp
		
		LCR    	_check_gp_clipping		; AR6 = flag
		
		MOV		@AR0,AR6				; AR0 = gpc_flag = flag
		
		; Limit the gain to 0.85 to cope with bit errors in the decoder in a better way
		
B1:		MOV		@AL,*(0:_buffer1+4)		; AL = gain_pit
		CMP		AL,#13926				; if gain_pit > 13926
		SB		B2,LEQ
		MOV		AL,#13926				; AL = #13926
		MOV		*(0:_buffer1+4),@AL		; gain_pit = 13926

B2:		CMP		@AR0,#0					; if gpc_flag != 0
		SB		B3,EQ
		MOV		AL,#GP_CLIP
		MOV		*(0:_buffer1+5),@AL		; gp_limit = GP_CLIP

		; Update target vector und evaluate LTP residual

B3:		MOV		AR0,#39					; AR0 = L_SUBFR - 1
		MOV		@T,*(0:_buffer1+4)		; T = gain_pit
		MOVL	XAR2,@_buffer1+12				; XAR2 = exc
		MOVL	XAR3,@_buffer1+14				; XAR3 = &xn[0]
		MOVL	XAR4,@_buffer1+18				; XAR4 = &res2[0]
		MOVL	XAR5,@_buffer1+20				; XAR5 = &xn2[0]
		MOVL	XAR7,@_buffer1+22				; XAR7 = &y1[0]

L1:		ZAPA
		MPY		P,T,*XAR7++				; P = y1[i] * gain_pit, i++
		ADDL	ACC,P << Pm				; ACC = L_temp = L_mult(y1[i], gain_pit)
		LSL		ACC,#1					; ACC = L_temp = L_shl(L_temp, 1)
		MOV		AR6,*XAR3++				; AR6 = xn[i], i++
		SUB		@AR6,AH					; AR6 = sub(xn[i], extract_h(L_temp)
		MOV		AH,@AR6					; AH = sub(xn[i], extract_h(L_temp)
		MOV		*XAR5++,AH				; xn2[i] = sub(xn[i], extract_h(L_temp)
		
		ZAPA
		MPY		P,T,*XAR2++				; P = exc[i] * gain_pit, i++
		ADDL	ACC,P << Pm				; ACC = L_temp = L_mult(exc[i], gain_pit)
		LSL		ACC,#1					; ACC = L_temp = L_shl(L_temp, 1)
		MOV		AR6,*XAR4				; AR6 = res2[i], i++
		SUB		@AR6,AH					; AR6 = sub(res2[i], extract_h(L_temp)
		MOV		AH,@AR6					; AH = sub(res2[i], extract_h(L_temp)
		MOV		*XAR4++,AH				; xn2[i] = sub(res2[i], extract_h(L_temp)
		
		BANZ	L1,AR0--
		
		LRETR

⌨️ 快捷键说明

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