📄 encodeld.dsp
字号:
/*---------LSP quantization-------*/
I1=^Enc_lspnew+M-1;
CALL Qua_lsp;
I6=DM(analy);
DM(I6,M4)=SR0;
DM(I6,M4)=SR1;
/*----------------------------------------------------------------*
* Find interpolated LPC parameters in all subframes *
* The interpolated parameters are in array Enc_Aqt[]. *
*----------------------------------------------------------------*/
I0=^Enc_Aqt;
I1=^Enc_lspold_q;
I2=^Enc_lspnew_q;
CALL Int_qlpc;
/*---------Compute A(z/gamma)----------------------*/
CNTR=M-1;
MY1=GAMMA1;
I0=^Enc_Apt;
I1=^Enc_Aqt;
CALL Weight_Az;
CNTR=M-1;
MY1=GAMMA1;
I0=^Enc_Apt+MP1;
I1=^Enc_Aqt+MP1;
CALL Weight_Az;
/*---------update the LSPs for the next frame------*/
I2=^Enc_lspold_q;
I3=^Enc_lspnew_q;
I1=^Enc_lspold;
I0=^Enc_lspnew;
CNTR=M;
DO copy_oldnew UNTIl CE;
AR=DM(I0,M1);
DM(I1,M1)=AR;
AR=DM(I3,M1);
copy_oldnew: DM(I2,M1)=AR;
/*----------------------------------------------------------------------*
* - Find the weighted input Enc_speech w_sp for the whole speech frame *
* - Find the open-loop pitch delay *
*----------------------------------------------------------------------*/
I2=^Enc_Aqt;
I1=DM(Enc_speech);
I0=DM(Enc_excit);
CNTR=L_SUBFR;
CALL Residu;
M3=L_SUBFR;
I2=^Enc_Aqt+MP1;
I1=DM(Enc_speech);
I0=DM(Enc_excit);
MODIFY(I1,M3);
MODIFY(I0,M3);
CNTR=L_SUBFR;
CALL Residu;
// CNTR=M;
I1=^Ap1;
I2=^Enc_Apt;
MY0=22938;
DM(I1,M1)=4096;
CNTR=M;
DO calc_api UNTIL CE;
AR=DM(I2,M1);
MR=AR * MY0(SS),AY0=DM(I2,M0);
AR=AY0-MR1;
calc_api: DM(I1,M1)=AR;
AY0=1;
I1=^Ap1;
I2=DM(Enc_excit);
I0=DM(Enc_wsp);
I3=^Enc_memw;
SI=L_SUBFR;
CALL Syn_filt;
// CNTR=M;
I1=^Ap1+1;
I2=^Enc_Apt+MP1;
MY0=22938;
CNTR=M;
Do copy_Apmul UNTIL CE;
AR=DM(I2,M1);
MR=AR * MY0(SS),AY0=DM(I2,M0);
AR=AY0-MR1;
copy_Apmul: DM(I1,M1)=AR;
AY0=1;
I1=^Ap1;
I2=DM(Enc_excit);
I0=DM(Enc_wsp);
I3=^Enc_memw;
M3=L_SUBFR;
MODIFY(I0,M3);
MODIFY(I2,M3);
SI=L_SUBFR;
CALL Syn_filt;
/*--------Find open loop pitch lag-----------*/
AR=DM(Enc_wsp);
AX1=L_SUBFR;
AY1=PIT_MAX;
AR=AR-AY1;
I1=AR;
SI=L_FRAME+PIT_MAX;
CALL Pitch_ol_fast;
/*--------Range for closed loop pitch search in 1st subframe----*/
AR=AR-3;
AY0=PIT_MIN;
NONE=AR-AY0;
IF LT AR=PASS AY0;
DM(Enc_T0min)=AR;
AY0=6;
AR=AR+AY0;
DM(Enc_T0max)=AR;
AY0=PIT_MAX;
NONE=AR-AY0;
IF LE JUMP analy_frame;
DM(Enc_T0max)=AY0;
AX0=6;
AR=AY0-AX0;
DM(Enc_T0min)=AR;
/*------------------------------------------------------------------------*
* Loop for every subframe in the analysis frame *
* To find the pitch and innovation parameters. The subframe size is *
* L_SUBFR and the loop is repeated 2 times. *
* - find the weighted LPC coefficients *
* - find the LPC residual signal res[] *
* - compute the target signal for pitch search *
* - compute impulse response of weighted synthesis filter (h1[]) *
* - find the closed-loop pitch parameters *
* - encode the pitch delay *
* - find target vector for codebook search *
* - codebook search *
* - VQ of pitch and codebook gains *
* - update states of weighting filter *
*------------------------------------------------------------------------*/
analy_frame: AR=^Enc_Aqt;
DM(Enc_Aq)=AR; /* pointer to interpolated quantized LPC parameters */
AR=^Enc_Apt;
DM(Enc_Ap)=AR; /* pointer to weighted LPC coefficients */
AR=PASS 0;
find_pitchlp: DM(Enc_subfr)=AR;
/*---------------------------------------------------------------*
* Compute impulse response, h1[], of weighted synthesis filter *
*---------------------------------------------------------------*/
I1=^Enc_h1;
DM(I1,M1)=4096;
CNTR=L_SUBFR-1;
DO zero_h11 UNTIL CE;
zero_h11: DM(I1,M1)=0;
AY0=0;
I1=DM(Enc_Ap);
I2=^Enc_h1;
I0=^Enc_h1;
I3=^Enc_h1+1;
SI=L_SUBFR;
CALL Syn_filt;
/*-------------------------------------------------------------*
* Find the target vector for pitch search: *
*-------------------------------------------------------------*/
AY0=0;
I1=DM(Enc_Ap);
I2=DM(Enc_excit);
M3=DM(Enc_subfr);
MODIFY(I2,M3);
I0=^Enc_xn;
SI=L_SUBFR;
I3=^Enc_memw0;
CALL Syn_filt;
/*-----------------------------------------------------------*
* Closed-loop fractional pitch search *
*-----------------------------------------------------------*/
DM(analy)=I6;
I6=DM(Enc_excit);
M5=DM(Enc_subfr);
MODIFY(I6,M5);
SI=L_SUBFR;
CALL Pitch_fr3_fast;
DM(Enc_T0)=SR1;
DM(Enc_T0frac)=SR0;
AY0=PIT_MIN;
AY1=PIT_MAX;
AR=DM(Enc_subfr);
CALL Enc_lag3;
I6=DM(analy);
AX0=DM(Enc_subfr);
AF=PASS AX0,DM(I6,M4)=AR;
IF NE JUMP find_pitchexc;
CALL Parity_Pitch;
DM(I6,M4)=AR;
/*-----------------------------------------------------------------*
* - find filtered pitch Enc_excit *
* - compute pitch gain and limit between 0 and 1.2 *
* - update target vector for codebook search *
*-----------------------------------------------------------------*/
find_pitchexc: AY0=0;
I1=DM(Enc_Ap);
I2=DM(Enc_excit);
M3=DM(Enc_subfr);
MODIFY(I2,M3);
I0=^Enc_y1;
SI=L_SUBFR;
I3=^Enc_memzero;
CALL Syn_filt;
I2=^Enc_xn;
I1=^Enc_y1;
I0=^Enc_gcoeff;
SI=L_SUBFR;
CALL G_pitch;
DM(Enc_gainpitch)=AR;
/*---------clip pitch gain if taming is necessary------*/
MR1=DM(Enc_T0);
MR0=DM(Enc_T0frac);
CALL test_err;
DM(tameflag)=AR;
AR=AR-1;
AR=DM(Enc_gainpitch);
IF NE JUMP gain_pitnext;
AY0=GPCLIP;
NONE=AR-AY0;
IF GT AR=PASS AY0;
/*---------xn2[i] = xn[i] - y1[i] * gain_pit----------*/
gain_pitnext: MY0=AR;
I1=^Enc_y1;
I2=^Enc_xn;
I0=^Enc_xn2;
CNTR=L_SUBFR;
DO create_pitch UNTIL CE;
AR=DM(I1,M1);
MR=AR * MY0(SS),AY0=DM(I2,M1);
SR=LSHIFT MR0 BY 1(LO);
SR=SR OR ASHIFT MR1 BY 1(HI);
AR=AY0-SR1;
create_pitch: DM(I0,M1)=AR;
/*-----------------------------------------------------*
* - Innovative codebook search. *
*-----------------------------------------------------*/
AX0=DM(Enc_T0);
DM(analy)=I6;
SR0=DM(Enc_sharp);
CALL ACELP_Code_A;
I6=DM(analy);
DM(I6,M4)=SR0;
DM(I6,M4)=SR1;
/*-----------------------------------------------------*
* - Quantization of gains. *
*-----------------------------------------------------*/
I1=^Enc_gcoeff;
I4=^Enc_gcoeff_cs;
I5=^Enc_exp_gcoeff_cs;
AR=DM(I1,M1);
AX0=DM(I1,M1);
AR=-AX0,DM(I4,M4)=AR;
AX0=DM(I1,M1);
AR=-AX0,DM(I5,M4)=AR;
AY0=DM(I1,M1);
AR=AY0+1,DM(I4,M4)=AR;
AR=-AR;
I0=^Enc_xn;
I1=^Enc_y1;
I2=^Enc_y2;
DM(I5,M4)=AR;
CALL Corr_xy2;
I2=^Enc_code;
SI=L_SUBFR;
DM(analy)=I6;
CALL Qua_gain;
I6=DM(analy);
DM(I6,M4)=AR;
DM(Enc_gainpitch)=MR0;
DM(Enc_gaincode)=MY1;
/*------------------------------------------------------------*
* - Update pitch sharpening with quantized gain_pit *
*------------------------------------------------------------*/
AY0=SHARPMAX;
AF=MR0-AY0,AR=MR0;
IF GT AR=PASS AY0;
AY0=SHARPMIN;
AF=AR-AY0,MY0=MR0;
IF LT AR=PASS AY0;
DM(Enc_sharp)=AR;
/*------------------------------------------------------*
* - Find the total excitation *
* - update filters memories for finding the target *
* vector in the next subframe *
*------------------------------------------------------*/
I1=DM(Enc_excit);
I2=^Enc_code;
M3=DM(Enc_subfr);
MODIFY(I1,M3);
CNTR=L_SUBFR;
DO create_exc UNTIL CE;
MX0=DM(I1,M0);
MR=MX0 * MY0(SS),MX0=DM(I2,M1);
MR=MR+MX0*MY1(SS);
SR=LSHIFT MR0 BY 1(LO);
SR=SR OR ASHIFT MR1 BY 1(HI);
AR=SR0+H#8000;
AR=SR1+C;
create_exc: DM(I1,M1)=AR;
AY0=DM(Enc_T0);
CALL update_exc_err;
// CNTR=M;
I0=^Enc_memw0;
I1=^Enc_y1+L_SUBFR-M;
I2=^Enc_y2+L_SUBFR-M;
I3=^Enc_xn+L_SUBFR-M;
CNTR=M;
DO interpol UNTIL CE;
MX0=DM(I1,M1);
MR=MX0 * MY0(SS),MX0=DM(I2,M1);
SR=LSHIFT MR0 BY 1(LO);
SR=SR OR ASHIFT MR1 BY 1(HI);
MR=MX0 * MY1(SS),AY0=SR1;
SR=LSHIFT MR0 BY 2(LO);
SR=SR OR ASHIFT MR1 BY 2(HI);
AR=SR1+AY0,AY0=DM(I3,M1);
AR=AY0-AR;
interpol: DM(I0,M1)=AR;
AY0=MP1;
AX0=DM(Enc_Aq);
AR=AX0+AY0;
DM(Enc_Aq)=AR;
AX0=DM(Enc_Ap);
AR=AX0+AY0;
DM(Enc_Ap)=AR;
AX0=DM(Enc_subfr);
AY0=L_SUBFR;
AR=AX0+AY0;
AY0=L_FRAME;
NONE=AR-AY0;
IF LT JUMP find_pitchlp;
/*--------------------------------------------------*
* Update signal for next frame. *
* -> shift to the left by L_FRAME: *
* Enc_speech[], Enc_wsp[] and Enc_excit[] *
*--------------------------------------------------*/
update_mem: I0=^Enc_oldspeech;
I1=^Enc_oldspeech+L_FRAME;
CNTR=L_TOTAL-L_FRAME;
DO copy_oldvoice UNTIL CE;
AR=DM(I1,M1);
copy_oldvoice: DM(I0,M1)=AR;
I0=^Enc_oldwsp;
I1=^Enc_oldwsp+L_FRAME;
CNTR=PIT_MAX;
DO copy_oldwsp UNTIL CE;
AR=DM(I1,M1);
copy_oldwsp: DM(I0,M1)=AR;
I0=^Enc_oldexc;
I1=^Enc_oldexc+L_FRAME;
CNTR=PIT_MAX+L_INTERPOL;
DO save_oldexc UNTIL CE;
AR=DM(I1,M1);
save_oldexc: DM(I0,M1)=AR;
RTS;
/*************************************************************************/
.ENDMOD;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -