www.pudn.com > g729Decoder.rar > QUA_LSP.asm


;========================================================================== 
;  File Name 
;  ---------- 
;  QUA_LSP.ASM 
; 
;  Brief Description of the Code: 
;  ------------------------------ 
;  Quantize LSP coefficients. 
; 
;  Ref 
;  ------ 
;  QUA_LSP.C, LSPGETQ.C, LPCFUNC.C 
;========================================================================== 
        .mmregs 
 
        .include  ../include/const.h 
        .include  ../include/tab_ld8a.h 
        .include  ../include/ld8amem.h 
 
        .text 
        .def    QUA_LSP 
        .def    Get_wegt 
 
        .ref    Lsp_prev_extract     ; lsp_extr.asm 
        .ref    Lsp_select_L1        ; lsp_sel.asm 
        .ref    Lsp_select_L2L3      ; lsp_sel.asm 
        .ref    Lsp_expand_1_2       ; lsp_expn.asm 
        .ref    Lsp_get_tdist        ; lsp_dist.asm 
 
        .ref    Lsp_prev_compose     ; lsp_comp.asm 
        .ref    Lsp_prev_update      ; lsp_updt.asm 
        .ref    Lsp_stability        ; lsp_stb.asm 
 
        .ref    Lsp_Lsf2             ; lsp_lsf.asm 
        .ref    Lsf_Lsp2             ; lsp_lsf.asm 
 
 
;----------------------------------------------------------------------- 
;  QUA_LSP 
;----------------------------------------------------------------------- 
;  Constants :  Addr_L0 -> L0 
;               Addr_L1 -> L1[0] 
;                          &Lspcb1[L1[0]] 
;                          L1[1] 
;                          &Lspcb1[L1[0]] 
;               Addr_L2 -> L2[0] 
;                          &Lspcb2[L2[0]] 
;                          L2[1] 
;                          &Lspcb2[L2[0]] 
;               Addr_L3 -> L3[0] 
;                          &Lspcb2[L3[0]] 
;                          L3[1] 
;                          &Lspcb2[L3[0]] 
; 
;----------------------------------------------------------------------- 
 
 
fg_size  .set   MA_NP * M 
 
        .asg    "AR1", pLerror 
 
        .asg    "AR2", pL123 
        .asg    "AR3", pCode 
 
        .asg    "AR2", pLspVecQ13 
        .asg    "AR3", pLspCb1Q13 
        .asg    "AR4", pLspCb2Q13 
 
        .asg    "AR6", AR_Counter 
 
 
QUA_LSP: 
        STM     #M, BK 
 
        CALLD   Lsp_Lsf2 
        STM     #M-1, BRC 
 
        CALLD   Get_wegt 
        STM     #2 - 1, AR_Counter 
 
        LD      #ptr_MA_coef, DP 
 
        ST      #Addr_lsp_vec_buf1Q13, ptr_lsp_vec 
 
        ST      #fg, ptr_MA_coef 
        ST      #fg_sum_inv_Q12, ptr_MA_sum_inv 
        ST      #fg_sum, ptr_MA_sum 
 
        ST      #Addr_L1, ptr_L1 
        ST      #Addr_L2, ptr_L2 
        ST      #Addr_L3, ptr_L3 
 
        ST      #Addr_mean_sqr_err, ptr_mean_sqr_err 
 
FindLspIndex: 
 
                CALLD   Lsp_prev_extract 
                STM     #Addr_lsf_coefQ13, AR3 
 
                CALLD   Lsp_select_L1 
                ADDM    #fg_size, ptr_MA_coef 
 
                CALLD   Lsp_select_L2L3 
                ADDM    #M, ptr_MA_sum_inv 
 
                STM     #5 - 1, BRC 
 
                MVDM    ptr_sel_lspcb1, pLspCb1Q13 
                MVDM    ptr_sel_lspcb2_L2, pLspCb2Q13 
 
                RPTBD   EndVecL1L2 - 1 
                MVDM    ptr_lsp_vec, pLspVecQ13 
 
                        ADD     *pLspCb1Q13+, *pLspCb2Q13+, A 
                        STL     A, -16, *pLspVecQ13+ 
EndVecL1L2: 
                STM     #5 - 1, BRC 
                MVDM    ptr_sel_lspcb2_L3, pLspCb2Q13 
                RPTB    EndVecL1L3 - 1 
 
                        ADD     *pLspCb1Q13+, *pLspCb2Q13+, A 
                        STL     A, -16, *pLspVecQ13+ 
