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

📄 pitch_ol.asm

📁 基于TMS320F2812的AMR+RS编解码+OFDM调制解调源程序。是stand alone运行版本
💻 ASM
字号:
***************************************************************************
** Description:     pitch_ol() in pitch_ol.c                              
**                                                                         
** Inputs                                                                  
**                                                                         
**	 XAR1:		Word16 &signal
**                                                                   
** Outputs:                                                                
**                                                                         
** Return value:
**	
**   AL:		Word16 p_max1                                         
**                                                                         
** Attribute:   Cycles: 377726      Pm: 78                           
**                      
** Modified Registers:  all                           
**                                                                         
** Programmer:  Liu Yang
**
** Complete time: 2003 3 21 	
*****************************************************************************

		.global _pitch_ol
		.ref	_buffer1
		.ref	_buffer3
		.ref	_lag_max
		.ref	_comp_corr
		
_pitch_ol:
		
		MOVL	ACC,@XAR1			; ACC = XAR1 = &signal
		SUBB	ACC,#143			; ACC = &signal[-pit_max]
		MOVL	@XAR1,ACC			; XAR1 = &signal[-pit_max]
		MOVL	@XAR2,ACC			; XAR2 = &signal[-pit_max]
		MOV		@AR0,#302			; AR0 = L_frame + pit_max - 1
		ZAPA
		RPT		AR0					; Repeat L_frame + pit_max times
	  ||SQRA	*XAR1++				; PM = 1, ACC = t0 = L_mac (t0, signal[i], signal[i]);
		ADDL	ACC,P << PM	    	; Perform final accumulate, ACC = t0
		MOVL	@XAR1,ACC			; XAR1 = ACC = t0
		
		; Scaling of input signal
		
		MOVL	XAR3,#_buffer3		; Allocate scal_sig[]: &scal_sig = #_buffer3 + pit_max
									; XAR3 = &scal_sig[-pit_max]
		MOV		AH,#0x7FFF			; ACC = MAX_32
		MOV		AL,#0xFFFF
		CMPL	ACC,@XAR1			; if t0 = MAX_32
		SB		B1,GT
L1:		MOV		AL,*XAR2++			; AL = *XAR1 = signal[i]
		ASR		AL,#3				; AL = shr (signal[i], 3)
		MOV		*XAR3++,AL			; *XAR3 = AL = shr (signal[i], 3)
		BANZ	L1,AR0--			; if AR0 != 0, loop and AR0--
		SB		B2,UNC				; else SB B2
	
B1:		MOV		AH,#0x0010			; ACC = 2^20
		MOV		AL,#0x0000
		CMPL	ACC,@XAR1			; else if t0 < 2^20
		SB		B3,LT
L2:		MOV		AL,*XAR2++			; AL = *XAR1 = signal[i]
		LSL		AL,#3				; AL = shl (signal[i], 3)
		MOV		*XAR3++,AL			; *XAR3 = AL = shl (signal[i], 3)
		BANZ	L2,AR0--			; if AR0 != 0, loop and AR0--
		SB		B2,UNC				; else SB B2
		
B3:     							; else 
L3:		MOV		AL,*XAR2++			; AL = *XAR1 = signal[i]
		MOV		*XAR3++,AL			; *XAR3 = AL = shl (signal[i], 3)
		BANZ	L3,AR0--			; if AR0 != 0, loop and AR0--

		; Calculate all coreelations of scal_sig, from pit_min to pit_max

B2:		MOVL	XAR3,#_buffer3+700	; Allocate corr[]: &corr = #_buffer3+700
		MOV		ACC,#286			; ACC = 2 * pit_max
		ADDL	@XAR3,ACC			; XAR3 = &corr[pit_max]
		MOV		@AR0,#143			; AR0 = pit_max
		MOV		@AR1,#160			; AR1 = L_frame
		MOVL	XAR2,#_buffer3+143	; XAR2 = &scal_sig
		MOV		@AR4,#20			; AR4 = pit_min
		LCR		_comp_corr			
		
		MOVL	XAR1,#_buffer3+700+286	; XAR1 = &corr[pit_max]
		MOVL	XAR2,#_buffer3+143	; XAR2 = &scal_sig
		MOV		@AR3,#143			; AR3 = pit_max
		MOV		@AR4,#80				; AR4 = 4 * pit_min
		MOVL	XAR5,#_buffer1		; XAR5 = &max1 = #_buffer1
		
		LCR		_lag_max
		
		PUSH	AL					; PUSH AL = p_max1
		MOV		@AR3,#79				; AR3 = 4 * pit_min - 1		
		MOV		@AR4,#40				; AR4 = 2 * pit_min
		ADDB	XAR5,#1				; XAR5 = &max2 = #_buffer1 + 1
		
		LCR 	_lag_max
		
		PUSH	AL					; PUSH AL = p_max2
		MOV		@AR3,#39				; AR3 = 2 * pit_min - 1		
		MOV		@AR4,#20			    ; AR4 = pit_min
		ADDB	XAR5,#1				; XAR5 = &max2 = #_buffer1 + 2
		
		LCR 	_lag_max
		
		MOV		@AR3,AL				; AR3 = AL = p_max3
		POP		AR2					; AR2 = p_max2
		POP		AR1					; AR1 = p_max1
		MOV		@AR4,*(0:_buffer1)	; AR4 = max1
		MOV		@AR5,*(0:_buffer1+1)	; AR5 = max2
		MOV		@AR6,*(0:_buffer1+2)	; AR6 = max3
		MOV		T,#27853			; T = THRESHOLD = 27853
		MPY		P,T,AR4				; P = max1 * THRESHOLD
		MOVH	AR0,P				; AR0 = PH << 1: Get upper 16 bits
		MOV		ACC,@AR0    		; AL = mult (max1, THRESHOLD) = 2 * max1 * THRESHOLD
		CMP		AL,@AR5				; if mult (max1, THRESHOLD) < max2
		SB		B4,GEQ  
		MOV		@AR1,AR2
		MOV		@AR4,AR5

B4:		MPY		P,T,AR4				; P = max1 * THRESHOLD
		MOVH	AR0,P				; AR0 = PH << 1: Get upper 16 bits
		MOV		ACC,@AR0			; AL = mult (max1, THRESHOLD) = 2 * max1 * THRESHOLD
		CMP		AL,@AR6				; if mult (max1, THRESHOLD) < max3
		SB		B5,GEQ  
		MOV		@AR1,AR3

B5:		MOV		AL,@AR1				

		LRETR

⌨️ 快捷键说明

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