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

📄 levinson.asm

📁 基于TMS320F2812的AMR+RS编解码+OFDM调制解调源程序。是stand alone运行版本
💻 ASM
字号:
*****************************************************************************
** Description:     levinson()      in levinson.c                          **
**                                                                         **
** Inputs :                                                                **
**   *XAR1---Word16 old_A[M + 1]  :LevinsonState                           **
**   *XAR2---Word16 Rh[]       : Rh[m+1] Vector of autocorrelations (msb)  **
**   *XAR3---Word16 Rl[],      : Rl[m+1] Vector of autocorrelations (lsb)  **
**                                                                         **
** Outputs:                                                                **
**   *XAR4---Word16 A[],       : A[m]    LPC coefficients  (m = 10)        **
**   *XAR5---Word16 rc[]       : rc[4]   First 4 reflection coefficients   **
**																		   **
** Return value :    		AL	                                           **
**                                                                         **
** Attribute    :       Cycles:21272          Pm: 277                      **
**               Modified Registers:XAR0--XAR7							   **
**                      @_buffer1--@_buffer1+17                              **
**                      @_buffer2--@_buffer2+46                              **
**						ACC,P,T											   **
**                                                                         **
** Programmer   :       ZHOU Bei       (ok! MAR 17th,2003)                 **
*****************************************************************************
     .global _levinson
	  
	 .ref _div_32
	 .ref _mpy_32
	 
	 .ref _buffer1
	 .ref _buffer2
	 
	 .ref M
	 
_levinson:

	  	;Save #MAX_32
	  	MOV		@_buffer1+11,#7fffh
	  	MOV		@_buffer1+10,#0ffffh
	  	
	  	;t1 = L_Comp (Rh[1], Rl[1])
	  	ADDB	XAR3,#1
	  	ADDB	XAR2,#1
	  	MOV		ACC,*XAR3<<1           ;AL=Rl[1]<<1
	  	MOV	 	AH,*XAR2               ;AH=Rh
	  	MOVL	@_buffer1+4,ACC         ;Temp save t1
	  	ABS	 	ACC                    ;abs 
	    SUBB	XAR3,#1
	    SUBB	XAR2,#1
	    
	  	;t0=Div_32 (t2, Rh[0], Rl[0])
	  	PUSH	XAR1
	  	PUSH	XAR4
	  	PUSH	XAR2
	  	PUSH	XAR3
	  	PUSH	XAR5
	    PUSH	ACC
	  	MOV	 	AL,*XAR2
	  	MOV	    AR2,AL
	  	MOV	 	AL,*XAR3
	  	MOV	    AR3,AL
	  	POP	    ACC
	  	LCR	 	_div_32                    ;Result save in ACC
	  	POP	    XAR5
	  	POP	 	XAR3
	  	POP	 	XAR2
	  	
	  	
	    ;if (t1 > 0)   t0 = L_negate (t0);   
	  	TBIT	@_buffer1+5,#15
	  	BF	 	_LINE_184,TC
	  		NOT		ACC
	  		ADDB	ACC,#1