EndVecL1L3: 
                CALLD   Lsp_expand_1_2 
                STM     #GAP1, T 
 
                CALLD   Lsp_expand_1_2 
                STM     #GAP2, T 
 
                CALL    Lsp_get_tdist 
 
                ADDM    #M, ptr_MA_sum                ; ptr_MA_sum  -> fg[1] 
                ADDM    #16, ptr_lsp_vec              ; ptr_lsp_vec -> Addr_lsp_vec_buf2Q13 
 
        BANZ    FindLspIndex, *AR_Counter- 
 
        ; select L0 
 
        ; from Lsp_get_tdist : B = Err[1], pLerror -> &Err[3] 
 
        MAR     *+pLerror(-4)                ; pLerror -> &Err[0] 
        DSUB    *pLerror, B                  ; B = Err[1] - Err[0] 
 
        STM     #Addr_L1, pL123 
        MVDM    ptr_codeword, pCode 
        STM     #4, AR0 
 
        BCD     Select1, BLT                  ; Lsp_last_select 
        ADDM    #-16, ptr_lsp_vec 
Select0: 
                ADDM    #-2 * M, ptr_MA_sum 
                ADDM    #-2 * fg_size, ptr_MA_coef 
                LD      #0, A 
                BD      QuaCoef 
                ADDM    #-16, ptr_lsp_vec 
Select1: 
                MAR     *+pL123(2) 
                LD      #1, 7, A 
                ADDM    #-M, ptr_MA_sum 
                ADDM    #-fg_size, ptr_MA_coef 
 
QuaCoef: 
        OR      *pL123+0, A 
        STL     A, *pCode+ 
        LD      *pL123+0, 5, A 
        OR      *pL123, A 
        STL     A, *pCode 
 
        CALL    Lsp_prev_compose 
        CALL    Lsp_prev_update 
        CALL    Lsp_stability 
 
        CALLD   Lsf_Lsp2 
        STM     #M-1, BRC 
 
 
        RETD 
        ADDM    #2, ptr_codeword 
 
 
;----------------------------------------------------------------------- 
;  Get_wegt 
;----------------------------------------------------------------------- 
;  void Get_wegt( 
;    Word16 flsp[],    /* (i) Q13 : M LSP parameters  */ 
;    Word16 wegt[]     /* (o) Q11->norm : M weighting coefficients */ 
;  ) 
;----------------------------------------------------------------------- 
;  Equation 22 
;----------------------------------------------------------------------- 
;  Constants :  Addr_lsf_coefQ13 -> flsp 
;               Addr_wegtQ11 -> wegt 
; 
;  note : *(Addr_lsf_coefQ13 - 1)  = PI04 = 0.4  ã  
;         *(Addr_lsf_coefQ13 + 10) = PI92 = 0.92 ã  
;----------------------------------------------------------------------- 
 
 
        .asg    "AR2", pLsf1Q13 
        .asg    "AR3", pLsf2Q13 
        .asg    "AR4", pWegtQ11 
 
Get_wegt: 
        STM     #Addr_lsf_coefQ13-1, pLsf1Q13 
        STM     #Addr_lsf_coefQ13+1, pLsf2Q13 
        STM     #Addr_wegtQ11, pWegtQ11 
 
        LD      #1, 16, B 
        STM     #CONST10, T 
        STM     #M-1, BRC 
        LD      B, 11, B                     ; B = 1 in Q27 
 
        STM     #4,AR5 
        RPTB    EndGetWeight - 1 
                SUB     *pLsf2Q13+, *pLsf1Q13+, A 
                SUB     B, 2, A 
                BC      NegDif, ALT 
                        LD      B, A 
                        B       SaveW 
NegDif: 
                        SQUR    A, A 
                        SFTA    A,2         ; Q27 -> Q31 
						STL     A,-16,*AR5 
                        MPY     *AR5,A 
						LD      A,2,A 
						ADD     B,A 
SaveW: 
                STL     A, -16, *pWegtQ11+ 
EndGetWeight: 
        STM     #Addr_wegtQ11+4, pWegtQ11 
        STM     #CONST12, T 
 
        MPY     *pWegtQ11, A            ; update W4 
        STL     A, -15, *pWegtQ11+        ; Q26 -> Q11 
 
        MPY     *pWegtQ11, A            ; update W5 
        STL     A, -15, *pWegtQ11         ; Q26 -> Q11 
        STM     #Addr_wegtQ11,pWegtQ11 
		LD       #0,A 
		STM      #9,BRC 
		RPTB    Ma-1 
		LD        *pWegtQ11+,B 
		MAX       A 
Ma: 
        EXP       A 
		STM     #Addr_wegtQ11,pWegtQ11 
		STM      #9,BRC 
		RPTB     Scale-1 
		LD        *pWegtQ11,A 
		NORM      A 
		STL       A,-16, *pWegtQ11+ 
Scale: 
        RET