📄 lpcfunc.asm
字号:
.mmregs
.include "tab_ld8a.inc"
.include "ld8a.inc"
.bss lsp,M
.bss f1,12
.bss f2,12
.global Lsp_lsf2
.global Lsf_lsp2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Lsp_Az(
; Word16 lsp[], /* (i) Q15 : line spectral frequencies */
; Word16 a[] /* (o) Q12 : predictor coefficients (order = 10) */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Lsp_Az:
pshm ar0
pshm ar2
pshm ar3
pshm ar4
pshm ar5
pshm ar6
pshm ar7
frame -1 ;*sp(0)--arg1
;*sp(9)--a
st #f1,*sp(0)
call Get_lsp_pol
st #f2,*sp(0)
add #1,a
call Get_lsp_pol
stm #f1+10,ar2
stm #f1+8,ar3
stm #f2+10,ar4
stm #f2+8,ar5
stm #2,ar0
stm #4,brc
rptb lsp_az_rep-1
dld *ar2,a
dld *ar3-0,b
add a,b
dst b,*ar2-0
dld *ar4,a
dld *ar5-0,b
sub b,a
dst a,*ar4-0
lsp_az_rep:
stm #2,ar0
mvdk *sp(9),ar6
ld *sp(9),a
add #10,a
stlm a,ar7
st #4096,*ar6
stm #f1+2,ar2
stm #f2+2,ar3
stm #4,brc
rptb lsp_az_rep1-1
dld *ar2,a
dld *ar3+,b
add b,a
ld a,-13,a
stl a,*ar6+0
dld *ar2+,a
sub b,a
ld a,-13,a
stl a,*ar7-0
lsp_az_rep1:
frame 1
popm ar7
popm ar6
popm ar5
popm ar4
popm ar3
popm ar2
popm ar0
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Find the polynomial F1(z) or F2(z) from the LSPs
;Parameters: *
; * lsp[] : line spectral freq. (cosine domain) in Q15 *
; * f[] : the coefficients of F1 or F2 in Q24 *
;static void Get_lsp_pol(Word16 *lsp, Word32 *f)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Get_lsp_pol:
pshm ar0
pshm ar2
pshm ar3
frame -3
;All computation in Q24
;*sp(0)--i,*sp(1)--hi,*sp(2)--lo
;*sp(7)--f
stm #2,ar0
stlm a,ar3 ;ar3--lsp
mvdk *sp(7),ar2 ;ar2--f
ld #100h,16,b ;f[0] = 1.0; in Q24
dst b,*ar2+0
st #512,t ;f[1] = -2.0 * lsp[0]; in Q24
mpy *ar3+0,b
neg b
dst b,*ar2+0
st #2,*sp(0)
glp_rep1:
dld *ar2(-4),b ;*f = f[-2]
dst b,*ar2
ld *sp(0),a
sub #2,a
stlm a,brc
rptb glp_rep-1
dld *ar2(-4),a ;*f = L_add(*f, f[-2])
dld *ar2,b
add a,b
dst b,*ar2
dld *ar2(-2),b ;L_Extract(f[-1] ,&hi, &lo)
sth b,*sp(1)
sub *sp(1),16,b
ld b,-1,b
stl b,*sp(2)
ld *ar3,t ;t0 = f[-1] * lsp
mpy *sp(1),b
mpy *sp(2),a
add a,-15,b
ld b,1,b ;t0 = L_shl(t0, 1)
dld *ar2,a ;*f = L_sub(*f, t0)
sub b,a
dst a,*ar2
ld *ar2-0,a
glp_rep:
ld *ar3,9,b ;*f -= lsp<<9
dld *ar2,a
sub b,a
dst a,*ar2
ld *sp(0),a
ld a,1,a
stlm a,ar0
ld *ar2+0,a
stm #2,ar0
ld *ar3+0,a
addm #1,*sp(0)
ld *sp(0),b
sub #5,b
bc glp_rep1,bleq
frame 3
popm ar3
popm ar2
popm ar0
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Lsf_lsp2(
; Word16 lsf[], /* (i) Q13 : lsf[m] (range: 0.0<=val<PI) */
; Word16 lsp[], /* (o) Q15 : lsp[m] (range: -1<=val<1) */
; Word16 m /* (i) : LPC order */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Lsf_lsp2:
PSHM ST0
PSHM ST1
pshm ar0
pshm ar2
pshm ar3
pshm ar4
pshm ar5
frame -3 ;*sp(0)--ind,*sp(1)--offset
;*sp(2)--freq
;*sp(11)--lsp,*sp(12)--m
ssbx sxm
ssbx ovm
ssbx frct
stlm a,ar2 ;ar2--lsf
mvdk *sp(11),ar3 ;ar3--lsp
ld *sp(12),b ;for(i=0; i<m; i++)
sub #1,b
stlm b,brc
ssbx braf
rptb lsf2_rep-1
stm #table2,ar4 ;ar4--table2
stm #slope_cos,ar5 ;ar5--slope_cos
mpy *ar2+,#20861,b ;20861: 1.0/(2.0*PI) in Q17
ld b,-16,b
ld b,-8,a ;ind = b8-b15 of freq
and #0ffh,b ;offset = b0-b7 of freq
stlm b,t
ld a,b
sub #63,a ;if ( sub(ind, 63)>0 )
xc 1,agt
ld #63,b ;ind = 63
;lsp[i] = table2[ind]+ (slope_cos[ind]*offset >> 12)
stlm b,ar0
ld ar4+0,a
ld ar5+0,a
mpy *ar5,b ;L_tmp = L_mult(slope_cos[ind], offset),L_tmp in Q28
ld b,3,b
add *ar4,16,b
sth b,*ar3+ ;lsp[i] = add(table2[ind], extract_l(L_shr(L_tmp, 13)))
lsf2_rep:
frame 3
popm ar5
popm ar4
popm ar3
popm ar2
popm ar0
POPM ST1
POPM ST0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Lsp_lsf2(
; Word16 lsp[], /* (i) Q15 : lsp[m] (range: -1<=val<1) */
; Word16 lsf[], /* (o) Q13 : lsf[m] (range: 0.0<=val<PI) */
; Word16 m /* (i) : LPC order */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Lsp_lsf2:
PSHM ST0
PSHM ST1
pshm ar0
pshm ar2
pshm ar3
pshm ar4
pshm ar5
frame -3 ;*sp(0)--ind,*sp(1)--offset
;*sp(2)--freq
;*sp(11)--lsf,*sp(12)--m
ssbx sxm
ssbx ovm
ssbx frct
stlm a,ar2 ;ar2--lsp
mvdk *sp(11),ar3 ;ar3--lsf
st #63,*sp(0) ;begin at end of table2 -1
stm #table2+63,ar4 ;ar4--table2
ld *sp(12),b ;for(i= m-(Word16)1; i >= 0; i--)
sub #1,b
stlm b,ar0
ld ar2+0,a
ld ar3+0,a
stlm b,brc
ssbx braf
rptb lsp2_rep-1
ld *sp(0),b
lsp2_while:
sub *ar4,*ar2,a ;while( sub(table2[ind], lsp[i]) < 0 )
bc lsp2_break,ageq
ld *ar4-,a
sub #1,b
bc lsp2_break,bleq
b lsp2_while
lsp2_break:
stl b,*sp(0)
sub *ar2-,*ar4,b
ld b,-16,b
stlm b,t
stm #slope_acos,ar5 ;ar5--slope_acos
mvdk *sp(0),ar0
ld *ar5+0,a
mpy *ar5,b
ld b,4,b
ld *sp(0),16,a
add a,9,b
sth b,*sp(2)
stm #25736,t
mpy *sp(2),b
sth b,*ar3-
lsp2_rep:
frame 3
popm ar5
popm ar4
popm ar3
popm ar2
popm ar0
POPM ST1
POPM ST0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;void Weight_Az(
; Word16 a[], /* (i) Q12 : a[m+1] LPC coefficients */
; Word16 gamma, /* (i) Q15 : Spectral expansion factor. */
; Word16 m, /* (i) : LPC order. */
; Word16 ap[] /* (o) Q12 : Spectral expanded LPC coefficients */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_Weight_Az:
pshm st0
pshm st1
pshm ar2
pshm ar3
frame -1 ;*sp(0)--fac
;*sp(6)--gamma,*sp(7)--m,*sp(8)--ap
ssbx sxm
ssbx ovm
ssbx frct
stlm a,ar2 ;ar2--a
mvdk *sp(8),ar3 ;ar3--ap
mvdd *ar2+,*ar3+
ld *sp(6),b ;fac = gamma
stl b,*sp(0)
ld *sp(7),a
sub #2,a
stlm a,brc
rptb weight_az_rep-1
ld *ar2+,t
mpy *sp(0),b
add #4000h,1,b
sth b,*ar3+
ld *sp(6),t
mpy *sp(0),b
add #4000h,1,b
sth b,*sp(0)
weight_az_rep:
ld *ar2,t
mpy *sp(0),b
add #4000h,1,b
sth b,*ar3
frame 1
popm ar3
popm ar2
popm st1
popm st0
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Interpolation of the quantized LSP's
;void Int_qlpc(
; Word16 lsp_old[], /* input : LSP vector of past frame */
; Word16 lsp_new[], /* input : LSP vector of present frame */
; Word16 Az[] /* output: interpolated Az() for the 2 subframes */
;)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
_Int_qlpc:
PSHM ST0
PSHM ST1
pshm ar2
pshm ar3
pshm ar4
frame -1 ;*sp(0)--arg1
;*sp(7)--lsp_new,*sp(8)--Az
ssbx sxm
ssbx ovm
ssbx frct
stlm a,ar3 ;ar3--lsp_old
mvdk *sp(7),ar2 ;ar2--lsp_new
stm #lsp,ar4 ;ar4--lsp
stm #M-1,brc
rptb Int_qlpc_rep-1
ld *ar2+,16,b
ld b,-1,b
ld *ar3+,16,a
ld a,-1,a
add a,b
sth b,*ar4+
Int_qlpc_rep:
ld *sp(8),b
stl b,*sp(0)
ld #lsp,a
call Lsp_Az
ld *sp(8),b
add #MP1,b
stl b,*sp(0)
ld *sp(7),a
call Lsp_Az
popm ar4
popm ar3
popm ar2
frame 1
POPM ST1
POPM ST0
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -