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

📄 postfilt.dsp

📁 基于ADSP的G.729语音编解码程序
💻 DSP
📖 第 1 页 / 共 2 页
字号:
               IF MV SAT MR;
			   AR=MR0-AY0,SR0=AY0;
			   AY0=AR,AR=MR1-AY1+C-1;
			   NONE=PASS AR;
			   IF LT JUMP find_cormax;
			   NONE=AR OR AY0;
			   IF EQ JUMP find_cormax;
			   SR0=MR0;
			   AR=PASS AF,AY1=MR1;
			   DM(T0_index)=AR;
find_cormax:   AF=AF+1,AY0=SR0; 
               DM(cormax_lo)=AY0;
			   DM(cormax_hi)=AY1;
			   AR=DM(T0_index);
 {-------------Compute the energy of the signal delayed by t0----------}
			   MR =0;
               MR0=1;
               I4=I2;
			   AR=-AR;
			   M5=AR;
//               CNTR=SI;
			   MODIFY(I4,M5);
               CNTR=SI;
			   DO mac_ener UNTIL CE;
			   AR=DM(I4,M4);
mac_ener:      IF NOT MV MR=MR+AR*AR(SS);
               IF MV SAT MR;
               AX1=MR1;
			   MR=0,AX0=MR0;
 {-------------Compute the signal energy in the present subframe------------}
			   MR0=1;
			   I4=I2;
			   CNTR=SI;
			   DO mac_ener0 UNTIL CE;
			   AR=DM(I4,M4);
mac_ener0:     IF NOT MV MR=MR+AR*AR(SS);
               IF MV SAT MR;
			   NONE=PASS AY1;
			   IF GE JUMP no_recmax;
			   AY1=0;
			   AY0=0;
no_recmax:     AR=MR0-AY0;
			   AR=MR1-AY1+C-1;
			   NONE=PASS AR;
    {----------scale "cor_max", "ener" and "ener0" on 16 bits-------}
			   IF LT JUMP exc_ener0;
			   AY1=MR1;
			   AY0=MR0; 
exc_ener0:     AR=AX0-AY0;
			   AR=AX1-AY1+C-1;
			   NONE=PASS AR;
			   IF LT JUMP exc_ener;
			   AY1=AX1;
			   AY0=AX0;	
exc_ener:      AR=PASS AY1;
			   AY1=DM(cormax_hi);
			   SE=EXP AR(HI),AR=AY0;
               AY0=DM(cormax_lo);
               SE=EXP AR(LO),AR=AY0;
			   SR=NORM AR(LO),AR=AY1;
			   SR=SR OR NORM AR(HI);
			   AR=SR0+H#8000;
			   AR=SR1+C;
			   AR=PASS AX0,MX0=AR;
			   SR=NORM AR (LO),AR=AX1;
			   SR=SR OR NORM AR(HI);
 		       AR=SR0+H#8000;
			   AR=SR1+C;		      
			   SR=NORM MR0 (LO),MY0=AR;
			   SR=SR OR NORM MR1(HI);
			   AR=SR0+H#8000;
			   AR=SR1+C;		      
  /*-----------prediction gain (dB)= -10 log(1-cor_max*cor_max/(ener*ener0))---*/
  /*-----------temp = (cor_max * cor_max) - (0.5 * ener * ener0)---------------*/
			   MR=AR * MY0(SS);
			   SR=LSHIFT MR0 BY -1(LO);
			   SR=SR OR ASHIFT MR1 BY -1(HI);
			   AY0=SR0;
			   MR=MX0 * MX0(SS);
			   AF=MR0-AY0,AY1=SR1;
			   AF=MR1-AY1+C-1,AY0=MX0;
			   NONE=PASS AF;
			   IF GE JUMP cal_gain;
			   CNTR=SI;
			   DO copy_pstsig UNTIL CE;
			   AR=DM(I1,M1);
copy_pstsig:   DM(I0,M1)=AR;
               RTS;
cal_gain:      AR=MY0;
			   NONE=AY0-AR;
			   IF LE JUMP cmax_bran2;
			   MY1=GAMMAP_2;
		       MY0=INV_GAMMAP;
			   JUMP cal_signal;
