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

📄 qua_gain.asm

📁 TI C54写的G729代码,视线8kbps高质量语音编码,汇编优化
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;==========================================================================
;  File Name
;  ----------
;  QUA_GAIN.ASM
;
;  Brief Description of the Code:
;  ------------------------------
;  Quantize gain.
;
;  Ref
;  ------
;  QUA_GAIN.C
;==========================================================================
;  Function  Qua_gain
;----------------------------------------------------------------------
;  Word16 Qua_gain(
;     Word16 code[],       /* (i) Q13 :Innovative vector.             */
;     Word16 g_coeff[],    /* (i)     :Correlations <xn y1> -2<y1 y1> */
;                          /*            <y2,y2>, -2<xn,y2>, 2<y1,y2> */
;     Word16 exp_coeff[],  /* (i)     :Q-Format g_coeff[]             */
;     Word16 L_subfr,      /* (i)     :Subframe length.               */
;     Word16 *gain_pit,    /* (o) Q14 :Pitch gain.                    */
;     Word16 *gain_cod,    /* (o) Q1  :Code gain.                     */
;     Word16 tameflag      /* (i)     : set to 1 if taming is needed  */
;  )
;----------------------------------------------------------------------
;  Constants : Addr_cn -> code
;              Addr_g_coeff_cs -> g_coeff
;              Addr_exp_g_coeff_cs -> exp_coeff
;
;              Addr_gain_pit -> gain_pit
;              Addr_gain_code -> gain_cod
;              Addr_TempFlag -> &tameflag
;
;              L_SUBFR = L_subfr
;
;  Pointers :  ptr_prev_qua_eng -> past_qua_en
;
;  Return   :  AL = Qua_Gain
;----------------------------------------------------------------------
;  Modified Registers : AR0, AR1, AR2, AR3, AR4, AR5, BRC, DP
;-----------------------------------------------------------------------
		.mmregs
		.include ..\include\const.h
		.include ..\include\ld8amem.h
		.include ..\include\tab_ld8a.h
		.include ..\include\qua_gain.h

		.text
		.def     Qua_gain
		.ref     Gain_predict
		.ref     Gbk_presel
		.ref     Gain_update

		.asg     "AR2", pG_coeff
		.asg     "AR3", pExp_coeff
		.asg     "AR4", pCoeff
		.asg     "AR5", pExp_min

		.asg     "AR2", pGbk1
		.asg     "AR3", pGbk2

Qua_gain:
	CALL    Gain_predict

	LD      #Addr_local_buf1, DP
	STL     A, gcode0
	STL     B, exp_gcode0

	STM     #0, BK
	STM     #2, AR0
	STM     #Addr_g_coeff_cs, AR2           ; pG_coeff   -> g_coeff[0]
	STM     #Addr_exp_g_coeff_cs, AR3       ; pExp_coeff -> exp_coeff[0]

;-----------------------------------------------------------------
;  tmp = -1./(4.*coeff[0]*coeff[2]-coeff[4]*coeff[4]);
;-----------------------------------------------------------------

	LD      *pG_coeff+0, T          ; pG_coeff -> g_coeff[2]
	MPY     *pG_coeff+0, A          ; pG_coeff -> g_coeff[4], A = L_tmp1
	SQUR    *pG_coeff-0, B          ; pG_coeff -> g_coeff[2], B = L_tmp2
	DST     A, L_tmp1
	DST     B, L_tmp2

	LD      #1-2, A
	ADD     *pExp_coeff+0, A        ; pExp_coeff -> exp_coeff[2]
	ADD     *pExp_coeff+0, A        ; pExp_coeff -> exp_coeff[4], A = exp1
	LD      #1, B
	ADD     *pExp_coeff-0%, 1, B    ; pExp_coeff -> exp_coeff[2], B = exp2

	SUB     B, A                    ; A = exp1 - exp2 , B = exp2
	BC      Else1, ALEQ
If1:
		STL     B, exp

			NEG     A
			BC      Rar0,AGT
            		ABS     A,B
					SUB     #31,B
					BC      Comm0,BLT
							LD      L_tmp1,B
					NOP 
			       	LD  #0,A
            		XC     2,BLT
			    		   LD   #-1,A
			    		   NOP
			B       Endm0		           
Rar0:
            LD      A,B
			SUB     #31,B
			NOP
			BC      Comm0,BLT
			LD      L_tmp1,A
			NOP