_LINE_184:
	
		;L_Extract (t0, &Kh, &Kl)
		;Save Kh to @_buffer1+7
		;Save Kl to @_buffer1+6
		PUSH	ACC
		MOV		@_buffer1+7,AH      ;Save kh in @_buffer1+7
		LSR		AL,#1
		MOV		@_buffer1+6,AL      ;Save kl in @_buffer1+6

	    ;rc[0] = round (t0) 
	    POP		ACC
	    PUSH	ACC
	    ADD 	ACC,#0800H<<4	        ; Round
	    MOVL	@_buffer1+16,XAR5
		MOV 	*XAR5,AH          ; Save MSB to rc[0],xar5++
		POP	    ACC
		
		;t0 = L_shr (t0, 4)
		MOV		AR0,#4
		MOV     T,AR0
        ASRL    ACC,T
        
        
        ;L_Extract (t0, &Ah[1], &Al[1]);     /* A[1] in DPF      */
        ;Save Ah[] to @_buffer2--@_buffer2+10
        ;Save Al[] to @_buffer2+12--@_buffer2+22
        MOVL	XAR7,#_buffer2+1
        MOVL	XAR6,#_buffer2+13
        MOV		*XAR7,AH      ;Save to @_buffer2
		LSR		AL,#1
		MOV		*XAR6,AL   ;Save to @_buffer2+11
		
		;t0 = Mpy_32 (Kh, Kl, Kh, Kl)  /*  k*k  */
		ZAPA
        MOV		T,@_buffer1+7	
        MPYA	P,T,@_buffer1+7  	;P=kh*kh
	    MPYA	P,T,@_buffer1+6    	;ACC=P<<1,P=kh*kl
	    MOVH    AR0,P               ;Get upper 16bit without sign
	    ADD     ACC,AR0<<#2      	;Add to ACC	 
	     
	    ABS		ACC                 ;abs
	    
	    ;t0 = L_sub ((Word32) 0x7fffffffL, t0)
	    SUBL	@_buffer1+10,ACC
	    
	    ;L_Extract (t0, &hi, &lo);
		MOV		AL,@_buffer1+10  
        LSR		AL,#1          	                           
   		MOV		@_buffer1+10,AL 
  		
  	    ;t0 = Mpy_32 (Rh[0], Rl[0], hi, lo)
  	    ZAPA
        MOV		T,@_buffer1+11    	
        MPYA	P,T,*XAR2       	;P=hi*Rh[0]
	    MPYA	P,T,*XAR3++        	;ACC=P<<1,P=hi*Rl[0];xar3++
	    MOVH    AR0,P               ;Get upper 16bit without sign
	    ADD     ACC,AR0<<#1      	;Add to ACC	
	    MOV	    T,@_buffer1+10						
	    MPY	    P,T,*XAR2++          ;P=lo*Rh[0],xar2++
	    MOVH    AR0,P   			;Get upper 16bit without sign
	    ADD     ACC,AR0<<#1	        ;Add to ACC	  
	   
	   
	     ;norm
	    MOVB    XAR0,#0				; Initialize XAR0 to zero
	      RPT     #31				; Repeat next operation 32 times
		||NORM    ACC,XAR0++		; Normalize contents of ACC;Save norm time to AR0
  		MOV		@_buffer1+12,AR0 	;Save alp_exp to _buffer1+12
  		
  		;L_Extract (t0, &alp_h, &alp_l);     /* DPF format    */
 		MOV		@_buffer1+9,AH      ;Save to @_buffer2
		LSR		AL,#1
		MOV		@_buffer1+8,AL
    
		;for (i = 2; i <= M; i++)  (here:1--M-1)
		MOV	    @_buffer1+13,#1  ;Loop time--i
		
_LOOP_214:
	    	
	    	MOVL	XAR7,#_buffer2+1
        	MOVL	XAR6,#_buffer2+13
	    	MOV	    @_buffer1+14,#1  ;Loop time--j 
	    	PUSH	XAR2			;Point to Rh[1]
	    	PUSH	XAR3        	;Point to Rl[1]
	    	MOV		ACC,@_buffer1+13
	    	SUB	    ACC,@_buffer1+14
	    	ADD     AR6,AL          ;Calculate start addr of Ah[i-j]
	    	ADD     AR7,AL 	     	;Calculate start addr of Al[i-j]
	    	MOV  	@_buffer1+4,#0   ;Save result
	    	MOV	    @_buffer1+5,#0
	    	;for (j = 1; j < i; j++)		