cmax_bran2:    MY1=GAMMAP;
			   MR=MX0 * MY1(SS);
			   SR=ASHIFT MR1 BY -1(LO);
			   AF=PASS SR0,MX0=SR0;	
			   SR=ASHIFT AR BY -1(LO);
			   AR=SR0+AF,MY0=SR0;
			   IF LE JUMP gain_bran1;
			   SR=ASHIFT AR BY 0(LO);
			   MR0=MX0;
			   MR1=MR2;
			   CALL div_s;
			   AY0=H#7FFF;
			   AR=AY0-AR,MY1=AR;
			   MY0=AR;
			   JUMP cal_signal;
gain_bran1:	   MY1=0;
			   MY0=H#7FFF;
cal_signal:    I4=I1;
//               CNTR=SI;
			   MODIFY(I4,M5);
               CNTR=SI;
   {-----------signal_pst[i] = g0*signal[i] + gain*signal[i-t0]----}
			   DO pst_signal UNTIL CE;
               MX0=DM(I1,M1);
			   MR=MX0 * MY0(SS),MX1=DM(I4,M4);
			   MR=MX1 * MY1(SS),AY0=MR1;
			   AR=MR1+AY0;
pst_signal:	   DM(I0,M1)=AR;
               RTS;
/**************************************************************************
* Procedure    Init_Post_Filter:                                          *
* Initializes the postfilter parameters:                                  *
* $$01/10/2000 only used in decoder                                       *
* Calling Parameters												      *	
* Return Values														      *
* Altered Registers: AR,I0,I1,M1                                          *	
* Computation Time : 18 cycles										      *	
***************************************************************************/
.ENTRY         Init_Post_Filter;

Init_Post_Filter:
//			   CNTR=M;
			   AR=^res2_buf + PIT_MAX;
			   DM(res2)=AR;
			   AR=^scal_res2_buf + PIT_MAX;
			   DM(scal_res2)=AR;
			   I0=^mem_syn_pst;
			   CNTR=M;
			   DO zero_mem UNTIL CE;
zero_mem:	   DM(I0,M1)=0;
			   I0=^res2_buf;
			   I1=^scal_res2_buf;
			   CNTR=PIT_MAX+L_SUBFR;
			   DO zero_res2 UNTIL CE;
        	   DM(I0,M1)=0;
zero_res2:	   DM(I1,M1)=0;
               AR=PASS 0;
			   DM(mem_pre)=AR;
			   AR=PASS 4096;
			   DM(past_gain)=AR; 
               RTS;
/**************************************************************************
* Preemphasis: filtering through 1 - g z^-1                               *
* $$01/10/2000 only used in decoder                                       *
* Calling Parameters												      * 	
*         MX0 : Q15 preemphasis coefficient                               *
*         AY0 : size of filtering  (L-1)                                  *
* Return Values														      *
*         I0  : input signal overwritten by the output                    *
* Altered Registers: MR,SR,AR,I0,I1,I2,I3,AX0,MY0                         *	
* Computation Time : 18 cycles										      *	
***************************************************************************/
preemphasis:   M3=AY0;
//			   CNTR=AY0;
			   MODIFY(I0,M3);
               I1=I0;
			   MODIFY(I1,M2);
			   AX0=DM(I0,M0);
			   MY0=DM(I1,M2);
			   CNTR=AY0;
			   DO save_p1 UNTIL CE;
			   MR=MX0 * MY0(SS),AY0=DM(I0,M0);
			   AR=AY0-MR1,MY0=DM(I1,M2);
save_p1:       DM(I0,M2)=AR;
               MY0=DM(mem_pre);
			   MR=MX0 * MY0(SS),AY0=DM(I0,M0);
			   AR=AY0-MR1;
			   DM(I0,M0)=AR;
			   DM(mem_pre)=AX0;
               RTS;
/**************************************************************************
* Scale the postfilter output on a subframe basis by automatic control    *
* of the subframe gain.                                                   *
* gain[n] = AGC_FAC * gain[n-1] + (1 - AGC_FAC) g_in/g_out                *
* $$01/10/2000 only used in decoder                                       *
* Calling Parameters												      *	
*         I1  : postfilter input signal                                   *
*         SI  : subframe size                                             *
* Return Values														      *
*         I2  : postfilter output signal                                  *
* Altered Registers: MR,SR,AR,I0,I1,I2,I3,AX0,MY0                         *	
* Computation Time : 18 cycles										      *	
***************************************************************************/
.VAR/DM/RAM/SEG=App_DMbuf    signal[L_SUBFR];
.VAR/DM/RAM/SEG=App_DMtmp    expon;