NOP
			BC      Ltm0,ALT
			        LD  #0X7fff,16,A
					OR  #0xFFFF,A
					B    Endm0
Ltm0:         
            LD      #0X8000,16,A
			B       Endm0

Comm0:
		SFTA    A, -1
		STL     A, shift
		LD      shift, ASM
		DLD     L_tmp1, A
		XC      1, C
				LD      A, 1
		LD      A, ASM, A
		LD      A, ASM, A

Endm0:
		BD      Next1
		DLD     L_tmp2, B
		SUB     B, A            ; A = L_tmp

Else1:
		ADD     A, B            ; if (A <= 0) B = exp1
		STL     B, exp
            NOP
			BC      Tarm11,AGT
            ABS     A,B
			SUB     #31,B
			NOP
			BC      Comm11,BLT
					LD      L_tmp2,A
			NOP 
	        LD  #0,B
            XC     2,ALT
			       LD   #-1,B
            	   NOP
			B       Endm11		           
Tarm11:
            LD      A,B
			SUB     #31,B
			NOP
			BC      Comm11,BLT
			LD      L_tmp2,B
			NOP
                     NOP
			BC      Lt11,BLT
			        LD  #0X7fff,16,B
					OR  #0xFFFF,B
					B    Endm11
Ltm11:         
            LD      #0X8000,16,B
			B       Endm11

Comm11:
			SFTA    A, -1
			STL     A, shift
			LD      shift, ASM
			DLD     L_tmp2, B
			XC      1, C
					LD      B, 1
			LD      B, ASM, B
			LD      B, ASM, B
Endm11:
		DLD     L_tmp1, A

		SUB     B, A            ; A = L_tmp
Next1:
	EXP     A
	NOP
	LDM     T, B
	NORM    A
	STL     A,-16, inv_denom

	LD      #4000h, 16, A
	RPT     #15-1
		SUBC    inv_denom, A

	NEG     A
	STL     A, inv_denom

	ADD     exp, B
	SUB     #14+15+16, B, A
	NEG     A
	STL     A, exp_inv_denom

;-----------------------------------------------------------------
;  best_gain[0] = (2.*coeff[2]*coeff[1]-coeff[3]*coeff[4])*tmp;
;-----------------------------------------------------------------

	LD      *pG_coeff-, T           ; pG_coeff -> g_coeff[1]
	MPY     *pG_coeff+0, A          ; pG_coeff -> g_coeff[3], A = L_tmp1
	LD      *pG_coeff+, T           ; pG_coeff -> g_coeff[4]
	MPY     *pG_coeff-, B           ; pG_coeff -> g_coeff[3], B = L_tmp2
	DST     A, L_tmp1
	DST     B, L_tmp2

	LD      *pExp_coeff-, A         ; pExp_coeff -> exp_coeff[1]
	ADD     *pExp_coeff+0, A        ; pExp_coeff -> exp_coeff[3], A = exp1
	LD      #1, B
	ADD     *pExp_coeff+, B         ; pExp_coeff -> exp_coeff[4]
	ADD     *pExp_coeff-, B         ; pExp_coeff -> exp_coeff[3], B = exp2

	SUB     B, A                    ; A = exp1 - exp2 , B = exp2
	BC      Else2, ALEQ
If2:
		SUB     #1, B
		STL     B, exp

		ADD     #1, A
		NEG     A
            NOP
			BC      Tar0,AGT
            ABS     A,B
			SUB     #31,B
			NOP
			BC      Com0,BLT
			LD      L_tmp1,B
			NOP 
	        LD  #0,A
            XC     2,BLT
			       LD   #-1,A
            	   NOP
			B       End0		           
Tar0:
            LD      A,B
			SUB     #31,B
			NOP
			BC      Com0,BLT
			LD      L_tmp1,A
			NOP
                     NOP
			BC      Lt0,ALT
			        LD  #0X7fff,16,A
					OR  #0xFFFF,A
					B    End0
Lt0:         
            LD      #0X8000,16,A
			B       End0

Com0:
			SFTA    A, -1
			STL     A, shift
			LD      shift, ASM
			DLD     L_tmp1, A
			XC      1, C
				LD      A, 1, A
			LD      A, ASM, A
			LD      A, ASM, A

End0:
		BD      Next2
		DLD     L_tmp2, B
		SUB     B, -1, A            ; A = L_tmp

