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

📄 norm_corr.asm

📁 基于TMS320F2812的AMR+RS编解码+OFDM调制解调源程序。是stand alone运行版本
💻 ASM
字号:
***************************************************************************
** Description:     norm_corr() in pitch_fr.c                              
**                                                                         
** Inputs                                                                  
**                                                                         
**	 XAR1:		Word16 &exc[0]    
**   XAR2:		Word16 &h[0]                                               	   
**   XAR4:		Word16 &xn[0]
**   AR5:	    Word16 t_min
**	 AR6: 		Word16 t_max
**	 XAR7:		Word32 &corr_norm[0]
**                                                                         
** Outputs:                                                                
**                                                                         
**   Word16 &corr_norm[0]                                           
**                                                                         
** Return value:
**	
**                                                                         
** Attribute:   Cycles: 45682       Pm: 91                           
**                      
** Modified Registers:  all                           
**                                                                         
** Programmer: Liu Yang
**
** Complete time: 2003 3 30	
*****************************************************************************

		.global		_norm_corr
		.ref		_convolve
		.ref 		_inv_sqrt
		.ref		_mpy_32_v_reg
		.ref		_buffer2
		
_norm_corr:

		; Compute the filtered excitation for the first delay t_min
		
		ADDB	SP,#18
		;BY SKIFF
		MOV		AH,#0
		MOV		AL,@AR5			    ; ACC = AR5 = t_min
		SUBL	@XAR1,ACC			; XAR1 = &exc[-t_min] = &exc[k]
		MOVL	*-SP[2],XAR1		; *-SP[2] = &exc[-t_min]
		MOVL	ACC,XAR2			; ACC = XAR2 = &h
		ADD		ACC,#40				; ACC = &h[L_subfr]
		MOVL	*-SP[4],ACC			; *-SP[4] = &h[L_subfr]
		
		MOVL	XAR3,#_buffer2		; XAR3 = #_buffer2 = &excf[0]
		MOVL	*-SP[6],XAR4		; *-SP[6] = &xn[0]
		MOV		*-SP[14],AR5		; *-SP[14] = t_min
		MOV		*-SP[15],AR6		; *-SP[15] = t_max
		MOVL	*-SP[8],XAR7		; *-SP[8] = &corr_norm[0]
		
		LCR		_convolve
		
		; Scale excf[] to avoid overflow
		
		MOVL	XAR1,#_buffer2+40	; XAR1 = #_buffer2+40 = &scaled_excf[0]
		MOV		AR0,#39				; AR0 = L_subfr - 1: j = 0
L1:		MOV		AL,*XAR3++			; AL = *XAR3 = excf[j]
		ASR		AL,#2				; AL = shr (excf[j],  2)
		MOV		*XAR1++,AL			; *XAR1 = AL = scaled_excf[j] 
		BANZ	L1,AR0--			; if j < L_subfr branch to L1, j++
		
		;Compute 1/sqrt(energy of excf[])
		
		MOVL	XAR3,#_buffer2		; XAR3 = #_buffer2 = &excf[0]
		ZAPA
		NOP
		NOP
		NOP
		RPT		#39					; Repeat L_subfr times
	  ||SQRA	*XAR3++				; ACC = s = L_mac (s, excf[j], excf[j])
	  	ADDL	ACC,P << PM			; Perform final accumulate
	  	
	  	SUB		ACC,#0x0800 << #15	; if s <= 2^26
	  	SB		B1,GT
	  	MOVL	XAR0,#_buffer2
	  	MOVL	*-SP[10],XAR0		; *-SP[10] = &s_excf[0] = &excf[0]
		MOV		*-SP[16],#3			; *-SP[16] = h_fac = 15 - 12
		MOV		*-SP[17],#0			; *-SP[17] = scaling = 0
		SB		B2,UNC
									
B1:		MOVL	XAR0,#_buffer2+40	; else excf[] is divided by 2
		MOVL	*-SP[10],XAR0		; *-SP[10] = &s_excf[0] = &scaled_excf[0]
		MOV		*-SP[16],#1			; *-SP[16] = h_fac = 15 - 12 - 2
		MOV		*-SP[17],#2			; *-SP[17] = scaling = 2

