?? dtxcng.dsp
字號(hào):
/************************************************************************
* DTX and Comfort Noise Generator - Encoder part *
* $$01/10/2000 checked Dtxmod 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 Dtxmod;
/************************************************************************/
#include "ld8a.inc"
#include "vad.inc"
#include "dtx.inc"
#include "tab_dtx.inc"
#include "tab_ld8a.inc"
/************************************************************************/
/* $$01/10/2000 static memory and pointer */
/************************************************************************/
.VAR/DM/RAM/SEG=App_DMmem lspSid_q[M] ;
.VAR/DM/RAM/SEG=App_DMmem pastCoeff[MP1];
.VAR/DM/RAM/SEG=App_DMmem RCoeff[MP1];
.VAR/DM/RAM/SEG=App_DMmem Acf[SIZ_ACF];
.VAR/DM/RAM/SEG=App_DMmem sh_Acf[NB_CURACF];
.VAR/DM/RAM/SEG=App_DMmem sumAcf[SIZ_SUMACF];
.VAR/DM/RAM/SEG=App_DMmem sh_sumAcf[NB_SUMACF];
.VAR/DM/RAM/SEG=App_DMmem ener[NB_GAIN];
.VAR/DM/RAM/SEG=App_DMmem sh_ener[NB_GAIN];
.VAR/DM/RAM/SEG=App_DMmem sh_RCoeff,sid_gain,Enc_curgain;
.VAR/DM/RAM/SEG=App_DMmem fr_cur,nb_ener,count_fr0;
.VAR/DM/RAM/SEG=App_DMmem flag_chang,prev_energy;
.GLOBAL lspSid_q;
/*************************************************************************/
.EXTERNAL Enc_excit;
.EXTERNAL Enc_seed;
.EXTERNAL Enc_lspold_q;
.EXTERNAL Enc_pastVad;
.EXTERNAL analy,Enc_Aqt;
.EXTERNAL Az_lsp;
.EXTERNAL Int_qlpc;
.EXTERNAL Levinson;
.EXTERNAL lsfq_noise;
.EXTERNAL Qua_Sidgain;
.EXTERNAL Calc_exc_rand;
/**************************************************************************
* procedure Init_Cod_cng: *
* Initialize variables used for dtx at the encoder *
* $$01/10/2000 checked Dtxmod module data variables and function *
* Calling Parameters *
* Return Values *
* Altered Registers: MR,SR,AR,I0,I1,I2,I3,AX0,MY0 *
* Computation Time : 18 cycles *
***************************************************************************/
.ENTRY Init_Cod_cng;
Init_Cod_cng: I1=^sumAcf;
CNTR=SIZ_SUMACF;
DO zero_sumAcf UNTIL CE;
zero_sumAcf: DM(I1,M1)=0;
I1=^sh_sumAcf;
CNTR=NB_SUMACF;
DO zero_shsumAcf UNTIL CE;
zero_shsumAcf: DM(I1,M1)=40;
I1=^Acf;
CNTR=SIZ_ACF;
DO zero_Acf UNTIL CE;
zero_Acf: DM(I1,M1)=0;
I1=^sh_Acf;
CNTR=NB_CURACF;
DO zero_shAcf UNTIL CE;
zero_shAcf: DM(I1,M1)=40;
I2=^ener;
I1=^sh_ener;
CNTR=NB_GAIN;
DO zero_ener UNTIL CE;
DM(I1,M1)=40;
zero_ener: DM(I2,M1)=0;
AR=PASS 0;
DM(Enc_curgain)=AR;
DM(fr_cur)=AR;
DM(flag_chang)=AR;
RTS;
/**************************************************************************
* procedure Cod_cng: *
* $$01/10/2000 checked Dtxmod module data variables and function *
* computes DTX decision *
* encodes SID frames *
* computes CNG excitation for encoder update *
* Calling Parameters *
* *exc, : excitation array *
* Enc_pastVad : previous VAD decision *
* Enc_lspold_q : previous quantized lsp *
* Enc_Aqt : set of interpolated LPC coefficients *
* analy : coded SID parameters *
* lsfq_mem : previous LPS for quantization *
* seed : random generator seed *
* Return Values *
* Altered Registers: MR,SR,AR,I0,I1,I2,I3,AX0,MY0 *
* Computation Time : 18 cycles *
***************************************************************************/
.ENTRY Cod_cng;
.VAR/DM/RAM/SEG=App_DMtmp lpcCoeff,cur_igain,energyq;
.VAR/DM/RAM/SEG=App_DMbuf curAcf[MP1],curCoeff[MP1],lsp_new[M];
Cod_cng: AR=DM(ener);
/*--------Update Ener and sh_ener-------------*/
DM(ener+1)=AR;
AR=DM(sh_ener);
DM(sh_ener+1)=AR;
/*--------Compute current Acfs---------------*/
I1=^sh_Acf;
I3=^curAcf;
AY0=NB_CURACF;
CALL Calc_sum_acf;
DM(sh_ener)=AR;
SR0=DM(curAcf);
AR=PASS SR0;
IF EQ JUMP zero_curAcf;
I0=^zero;
CNTR=MP1;
DO zero_zero UNTIL CE;
zero_zero: DM(I0,M1)=0;
I3=^curAcf;
I2=^zero;
I0=^curCoeff;
I1=^bid;
CALL Levinson;
/*---------if first frame of silence => SID frame-----*/
zero_curAcf: DM(ener)=SR0;
AR=DM(Enc_pastVad);
AR=PASS AR;
IF EQ JUMP gain_next;
I6=DM(analy);
AY0=1;
AR=PASS 0;
DM(I6,M4)=2;
DM(nb_ener)=AY0;
DM(count_fr0)=AR;
I1=^ener;
I2=^sh_ener;
CALL Qua_Sidgain;
DM(energyq)=AR;
DM(cur_igain)=AX0;
JUMP gain_comm;
gain_next: AY0=DM(nb_ener);
AR=AY0+1;
AY0=NB_GAIN;
NONE=AR-AY0;
IF GT AR=PASS AY0;
DM(nb_ener)=AR;
I1=^ener;
I2=^sh_ener;
AY0=DM(nb_ener);
CALL Qua_Sidgain;
DM(energyq)=AR;
DM(cur_igain)=AX0;
/*---------Compute stationarity of current filter---------*/
/*---------versus reference filter-------------------------*/
MX1=DM(ener);
MY1=FRAC_THRESH1;
CALL Cmp_filt;
AR=DM(flag_chang);
AF=PASS AF;
IF NE AR=PASS 1;
/*---------compare energy difference between current frame and last frame */
AX0=DM(prev_energy);
AY0=DM(energyq);
AR=AX0-AY0,AX1=AR;
AF=ABS AR;
AX0=2;
AF=AF-AX0,AR=AX1;
IF GT AR=PASS 1;
DM(flag_chang)=AR;
AY0=DM(count_fr0);
AF=AY0+1,AX1=AR;
AR=PASS 0;
AX0=FR_SID_MIN;
NONE=AF-AX0;
IF LT JUMP gain_con;
NONE=PASS AX1;
IF NE AR=PASS 2;
AF=PASS AX0;
gain_con: I6=DM(analy);
AR=PASS AF,DM(I6,M4)=AR;
DM(count_fr0)=AR;
gain_comm: I6=DM(analy);
AR=DM(I6,M4);
DM(analy)=I6;
AR=AR-2;
IF NE JUMP gain_abc_con;
/*--------Reset frame count and change flag */
DM(count_fr0)=AR;
DM(flag_chang)=AR;
/*--------Compute past average filter */
CALL Calc_pastfilt;
I0=^RCoeff;
AX0=^pastCoeff;
CALL Calc_RCoeff;
DM(sh_RCoeff)=AR;
/*--------Compute stationarity of current filter ---- */
/*--------versus past average filter ----*/
/*--------if stationary--------------------------------*/
/*--------transmit average filter => new ref. filter---*/
MX1=DM(ener);
MY1=FRAC_THRESH2;
CALL Cmp_filt;
AF=PASS AF;
I1=^pastCoeff;
IF EQ JUMP tran_con;
/*--------transmit current filter => new ref. filter */
I0=^RCoeff;
AX0=^curCoeff;
CALL Calc_RCoeff;
DM(sh_RCoeff)=AR;
I1=^curCoeff;
tran_con: M3=M;
I2=I1;
MODIFY(I1,M1);
MODIFY(I2,M3);
/*--------Compute SID frame codes-----*/
I0=^lsp_new;
I3=^Enc_lspold_q;
CALL Az_lsp;
/*--------LSP quantization------------*/
I1=^lsp_new+M-1;
CALL lsfq_noise;
AR=DM(energyq);
DM(prev_energy)=AR;
I6=DM(analy);
AR=DM(cur_igain);
DM(I6,M6)=AR;
DM(analy)=I6;
I4=^tab_Sidgain;
M5=AR;
MODIFY(I4,M5);
AR=PM(I4,M4);
DM(sid_gain)=AR;
/*-------Compute new excitation-----------*/
gain_abc_con: AR=DM(sid_gain);
AX0=DM(Enc_pastVad);
NONE=PASS AX0;
IF NE JUMP gain_cde;
MY0=A_GAIN1;
MR=AR * MY0(RND);
MY0=A_GAIN0;
AR=DM(Enc_curgain);
MR=AR * MY0(RND),AY0=MR1;
AR=MR1+AY0;
gain_cde: DM(Enc_curgain)=AR;
I1=DM(Enc_excit);
MX0=DM(Enc_seed);
AX0=DM(Enc_curgain);
CALL Calc_exc_rand;
DM(Enc_seed)=MX0;
I1=^Enc_lspold_q;
I2=^lspSid_q;
I0=^Enc_Aqt;
CALL Int_qlpc;
// CNTR=M;
I1=^lspSid_q;
I0=^Enc_lspold_q;
CNTR=M;
DO old_sid UNTIL CE;
AR=DM(I1,M1);
old_sid: DM(I0,M1)=AR;
/*---------Update sumAcf if fr_cur = 0-------*/
AR=DM(fr_cur);
AR=PASS AR;
IF EQ CALL Update_sumAcf;
RTS;
/***************************************************************************
* procedure Update_cng: *
* Updates autocorrelation arrays *
* used for DTX/CNG *
* If Vad=1 : updating of array sumAcf *
* $$01/10/2000 checked Dtxmod module data variables and function *
* Calling Parameters *
* I2 : MSB of frame autocorrelation *
* AX0 : scaling factor associated *
* AY0 : current Vad decision *
* Return Values *
* Altered Registers: AR,AX0,AY0,AY1,SI,I1,I2,I3 *
* Computation Time : 18 cycles *
****************************************************************************/
.ENTRY Update_cng;
Update_cng: //CNTR=SIZ_ACF-MP1;
I1=^Acf+SIZ_ACF-1;
I3=^Acf+SIZ_ACF-MP1-1;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -