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

📄 lag_max.asm

📁 基于TMS320F2812的AMR+RS编解码+OFDM调制解调源程序。是stand alone运行版本
💻 ASM
字号:
***************************************************************************
** Description:     lag_max() in pitch_ol.c                              
**                                                                         
** Inputs                                                                  
**                                                                         
**	 XAR1:		Word32 &corr[0]	      /* i   : correlation vector.                     */
**   XAR2:		Word16 &scal_sig[0]	  /* i   : scaled signal.                          */    
**   AR3:		Word16 lag_max	      /* i   : maximum lag                             */
**   AR4:		Word16 lag_min	      /* i   : minimum lag                             */
**   XAR5:		Word16 &cor_max		  /* i,o : normalized correlation of selected lag  */
**                                                                         
** Outputs:                                                                
**                                                                         
**   XAR5:		Word16 &cor_max	                                          
**                                                                         
** Return value:
**	
**   AL:		Word16 p_max                                           
**                                                                         
** Attribute:   Cycles: depend on lag_max & lag_min        Pm: 45                           
**                      
** Modified Registers:  all                           
**                                                                         
** Programmer:  Liu Yang
**
** Complete time: 2003 3 18		
*****************************************************************************

		.global _lag_max
		.ref	_inv_sqrt
		
_lag_max:

		; Compute max and p_max
		
		MOV     AH,#0x8000			; XAR7 = max = MIN_32
		MOVB	AL,#0
		MOVL	@XAR7,ACC
		
		CLRC	TC
		MOVL	ACC,@XAR1			; ACC = XAR1 = &corr[0]
		SUB		ACC,@AR3 << #1		; ACC = *corr[-i], i = lag_max
		MOVL	@XAR0,ACC			; XAR0 = *corr[-i]
L1:		MOVL	ACC,*XAR0	
		CMPL	ACC,XAR7			; if corr[-i] - max >= 0
		SB		B1,LT					
		MOVL	XAR7,*XAR0			; XAR7 = max = corr[-i]
		MOV		@AR6,AR3			; AR6 = p_max = i
B1:		ADDB	XAR0,#2				; i = i - 1
		DEC		AR3
		MOV		AL,@AR3
		CMP		AL,@AR4				; if AR3 = i >= AR4 = lag_min
		SB 		L1,GEQ				; SB L1
		
		; Compute energy
		
		MOVL	ACC,@XAR2		    ; ACC = &scal_sig[0]
		SUB 	ACC,@AR6 << #0		; ACC = p = &scal_sig[-p_max]
		MOVL	@XAR4,ACC			; XAR4 = p
		ZAPA
		RPT		#159			    ; Repeat L_frame times
	  ||SQRA	*XAR4++				; PM = 1, ACC = t0 = L_mac (t0, *p, *p);
	  	ADDL	ACC,P << PM	        ; Perform final accumulate, ACC = t0
	  	
	  	; 1/sqrt(energy) 
	  	
	  	LCR		_inv_sqrt			; ACC = t0 = inv_sqrt (t0)
	  	
		; max = max/sqrt(energy)
	    
		MOV		@AR0,AH				; AR0 = ener_h
		LSR		AL,#1
		MOV		@AR3,AL				; AR3 = ener_l
		
		MOVL	ACC,@XAR7			; ACC = max
		MOV		T,@AH				; T = max_h
		LSR		AL,#1
		MOV		@AR4,AL				; AR4 = max_l
		
		; ACC = t0 = mpy_32 (max_h,max_l,ener_h,ener_l)
		
		ZAPA
		MPY    	P,T,@AR0	  		; P = max_h * ener_h
	    MPYA    P,T,@AR3	    	; ACC = P, P = max_h * ener_l
	    MOVH    AR3,P               ; AR4 = PH: get upper 16 bits 
	    ADD     ACC,AR3 << #1      	; Perform accumulate	 
	    MOV	    T,@AR4				; T = max_l		
	    MPY	    P,T,@AR0	        ; P = max_l * ener_h
	    MOVH    AR4,P   			; AR4 = PH: get upper 16 bits 
	    ADD     ACC,AR4 << #1	    ; Perform final accumulate
									; ACC = t0		
		MOV		*XAR5,AL			; &cor_max = extract_l(t0)
		MOV 	AL,@AR6				; AL = AR6 = p_max
		
		LRETR

⌨️ 快捷键说明

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