📄 acelpcode.dsp
字号:
/**************************************************************************
* Function ACELP_Code_A() *
* Find Algebraic codebook for G.729A *
* $$01/10/2000 checked Acelp_ca module data variables and function *
* $$01/16/2001 modified and printed,Author: Jason.wang (zhigang wang) *
* $$01/16/2001 Email: wzg119@yeah.net, BP: 86+02195950-161452 *
* $$01/16/2001 This modlue is not optimized! should be test on Emulator *
***************************************************************************/
.MODULE/SEG=App_PM AcelpCode;
/**************************************************************************/
#include "ld8a.inc"
/**************************************************************************/
.EXTERNAL Enc_h1,Enc_y2,Enc_xn2;
.EXTERNAL Enc_code,Enc_T0;
.EXTERNAL Cor_h_X;
/**************************************************************************/
.VAR/DM/RAM/SEG=App_DMtmp ptr_rri0i3_i4,ptr_rri1i3_i4;
.VAR/DM/RAM/SEG=App_DMtmp ptr_rri2i3_i4,ptr_rri3i3_i4;
/**************************************************************************
* Main ACELP function. *
* $$01/10/2000 used only in encoder *
* Calling Parameters *
* Enc_xn2 : Target vector *
* Enc_h1 : Q12 Inpulse response of filters *
* AX0 : Pitch lag *
* AR : Last quantized pitch gain *
* Return Values *
* Enc_code : Q13 :Innovative codebook *
* Enc_y2 : Q12 :Filtered innovative codebook *
* SR1 : Signs of 4 pulses *
* SR0 : index of pulses positions *
* Altered Registers: MR,SR,AR,I0,I1,I2,I3,AX0,MY0 *
* Computation Time : 18 cycles *
***************************************************************************/
.ENTRY ACELP_Code_A;
.VAR/DM/RAM/SEG=App_DMbuf ACELP_Dn[L_SUBFR];
.VAR/DM/RAM/SEG=App_DMbuf ACELP_rr[DIM_RR];
.VAR/DM/RAM/SEG=App_DMtmp incsharp;
ACELP_Code_A: SR=ASHIFT SR0 BY 1(LO);
DM(incsharp)=SR0;
AY0=L_SUBFR;
/*-----------------------------------------------------------------*
* Include fixed-gain pitch contribution into impulse resp. h[] *
* Find correlations of h[] needed for the codebook search. *
*-----------------------------------------------------------------*/
AR=AY0-AX0,MY0=SR0;
IF LE JUMP calc_corh;
I1=^Enc_h1;
I2=^Enc_h1;
M3=AX0;
CNTR=AR;
MODIFY(I2,M3);
DO add_hhhh UNTIL CE;
AR=DM(I1,M1);
MR=AR * MY0(SS),AY0=DM(I2,M0);
AR=MR1+AY0;
add_hhhh: DM(I2,M1)=AR;
calc_corh: I1=^Enc_h1;
AX1=^ACELP_rr;
CALL Cor_h;
/*-----------------------------------------------------------------*
* Compute correlation of target vector with impulse response. *
*-----------------------------------------------------------------*/
I1=^Enc_xn2;
I2=^Enc_h1;
I0=^ACELP_Dn;
CALL Cor_h_X;
/*-----------------------------------------------------------------*
* Find innovative codebook. *
*-----------------------------------------------------------------*/
I1=^ACELP_Dn;
I2=^sign_dn;
I3=^sign_dn_inv;
CNTR=L_SUBFR;
CALL D4i40_17_fast;
/*-----------------------------------------------------------------*
* Compute innovation vector gain. *
* Include fixed-gain pitch contribution into code[]. *
*-----------------------------------------------------------------*/
M2=-1;
AX0=DM(Enc_T0);
AY0=L_SUBFR;
AR=AY0-AX0;
IF LE RTS;
CNTR=AR;
M3=AX0;
I1=^Enc_code;
I2=^Enc_code;
MODIFY(I2,M3);
MX0=DM(I1,M1);
MY0=DM(incsharp);
DO copy_code UNTIL CE;
MR=MX0 * MY0(SS),AY0=DM(I2,M0);
AR=MR1+AY0,MX0=DM(I1,M1);
copy_code: DM(I2,M1)=AR;
RTS;
/**************************************************************************
* Function Cor_h() *
* Compute correlations of h[] needed for the codebook search. *
* $$01/10/2000 used only in encoder *
* Calling Parameters *
* I1 : Q12 Impulse response of filters *
* Return Values *
* AX1 : Correlations of H[] *
* Altered Registers: MR,SR,SE,AR,I0,AY0,MY0 *
* Computation Time : 18 cycles *
***************************************************************************/
.VAR/DM/RAM/SEG=App_DMbuf h[L_SUBFR]; /* Scaling h[] for maximum precision */
Cor_h: MR=0;
I2=I1;
CNTR=L_SUBFR;
DO Cor_hmac UNTIL CE;
AR=DM(I2,M1);
Cor_hmac: IF NOT MV MR=MR+AR*AR(SS);
IF MV SAT MR;
AY0=32000;
NONE=MR1-AY0;
IF LE JUMP Cor_hbr1;
I2=I1;
I4=^h;
CNTR=L_SUBFR;
DO Cor_hshr UNTIL CE;
AR=DM(I2,M1);
SR=ASHIFT AR BY -1(LO);
Cor_hshr: MR=0,DM(I4,M4)=SR0;
JUMP Cor_hcomm1;
Cor_hbr1: SE=EXP MR1(HI);
SE=EXP MR0(LO);
AR=SE;
AR=-AR;
SR=ASHIFT AR BY -1(LO);
AR=PASS AX1,SE=SR0;
I2=I1;
I4=^h;
CNTR=L_SUBFR;
AR=DM(I2,M1);
DO Cor_hshl UNTIL CE;
SR=ASHIFT AR (LO),AR=DM(I2,M1);
Cor_hshl: MR=0,DM(I4,M4)=SR0;
/*------------------------------------------------------------*
* Compute rri0i0[], rri1i1[], rri2i2[], rri3i3 and rri4i4[] *
*------------------------------------------------------------*/
Cor_hcomm1: I4=^h;
M3=-NB_POS;
I1=^ACELP_rr+5*NB_POS-1;
CNTR=NB_POS;
DO excor_hcomp UNTIL CE;
I0=I1;
CNTR=5;
DO incor_hcomp UNTIL CE;
AR=DM(I4,M4);
MR=MR+AR*AR(SS);
IF MV SAT MR;
incor_hcomp: DM(I0,M3)=MR1;
excor_hcomp: MODIFY(I1,M2);
/*-----------------------------------------------------------------*
* Compute elements of: rri2i3[], rri1i2[], rri0i1[] and rri0i4[] *
*-----------------------------------------------------------------*/
AX0=1;
M5=STEP;
I6=^h+1;
AY0=NB_POS;
// CNTR=NB_POS;
M3=-NB_POS-1;
AR=NB_POS-1;
AY1=^ACELP_rr+5*NB_POS+4*MSIZE-2;
AX1=^ACELP_rr+5*NB_POS+MSIZE-1;
SR0=^ACELP_rr+5*NB_POS+5*MSIZE-1;
SR1=^ACELP_rr+5*NB_POS+8*MSIZE-1;
CNTR=NB_POS;
DO Cor_hline1 UNTIL CE;
CALL twid_mult;
AR=SR0-AY0,MX0=DM(I4,M4);
MY0=DM(I5,M4);
MR=MR+MX0*MY0(SS),SR0=AR;
IF MV SAT MR;
DM(I3,M1)=MR1;
AR=AX1-AY0,MX0=DM(I4,M4);
MY0=DM(I5,M4);
MR=MR+MX0*MY0(SS),AX1=AR;
IF MV SAT MR;
DM(I2,M1)=MR1;
AR=AY1-1,MX0=DM(I4,M4);
MY0=DM(I5,M4);
MR=MR+MX0*MY0(SS),AY1=AR;
IF MV SAT MR;
Cor_hline1: AR=PASS AF,DM(I1,M1)=MR1;
/*---------------------------------------------------------------------*
* Compute elements of: rri2i4[], rri1i3[], rri0i2[], rri1i4[], rri0i3 *
*---------------------------------------------------------------------*/
// CNTR=NB_POS;
M5=-NB_POS-1;
AR=NB_POS-1;
AX0=^h+2;
AY1=^ACELP_rr+5*NB_POS+3*MSIZE-2;
AX1=^ACELP_rr+5*NB_POS+9*MSIZE-1;
SR0=^ACELP_rr+5*NB_POS+2*MSIZE-1;
SR1=^ACELP_rr+5*NB_POS+6*MSIZE-1;
MX1=^ACELP_rr+5*NB_POS+7*MSIZE-2;
CNTR=NB_POS;
DO Cor_hline2 UNTIL CE;
CALL Conv_mac;
DM(I3,M1)=MR1;
AR=SR0-AY0,MX0=DM(I5,M4);
MY0=DM(I6,M4);
MR=MR+MX0*MY0(SS),SR0=AR;
IF MV SAT MR;
Cor_hline2: AR=PASS AF,DM(I2,M1)=MR1;
/*----------------------------------------------------------------------*
* Compute elements of: rri1i4[], rri0i3[], rri2i4[], rri1i3[], rri0i2 *
*----------------------------------------------------------------------*/
AR=NB_POS-1;
// CNTR=NB_POS;
AX0=^h+3;
AY1=^ACELP_rr+5*NB_POS+2*MSIZE-2;
AX1=^ACELP_rr+5*NB_POS+7*MSIZE-1;
SR0=^ACELP_rr+5*NB_POS+9*MSIZE-2;
SR1=^ACELP_rr+5*NB_POS+3*MSIZE-1;
MX1=^ACELP_rr+5*NB_POS+6*MSIZE-2;
CNTR=NB_POS;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -