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

📄 encoder.asm

📁 TI C54写的G729代码,视线8kbps高质量语音编码,汇编优化
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;=============================================================
;  File Name
;  ----------
;  ENCODER.ASM
;
;  Brief Description of the Code:
;  ------------------------------
;  Main encoder for G.729A.
;
;  Reference
;  ----------
;  cod_ld8a.C
;=============================================================

        .mmregs

        .include  ..\include\const.h
        .include  ..\include\tab_ld8a.h
        .include  ..\include\ld8amem.h

        .ref   	G729A_encoder

        .ref    Pre_Process          ; pre_proc.asm
        .ref    AutoCorr             ; autocorr.asm
        .ref    LagWindow            ; lag_win.asm
        .ref    Levinson             ; levinson.asm
        .ref    lpc_lsp              ; lpc_lsp.asm
        .ref    QUA_LSP              ; qua_lsp.asm
        .ref    Int_qlpc             ; int_qlpc.asm
        .ref    Weight_Az            ; wegt_az.asm
        .ref    Residu               ; residu.asm
        .ref    Syn_ap1              ; syn_ap1.asm   
        .ref    Syn_filt1            ; syn_filt.asm first 40
        .ref    Syn_filt2            ; syn_filt.asm second 40
        .ref    Syn_filt3            ; syn_filt.asm Updata = 0  

        .ref    Pitch_ol_fast        ; pit_ol_f.asm

        .ref    Pitch_fr3_fast       ; pit_fr3.asm
        .ref    Enc_lag3             ; Enc_lag3.asm
        .ref    Parity_Pitch         ; P_Parity.asm
        .ref    G_pitch              ; G_pitch.asm
        .ref    test_err             ; Test_err.asm
        .ref    ACELP_Codebook       ; ACELP_CA.asm
        .ref    Corr_xy2             ; Corr_xy2.asm
        .ref    Qua_gain             ; Qua_gain.asm
        .ref    update_exc_err       ; Updt_err.asm


;-----------------------------------------------------------------------
;  G729A_encoder
;-----------------------------------------------------------------------
G729A_encoder:
        PSHM    ST1
        RSBX    CPL
        SSBX    FRCT

        NOP                             ; 3 cycles latencies for changing CPL
        LD      #ptr_codeword, DP
        ST      #CodeWord, ptr_codeword

        LD      #0, DP
        ORM     #020h, PMST                ; set DARAM

        MVDM    ptr_new_speech, AR3
        CALLD   Pre_Process
        STM     #L_FRAME - 1, BRC

        CALLD   AutoCorr
        MVDM    ptr_old_speech, AR3            ; init input pointer

        CALLD   LagWindow
        STM     #Addr_CorrCoef1 + 2, AR5       ; init input pointer

        CALL    Levinson

   ; if (!NewCoef)
   ;   skip lpc_lsp, QUA_LSP, lar(in perc_var)

        BCD     FailToFindNewCoef, ANEQ
        LD      #bOldCoef, DP
        STL     A, bOldCoef


; lsp coefficients are found successfully
        CALL    lpc_lsp
        BC     LSP_Quantization, AEQ           

   ; unable to find coefficients
   ; use old lsp coefficients and skip QUA_LSP

FailToFindNewCoef:
        STM     #M - 1, BRC
        MVDM    ptr_lsp_old, AR2
        MVDM    ptr_qlsp_old, AR4
        STM     #Addr_lsp_coef, AR3

        RPTBD   EndOldLsp - 1
        STM     #Addr_lspq_coef, AR5

		MVDD    *AR2+, *AR3+       ; lsp_new[i]  = lsp_old[i]
		MVDD    *AR4+, *AR5+       ; lspq_new[i] = lspq_old[i]
EndOldLsp:

        B       LPC_Intp
LSP_Quantization:

        CALL    QUA_LSP

LPC_Intp:

        LD      #ptr_lsp_new, DP
        ST      #Addr_lspq_coef, ptr_lsp_new     ;lsp_new_q
        CALLD   Int_qlpc
        ST      #Addr_qlpc_intp, ptr_Az          ;Aq_t


   ; update lsp coefficients

        STM     #M - 1, BRC
        STM     #Addr_lsp_coef, AR2
        MVDM    ptr_lsp_old, AR3
        MVDM    ptr_qlsp_old, AR5

        RPTBD   EndUpdateLsp - 1
        STM     #Addr_lspq_coef, AR4

		MVDD    *AR2+, *AR3+       ; lsp_old[i] = lsp_new[i]
		MVDD    *AR4+, *AR5+       ; lspq_old[i] = lspq_new[i]
EndUpdateLsp:


;        STM     #24576, AR1                ; AR1 -> gamma=0.75
	LD	#24576, 16, A

        STM     #Addr_qlpc_intp, AR4
        STM     #Addr_Ap1_1, AR5
;        LD      AR1, 16, A                 ; AR1 -> gamma=0.75
        CALLD   Weight_Az
        STM     #M - 1, BRC


	LD	#24576, 16, A
        STM     #Addr_qlpc_intp+16, AR4
        STM     #Addr_Ap1_2, AR5
