📄 encoder.asm
字号:
;=============================================================
; 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 + -