📄 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -