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


;========================================================================== 
;  File Name 
;  ---------- 
;  CHANNEL.ASM 
; 
;  Brief Description of the Code: 
;  ------------------------------ 
;  SelectChannel : initialize pointers for the selected channel 
;  ResetChannel  : initialize data for the selected channel 
; 
; 
;  Ref 
;  ------ 
; 
;========================================================================== 
 
        .mmregs 
 
        .include  ..\include\const.h 
        .include  ..\include\struct.h 
        .include  ..\include\ld8amem.h 
        .include  ..\include\tab_ld8a.h 
 
        .def    SelEncChannel 
        .def    ResetEncChannel 
        .def    SelDecChannel 
        .def    ResetDecChannel 
 
;--------------------------------------------------------------------------- 
;   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) =  G729ASpeech = &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 
;--------------------------------------------------------------------------- 
        .text 
 
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 
        STL     A, ptr_lar_old            ; lar 
 
        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_w             ; ptr_mem_w -> mem_w 
 
        ADD     #M, A 
        STL     A, ptr_mem_zero             ; ptr_mem_zero -> mem_zero 
 
        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 
 
        POPM    ST1 
        RET 
 
 
;--------------------------------------------------------------------------- 
;   Function Name : ResetChannel 
; 
;          Initialize data for the selected channel. 
; 
;--------------------------------------------------------------------------- 
; 
;  Modified Registers : A, AR2, AR3 
; 
;--------------------------------------------------------------------------- 
ResetEncChannel: 
 
        MVDM    ptr_speech_buf, AR3 
 
        RPTZ	A,  #G729ASpeechLen 
                STL     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 
 
lsp_coef_init: 
        .word   30000, 26000, 21000, 15000, 8000, 0, -8000,-15000,-21000,-26000 
 
 
 
;--------------------------------------------------------------------------- 
;----------------------------------------------------------------------- 
;   Function Name : SelDecChannel 
; 
;      Initialize decoder's pointers for the selected channel 
;----------------------------------------------------------------------- 
 
SelDecChannel: 
        PSHM    ST1 
        RSBX    CPL 
        LD      #ptr_lsp_old, DP 
        LD      #1, B 
        nop 
 
        STL     A, ptr_codeword 
 
        ADD     #PRM_SIZE+1, A 
        STL     A, ptr_status              ; control status 
 
        ADD     B, A 
        STL     A, ptr_T0_old              ; ptr_bflat -> bflat 
 
        ADD     B, A 
        STL     A, ptr_T0_first 
 
        ADD     B, A 
        STL     A, ptr_sharp              ; ptr_sharp -> sharp 
 
        ADD     B, A 
        STL     A, ptr_prev_ma            ; ptr_prev_ma -> prev_ma 
 
        ADD     B, A 
        STL     A, ptr_voicing            ; ptr_voicing -> voicing 
 
        ADD     B, A 
        STL     A, ptr_gain_prec          ; ptr_gain_prec -> gain_prec 
 
        ADD     B, A 
        STL     A, ptr_prev_qua_eng       ; ptr_prev_qua_eng -> past_qua_eng 
 
        ADD     #4, A 
        STL     A, ptr_prev_lsp_vec       ; ptr_prev_lsp_vec -> prev_lsp_vec 
 
        LD      #M, B 
        ADD     #(4 * M), A 
        STL     A, ptr_lsp_old            ; ptr_lsp_old -> lsp_coef 
 
        ADD     B, A 
        STL     A, ptr_qlsp_old           ; ptr_qlsp_old -> lsp_coef_q 
 
        ADD     B, A 
        STL     A, ptr_mem_syn            ; ptr_mem_syn -> mem_syn 
 
        ADD     B, A 
        STL     A, ptr_mem_stp            ; ptr_mem_stp -> mem_stp 
 
        ADD     B, A 
        SFTL    A, -1, B              ; check even/odd address 
        NOP 
        SFTL    B, 1                  ; if even address 
        XC      2, C                  ; else make sure ptr_hpf_u -> even address 
                ADD     #1, A, B 
 
        STL     B, ptr_hpf_u 
 
        ADD     #5, A 
        STL     A, ptr_apond2             ; ptr_apond2 -> apond2 
 
        ADD     #LONG_H_ST, A 
        STL     A, ptr_pst_out            ; ptr_pst_out -> pst_out 
 
        ADD     #(L_FRAME + M), A 
        STL     A, ptr_synth              ; ptr_synth -> synth_buf 
 
        ADD     #L_FRAME, A 
        STL     A, ptr_res2               ; ptr_res2 -> res2 
        ADDM    #MEM_RES2, ptr_res2 
 
        ADD     #(SIZ_RES2 + PIT_MAX + L_INTERPOL), A 
        STL     A, ptr_exc                            ; exc = old_exc + PIT_MAX + L_INTERPOL 
 
        POPM    ST1 
        RET 
 
;--------------------------------------------------------------------------- 
;   Function Name : ResetDecChannel 
; 
;          Initialize data for the selected channel for the decoder. 
; 
;--------------------------------------------------------------------------- 
; 
;  Modified Registers : A, AR2, AR3 
; 
;--------------------------------------------------------------------------- 
 
 
xBuf0Size   .set   M+M+5+LONG_H_ST+L_FRAME+M+L_FRAME+SIZ_RES2+PIT_MAX+L_INTERPOL 
 
ResetDecChannel: 
 
        MVDM    ptr_T0_old, AR3 
        MVDM    ptr_sharp, AR2 
        ST      #60, *AR3            ; old_T0 = 60 
        ST      #SHARPMIN, *AR2      ; sharp = SHARPMIN 
 
        LD      #-14336, A 
        MVDM    ptr_prev_qua_eng, AR3 
        MVDM    ptr_gain_prec, AR2 
        RPT     #4 - 1 
                STL     A, *AR3+ 
 
        ST      #16384, *AR2          ; gain_prev = 16384 
 
        STM     #M - 1, BRC 
        MVDM    ptr_prev_lsp_vec, AR3 
        STM     #PrevLspVectQ13, AR2 
 
        RPTB    EndResetLspVec2 - 1 
                MVDD    *AR2,  *AR3+ 
                MVDD    *AR2,  *AR3+ 
                MVDD    *AR2,  *AR3+ 
                MVDD    *AR2+, *AR3+ 
EndResetLspVec2: 
 
        ; initialize lsp coefficients and 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+ 
 
        LD      #0, A 
 
        LDM     AR2, B 
        AND     #1, B 
        STM     #(xBuf0Size >> 1) + 1, BRC 
        XC      1, BNEQ 
                STL     A, *AR2+               ; check for long word boundary 
 
        RPTB    #InitData2 - 1 
                DST     A, *AR2+               ; init mem_syn and exc_buf to 0 
InitData2: 
 
        RET