_LOOP_219:
				;t0 = L_add (t0, Mpy_32 (Rh[j], Rl[j], Ah[i - j], Al[i - j])		
				LCR		_mpy_32
				INC		@_buffer1+14
				ADDL	@_buffer1+4,ACC
				SUBB	XAR6,#1	   ;Al,Ah--
				SUBB	XAR7,#1
				ADDB	XAR2,#1
				ADDB	XAR3,#1    ;Rh,Rl++
        		MOV		AL,@_buffer1+13		
				CMP	    AL,@_buffer1+14
				;BF		_LOOP_219,HIS,C
				BF		_LOOP_219,GEQ		
		
			MOVL	ACC,@_buffer1+4
			POP		XAR3
			POP		XAR2
		
			;t0 = L_shl (t0, 4)
        	LSL     ACC,#4
        	MOVL	@_buffer1+4,ACC
        
        	;t1 = L_Comp (Rh[i], Rl[i]);
        	PUSH	XAR2
        	PUSH	XAR3
        	MOV	    ACC,@_buffer1+13
        	ADD     AR2,AL         		;Calculate start addr of Ah[i]
	    	ADD     AR3,AL 
	    	MOV		ACC,*XAR3<<1        ;AL=Rl[1]<<1
	  		MOV	 	AH,*XAR2            ;AH=Rh	
       		POP		XAR3
       		POP		XAR2
       		
       		;t0 = L_add (t0, t1);            
        	ADDL	ACC,@_buffer1+4
        	MOVL	@_buffer1+4,ACC
        
        	;t1 = L_abs (t0);
        	ABS		ACC
        
        	;t2 = Div_32 (t1, alp_h, alp_l)
        	PUSH	XAR2
	  		PUSH	XAR3
	  		PUSH	XAR5
	  		PUSH	ACC
	  		MOV	    AL,@_buffer1+9
	  		MOV		AR2,AL
	  		MOV	    AL,@_buffer1+8
	  		MOV		AR3,AL
	  		POP		ACC
	  		LCR	 	_div_32                    ;Result save in ACC
	  		POP	    XAR5
	  		POP	 	XAR3
	  		POP	 	XAR2
	  	
    		;if (t0 > 0)   t2 = L_negate (t2);   
	  		TBIT	@_buffer1+5,#15
	  		BF	 	_LINE_236,TC
	  			NOT		ACC
	  			ADDB	ACC,#1

_LINE_236:
	  		;t2 = L_shl (t2, alp_exp)
	  		MOV		T,@_buffer1+12
	  		LSL		ACC,T
	  	
	  		;L_Extract (t2, &Kh, &Kl)
	  		PUSH	ACC
			MOV		@_buffer1+7,AH      ;Save kh in @_buffer1+7
			LSR		AL,#1
			MOV		@_buffer1+6,AL      ;Save kl in @_buffer1+6
        	
        	;if (sub (i, 5) < 0)		{rc[i - 1] = round (t2)}
        	CMP		@_buffer1+13,#4     		
			;BF	    _LINE_242,HIS,C
			BF	    _LINE_242,GEQ
				
				MOV		AL,@_buffer1+13
				ADD		AR5,AL
				POP		ACC
				PUSH	ACC
				ADD 	ACC,#0800H<<4	        ; Round
				MOV 	*XAR5,AH          ; Save MSB to rc[0],xar5++
				MOVL	XAR5,@_buffer1+16
_LINE_242: 
	    	;if (sub (abs_s (Kh), 32750) > 0)
	    	MOV		AL,@_buffer1+7
	    	ABS		ACC
	    	CMP		AL,#7FEEH
	   	 	BF		_LINE_249,LOS
		    
		        ;for (j = 0; j <= M; j++)	A[j] = st->old_A[j];
        		POP		ACC
        		POP		XAR4
        		POP		XAR1
        		PUSH	XAR1
        		PUSH	XAR4
        		PUSH	ACC
        		MOV		AR0,#M
_LOOP_251:
					MOV		ACC,*XAR1++			;old_A[j]->ACC
					MOV		*XAR4++,ACC
					BANZ	_LOOP_251,AR0--
					
                ;for (j = 0; j < 4; j++)  	rc[j] = 0;
				MOVL	XAR5,@_buffer1+16        ;resume addr of rc[]
				RPT		#4
				||MOV		*XAR5++,#0

_LINE_249: 
			;for (j = 1; j < i; j++)
			MOV	    @_buffer1+14,#1  	;Loop time--j
			
			MOVL	XAR7,#_buffer2+1     ;star addr of Ah,Al
        	MOVL	XAR6,#_buffer2+13  
        	
        	PUSH	XAR2
	    	PUSH	XAR3
	    	PUSH	XAR5
	    	
	    	MOVL	XAR0,#_buffer2+1     ;star addr of Ah,Al
        	MOVL	XAR5,#_buffer2+13  
	    	
        	MOV		ACC,@_buffer1+13
	    	SUB	    ACC,@_buffer1+14
	    	ADD     AR6,AL          ;Calculate start addr of Ah[i-j]
	    	ADD     AR7,AL 	     	;Calculate start addr of Al[i-j] 
	    	
	    
	    	MOVL	XAR2,#_buffer1+7  ;Point to Kh
	    	MOVL	XAR3,#_buffer1+6  ;Point to Kl
	    	MOVL	XAR1,#_buffer2+25 ;Point to Anh[1]
	    	MOVL	XAR4,#_buffer2+37 ;Point to Anl[1] 
_LOOP_269:
            	;t0 = Mpy_32 (Kh, Kl, Ah[i - j], Al[i - j]);
	    		PUSH	XAR4
	    		LCR		_mpy_32
	    		MOVL	@_buffer1+4,ACC
	    		POP		XAR4
	    		
	    		;t0 = L_add(t0, L_Comp(Ah[j], Al[j]))
				MOV		ACC,*XAR5++<<1           ;AL=Al[j]<<1
	  			MOV	 	AH,*XAR0++               ;AH=Al[j],j++
				ADDL	ACC,@_buffer1+4
			
				;L_Extract (t0, &Anh[j], &Anl[j])
 				MOV 	*XAR1++,AH		       	 ;Save MSB to Anh[j]
	    		LSR		AL,#1
	    		MOV     *XAR4++,AL			     ;Save LSB>>1 to Anl[j]
	    	
				INC		@_buffer1+14  ;j++
				SUBB	XAR6,#1	   ;Al,Ah--
				SUBB	XAR7,#1
			
        		MOV		AL,@_buffer1+13		
				CMP	    AL,@_buffer1+14
				;BF		_LOOP_269,HIS,C	
				BF		_LOOP_269,GEQ
				
			POP		XAR5
			POP		XAR3
			POP		XAR2
			POP		ACC
			
         	;t2 = L_shr (t2, 4)
         	MOV		AR0,#4
			MOV     T,AR0
        	ASRL    ACC,T
       
       		;L_Extract (t2, &Anh[i], &Anl[i])
       		MOVL	@_buffer1+4,ACC
       		MOVL	XAR0,#_buffer2+25
       		MOVL	ACC,XAR0
       		ADD 	ACC,@_buffer1+13
       		MOV  	AR0,AL
       		MOV 	AL,@_buffer1+5     ;Save MSB to Anh[i]
	   		MOV		*XAR0,AL
	   		
	   		MOVL	XAR0,#_buffer2+37
       		MOVL	ACC,XAR0
       		ADD 	ACC,@_buffer1+13
       		MOV 	AR0,AL
	   		MOV		AL,@_buffer1+4
   	   		LSR		AL,#1
	   		MOV     *XAR0,AL			 ;Save LSB>>1 to Anl[i]
	   		
	   		;t0 = Mpy_32 (Kh, Kl, Kh, Kl);           
       		ZAPA
        	MOV		T,@_buffer1+7	
        	MPYA	P,T,@_buffer1+7  	;P=kh*kh
	    	MPYA	P,T,@_buffer1+6    	;ACC=P<<1,P=kh*kl
	    	MOVH    AR0,P               ;Get upper 16bit without sign
	    	ADD     ACC,AR0<<#2      	;Add to ACC	 
	     
	   	    ABS		ACC                 ;abs
	    
	    	;t0 = L_sub ((Word32) 0x7fffffffL, t0)
	    	MOV		@_buffer1+11,#7fffh
	  		MOV		@_buffer1+10,#0ffffh
	    	SUBL	@_buffer1+10,ACC
       		
       		;L_Extract (t0, &hi, &lo);
			MOV		AL,@_buffer1+10  
        	LSR		AL,#1          	                           
   			MOV		@_buffer1+10,AL 
       
	       ;t0 = Mpy_32 (alp_h, alp_l, hi, lo);
	       	ZAPA
        	MOV		T,@_buffer1+11    	
        	MPYA	P,T,@_buffer1+9       
	    	MPYA	P,T,@_buffer1+8      ;ACC=P<<1,P=
	    	MOVH    AR0,P               ;Get upper 16bit without sign
	   	 	ADD     ACC,AR0<<#1      	;Add to ACC	
	    	MOV	    T,@_buffer1+10						
	    	MPY	    P,T,@_buffer1+9          ;
	    	MOVH    AR0,P   			;Get upper 16bit without sign
	    	ADD     ACC,AR0<<#1	        ;Add to ACC	  
       		
       		;j = norm_l (t0);   t0 = L_shl (t0, j)
	   		MOVB    XAR0,#0				; Initialize XAR0 to zero
	      	RPT     #31			 		; Repeat next operation 32 times
			||NORM    ACC,XAR0++		; Normalize contents of ACC;Save norm time to AR0
       		
       		;L_Extract (t0, &alp_h, &alp_l)
       		MOV		@_buffer1+9,AH      		
			LSR		AL,#1
			MOV		@_buffer1+8,AL   
       		
       		;alp_exp = add (alp_exp, j);             
       		
       		MOV	    AL,AR0
       		ADD		@_buffer1+12,AL
       		
	        ;for (j = 1; j <= i; j++)
       		MOV	 	AL,@_buffer1+13
       		MOV		AR0,AL
       		MOVL	XAR7,#_buffer2+1     ;star addr of Ah,Al
        	MOVL	XAR6,#_buffer2+13
        	MOVL	XAR1,#_buffer2+25 	;Point to Anh[1]
	    	MOVL	XAR4,#_buffer2+37 	;Point to Anl[1]   
_LOOP_296:
            ;Ah[j] = Anh[j]    Al[j] = Anl[j]
            MOV	    AH,*XAR1++
            MOV		AL,*XAR4++
            MOV		*XAR7++,AH
            MOV		*XAR6++,AL
            BANZ	_LOOP_296,AR0--
            
		;i++<=M,loop
		INC     @_buffer1+13
		CMP	    @_buffer1+13,#M
		BF	    _LOOP_214,LT
		
		;A[0] = 4096
		POP		XAR4
		POP		XAR1
		MOV		*XAR4++,#1000H
		
		;for (i = 1; i <= M; i++)
		MOV		AR0,#M-1
		ADDB	XAR1,#1
		MOVL	XAR7,#_buffer2+1     ;star addr of Ah,Al
        MOVL	XAR6,#_buffer2+13
		
_LOOP_304:
		;t0 = L_Comp (Ah[i], Al[i]);
		MOV		ACC,*XAR6++<<1           ;AL=Rl[1]<<1
	  	MOV	 	AH,*XAR7++               ;AH=Rh
	  	
		;st->old_A[i] = A[i] = round (L_shl (t0, 1))
		LSL		ACC,#1
		ADD 	ACC,#0800H<<4
		MOV		*XAR4++,AH
		MOV		*XAR1++,AH
		BANZ	_LOOP_304,AR0--
		
		MOV		AL,#0
		
		LRETR
		

⌨️ 快捷键说明

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