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

📄 autocorr.asm

📁 基于TMS320F2812的AMR+RS编解码+OFDM调制解调源程序。是stand alone运行版本
💻 ASM
字号:
*****************************************************************************
** Description:     Autocorr()      in autocorr.c                          **
**                                                                         **
** Inputs :                                                                **
**     AR1---Word16 m               : LPC order                            **
**   *XAR2---XWord16 x[],           : Input signal (L_WINDOW)              **
**   *XAR3---CONST Word16 wind[]    : window for LPC analysis (L_WINDOW)   **
**                                                                         **
** Outputs:                                                                **
**   *XAR4---Word16 r_h[]	    :Autocorrelations  (msb)                   **
**   *XAR5---Word16 r_l[]	    :Autocorrelations  (lsb)                   **
**																		   **
** Return value :       AL      : Word16 Autocorr                          **
**                                                                         **
** Attribute    :       Cycles:13021         Pm: 59                        **
**               Modified Registers:AR0,AR1,XAR2,XAR3,XAR4,XAR5,XAR6,XAR7  **
**                                ACC,T,P								   **
**                                @buffer1--@buffer1+3                     **
**                                @buffer3                                         **
** Programmer   :       ZHOU Bei     (OK,MAR 10th,2003)                    **
*****************************************************************************
	 .global _autocorr
	  
	 .ref L_WINDOW

	 .ref _buffer1
	 .ref _buffer3
	
	 
_autocorr:	
		MOV	  	AR0,#L_WINDOW-1		   	; Set loop time
		MOV     @_buffer1+3,#7FFFh       ; Get MAX_32
		MOV		@_buffer1+2,#0FFFFh
		;PUSH  	XAR2                    ; Temp save start addr of x[]
     	PUSH	XAR4
     	MOVL	XAR4,#_buffer3
_LOOP_67:
			MOV	   T,*XAR3++            ; T=x[i]
			MPY	   ACC,T,*XAR2++        ; ACC=x[i]*wind[i]
			ADD	   ACC,#4000H           ; Adjust num in ACC
			LSL	   ACC,#1
			MOV	   *XAR4++,AH   	    ; Save hige 16bit without sign to y[i]
			BANZ    _LOOP_67,AR0--      ; Loop if AR0!=0
		
		POP		XAR4
		;POP		XAR2            ; Resume start addr of x[] (y[])     
		MOVL	XAR2,#_buffer3
		MOV		@_buffer1,#0     ; overfl_shft=0
		
_LOOP_76:
			ZAPA                ; Clear ACC,P
			PUSH	XAR2		; Temp save start addr of y[]
			SETC    OVM,SXM
;			movl    xar7, xar2
;			mov     ar6, #L_WINDOW-1
;a:			mac     p,*xar2++,*xar7++
;			banz    a, ar6--
			RPT    #L_WINDOW-1	; Repeat SQRA L_WINDOW times
			||SQRA   *XAR2++	; ACC = ACC + P<<1  ; P = (*XAR2++)^2
   			ADDL   ACC,P << PM	; Perform final accumulate	

 			POP	   XAR2                 ; Resume start addr of y[]
  			CMPL   ACC,@_buffer1+2 		; Compare ACC with MAX_32   		
			SBF	   _LINE_102,NEQ        ; Not EQ,to _LINE_102 
									    ; EQ,continue
			ADD	   @_buffer1,#4          ; overfl_shft+4
			PUSH	XAR2                ; Temp save start addr of y[]
			MOV	  	AR0,#L_WINDOW-1		; Set loop time
_LOOP_93:
				MOV	 ACC,*XAR2			; y[i]=y[i]>>2
				ASR  AL,#2
				MOV	 *XAR2++,ACC       
				BANZ    _LOOP_93,AR0--   
			POP	    XAR2                ; Resume start addr of y[]
			SB		_LOOP_76,UNC        ; Jump to _LOOP_76
					
_LINE_102:
		ADDB	ACC,#1			; To avoid all bit is zero
        MOVB    XAR3,#0			; Initialize XAR3 to zero
   	    nop
   	    RPT     #31				; Repeat next operation 32 times
		||NORM    ACC,XAR3++	; Normalize contents of ACC;Save norm time to AR3
		 
		MOV 	*XAR4++,AH		; Save MSB to r_h[0]
	    LSR		AL,#1
	    MOV     *XAR5++,AL		; Save LSB>>1 to r_l[0]
		
		MOVB	XAR6,#0			; 0->AR6 for loop (m times)
	   
_LOOP_112:	    
	    	MOV	    ACC,#L_WINDOW-1
	    	INC	    AR6					
	    	SUB	    ACC,AR6
	    	MOV	    AR0,AL     	;RPT times=#L_WINDOW-AR6
	    	PUSH	XAR2
	    		    	
	    	MOVL   ACC,XAR2    	;Save start addr y[AR6] to XAR7
	    	ADD	   ACC,AR6    
	    	MOVL   XAR7,ACC
	    
	    	ZAPA
	    	NOP
	    	NOP
	    	
	     	rpt		ar0
	  		||mac     p,*xar2++,*xar7++
	     	
	   	        
	    	ADDL 	ACC,P<<PM         	; Perform final accumulate
	   		POP		XAR2 
	    
	    	MOV	    T,AR3       	    ; Norm times to T
	    	LSLL    ACC,T           	; ACC<<T
	   		MOV 	*XAR4++,AH			; Save MSB to r_h[i]
	    	LSR		AL,#1
	    	MOV     *XAR5++,AL			; Save LSB>>1 to r_l[i]
	    	
	    	BAR    _LOOP_112,AR1,AR6,NEQ;Loop for m times
	     
	     MOV	ACC,AR3			; norm=norm-overfl_shft
	     SUB	ACC,@_buffer1
	     

	     LRETR
		

⌨️ 快捷键说明

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