📄 vadcheck.dsp
字号:
/************************************************************************/
/* $$01/10/2000 checked VadDetect 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 VadDetect;
/************************************************************************/
#include "vad.inc"
#include "dtx.inc"
#include "ld8a.inc"
#include "tab_dtx.inc"
#include "tab_ld8a.inc"
/************************************************************************/
/* $$01/10/2000 static varaibles used in decoder frame speech process */
/************************************************************************/
.VAR/DM/RAM/SEG=App_DMmem MeanLSF[M],Min_buffer[16];
.VAR/DM/RAM/SEG=App_DMmem Prev_Min,Next_Min,Min;
.VAR/DM/RAM/SEG=App_DMmem MeanE,MeanSE,MeanSLE,MeanSZC;
.VAR/DM/RAM/SEG=App_DMmem count_sil,count_update,count_ext;
.VAR/DM/RAM/SEG=App_DMmem ad_flag,v_flag,less_count,prev_energy;
/************************************************************************/
.EXTERNAL Enc_Frame,Enc_pastVad;
.EXTERNAL Enc_lsfnew,Enc_ppastVad;
.EXTERNAL VadEncode,Enc_expR0,Enc_pwindow;
.EXTERNAL Log2;
/************************************************************************
* Function vad_init ( ) *
* -> Initialization of variables for voice activity detection *
* $$01/10/2000 used only in encoder *
* Calling Parameters *
* Return Values *
* Altered Registers: AR,I1,M1 *
* Computation Time : 18 cycles *
*************************************************************************/
.ENTRY vad_init;
vad_init: AY0=0;
I1=^MeanLSF;
/*-----Static vectors to zero--------------*/
CNTR=%MeanLSF;
DO zero_mean UNTIL CE;
zero_mean: AR=AY0+1,DM(I1,M1)=AY0;
I1=^Min_buffer;
CNTR=%Min_buffer;
DO zero_minbuf UNTIL CE;
zero_minbuf: DM(I1,M1)=0;
/*------Initialize VAD parameters-----------*/
DM(MeanSE)=AY0;
DM(MeanSLE)=AY0;
DM(MeanE)=AY0;
DM(MeanSZC)=AY0;
DM(count_sil)=AY0;
DM(count_update)=AY0;
DM(count_ext)=AY0;
DM(less_count)=AY0;
DM(ad_flag)=AR;
AR=H#7FFF;
DM(Min)=AR;
RTS;
/************************************************************************
* Functions vad to detect voice activity *
* $$01/10/2000 used only in encoder *
* $$01/11/2000 move dm table to pm table area *
* $$01/11/2000 modify pointer and varaibles to adapt table change *
* Calling Parameters *
* SI : reflection coefficient *
* Enc_lsfnew : unquantized lsf vector *
* I0 : upper 16-bits of the autocorrelation vector *
* I1 : lower 16-bits of the autocorrelation vector *
* Enc_expR0 : exponent of the autocorrelation vector *
* Enc_pwindow: preprocessed input signal *
* Enc_Frame : frame counter *
* Enc_pastVad: VAD decision of the last frame *
* Enc_ppastVad: VAD decision of the frame before last frame *
* Return Values *
* VadEncode: VAD decision of the current frame *
* Altered Registers: MR,SR,AR,I0,I1,I2,I3,AX0,MY0 *
* Computation Time : 18 cycles *
*************************************************************************/
.ENTRY Vadcheck;
Vadcheck: CALL calc_parm;
CALL update_mins;
CALL calc_mean;
AR=DM(ENERGY);
DM(prev_energy)=AR;
RTS;
/************************************************************************
* calculte basic voice active detect guidlines *
* $$01/10/2000 used only in encoder *
* $$01/11/2000 move dm table to pm table area *
* Calling Parameters *
* Enc_lsfnew : unquantized lsf vector *
* I0 : upper 16-bits of the autocorrelation vector *
* I1 : lower 16-bits of the autocorrelation vector *
* Enc_expR0 : exponent of the autocorrelation vector *
* Enc_pwindow: preprocessed input signal *
* Return Values *
* Altered Registers: MR,SR,AR,AF,AX0,AX1,AY0,AY1,MX0,MX1,MY0,MY1 *
* Computation Time : 18 cycles *
*************************************************************************/
.VAR/DM/RAM/SEG=App_DMtmp ENERGY,ENERGY_low,SD,ZC;
calc_parm:
/*-----------compute the frame energy-----------------*/
SR0=DM(I1,M1);
MR1=DM(I0,M0);
SR=LSHIFT SR0 BY 1(LO);
MR0=SR0;
CALL Log2;
MY0=9864;
I4=^lbf_corr;
AR=PASS 1,MX1=DM(I0,M1);
MF=SR0 * MY0(SS),MY1=PM(I4,M4);
MR=AR * MF(SS),AX0=MY0;
MR=MR+SR1*MY0(SS);
AR=DM(Enc_expR0);
AR=AR-2;
MR=MR+AR*MY0(SS),AX1=AR;
SR=LSHIFT MR0 BY 11(LO);
SR=SR OR ASHIFT MR1 BY 11(HI);
AY1=4875;
AR=SR1-AY1;
DM(ENERGY)=AR;
/*-----------compute the low band energy----------*/
MR=0;
CNTR=NP;
DO mac_lbf UNTIL CE;
MX0=DM(I0,M1),MY0=PM(I4,M4);
mac_lbf: IF NOT MV MR=MR+MX0*MY0(SS);
IF MV SAT MR;
SR=LSHIFT MR0 BY 1(LO);
SR=SR OR ASHIFT MR1 BY 1(HI);
MR0=SR0;
MR1=SR1;
MR=MR+MX1*MY1(SS),MY1=AX0;
CALL Log2;
AR=PASS 1;
MF=SR0 * MY1(SS);
MR=AR * MF(SS);
MR=MR+SR1*MY1(SS),MX0=AX1;
MR=MR+MX0*MY1(SS);
SR=LSHIFT MR0 BY 11(LO);
SR=SR OR ASHIFT MR1 BY 11(HI);
AR=SR1-AY1;
DM(ENERGY_low)=AR;
/*--------compute SD-------------*/
// CNTR=M;
I3=^MeanLSF;
I2=^Enc_lsfnew;
MR=0,AX0=DM(I2,M1);
CNTR=M;
DO mac_meanlsf UNTIL CE;
AY0=DM(I3,M1);
AR=AX0-AY0,AX0=DM(I2,M1);
mac_meanlsf: IF NOT MV MR=MR+AR*AR(SS);
IF MV SAT MR;
DM(SD)=MR1; /* Q15 */
/*-----------compute # zero crossing------------*/
AY0=410;
M3=ZC_START;
I3=DM(Enc_pwindow);
MODIFY(I3,M3);
MX0=DM(I3,M1);
AR=PASS 0,MY0=DM(I3,M0);
CNTR=ZC_END-ZC_START;
DO cal_zerocross UNTIL CE;
MR=MX0 * MY0(SS),MX0=DM(I3,M1);
AF=PASS MR1,MY0=DM(I3,M0);
IF LT AR=AR+AY0;
cal_zerocross: DM(ZC)=AR; /* Q15 */
RTS;
/************************************************************************
* initialize and update the mins and prevmins *
* $$01/10/2000 used only in encoder *
* $$01/11/2000 move dm table to pm table area *
* Calling Parameters *
* Return Values *
* Altered Registers: MR,SR,AR,AF,AX0,AX1,AY0,AY1,MX0,MX1,MY0,MY1 *
* Computation Time : 18 cycles *
*************************************************************************/
update_mins:
/*-----------Initialize and update Mins-------------*/
AY1=129;
AY0=H#0007;
AX0=DM(Enc_Frame);
AR=AX0-AY1;
IF GE JUMP find_prevmin;
AX1=DM(ENERGY);
AY1=DM(Min);
AR=AX1-AY1;
NONE=PASS AR;
IF GE JUMP Prevno_update;
DM(Min)=AX1;
DM(Prev_Min)=AX1;
Prevno_update: AR=AX0 AND AY0,SR0=AX0;
IF NE JUMP find_prevmin;
I3=^Min_buffer;
SR=ASHIFT SR0 BY -3(LO);
AR=SR0-1;
M3=AR;
MODIFY(I3,M3);
AX1=DM(Min);
DM(I3,M1)=AX1;
AX1=H#7FFF;
DM(Min)=AX1;
find_prevmin: AR=AX0 AND AY0;
IF NE JUMP find_nextmin;
I3=^Min_buffer;
// CNTR=15;
AR=DM(I3,M1);
CNTR=15;
DO comp_prevmin UNTIL CE;
AY1=DM(I3,M1);
AF=AY1-AR;
AF=PASS AF;
IF LT AR=PASS AY1;
comp_prevmin: DM(Prev_Min)=AR;
find_nextmin: AY1=129;
AR=AX0-AY1;
IF LT RTS;
AR=AX0 AND AY0;
AR=AR XOR H#0001;
AR=DM(Min);
AX1=DM(Next_Min);
IF NE JUMP comp_energy;
AR=DM(Prev_Min);
AX1=H#7FFF;
comp_energy: AY1=DM(ENERGY);
AF=AY1-AR;
AF=PASS AF;
IF LT AR=PASS AY1;
DM(Min)=AR;
AF=AY1-AX1,AR=AX1;
AF=PASS AF;
IF LT AR=PASS AY1;
DM(Next_Min)=AR;
NONE=AX0 AND AY0;
IF NE RTS;
// CNTR=15;
I2=^Min_buffer;
I3=^Min_buffer+1;
CNTR=15;
DO shift_minbuff UNTIL CE;
SR0=DM(I3,M1);
shift_minbuff: DM(I2,M1)=SR0;
nop;
AR=DM(Next_Min);
// CNTR=15;
DM(I2,M1)=AR;
I2=^Min_buffer;
AR=DM(I2,M1);
CNTR=15;
DO iteriate_min UNTIL CE;
AY1=DM(I2,M1);
AF=AY1-AR;
AF=PASS AF;
IF LT AR=PASS AY1;
iteriate_min: DM(Prev_Min)=AR;
RTS;
/************************************************************************
* initialize and update the mins and prevmins *
* $$01/10/2000 used only in encoder *
* $$01/11/2000 move dm table to pm table area *
* Calling Parameters *
* Enc_lsfnew : unquantized lsf vector *
* Return Values *
* Altered Registers: MR,SR,AR,AF,AX0,AX1,AY0,AY1,MX0,MX1,MY0,MY1 *
* Computation Time : 18 cycles *
*************************************************************************/
.VAR/DM/RAM/SEG=App_DMtmp coeffbuf[6];
start_calmean: I4=^coeffbuf;
AR=DM(count_update);
AR=AR+1;
DM(count_update)=AR;
AY0=INIT_COUNT;
AF=AR-AY0,AX0=AR;
IF GE JUMP adjust_6;
DM(I4,M4)=24576;
DM(I4,M4)=8192;
DM(I4,M4)=26214;
DM(I4,M4)=6554;
DM(I4,M4)=19661;
DM(I4,M4)=13017;
JUMP comp_meanse;
adjust_6: AY0=INIT_COUNT+10;
AR=AX0-AY0;
IF GE JUMP adjust_7;
DM(I4,M4)=31130;
DM(I4,M4)=1638;
DM(I4,M4)=30147;
DM(I4,M4)=2621;
DM(I4,M4)=21299;
DM(I4,M4)=11469;
JUMP comp_meanse;
adjust_7: AY0=INIT_COUNT+20;
AR=AX0-AY0;
IF GE JUMP adjust_8;
DM(I4,M4)=31785;
DM(I4,M4)=983;
DM(I4,M4)=30802;
DM(I4,M4)=1966;
DM(I4,M4)=22938;
DM(I4,M4)=9830;
JUMP comp_meanse;
adjust_8: AY0=INIT_COUNT+30;
AR=AX0-AY0;
IF GE JUMP adjust_9;
DM(I4,M4)=32440;
DM(I4,M4)=328;
DM(I4,M4)=31457;
DM(I4,M4)=1311;
JUMP adjust_11;
adjust_9: DM(I4,M4)=32604;
DM(I4,M4)=164;
AY0=INIT_COUNT+40;
AR=AX0-AY0;
IF GE JUMP adjust_10;
DM(I4,M4)=32440;
DM(I4,M4)=328;
JUMP adjust_11;
adjust_10: DM(I4,M4)=32702;
DM(I4,M4)=66;
adjust_11: DM(I4,M4)=24576;
DM(I4,M4)=8192;
/*----------compute MeanSE----------------*/
comp_meanse: I4=^coeffbuf;
MX0=DM(I4,M4);
MY0=DM(MeanSE);
MR=MX0 * MY0(SS),MX1=DM(I4,M4);
MY0=DM(ENERGY);
MR=MR+MX1*MY0(SS);
IF MV SAT MR;
DM(MeanSE)=MR1;
/*-----------compute MeanSLE---------------*/
MY0=DM(MeanSLE);
MR=MX0 * MY0(SS);
MY0=DM(ENERGY_low);
MR=MR+MX1*MY0(SS),MX0=DM(I4,M4);
IF MV SAT MR;
DM(MeanSLE)=MR1;
/*-----------compute MeanSZC----------------*/
MY0=DM(MeanSZC);
MR=MX0 * MY0(SS),MX1=DM(I4,M4);
MY0=DM(ZC);
MR=MR+MX1*MY0(SS),MX0=DM(I4,M4);
IF MV SAT MR;
DM(MeanSZC)=MR1;
/*----------compute MeanLSF-----------------*/
// CNTR=M;
I1=^MeanLSF;
I2=^Enc_lsfnew;
MX1=DM(I4,M4);
MY0=DM(I2,M1);
CNTR=M;
DO mult_lsf UNTIL CE;
MR=MX1 * MY0(SS),MY0=DM(I1,M0);
MR=MR+MX0*MY0(SS),MY0=DM(I2,M1);
IF MV SAT MR;
mult_lsf: DM(I1,M1)=MR1;
RTS;
/************************************************************************
* initialize and update the mins and prevmins *
* $$01/10/2000 used only in encoder *
* $$01/11/2000 move dm table to pm table area *
* Calling Parameters *
* SI : reflection coefficient *
* Enc_Frame : frame counter *
* Enc_pastVad: VAD decision of the last frame *
* Enc_ppastVad: VAD decision of the frame before last frame *
* Return Values *
* Altered Registers: MR,SR,AR,AF,AX0,AX1,AY0,AY1,MX0,MX1,MY0,MY1 *
* Computation Time : 18 cycles *
*************************************************************************/
.VAR/DM/RAM/SEG=App_DMtmp dSE,dSLE,dSZC;
calc_mean: AY0=INIT_FRAME;
AR=AX0-AY0;
IF GT JUMP set_parameter;
AX1=DM(ENERGY);
AY1=3072;
AR=AX1-AY1;
AR=PASS AR;
IF GE JUMP gt_energy;
AR=PASS NOISE;
DM(VadEncode)=AR;
AY1=DM(less_count);
AR=AY1+1;
DM(less_count)=AR;
JUMP set_parameter;
gt_energy: AR=PASS VOICE;
DM(VadEncode)=AR;
MR0=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -