📄 acelpcode.dsp
字号:
DO Cor_hline3 UNTIL CE;
CALL Conv_mac;
AR=SR0-1;
SR0=AR;
Cor_hline3: AR=PASS AF,DM(I3,M1)=MR1;
/*----------------------------------------------------------------------*
* Compute elements of: rri0i4[], rri2i3[], rri1i2[], rri0i1[] *
*----------------------------------------------------------------------*/
AX0=0;
M5=STEP;
I6=^h+4;
// CNTR=NB_POS;
AR=NB_POS-1;
AY1=^ACELP_rr+5*NB_POS+MSIZE-2;
AX1=^ACELP_rr+5*NB_POS+5*MSIZE-2;
SR0=^ACELP_rr+5*NB_POS+8*MSIZE-2;
SR1=^ACELP_rr+5*NB_POS+4*MSIZE-1;
CNTR=NB_POS;
DO Cor_hline4 UNTIL CE;
CALL twid_mult;
AR=SR0-1;
AR=AY1-1,SR0=AR;
AY1=AX1;
AR=AY1-1,AY1=AR;
AX1=AR;
Cor_hline4: AR=PASS AF,DM(I3,M1)=MR1;
RTS;
/*************************************************************************
* do convolution multipy operation (standalone function) *
* $$01/10/2000 used only in encoder *
* Calling Parameters *
* AY1 : data pointer 0 *
* MX1 : data pointer 1 *
* SR0 : data pointer 2 *
* SR1 : data pointer 3 *
* AX1 : data pointer 4 *
* AX0 : data pointer 5 *
* AR : loop count of convolution *
* Return Values *
* Altered Registers: MR,SR,AR,AF,AX0,AX1,AY0,AY1,MX0,MX1,MY0 *
* I0,I1,I2,I3,I4,I5,I6 *
* Computation Time : 18 cycles *
**************************************************************************/
Conv_mac: MR=0;
I0=AY1;
I1=MX1;
I2=SR0;
I3=SR1;
I4=AX1;
I5=^h;
I6=AX0;
AF=PASS AR;
IF EQ JUMP Conv_loop+1;
CNTR=AR;
DO Conv_loop UNTIL CE;
MX0=DM(I5,M4);
MY0=DM(I6,M4);
MR=MR+MX0*MY0(SS),AR=DM(I5,M4);
IF MV SAT MR;
DM(I4,M5)=MR1;
MY0=DM(I6,M4);
MR=MR+AR*MY0(SS),MX0=DM(I5,M4);
IF MV SAT MR;
DM(I3,M3)=MR1;
MY0=DM(I6,M4);
MR=MR+MX0*MY0(SS),AR=DM(I5,M4);
IF MV SAT MR;
DM(I2,M3)=MR1;
MY0=DM(I6,M4);
MR=MR+AR*MY0(SS),MX0=DM(I5,M4);
IF MV SAT MR;
AR=PASS MR1,MY0=DM(I6,M4);
MR=MR+MX0*MY0(SS),DM(I1,M3)=AR;
IF MV SAT MR;
Conv_loop: DM(I0,M3)=MR1;
MX0=DM(I5,M4);
AR=AX1-AY0,MY0=DM(I6,M4);
MR=MR+MX0*MY0(SS),AX1=AR;
IF MV SAT MR;
DM(I4,M4)=MR1;
AR=SR1-AY0,MX0=DM(I5,M4);
AF=AF-1,MY0=DM(I6,M4);
MR=MR+MX0*MY0(SS),SR1=AR;
IF MV SAT MR;
AR=AX0+STEP;
AR=AY1-1,AX0=AR;
AY1=MX1;
AR=AY1-1,AY1=AR;
MX1=AR;
RTS;
/*************************************************************************
* do convolution multipy operation (standalone function) *
* $$01/10/2000 used only in encoder *
* Calling Parameters *
* AX0 : control falg *
* AY1 : data pointer 0 *
* AX1 : data pointer 1 *
* SR0 : data pointer 2 *
* SR1 : data pointer 3 *
* AX0 : data pointer 4 *
* I6 : data pointer 5 *
* AR : loop count of convolution *
* Return Values *
* Altered Registers: MR,SR,AR,AF,AX0,AX1,AY0,AY1,MX0,MX1,MY0 *
* I0,I1,I2,I3,I4,I5,I6 *
* Computation Time : 18 cycles *
**************************************************************************/
twid_mult: MR=0;
I0=AY1;
I1=AX1;
I2=SR0;
I3=SR1;
I4=^h;
I5=I6;
AF=PASS AR;
IF EQ JUMP twid_loop+1;
CNTR=AR;
DO twid_loop UNTIL CE;
MX0=DM(I4,M4);
MY0=DM(I5,M4);
MR=MR+MX0*MY0(SS),MX1=DM(I4,M4);
IF MV SAT MR;
AR=PASS MR1,MY0=DM(I5,M4);
MR=MR+MX1*MY0(SS),MX0=DM(I4,M4);
IF MV SAT MR;
NONE=PASS AX0;
IF NE AR=PASS MR1;
DM(I3,M3)=AR;
MY0=DM(I5,M4);
MR=MR+MX0*MY0(SS),MX1=DM(I4,M4);
IF MV SAT MR;
DM(I2,M3)=MR1;
MY0=DM(I5,M4);
MR=MR+MX1*MY0(SS),MX0=DM(I4,M4);
IF MV SAT MR;
AR=PASS MR1,MY0=DM(I5,M4);
MR=MR+MX0*MY0(SS),DM(I1,M3)=AR;
IF MV SAT MR;
twid_loop: DM(I0,M3)=MR1;
AF=AF-1,MX0=DM(I4,M4);
AR=SR1-AY0,MY0=DM(I5,M4);
MR=MR+MX0*MY0(SS),SR1=AR;
IF MV SAT MR;
MODIFY(I6,M5);
RTS;
/**************************************************************************
* Function D4i40_17_fast() *
* Algebraic codebook for ITU 8kb/s. *
* -> 17 bits; 4 pulses in a frame of 40 samples *
* The code length is 40, containing 4 nonzero pulses i0, i1, i2, i3. *
* Each pulses can have 8 possible positions (positive or negative) *
* except i3 that have 16 possible positions. *
* i0 (+-1) : 0, 5, 10, 15, 20, 25, 30, 35 *
* i1 (+-1) : 1, 6, 11, 16, 21, 26, 31, 36 *
* i2 (+-1) : 2, 7, 12, 17, 22, 27, 32, 37 *
* i3 (+-1) : 3, 8, 13, 18, 23, 28, 33, 38 *
* 4, 9, 14, 19, 24, 29, 34, 39 *
* $$01/10/2000 used only in encoder *
* Calling Parameters *
* ACELP_Dn: Correlations between h[] and Xn[]. *
* AX1 : Correlations of impulse response h[]. *
* h : Q12 Impulse response of filters. *
* Return Values *
* Enc_code: Q13 Selected algebraic codeword. *
* Enc_y2: Q12 Filtered algebraic codeword. *
* SR0 : Index of pulses positions. *
* SR1 : Signs of 4 pulses. *
* Altered Registers: MR,SR,SE,AR,I0,,AY0,MY0 *
* Computation Time : 18 cycles *
***************************************************************************/
.VAR/DM/RAM/SEG=App_DMbuf sign_dn[L_SUBFR];
.VAR/DM/RAM/SEG=App_DMbuf sign_dn_inv[L_SUBFR];
.VAR/DM/RAM/SEG=App_DMbuf tmp_vect[NB_POS];
.VAR/DM/RAM/SEG=App_DMtmp IP0, IP1, IP2, IP3, track,ii1_offset;
.VAR/DM/RAM/SEG=App_DMtmp ps,psk,alp,ps1,prev_i0,alpk,max_start;
.VAR/DM/RAM/SEG=App_DMtmp II0,II1,II2,II3,IX,IY,sq,index_start;
D4i40_17_fast:
/*-----------------------------------------------------------------------*
* Chose the sign of the impulse. *
*-----------------------------------------------------------------------*/
AX0=H#8000;
DO choose_sign UNTIl CE;
AR=DM(I1,M0);
NONE=PASS AR;
IF LT JUMP le_sign;
AR=-AX0,DM(I3,M1)=AX0;
DM(I2,M1)=AR;
JUMP choose_sign;
le_sign: AR=-AR,DM(I2,M1)=AX0;
AR=-AX0,DM(I1,M0)=AR;
DM(I3,M1)=AR;
choose_sign: MODIFY(I1,M1);
/*-------------------------------------------------------------------*
* Modification of rrixiy[] to take signs into account. *
*-------------------------------------------------------------------*/
M5=STEP;
M3=MSIZE;
// CNTR=NB_POS;
I4=^sign_dn;
AY0=STEP;
AX0=^sign_dn+1;
I1=^ACELP_rr+5*NB_POS;
AX1=^sign_dn_inv+1;
CNTR=NB_POS;
DO modify_line1 UNTIL CE;
AR=PASS AX0,SR0=DM(I4,M5);
NONE=PASS SR0;
IF LT AR=PASS AX1;
CNTR=NB_POS;
DO modify_col1 UNTIL CE;
I5=AR;
I0=I1;
// CNTR=4;
MY0=DM(I5,M4);
CNTR=4;
DO inmodify_col1 UNTIL CE;
MX0=DM(I0,M0);
MR=MX0 * MY0(SS),MY0=DM(I5,M4);
inmodify_col1: DM(I0,M3)=MR1;
AR=AR+AY0;
modify_col1: MODIFY(I1,M1);
modify_line1: I2=^ACELP_rr+5*NB_POS+4*MSIZE;
I4=^sign_dn+1;
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -