⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 encodeld.dsp

📁 基于ADSP的G.729语音编解码程序
💻 DSP
📖 第 1 页 / 共 2 页
字号:
	/*---------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 + -