agc:           I0=I2;
//               CNTR=SI;
			   I4=^signal; 
               CNTR=SI;
     {---------calculate gain_out with exponent-----------}
	           DO shr_signal UNTIL CE;
			   AR=DM(I0,M1);
			   SR=ASHIFT AR BY -2(LO);
shr_signal:	   MR=0,DM(I4,M4)=SR0;
				nop;
			   I4=^signal;
			   CNTR=SI;
			   DO mac_signal UNTIL CE;
			   AR=DM(I4,M4);
mac_signal:    IF NOT MV MR=MR+AR*AR(SS);
               IF MV SAT MR;
               AY0=MR0;
			   AR=MR1 OR AY0;
			   IF NE JUMP not_zero;
			   DM(past_gain)=AR;
			   RTS;
not_zero:      SE=EXP MR1 (HI);
               SE=EXP MR0 (LO);
			   AR=PASS -1,AY0=SE;
			   AR=AR-AY0;
			   SE=AR;
			   DM(expon)=AR;
			   SR=LSHIFT MR0 (LO);
			   SR=SR OR ASHIFT MR1 (HI);
			   AR=SR0+H#8000;
			   AR=SR1+C;		      
     {---------calculate gain_in with exponent-------------}
	           I0=I1;
//			   CNTR=SI;
               I4=^signal;
			   CNTR=SI;
			   DO shr_sigout UNTIL CE;
               SR0=DM(I0,M1);
			   SR=ASHIFT SR0 BY -2(LO);
shr_sigout:    MR=0,DM(I4,M4)=SR0;
				nop;
			   I4=^signal;
			   CNTR=SI;
			   DO mac_sigout UNTIL CE;
			   SR0=DM(I4,M4);
mac_sigout:    IF NOT MV MR=MR+SR0*SR0(SS);
               IF MV SAT MR;
			   AY1=MR0;
			   AF=MR1 OR AY1;
			   IF EQ JUMP comp_gain;
			   SE=EXP MR1(HI);
               SE=EXP MR0(LO);
			   SR=NORM MR0(LO),AX1=SE;
			   SR=SR OR NORM MR1(HI),MR1=AR;
			   AR=SR0+H#8000;
			   AR=SR1+C,MR0=MR1;		      
   /*---------------------------------------------------*
    *  g0(Q12) = (1-AGC_FAC) * sqrt(gain_in/gain_out);  *
    *--------------------------------------------------*/
			   SR=ASHIFT AR BY 0(LO);
			   AY1=DM(expon);
			   AR=AX1+AY1,MR1=MR2;
			   AR=-AR;
			   DM(expon)=AR;
			   CALL div_s;
			   SR=ASHIFT AR BY 0(LO);
			   SR=ASHIFT SR1 BY 7(HI);
			   SR=SR OR LSHIFT AR BY 7(LO);
			   SE=DM(expon);
			   SR=LSHIFT SR0 (LO),AR=SR1;
			   SR=SR OR ASHIFT AR (HI);
    /*---------i(Q12) = s(Q19) = 1 / sqrt(s(Q22))----------*/
	           MR0=SR0;
			   MR1=SR1;
	           CALL Inv_sqrt; 
			   AR=PASS SR1;
			   SR=LSHIFT SR0 BY 9(LO);
			   SR=SR OR ASHIFT AR  BY 9(HI);
			   AR=SR0+H#8000;
			   AR=SR1+C;		      
    /*---------g0(Q12) = i(Q12) * (1-AGC_FAC)(Q15)---------*/
               MY0=AGC_FAC1;
			   MR=AR * MY0(SS);
			   AF=PASS MR1;	            
   /*----------compute gain(n) = AGC_FAC gain(n-1) + (1-AGC_FAC)gain_in/gain_out---*/
   /*----------sig_out(n) = gain(n) sig_out(n)-------------------------------------*/
comp_gain:     //CNTR=SI;
			   MX0=DM(past_gain);
			   MY0=AGC_FAC;
			   CNTR=SI;
			   DO sigout_loop UNTIL CE;
			   MR=MX0 * MY0(SS);
			   AR=MR1+AF,MY1=DM(I2,M0);
			   MR=AR * MY1(SS),MX0=AR;
			   SR=LSHIFT MR0 BY 3(LO);
			   SR=SR OR ASHIFT MR1 BY 3(HI);
sigout_loop:   DM(I2,M1)=SR1;
			   DM(past_gain)=MX0;
               RTS;
/***************************************************************************/
.ENDMOD;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -