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


        .mmregs 
 
        .include  ..\include\const.h 
        .include  ..\include\struct.h 
        .include  ..\include\ld8amem.h 
        .include  ..\include\tab_ld8a.h 
 
        .text 
        .global   _SelEncChannel 
        .global   _ResetEncChannel 
 
;--------------------------------------------------------------------------- 
;   Function Name : SelectChannel 
; 
;      initialize pointers for the selected channel 
;----------------------------------------------------------------------- 
;      Initialize pointers to speech vector. 
; 
; 
;   |--------------------|-------------|-------------|------------| 
;     previous speech           sf1           sf2         L_NEXT 
; 
;   <----------------  Total speech vector (L_TOTAL)   -----------> 
;   <----------------  LPC analysis window (L_WINDOW)  -----------> 
;   |                   <-- present frame (L_FRAME) --> 
; old_speech            |              <-- new speech (L_FRAME) --> 
; p_window              |              | 
;                     speech           | 
;                             new_speech 
;----------------------------------------------------------------------- 
; 
;  Input Registers :    A(bit 15 - bit 0) =  G729Speech = &speech_buf 
; 
;  Modified Registers : DP, A, B, AR2 
; 
;--------------------------------------------------------------------------- 
; 
;  Output Data : ptr_speech_buf 
;                ptr_old_speech 
;                ptr_new_speech 
;                ptr_speech 
;                ptr_pre_hpf_u 
;                ptr_wsp_un 
;                ptr_lar_old 
;                ptr_lsp_old 
;                ptr_qlsp_old 
;                ptr_prev_lsp_vec 
;                ptr_bflat 
;--------------------------------------------------------------------------- 
_SelEncChannel 
        PSHM    ST1 
        RSBX    CPL 
        LD      #ptr_old_speech, DP 
        STLM    A, AR2 
        nop 
        STL     A, ptr_speech_buf 
        STL     A, ptr_old_speech 
 
        MAR     *+AR2(L_TOTAL >> 1) 
        MVMD    AR2, ptr_speech 
 
        MAR     *+AR2(L_NEXT) 
        ADD     #L_TOTAL, A 
        SFTL    A, -1, B              ; check even/odd address 
        MVMD    AR2, ptr_new_speech 
        SFTL    B, 1                  ; if even address 
        XC      2, C                  ; else make sure ptr_pre_hpf_u -> even address 
                ADD     #1, A, B 
 
        STL     B, ptr_pre_hpf_u 
 
        ADD     #4, B                 ; ptr_wsp_un -> even address 
        STL     B, ptr_wsp_un 
 
        ADD     #20, B 
        STL     B, ptr_L_exc_err         ; exc_err 
 
        ADD     #32, A 
 
        ADD     #2, A 
        STL     A, ptr_lsp_old            ; ptr_lsp_old -> lsp_coef 
 
        ADD     #M, A 
        STL     A, ptr_qlsp_old           ; ptr_qlsp_old -> lsp_coef_q 
 
        ADD     #M, A 
        STL     A, ptr_prev_lsp_vec       ; ptr_prev_lsp_vec -> prev_lsp_vec 
 
        ADD     #(4 * M), A 
        STL     A, ptr_bflat              ; ptr_bflat -> bflat 
 
        ADD     #1, A 
        STL     A, ptr_sharp              ; ptr_sharp -> sharp 
 
        ADD     #1, A 
        STL     A, ptr_prev_qua_eng       ; ptr_prev_qua_eng -> past_qua_eng 
 
        ADD     #4, A 
        STL     A, ptr_mem_syn            ; ptr_mem_syn -> mem_syn 
 
        ADD     #M, A 
        STL     A, ptr_mem_w0             ; ptr_mem_w0 -> mem_w0 
 
        ADD     #M, A 
        STL     A, ptr_mem_err            ; ptr_mem_err -> mem_err 
 
        ADD     #(M + PIT_MAX), A 
        STL     A, ptr_wsp                            ; wsp = old_wsp + PIT_MAX 
 
        ADD     #(L_FRAME + PIT_MAX + L_INTERPOL), A 
        STL     A, ptr_exc                            ; exc = old_exc + PIT_MAX + L_INTERPOL 
 
		LD		#Addr_lar_old, A 
		STL		A, ptr_lar_old 
		 
        POPM    ST1 
        RET 
 
 
;--------------------------------------------------------------------------- 
;   Function Name : ResetChannel 
; 
;          Initialize data for the selected channel. 
; 
;--------------------------------------------------------------------------- 
; 
;  Modified Registers : A, AR2, AR3 
; 
;--------------------------------------------------------------------------- 
_ResetEncChannel: 
        STM     #(G729ASpeechLen >> 1) - 1, BRC 
 
        MVDM    ptr_speech_buf, AR3 
 
        LD      #0, A 
        RPTB    #InitData1 - 1 
 
                DST     A, *AR3+ 
InitData1: 
 
 
        STM     #M - 1, BRC 
        MVDM    ptr_prev_lsp_vec, AR3 
        STM     #PrevLspVectQ13, AR2 
 
        RPTB    EndResetLspVec - 1 
                MVDD    *AR2,  *AR3+ 
                MVDD    *AR2,  *AR3+ 
                MVDD    *AR2,  *AR3+ 
                MVDD    *AR2+, *AR3+ 
EndResetLspVec: 
 
        ; initialize lsp coefficients ans bflat 
 
        MVDM    ptr_lsp_old, AR2 
        RPT     #M - 1 
                MVPD    lsp_coef_init, *AR2+ 
 
        MVDM    ptr_qlsp_old, AR2 
        RPT     #M - 1 
                MVPD    lsp_coef_init, *AR2+ 
 
        MVDM    ptr_bflat, AR3 
        MVDM    ptr_sharp, AR2 
        ST      #1, *AR3             ; bflat = 1 
        ST      #SHARPMIN, *AR2      ; sharp = SHARPMIN 
 
        LD      #-14336, A 
        MVDM    ptr_prev_qua_eng, AR3 
        RPT     #4 - 1 
                STL     A, *AR3+ 
 
 
    ; for(i=0; i<4; i++) L_exc_err[i] = 0x00004000L;   /* Q14 */ 
 
        MVDM    ptr_L_exc_err , AR3 
        LD      #04000h, A 
        DST     A, *AR3+           ; DST is not working with RPT 
        DST     A, *AR3+ 
        DST     A, *AR3+ 
        DST     A, *AR3+ 
 
        RET 
		 
		.data 
lsp_coef_init: 
        .word   30000, 26000, 21000, 15000, 8000, 0, -8000,-15000,-21000,-26000