www.pudn.com > g729Decoder.rar > Qua_gain.asm
;========================================================================== ; 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-2 */ ; /* , -2 , 2 */ ; 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 STL B, exp SUB #1, A NOP BC Tar1,AGT ABS A,B SUB #31,B NOP BC Com1,BLT LD L_tmp2,B NOP NOP XC 2,BLT LD #-1,B NOP XC 1,BGEQ LD #0,B NOP B End1 Tar1: LD A,B SUB #31,B NOP BC Com1,BLT LD L_tmp2,B NOP NOP BC Lt1,BLT LD #0X7fff,16,B OR #0xFFFF,B B End1 Lt1: LD #0X8000,16,B B End1 Com1: 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 End1: DLD L_tmp1, A LD A, -1, A SUB B, A ; A = L_tmp Next3: EXP A NOP NORM A ; A = nume LDM T, B ADD exp, B ADD exp_inv_denom, B SUB #16+2+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_gain1 ;----------------------------------------------------------------- ; --- Change Q-format of gcode0 ( Q[exp_gcode0] -> Q4 ) --- ;----------------------------------------------------------------- LD exp_gcode0, A SUB #4, A BC Else4, ALT If4: NEG A SFTA A, -1 STL A, shift LD shift, ASM LD gcode0, A XC 1, C LD A, 1, A LD A, ASM, A LD A, ASM, A BD Next4 STL A, gcode0_org NOP Else4: NEG A ADD #16, A SFTA A, -1 STL A, shift LD shift, ASM LD gcode0, A XC 1, C LD A, 1, A LD A, ASM, A LD A, ASM, A STL A,-16, gcode0_org Next4: ;---------------------------------------------- ; - presearch for gain codebook - ;---------------------------------------------- CALL Gbk_presel ;---------------------------------------------- ; - Find the best quantizer - ;---------------------------------------------- LD #0, ASM STM #exp_min+4, AR5 ; pExp_min -> exp_min[4] ; pExp_coeff -> exp_coeff[4] LD *pExp_coeff-, 16, A ; pExp_coeff -> exp_coeff[3] ADD exp_gcode0, 16, A SUB #4, 16, A ST A, *pExp_min- ; pExp_min -> exp_min[3] || LD *pExp_coeff-, A ; pExp_coeff -> exp_coeff[2] ADD exp_gcode0, 16, A SUB #3, 16, A ST A, *pExp_min- ; pExp_min -> exp_min[2] || LD *pExp_coeff-, A ; pExp_coeff -> exp_coeff[1] ADD exp_gcode0, 16, A ADD exp_gcode0, 16, A SUB #21, 16, A ST A, *pExp_min- ; pExp_min -> exp_min[1] || LD *pExp_coeff-, A ; pExp_coeff -> exp_coeff[0] ADD #14, 16, A ST A, *pExp_min- ; pExp_min -> exp_min[0] || LD *pExp_coeff, A ; pExp_coeff -> exp_coeff[0] ADD #13, 16, A STM #4-1, BRC STL A,-16, *pExp_min ; pExp_min -> exp_min[0] RPTBD BLK1_END-1 LD *pExp_min+, A NOP LD *pExp_min+, B MIN A BLK1_END STL A, e_min ; --- align coeff[] --- MAR *pExp_min- ; pExp_min -> exp_min[4] STM #5-1, BRC RPTBD BLK2_END-1 STM #coeff+4*2, AR4 LD e_min, A SUB *pExp_min-, A SFTA A, -1 STL A, shift LD shift, ASM LD *pG_coeff-, 16, A XC 1, C LD A, 1, A LD A, ASM, A LD A, ASM, A STL A,-16,*pCoeff LD *pCoeff+,15,B LD A,-1,A SUB B,A STL A,*pCoeff MAR *+pCoeff(-3) BLK2_END: ; --- Codebook search --- LD #7FFFh, 16, A STM #0FFFFh, AL DST A, L_dist_min LD #Addr_TempFlag, DP CMPM Addr_TempFlag, 1 LD #Addr_local_buf1, DP STM #NCAN1-1, AR1 LD cand1, 1, A ADD #gbk1Q13Q14, A STLM A, AR2 LD cand2, 1, A ADD #gbk2Q14Q13, A STL A, cand2 STLM A, AR3 BCD Else5, NTC STM #g2_pitch, AR5 ; AR5 -> g2_pitch If5: Outter_Loop_Start1: STM #NCAN2-1, BRC RPTB BLK3_END-1 STM #coeff+1, AR4 ADD *pGbk1+, *pGbk2+, A STL A,-16, g_pitch SUB #GP0999, 16, A BC Else6, AGEQ If6: ADD *pGbk1-, *pGbk2+, A LD A,-1,A MPYA gcode0 LD B,-16,B STL B, g_code SQUR g_pitch, A STL A, -16,g2_pitch SQUR g_code, A STL A,-16, g2_code MPY g_pitch, A STL A,-16, g_pit_cod ;MPY32_16 LD #0, B MACSU *pCoeff-, *AR5, B LD B, -16, B LD B, 1,B MAC *AR5+, *pCoeff+0%, B, A ;MPY32_16 LD #0, B MACSU *pCoeff-, *AR5, B LD B, -16, B LD B, 1,B MAC *AR5+, *pCoeff+0%, B ADD B, A ;MPY32_16 LD #0, B MACSU *pCoeff-, *AR5, B LD B, -16, B LD B, 1,B MAC *AR5+, *pCoeff+0%, B ADD B, A ;MPY32_16 LD #0, B MACSU *pCoeff-, *AR5, B LD B, -16, B LD B, 1,B MAC *AR5+, *pCoeff+0%, B ADD B, A ;MPY32_16 LD #0, B MACSU *pCoeff-, *AR5, B LD B, -16, B LD B, 1,B MAC *AR5-, *pCoeff+0%, B ; AR5 -> g_code ADD B, A ; A = L_tmp DLD L_dist_min, B MIN B BCD Next7, C MAR *AR5-0 ; AR5 -> g2_pitch NOP If7: MVMD pGbk1, index1 MVMD pGbk2, index2 Next7: BD Next6 DST B, L_dist_min NOP Else6: MAR *pGbk1- MAR *pGbk2+ Next6: NOP BLK3_END MAR *+pGbk1(2) BANZD Outter_Loop_Start1, *AR1- MVDM cand2, AR3 B Next5 Else5: Outter_Loop_Start2: STM #NCAN2-1, BRC RPTB BLK4_END-1 STM #coeff+1, AR4 ADD *pGbk1+, *pGbk2+, A STL A, -16,g_pitch ADD *pGbk1-, *pGbk2+, A LD A,-1,A MPYA gcode0 LD B,-16,B STL B, g_code SQUR g_pitch, A STL A,-16, g2_pitch SQUR g_code, A STL A,-16, g2_code MPY g_pitch, A STL A,-16, g_pit_cod ;MPY32_16 LD #0, B MACSU *pCoeff-, *AR5, B LD B, -16, B LD B, 1,B MAC *AR5+, *pCoeff+0%, B, A ; AR5 -> g_pitch ;MPY32_16 LD #0, B MACSU *pCoeff-, *AR5, B LD B, -16, B LD B, 1,B MAC *AR5+, *pCoeff+0%, B ; AR5 -> g2_code ADD B, A ;MPY32_16 LD #0, B MACSU *pCoeff-, *AR5, B LD B, -16, B LD B, 1,B MAC *AR5+, *pCoeff+0%, B ; AR5 -> g_code ADD B, A ;MPY32_16 LD #0, B MACSU *pCoeff-, *AR5, B LD B, -16, B LD B, 1,B MAC *AR5+, *pCoeff+0%, B ; AR5 -> g_pit_cod ADD B, A ;MPY32_16 LD #0, B MACSU *pCoeff-, *AR5, B LD B, -16, B LD B, 1,B MAC *AR5-, *pCoeff+0%, B ; AR5 -> g_code ADD B, A ; A = L_tmp DLD L_dist_min, B MIN B BCD Next8, C MAR *AR5-0 ; AR5 -> g2_pitch NOP If8: MVMD pGbk1, index1 MVMD pGbk2, index2 Next8: DST B, L_dist_min BLK4_END MAR *+pGbk1(2) BANZD Outter_Loop_Start2, *AR1- MVDM cand2, AR3 Next5: MVDM index1, AR2 MVDM index2, AR3 MAR *pGbk1+ MAR *pGbk2- ADD *pGbk1-, *pGbk2-, A LD A, -1, A MPYA gcode0 ; B = L_acc LD A, -15, A DST A, L_gbk12 LD #-12-1+1+16, A SUB exp_gcode0, A SFTA A, -1 STL A, shift LD shift, ASM XC 1, C SFTA B, 1 LD B, ASM, B LD B, ASM, B LD #Addr_gain_code, DP STL B,-16, Addr_gain_code ADD *pGbk1, *pGbk2, A LD #Addr_gain_pit, DP STL A, -16,Addr_gain_pit LD #Addr_local_buf1, DP LDM pGbk1, B SUB #gbk1Q13Q14, B LD B, -1, B ADD #map1, B STLM B, AR2 LDM pGbk2, B SUB #gbk2Q14Q13, B LD B, -1, B ADD #map2, B CALLD Gain_update STLM B, AR3 DLD L_gbk12, A MPY *AR2, #NCODE2, A LD A, -1, A ADD *AR3, A RETD STM #L_TOTAL, BK