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

📄 g_pitch.asm

📁 基于TMS320F2812的AMR+RS编解码+OFDM调制解调源程序。是stand alone运行版本
💻 ASM
字号:
***************************************************************************
** Description:     g_pitch() in g_pitch.c                              
**                                                                         
** Inputs                                                                  
**                                                                         
**	 AR0:		L_subfr    
**   XAR1:		Word16 *xn                                               	   
**   XAR2:		Word16 *y1
**   XAR3:	    Word16 *g_coeff
**                                                                         
** Outputs:                                                                
**                                                                         
**   XAR3:      Word16 *g_coeff                                           
**                                                                         
** Return value:
**	
**   AR1:		Word16 gain                                               
**                                                                         
** Attribute:   Cycles: 2153       Pm: 94                           
**                      
** Modified Registers:  all                           
**                                                                         
** Programmer: Liu Yang
**
** Complete time: 2003 3 12		
*****************************************************************************

        .global _g_pitch
        .ref 	_div_s
        .ref 	_buffer3
  
_g_pitch:  
		
		; Compute scaled_y1[] = y1 / 4
		
		MOVL 	XAR4,@XAR2			; XAR4 = XAR2 = *y1
		MOVL	XAR5,#_buffer3+280	; XAR5 = *scaled_y1
		MOV		AH,#0
L1:		MOV		AL,*XAR4++
		ASR		AL,#2
		MOV		*XAR5++,AL
		INC		AH
		CMP		AH,@AR0
		SB		L1,LT
		
		; Compute yy
		
		; Compute s = L_mac (s, y1[i], y1[i]) or s = L_mac (s, scaled_y1[i], scaled_y1[i])
		
		MOVL	XAR4,@XAR2			; XAR4 = XAR2 = *y1
		ZAPA
		SB		_ov1,OV
_ov1:	ADDB	ACC,#1				; Avoid s = 0
		NOP
		NOP
		NOP
		RPT		@AR0				; Repeat L_subfr + 1 times
	  ||SQRA	*XAR4++				; PM = 1, and the last P is ignored
	    SB		B1,OV
	  	MOVB  	XAR4,#0				; XAR4 = 0: initialize for exp_yy
L2:		NORM	ACC,XAR4++          ; Normalize s, AR4 = exp_yy
		SB  	L2,NTC
		ADD		ACC,#0x0800 << #4	; Round 32bit s to 16bit yy
	   	MOV		AR5,AH				; AR5 = yy
	   	SB		B2,UNC
	  	
B1:		MOVL	XAR4,#_buffer3+280	; XAR4 = *scaled_y1
		ZAPA
		ADDB	ACC,#1				; Avoid s = 0
		NOP
		NOP
		NOP
		RPT		@AR0				; Repeat L_subfr + 1 times
	  ||SQRA	*XAR4++				; PM = 1, and the last P is ignored
	  	MOVB  	XAR4,#0				; XAR4 = 0: initialize for exp_yy
L3:		NORM	ACC,XAR4++          ; Normalize s, AR4 = exp_yy
		SB  	L3,NTC
		ADD		ACC,#0x0800 << #4	; Round 32bit s to 16bit yy
	   	MOV		AR5,AH				; AR5 = yy
	   	MOV 	AL,#4				
	   	SUB 	@AR4,AL				; AR4 = exp_yy = exp_yy - 4

		; Compute xy
		
		; Compute s = L_mac(s, xn[i], y1[i]) or L_mac (s, xn[i], scaled_y1[i])

B2:		MOVL	XAR6,@XAR2			; XAR6 = XAR2 = *y1
		MOVL	XAR7,@XAR1			; XAR7 = XAR1 = *xn
		ZAPA
		SB		_ov2,OV
_ov2:	ADDB	ACC,#1				; Avoid s = 0
		MOV		@AR0,#39
loop_1:	MAC		P,*XAR6++,*XAR7++	; PM = 1, and the last P is ignored
		BANZ	loop_1,AR0--
		ADDL 	ACC,P >> Pm			; Perform final accumulate
	   	SB		B3,OV
	  	MOVB  	XAR6,#0				; XAR6 = 0: initialize for exp_xy
L4:		NORM	ACC,XAR6++          ; Normalize s, AR6 = exp_xy
		SB  	L4,NTC
		ADD		ACC,#0x0800 << #4	; Round 32bit s to 16bit xy
	   	MOV		AR1,AH				; AR1 = xy
	   	SB		B4,UNC
	  	
B3:		MOVL	XAR6,#_buffer3		; XAR6 = *scaled_y1
		MOVL 	XAR7,@XAR1			; XAR7 = XAR1 = *xn
		ZAPA
		ADDB	ACC,#1				; Avoid s = 0
		MOV		@AR0,#39
loop_2:	MAC		P,*XAR6++,*XAR7++	; PM = 1, and the last P is ignored
		BANZ	loop_2,AR0--
		ADDL 	ACC,P >> Pm			; Perform final accumulate
	 	MOVB  	XAR6,#0				; XAR6 = 0: initialize for exp_xy
L5:		NORM	ACC,XAR6++          ; Normalize s, AR6 = exp_xy
		SB  	L5,NTC
		ADD		ACC,#0x0800 << #4	; Round 32bit s to 16bit xy
	   	MOV		AR1,AH				; AR1 = xy
	   	MOV 	AL,#2				
	   	SUB 	@AR6,AL				; AR6 = exp_xy = exp_xy - 2
		
		; Compute i = exp_xy - exp_yy
	   	
B4:	   	MOV		AL,@AR6			
	   	SUB		AL,@AR4
	   	MOV		AR0,AL				; AR0 = i
	   	
	   	; Load results into g_coeff[]

		MOV 	*XAR3++,AR5			; XAR3= *g_coeff
		MOV		AL,#15
		SUB		AL,@AR4
		MOV		*XAR3++,AL
		MOV		*XAR3++,AR1
		MOV		AL,#15
		SUB		AL,@AR6
		MOV		*XAR3,AL
		
		; If (xy < 4) gain = 0
		
		CMP		AR1,#4
		SB		B5,GEQ
		MOV		AR1,#0
		
		LRETR
		
		; Compute gain = xy / yy
		
B5:		MOV 	AL,@AR1				; Be sure xy < yy
		ASR		AL,#1				
		MOV		@AR1,AL				; AR1 = xy = shr (xy, 1)
		MOV		@AR2,AR5			; AR2 = AR5 = yy
		
		LCR		_div_s				; AL = gain = xy / yy
				
		MOV		AH,@AR0				; if (i >= 0) SB B6
		SB		B6,GEQ				
		NEG		AH					; i = -i
		MOV		@AR0,AH				; AR0 = i
		DEC		@AR0				; AR0 = i - 1
		
		; AL = gain = lsl (gain, i)

_loop:
		LSL		AL,#1
		SB		_overflow,LT
		BANZ	_loop,AR0--
		SB		B7,UNC

_overflow:
		MOV		AL,#0x7FFF
		SB		B7,UNC

B6:		MOV		T,@AR0				
		ASR		AL,T				; AL = gain = shr (gain, i)
		
B7:		CMP		AL,#19661			; If (gain > 1.2) gain = 1.2
		SB		B8,LEQ
		MOV		AR1,#19661
		
		LRETR
		
B8:		MOV		@AR1,AL				; AR1 = gain

       	LRETR

⌨️ 快捷键说明

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