Else2:
		ADD     A, B            ; if (A <= 0) B = exp1
		SUB     #1, B
		STL     B, exp

		SUB     #1, A
            NOP
			BC      Tar11,AGT
            ABS     A,B
			SUB     #31,B
			NOP
			BC      Com11,BLT
			LD      L_tmp2,B
			NOP
                     NOP 
            XC     2,BLT
			       LD   #-1,B
				   NOP
            XC     1,BGEQ
			       LD  #0,B
				   NOP
			B       End11		           
Tar11:
            LD      A,B
			SUB     #31,B
			NOP
			BC      Com11,BLT
			LD      L_tmp2,B
			NOP
                     NOP
			BC      Lt11,BLT
			        LD  #0X7fff,16,B
					OR  #0xFFFF,B
					B    End11
Lt11:         
            LD      #0X8000,16,B
			B       End11

Com11:
			SFTA    A, -1
			STL     A, shift
			LD      shift, ASM
			DLD     L_tmp2, B
			XC      1, C
				LD      B, 1, B
			LD      B, ASM, B
			LD      B, ASM, B
End11:
		DLD     L_tmp1, A
		LD      A, -1, A
		SUB     B, A            ; A = L_tmp
Next2:
	EXP     A
	NOP
	NORM    A                       ; A = nume

	LDM     T, B
	ADD     exp, B
	ADD     exp_inv_denom, B
	SUB     #16+9+16-1, B
	NEG     B

		SFTA    B, -1
		STL     B, shift
		LD      shift, ASM
	    MPYA    inv_denom
		XC      1, C
			LD      B, 1, B
		LD      B, ASM, B
		LD      B, ASM, B

	SAT     B
	STL     B,-16,best_gain0

	LD      #Addr_TempFlag, DP
	CMPM    Addr_TempFlag, 1
	LD      #GPCLIP2, 16, A
	SUB     A, B
	LD      #Addr_local_buf1, DP
	MAR     *AR0+                   ; AR0 = 3
	XC      2, TC, C
	STL     A, -16,best_gain0

;-----------------------------------------------------------------
;  best_gain[1] = (2.*coeff[0]*coeff[3]-coeff[1]*coeff[4])*tmp ;
;-----------------------------------------------------------------

	LD      *pG_coeff-0, T          ; pG_coeff -> g_coeff[0]
	MPY     *pG_coeff+, A           ; pG_coeff -> g_coeff[1], A = L_tmp1
	LD      *pG_coeff+0, T          ; pG_coeff -> g_coeff[4]
	MPY     *pG_coeff, B            ; pG_coeff -> g_coeff[4], B = L_tmp2
	DST     A, L_tmp1
	DST     B, L_tmp2

	LD      *pExp_coeff-0, A        ; pExp_coeff -> exp_coeff[0]
	ADD     *pExp_coeff+, A         ; pExp_coeff -> exp_coeff[1], A = exp1
	LD      #1, B
	ADD     *pExp_coeff+0, B        ; pExp_coeff -> exp_coeff[4]
	ADD     *pExp_coeff, B          ; pExp_coeff -> exp_coeff[4], B = exp2

	SUB     B, A                    ; A = exp1 - exp2 , B = exp2
	BC      Else3, ALEQ
If3:
		SUB     #1, B
		STL     B, exp

		ADD     #1, A
		NEG     A
            NOP
			BC      Tar,AGT
            ABS     A,B
			SUB     #31,B
			NOP
			BC      Com,BLT
			LD      L_tmp1,A
			NOP 
                     NOP
            XC     2,ALT
			       LD   #-1,A
            XC     1,AGEQ
			       LD  #0,A
			B       End		           
Tar:
            LD      A,B
			SUB     #31,B
			NOP
			BC      Com,BLT
			LD      L_tmp1,A
			NOP
                     NOP
			BC      Lt,ALT
			        LD  #0X7fff,16,A
					OR  #0xFFFF,A
					B    End
Lt:         
            LD      #0X8000,16,A
			B       End

Com:
			SFTA    A, -1
			STL     A, shift
			LD      shift, ASM
			DLD     L_tmp1, A
			XC      1, C
				    LD      A, 1, A
			LD      A, ASM, A
			LD      A, ASM, A
End:
		BD      Next3
		DLD     L_tmp2, B
		SUB     B, -1, A            ; A = L_tmp

Else3:
		ADD     A, B            ; if (A <= 0) B = exp1
		SUB     #1, B

⌨️ 快捷键说明

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