📄 acelp_ca.asm
字号:
;================================================================
; File Name
; ----------
; ACELP_CO.ASM
;
; Brief Description of the Code:
; ------------------------------
; Find Algebraic codebook.
;
; Ref
; ------
; ACELP_CO.C (ACELP_Codebook)
;==============================================================
.mmregs
.include ..\include\const.h
.include ..\include\tab_ld8a.h
.include ..\include\ld8amem.h
.def ACELP_Codebook
.ref Cor_h
.ref Corr_h_x
.ref D4i40_17_fast
;-----------------------------------------------------------------
; ACELP_Codebook
;-----------------------------------------------------------------
; Word16 ACELP_Codebook( /* (o) :index of pulses positions */
; Word16 x[], /* (i) :Target vector */
; Word16 h[], /* (i)Q12:Impulse response of filters */
; Word16 T0, /* (i) :Pitch lag */
; Word16 pitch_sharp, /* (i)Q14:Last quantized pitch gain */
; Word16 code[], /* (o)Q13:Innovative codebook */
; Word16 y[], /* (o)Q12:Filtered innovative codebook*/
; Word16 *sign /* (o) :Signs of 4 pulses */
; )
;------------------------------------------------------------------
;------------------------------------------------------------------
; Constants : Addr_Dn -> Dn
; Addr_rr -> rr
; Addr_DnSign -> DnSign
;
; Addr_xn2 -> x
; Addr_h1 -> h
; Addr_T0 -> T0
; Addr_cn -> code
; Addr_yn2 -> y
;
; Pointers : ptr_sharp -> pitch_sharp
;
; Variables : PulseIndex = D4i40_17(xxxxx) = ACELP_Codebook(xxxxx)
; PulseSign = sign
;------------------------------------------------------------------
; Memmory map requirement :
; PulseIndex .set PulseSign + 1
;-------------------------------------------------------------------
.asg "AR2", pHn1
.asg "AR3", pHn2
.asg "AR4", pHn_i_T0
.asg "AR2", pSharp
ACELP_Codebook:
; Include fixed-gain pitch contribution into impulse resp. h[]
; Find correlations of h[] needed for the codebook search.
; sharp = shl(pitch_sharp, 1); /* From Q14 to Q15 */
; if (sub(T0, L_SUBFR)<0)
; /* h[i] += pitch_sharp*h[i-T0] */
; for (i = T0; i < L_SUBFR; i++)
; h[i] = add(h[i], mult(h[i-T0], sharp));
LD #Addr_T0, DP
LD #L_SUBFR - 1, A
SUB Addr_T0, A
LD Addr_T0, B
BCD EndFindHn, ALT ;if T0>L_SUBFR do nothing.
ADD #Addr_h1, B ;B save the address of h1[T0]
MVDM ptr_sharp, pSharp
STLM A, BRC
LD *pSharp, 1, A
STLM B, pHn1
STLM B, pHn2
STLM A, T
STM #Addr_h1, pHn_i_T0
LD #0, ASM
LD *pHn1+,16, A
MPY *pHn_i_T0+, B
ADD B,A
RPTB EndFindHn - 1
STL A,-16, *pHn2+
LD *pHn1+,16, A
MPY *pHn_i_T0+, B
ADD B,A
EndFindHn:
CALL Cor_h
CALLD Corr_h_x
STM #Addr_xn2,AR5
CALL D4i40_17_fast
; Compute innovation vector gain.
; Include fixed-gain pitch contribution into code[].
; if(sub(T0 ,L_SUBFR) <0)
; for (i = T0; i < L_SUBFR; i++)
; {
; code[i] = add(code[i], mult(code[i-T0], sharp));
; }
LD #Addr_cn, A
CALL AddFixedGain
RET
;------------------------------------------------------------------
; AddFixedGain
;------------------------------------------------------------------
; void AddFixedGain(
; Word16 S[], /* (i/o) : Source/Target vector */
; Word16 T0, /* (i) :Pitch lag */
; Word16 pitch_sharp,/* (i) Q14 :Last quantized pitch gain */
; )
;------------------------------------------------------------------
; sharp = shl(pitch_sharp, 1); /* From Q14 to Q15 */
; if (sub(T0, L_SUBFR)<0)
; for (i = T0; i < L_SUBFR; i++) /* h[i] += pitch_sharp*h[i-T0] */
; S[i] = add(S[i], mult(S[i-T0], sharp));
;------------------------------------------------------------------
; Constants : Addr_T0 -> T0
;
; Pointers : ptr_sharp -> pitch_sharp
;
; Input Register : AL = &S
;------------------------------------------------------------------
.asg "AR2", pSn1
.asg "AR3", pSn2
.asg "AR4", pSn_i_T0
AddFixedGain:
LD #Addr_T0, DP
LD #L_SUBFR - 1, B
SUB Addr_T0, B
BCD EndFindSn, BLT
STLM A, pSn_i_T0
ADD Addr_T0, A
MVDM ptr_sharp, pSharp
STLM B, BRC
LD *pSharp, 1, B
STLM A, pSn1
STLM A, pSn2
STLM B, T
LD #0, ASM
LD *pSn1+, 16, A
MPY *pSn_i_T0+, B
ADD B,A
RPTB EndFindSn - 1
STL A,-16, *pSn2+
LD *pSn1+,16, A
MPY *pSn_i_T0+, B
ADD B,A
EndFindSn:
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -