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

📄 pitch_fr.asm

📁 基于TMS320F2812的AMR+RS编解码+OFDM调制解调源程序。是stand alone运行版本
💻 ASM
字号:
*****************************************************************************
** Description:     pitch_fr() in pitch_fr.c
**
** Inputs
**
**   	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
**
** Outputs:
**
**   	Pitch_frStare *st
**		XAR6:	    Word16 *pit_frac
**		AR7:		Word16 ana_index
**
** Return value:
**
** 		AL:			Word15 lag
**
** Attribute:   Cycles: 46424       Pm: 140
**
** Modified Registers:  all                           
**                                                                         
** Programmer: Liu Yang
**
** Complete time: 2003 4 7
*****************************************************************************

		.global		_pitch_fr
		.ref		_norm_corr
		.ref		_searchfrac
		.ref		_getrange
		.ref		_enc_lag3
		.ref		_buffer1
		.ref		_buffer3
		.ref		T0_prev_subframe
		.ref		L_INTER_SRCH		; cnst 4
		
_pitch_fr:

		ADDB		SP,#16
		
		MOVL		*-SP[2],XAR2		; *-SP[2] = &exc[0]
		MOVL		*-SP[4],XAR3		; *-SP[4] = &xn[0]
		MOVL		*-SP[6],XAR4		; *-SP[6] = &h[0]
		MOVL		*-SP[8],XAR6		; *-SP[8] = *pit_frac
						
		; Decide upon full or differential search
		
		MOV			*-SP[10],#1			; *-SP[10] = delta_search = 1
		
		; subframe 1
		
		CMP			@AR5,#0				; if i_subfr == 0
		SB			B1,NEQ
		MOV			*-SP[10],#0			; *-SP[10] = delta_search = 0
										; AR1 = T_op[0]
		MOV			@AR2,#5				; AR2 = delta_int_low = 5
		MOV			@AR3,#10			; AR3 = delta_int_range = 10
		
		LCR			_getrange
		
		SB			B2,UNC
		
		; subframe 2 3 and 4

B1:		MOVL		XAR0,#T0_prev_subframe	; XAR0 = #T0_prev_subframe
		MOV			AL,*XAR0			; AL = T0_prev_subframe
		MOV			AR1,AL				; AR1 = T0_prev_subframe
		MOV			AR2,#5				; AR2 = delta_frc_low = 5
		MOV			AR3,#9				; AR3 = delta_frc_range = 9
		
		LCR			_getrange			; AR1 = t0_min, AR2 = t0_max
		
		; Find interval to compute normalized correlation

B2:		MOV			*-SP[11],AR1		; *-SP[11] = t0_min
		MOV			*-SP[12],AR2		; *-SP[12] = t0_max
		MOV			AL,#L_INTER_SRCH	; AL = L_INTER_SRCH = 4
		SUB			@AR1,AL				; AR1 = t_min = t0_min - L_INTER_SRCH
		ADD			@AR2,AL				; AR2 = t_max = t0_max + L_INTER_SRCH
		MOV			@AR5,AR1			; AR5 = t_min
		MOV			@AR6,AR2			; AR6 = t_max
		MOVL		XAR1,*-SP[2]		; XAR1 = &exc[0]
		MOVL		XAR2,*-SP[6]		; XAR2 = &h[0]
		MOVL		XAR4,*-SP[4]		; XAR4 = &xn[0]
		MOVL		XAR7,#_buffer3+32	; XAR7 = #_buffer3+32 = &corr[0] = &corr_v[-t_min]
		
		; Compute normalized correlation between target and filtered excitation
		
		LCR			_norm_corr			; #_buffer3+32 = &corr[0]
		
		; Find integer pitch
		
		MOVL		XAR5,#_buffer3+32	; XAR5 = #_buffer3+32 = &corr[0]
		MOV			AR6,*-SP[11] 		; AR6 = lag = t0_min
		MOV			@AR0,AR6			; AR0 = t0_min
		MOV			AL,*+XAR5[AR0]		; AL = max = corr[t0_min]
		INC			AR0					; AR0 = i = t0_min + 1
		MOV			AR7,*-SP[12] 		; AR7 = t0_max
		INC			AR7					; AR7 = t0_max + 1
L1:		CMP			AL,*+XAR5[AR0] 		; if max <= corr[i]
		SB			B3,GT
		MOV			AL,*+XAR5[AR0]		; AL = max = corr[i]
		MOV			@AR6,AR0			; AR6 = lag = i
		
B3:		INC			AR0					; i++
		BAR			L1,AR0,AR7,NEQ		; if i <= t0_max loop
		
		MOV			*-SP[13],AR6		; *-SP[13] = lag
		
		; Find fractional pitch
		
		MOVL		XAR4,#_buffer3+32	; XAR4 = &corr[0]
		MOV			AL,*-SP[10]			; AL = delta_search
										; if delta_search == 0
		SB			B4,NEQ				; 
		CMP			@AR6,#84			; and if lag > max_frac_lag = 84
		SB			B4,LEQ
		MOV			*-SP[14],#0			; *-SP[14] = frac = 0
		MOV			AL,@AR6				; AL = lag
		MOV			@AR1,AL				; AR1 = lag
		MOV			AR2,#0				; AR2 = frac = 0
		SB			B11,UNC
		