;        LD      AR1, 16, A                 ; AR1 -> gamma=0.75
        CALLD   Weight_Az
        STM     #M - 1, BRC


        MVDM    ptr_new_speech, AR3 ;(i) AR3 -> ptr_new_speech
        NOP
        MAR     *+AR3(#-40)
        MVDM    ptr_exc, AR4           ; (o) AR4 --> ptr_exc
        STM     #Addr_qlpc_intp, AR2   ; (i) AR2 --> Aq_t[0]
        CALLD   Residu
        STM     #L_SUBFR-1,BRC         ; (i) lg --> L_SUBFR
                                      

        MAR     *+AR2(#16)
        CALLD   Residu
        STM     #L_SUBFR-1,BRC         ; (i) lg --> LSUBFR

;-------------------------------------------------------------
        STM     #Addr_Ap1_1 - 1, AR3
        STM     #Addr_Ap_1, AR4
        CALLD   Syn_ap1
        STM     #M-1, BRC              ; BRC = #M - 1


        STM     #Addr_Ap_1 + 1, AR2        ; AR2 --> ptr_bi
        MVDM    ptr_exc, AR3           ; AR3 --> ptr_xn
        MVDM    ptr_wsp, AR5           ; AR5 --> ptr_yn
        MVDM    ptr_mem_w, AR4         ; AR4 --> ptr_un
        CALLD   Syn_filt1
        LD      #L_SUBFR, 0, A         ; A --> lg
        NOP

;------------------------------------

        STM     #Addr_Ap1_2 - 1, AR3
        STM     #Addr_Ap_1, AR4
        CALLD   Syn_ap1
        STM     #M-1, BRC                ;BRC = #M - 1
        NOP

        STM    #Addr_Ap_1+1, AR2       ;AR2 --> ptr_bi
        MVDM   ptr_exc, AR3            ;AR3 --> ptr_xn
        NOP
        MAR     *+AR3(#40)
        MVDM   ptr_wsp, AR5            ;AR5 --> ptr_yn
        NOP
        MAR     *+AR5(#40)
        MVDM   ptr_mem_w, AR4          ;AR4 --> ptr_un
        CALLD   Syn_filt2
        LD      #L_SUBFR, A            ;A --> lg
        NOP

        CALL    Pitch_ol_fast

        LD      #Addr_T0, DP
        STL     A, Addr_T0

;-------------------------------------------------------------
; T0_min = sub(T_op - 3);
; if(sub(T0_min,PIT_MIN)<0) T0_min = PIT_MIN 

        SUB     #3, A, B        ; T0_min = T0 - 3
        LD      #PIT_MIN, A
        MAX     B               ; T0_min = MIN(T0_min, PIT_MIN)

; T0_max = add(T0_min + 6);
; if(sub(T0_max,PIT_MAX)>0){
;   T0_max = PIT_MAX;
;   T0_min = sub(T0_max,6)}

        ADD     #6, B           ; T0_max = T0_min + 6
        LD      #PIT_MAX, A
        MIN     B               ; B = min(T0_max, PIT_MAX)
        SUB     #6, B, A        ; A = T0_min
        LD      #Addr_T0_min, DP
        STL     B, Addr_T0_max
        STL     A, Addr_T0_min

;-----------------------------------------------
; Loop for every subframe in the analysis frame
;-----------------------------------------------

        LD      #Addr_i_subfr, DP
        ST      #0, Addr_i_subfr        ; i = 0



SubFrameBegin:

        STM     #Addr_h1, AR5
        LD      #4096, A
        STL     A,*AR5+
        RPTZ    A, L_SUBFR - 2       ; for(i=1;i<L_SUBFR;i++)
                STL     A, *AR5+     ;   h1[i] = 0

	LD	    #Addr_Ap1_1,DP
;-------------------------------------------------------------------
	LD Addr_i_subfr,A
	BC H1_Second_40,ANEQ
		STM #Addr_Ap1_1,AR2		;for the first 40 data.
		B H1_First_40_Next
H1_Second_40:						;Second 40:
        STM     #Addr_Ap1_2, AR2		; AR2 --> ptr_bi
H1_First_40_Next:
        STM     #Addr_h1, AR3               ; AR3 --> ptr_xn
        STM     #Addr_h1, AR5               ; AR5 --> ptr_yn
        STM     #Addr_h1+1, AR4             ; AR4 --> ptr_un
        CALLD   Syn_filt3
        LD      #L_SUBFR, 0, A         ; A -->lg
        NOP
        
        LD      #Addr_i_subfr, DP
        LD      Addr_i_subfr, A
        BC      Xn_Second_40, ANEQ

        STM     #Addr_Ap1_1, AR2    ; AR2 --> ptr_bi
        MVDM    ptr_exc, AR3           ; AR3 --> ptr_xn
        STM     #Addr_xn1, AR5         ; AR5 --> ptr_yn
        MVDM    ptr_mem_w0, AR4        ; AR4 --> ptr_un
        CALLD   Syn_filt3
        LD      #L_SUBFR, 0, A         ; A --> lg
        NOP
        B       Xn_End_80
Xn_Second_40:
        LD      #ptr_ai, DP
        STM     #Addr_Ap1_2, AR2    ; AR2 --> ptr_bi
        MVDM    ptr_exc, AR3           ; AR3 --> ptr_xn
        NOP
        MAR     *+AR3(#40)
        STM     #Addr_xn1, AR5         ; AR5 --> ptr_yn
;        MAR     *+AR5(#40)
        MVDM    ptr_mem_w0, AR4        ; AR4 --> ptr_un
        CALLD   Syn_filt3
        LD      #L_SUBFR, 0, A         ; A --> lg
        NOP
Xn_End_80:
;------------------------------------
; Closed-loop fractional pitch search

⌨️ 快捷键说明

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