B2:		MOVL	ACC,*-SP[8]			; ACC = *-SP[8] = &corr_norm[0]
		ADD		ACC,*-SP[14]		; ACC = *-SP[8] + *-SP[14] = &corr_norm[t_min]
		MOVL	@XAR5,ACC			; XAR5 = ACC = &corr_norm[t_min]
		MOV		AL,*-SP[15]			; AL = *-SP[15] = t_max
		SUB		AL,*-SP[14]			; AL = t_max - t_min
		MOV		@AR6,AL				; AR6 = t_max - t_min
		MOVL	XAR2,*-SP[2]		; XAR2 = &exc[-t_min]
		
		; Compute 1/sqrt(energy of excf[])

L3:		MOVL	*-SP[12],XAR2		; *-SP[12] = &exc[k]
		MOVL	XAR1,*-SP[10]		; XAR1 = *-SP[10] = &s_excf[0]
		ZAPA
		NOP
		NOP
		NOP
		RPT		#39					; Repeat L_subfr times
	  ||SQRA	*XAR1++				; ACC = s = L_mac (s, s_excf[j], s_excf[j])
	  	ADDL	ACC,P << PM			; Perform final accumulate
	  	
		LCR 	_inv_sqrt			; ACC = s = inv_sqrt (s)
		
		MOV		@AR1,AH				; AR1 = norm_h
		LSR		AL,#1
		MOV		@AR2,AL				; AR2 = norm_l
		
		; Compute correlation between xn[] and excf[]
		
		MOVL	XAR3,*-SP[6]		; XAR3 = *-SP[6] = &xn[0]
		MOVL	XAR7,*-SP[10]		; XAR7 = *-SP[10] = &s_excf[0]
		ZAPA
		rpt     #39
      ||MAC		P,*XAR3++,*XAR7++	; ACC = ACC + P << #1, P = *XAR3++ * *XAR7++
	  								; ACC = s = L_mac (s, xn[j], s_excf[j])
	  	ADDL 	ACC,P << PM			; Perform final accumulate
		MOV		@AR3,AH				; AR3 = corr_h
		LSR		AL,#1
		MOV		@AR4,AL				; AR4 = corr_l

		; Normalize correlaion = correlation * (1/sqrt(energy))
	 
	  	LCR		_mpy_32_v_reg			; ACC = s = Mpy_32 (corr_h, corr_l, norm_h, norm_l)														
		
		MOV		*XAR5++,AL			; *XAR5 = corr_norm[i] = extract_h (L_shl (s, 16)), i++
		
		; Modify the filtered excitation excf[] for the next iteration
		
		CMP		AR6,#0				; if (sub (i, t_max) != 0)
		SB		B3,EQ
				
		MOVL	XAR3,@XAR7			; XAR3 = &s_excf[L_subfr]
		SUBB	XAR3,#1				; XAR3 = &s_excf[L_subfr - 1]
		MOV		AR1,#38				; AR1 = L_subfr - 2
		MOVL	XAR2,*-SP[12]		; XAR2 = &exc[k]
		MOVL	XAR4,*-SP[4]		; XAR4 = &h[L_subfr]
		
		SUBB	XAR2,#1				; k--
L2:		MOV		T,*XAR2			    ; T = exc[k]
		MPY		P,T,*--XAR4			; j--, P = exc[k] * h[j]
		MOVL	ACC,P << PM			; ACC = s = L_mult (exc[k], h[j])
		MOV		T,*-SP[16]			; T = h_fac
		LSLL	ACC,T				; ACC = s = L_shl (s, h_fac)
		MOV		AL,@AH				; ACC = extract_h (s)
		ADD		AL,*--XAR3			; j--, AL = add (extract_h (s), s_excf[j - 1])
		MOV		*--XAR7,AL			; j--, *XAR7 = s_excf[j] = AL
		BANZ	L2,AR1--
																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																																				
		SUBB	XAR7,#1
		MOV		T,*-SP[17]			; T = scaling
		MOV		AL,*XAR2			; AL = exc[k]
		ASR		AL,T				; AL = shr (exc[k], scaling)
		MOV		*XAR7,AL			; *XAR7 = s_excf[0] = AL
		
		BANZ	L3,AR6--
		
B3:		SUBB	SP,#18

		LRETR

⌨️ 快捷键说明

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