B4:		CMP			AL,#0				; else if delta_search != 0
		SB			B5,EQ
		MOVL		XAR0,#T0_prev_subframe	; XAR0 = #T0_prev_subframe
		MOV			AR6,*XAR0		 	; AR6 = tmp_lag = T0_prev_subframe
		MOV			AL,@AR6				; AL = tmp_lag
		MOV			AR7,*-SP[11]		; AR7 = t0_min
		SUB			AL,@AR7				; AL = tmp_lag - t0_min
		CMP			AL,#5				; if tmp_lag - t0_min > 5
		SB			B6,LEQ
		MOV			AL,@AR7				; AL = t0_min
		ADD			AL,#5				; AL = tmp_lag = t0_min + 5
		MOV			@AR6,AL				; AR6 = tmp_lag

B6:		MOV			AR7,*-SP[12]		; AR7 = t0_max
		MOV			AL,@AR7				; AL = t0_max
		SUB			AL,@AR6				; AL = t0_max - tmp_lag
		MOV			AH,*-SP[13]			; AH = lag
		CMP			AL,#4				; if t0_max - tmp_lag > 4
		SB			B7,LEQ
		MOV			AL,@AR7				; AL = t0_max
		SUB			AL,#4				; AL = tmp_lag = t0_max - 4
		MOV			@AR6,AL				; AR6 = tmp_lag
			
B7:		CMP			AH,@AR6				; if lag == tmp_lag 
		SB			B8,EQ
		MOV			AL,@AR6				; AL = tmp_lag
		DEC			AL					; AL = tmp_lag - 1
		CMP			AH,@AL				; if lag == tmp_lag - 1
		SB			B9,NEQ		
B8:		MOV			@AR1,AH				; AR1 = lag
		MOV			AR2,#-2				; AR2 = frac = -2
		MOV			AR3,#2				; AR3 = last_frac = 2
		
		LCR			_searchfrac			; AR1 = lag, AR2 = frac
		
		SB			B11,UNC
		
B9:	 	MOV			AL,@AR6				; AL = tmp_lag
		SUB			AL,#2				; AL = tmp_lag - 2
		CMP			AH,@AL				; else if lag == tmp_lag - 2
		SB			B10,NEQ
		MOV			@AR1,AH				; AR1 = lag
		MOV			AR2,#0				; AR2 = frac = 0
		MOV			AR3,#2				; AR3 = last_frac = 2
		
		LCR			_searchfrac			; AR1 = lag, AR2 = frac
		
		SB			B11,UNC
		
B10: 	MOV			AL,@AR6				; AL = tmp_lag
		INC			@AL					; AL = tmp_lag + 1
		CMP 		AH,@AL				; else if lag == tmp_lag + 1
		SB			B12,NEQ
		MOV			@AR1,AH				; AR1 = lag
		MOV			AR2,#-2				; AR2 = frac = -2
		MOV			AR3,#0				; AR3 = last_frac = 0
		
		LCR    		_searchfrac			; AR1 = lag, AR2 = frac

		SB			B11,UNC
		
		; No fractional search
		
B12:	MOV			@AR1,AH				; AR1 = lag
		MOV			AR2,#0				; AR2 = frac = 0
		SB			B11,UNC

B5:		MOV			AL,*-SP[13]			; AL = lag
		MOV			@AR1,AL				; AR1 = lag
		MOV			AR2,#-2				; AR2 = frac = first_frac = -2
		MOV			AR3,#2				; AR3 = last_frac = 2
				
		LCR 		_searchfrac			; AR1 = lag, AR2 = frac
		
		; Encode pitch

B11:	MOV			*-SP[13],AR1		; *-SP[13] = lag
		MOV			*-SP[14],AR2		; *-SP[14] = frac
		MOV			AL,@AR1				; AL = lag
		MOV			@AR0,AL				; AR0 = lag
		MOV			AL,@AR2				; AL = frac
		MOV			@AR1,AL				; AR1 = frac
		MOVL		XAR7,#T0_prev_subframe	; XAR7 = #T0_prev_subframe
		MOV	   		AL,*XAR7			; AL = T0_prev_subframe
		MOV			@AR2,AL				; AR2 = T0_prev_subframe
		MOV			AL,*-SP[11]			; AL = t0_min
		MOV			@AR3,AL				; AR3 = t0_min
		MOV			AL,*-SP[12] 		; AL = t0_max
		MOV			@AR4,AL				; AR4 = t0_max
		MOV			AL,*-SP[10]			; AL = delta_search
		MOV			@AR5,AL				; AR5 = delta_search
		
		; Encode with 1/3 subsample resolution
		
		LCR			_enc_lag3			; AR7 = ana_index
		
		; Update state variables
		
		MOVL		XAR0,#T0_prev_subframe	; XAR0 = #T0_prev_subframe
		MOV			AL,*-SP[13]			; AL = lag
		MOV			*XAR0,AL			; T0_prev_subframe = lag	
		
		; Update output variables
		
		MOVL		XAR6,*-SP[8]		; XAR0 = *pit_frac
		MOV			AL,*-SP[14]			; AL = frac
		MOV			*XAR6,AL			; *pit_frac = frac
		MOV			AL,*-SP[13]			; AL = lag
		
		SUBB		SP,#16
		
		LRETR

⌨️ 快捷键说明

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