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

📄 voice activity detection.c

📁 传统的有声无声检测方法只能在相对安静的环境下(<20dB)进行。因此传统方法不能满足噪声环境下的检测要求;另一方面
💻 C
字号:
附录1、 DSP上所使用的程序
#include < file.h>
#include <stdlib.h>
#include <stdio.h>
#include <intrin.h>
#include<math.h>
#define TIM_PRD	    	*(int *)0x808028  /*定时器0的周期寄存器地址*/
#define TIM_CNT     	*(int *)0x808024  /*定时器0的计数寄存器地址*/
#define TIM_CTL     	*(int *)0x808020   /*定时器0的控制寄存器地址*/

#define TIM_CTL_VALUE   0x6c1                /*定时器工作方式控制字*/
#define TIM_PRD_VALUE   1750        /* 60Mhz/sample frequency ,定时器周期值,用它来控制采样率:fs=fclk/PRD*/
 
#define TIM_START       0xc0     /*开启定时器的常数,与控制字相或即可*/
#define AD_CS_ADDR       *(int *)0xf00000   /*port address, ADS7864的数据地址*/
#define AD_RS_ADDR       *(int *)0xf00001    
#define FIFO_RS_ADDR     *(int *)0xf00002 
#define DAC0    *(int *)0xe00004   /*CHANNEL0*/
#define DAC1    *(int *)0xe00005   /*CHANNEL1*/
#define DAC2    *(int *)0xe00006   /*CHANNEL0*/
#define DAC3    *(int *)0xe00007   /*CHANNEL1*/
                                                        
#define Latch_Data_CHA   *(int *)0xb00001  /*控制ADS7864工作方式的地址*/
#define Latch_Data_CHB   *(int *)0xb00002 
#define Latch_Data_CHC   *(int *)0xb00004
#define Latch_Data_CHAB  *(int *)0xb00003
#define Latch_Data_CHAC  *(int *)0xb00005
#define Latch_Data_CHBC  *(int *)0xb00006                                                   
#define Latch_Data_CHABC *(int *)0xb00007   /* 3 channel */  
#define Latch_Data       *(int *)0xb00007
#define VC33RAM3         *(int *)0x803FFF
#define VECS_EXINT0	     *(int *)0x809fc1 

void  sintab_initial(void); 
void hanning(void);
void add_hanning(void); 
extern int fft(float *a,float *b);
extern int ifft(float *a,float *b);
void pause_detection(void);
void noise_get(void);
void phase_amp(void); 
int i,j,m,buffer,k,count;
cregister unsigned int IE,IF,ST,IOF;
interrupt void adfifo_int(void);
unsigned char ChNumber; 
int inter_buf[2];
float sintab[350],junzhi0,sum0,buff;
float fft_in[512],fft_out[512],han[256],ifft_out[256],amp[256],amp0[256],real_img[256];
float input[512],output[256],output1[256];
float noise[256];
int  bitrev_index[256],point=0,temp,first,start;
float snoise[256],kk=0,a=1.0,test,aa=5.0;//,kk=0.01;
int  silence,NN;
float Emax,Emin,Elpmax,Elpmin,Ehpmax,Ehpmin;

main()
{
	 ST = 0x0000;
	/* IOF = 0x06; xf0=1*/
	 TIM_CTL=TIM_CTL_VALUE;         /*设定定时器工作方式及其频率*/
	 TIM_CNT=0;
	 TIM_PRD=TIM_PRD_VALUE;
	 TIM_CTL=TIM_CTL_VALUE|TIM_START;
	                             
     IOF  = 0x22;      
     ChNumber=0x01;
for(i=0;i<10;i++);
Latch_Data = ChNumber;
IOF=0x66;
for(i=0;i<10;i++);
      IE=1;
      IF=0x0;
VECS_EXINT0=0x60000000|(unsigned)adfifo_int;
ST=0x2000;
sintab_initial();
for(;;)
  { 
    if(point==128)
    { first=1;
     for(i=0;I<256;I++)
     {
         fft_in[i]=input[i+256];      
         fft_in[i+256]=input[i];
       }
add_hanning();
start++;
}
if(point==256)
    {point=0;first=1;
     for(i=0;i<512;i++)
fft_in[i]=input[i];      
     add_hanning();
     start++;
    if(first!=0)
     {fft(fft_in,sintab);    
       for(i=0;I<256;i++)
   {    fft_out[2*i]=fft_in[bitrev_index[i]];
        fft_out[2*i+1]=fft_in[bitrev_index[i]+1];
       }       
       if(start>=80)
       {phase_amp();        
        pause_detection();

       }
       first=0;
      }    
              
    }
 }   

interrupt void adfifo_int(void)
{  int buf1;
 for(j=0;j<2;j++)
{buffer=AD_CS_ADDR;
    k=buffer&0x0f000;    
    if(k==0x08000)    
    {buf1=buffer&0x0fff;j=8;}    
  }  
   
   if(count++<5000)
   sum0+=buf1;
  if(count>=5000)
    { count=200000;
     junzhi0=sum0/5000;
     buff=buf1-junzhi0;
   
    m=point*2;
    input[m]=buff; input[m+1]=0;

    /*buffer=(2*buff+junzhi0);
    DAC2=buffer;                   //J6   original source    
    DAC0=buffer; 
    DAC1=buffer; 
    DAC3=buffer; */
   
    buffer= buff+0x0800;
    buffer=2.4*output[point]+0x0800;
    if(NN==0)          
    buffer=0x0fff;
    else
    buffer=0x0000;      /*speech detected NN=1*/
    DAC3=buffer; 
    
    point++;
   }                       
}
   
                          
void phase_amp(void)
{int n;
for(n=0;n<128;n++)
{  amp0[n]=(fft_out[2*n]*fft_out[2*n]+fft_out[2*n+1]*fft_out[2*n+1]);
   real_img[n*2]=fft_out[2*n];real_img[n*2+1]=fft_out[2*n+1];
 }
 for(n=256;n<512;n++)
fft_out[n]=0;
}
void pause_detection(void)
{int n;
 float mid;
 float E,Elp,Ehp,deta,detalp,detahp;
 if(start= =80)
{
  E=0;Elp=0;Ehp=0;
  for (n=0;n<128;n++)
 {
   mid=amp0[n];
    E+=mid;
    if(n<63)
Elp+=mid;
   }
    Ehp=E-Elp;
    E=10*log10(E);Elp=10*log10(Elp);Ehp=10*log10(Ehp);
    Emin=E;Emax=E;Elpmin=Elp;Elpmax=Elp;Ehpmin=Ehp;Ehpmax=Ehp;
  }
  if(start>80)
{ 
  E=0;Elp=0;Ehp=0;silence=0;
  for(n=0;n<128;n++)
 {mid=amp0[n];
   E+=mid;
   if(n<63)
 Elp+=mid;
  }
   Ehp=E-Elp;
   E=10*log10(E);Elp=10*log10(Elp);Ehp=10*log10(Ehp);
   if(E>Emax)
   Emax=E;
   else
   Emax=Emax-(Emax-Emin)*0.032/3;
  If(E<Emin)
   Emin=E;
   else
   Emin=Emin+(Emax-Emin)*0.032/3;
   deta=Emax-Emin;
   if(Elp>Elpmax)
   Elpmax=Elp;
   else        
   Elpmax=Elpmax-(Elpmax-Elpmin)*0.032/3;
detalp=Elpmax-Elpmin;
   if(Ehp>Ehpmax) 
   Ehpmax=Ehp;
   else        
   Ehpmax=Ehpmax-(Ehpmax-Ehpmin)*0.032/3;   
   if(Ehp<Ehpmin)
  Ehpmin=Ehp;
   else
   Ehpmin=Ehpmin+(Ehpmax-Ehpmin)*0.032/3;   
   detahp=Ehpmax-Ehpmin;
   if(detalp<5)
 {
   if(detahp<5)
   {silence=;goto detected;}
if(Ehp-Ehpmin<0.1detahp)
 if(E-Emin<0.5*data)
  {silence=2;goto detected1;}
}
   else                        //detalp>5
   if(Elp-Elpmin<0.1*detahp)
 if(detahp<5)
 {if((E-Emin)< 0.5*deta)
     {silence=3;goto detected1;}
goto detected;
}
else
   if(Ehp-Ehpmin<0.5*detahp)
{silence=5;goto detected1;}
   else
   goto sp;
   if(detahp<5)
goto detected;
sp: if(Ehp-Ehpmin>0.1*detahp)
   goto detected;
   if(detalp>2*5)
   {if(Elp-Elpmin<2*0.1*detalp)
    {silence=6;goto detected1;}
     goto detected;
   }
   else
   if(Elp-Elpmin<0.5*detalp)
   {silence=7;goto detected1;}
    goto detected;
  }

 detected1:NN=0;goto dete_end;      /*NO speech detected*/
 detected:NN=1;                     /*speech detected NN=1*/
 dete_end:;
}
void add_hanning(void)
{ int I;
 float pi=3.14159265;
for(i=0;i<256;i++)
han[i]=0.5*(1-cos((2*pi)*i/255));
} 

void sintab_initial(void)
{
int i; 
float pi1[]={1.000000000,0.999698819,0.998795456,0.997290457,
          0.995184727,0.992479535,0.98917651, 0.985277642,
          0.98078528, 0.97570213, 0.970031253,0.963776066,
          0.956940336,0.949528181,0.941544065,0.932992799,
          0.923879533,0.914209756,0.903989293,0.893224301,
          0.881921264,0.870086991,0.85772861, 0.844853565,
          0.831469612,0.817584813,0.803207531,0.788346428,
          0.773010453,0.757208847,0.740951125,0.724247083,
          0.707106781,0.689540545,0.671558955,0.653172843,
          0.634393284,0.615231591,0.595699304,0.575808191,
          0.555570233,0.53499762, 0.514102744,0.492898192,
0.	471396737,0.44961133, 0.427555093,0.405241314, 
0.382683432,0.359895037,0.336889853,0.31368174,
          0.290284677,0.266712757,0.24298018, 0.21910124,
          0.195090322,0.170961889,0.146730474,0.122410675,
          0.09801714, 0.073564564,0.049067674,0.024541229,
          },
   pi2[]={0.00000000,0.024541229,0.049067674,0.073564564, 0.09801714,
          0.122410675,0.146730474, 0.170961889, 0.195090322,
          0.21910124, 0.24298018, 0.266712757, 0.290284677,
0.31368174, 0.336889853,0.359895037, 0.382683432
0.405241314,0.427555093, 0.44961133, 0.471396737,
          0.492898192,0.514102744, 0.53499762, 0.555570233,
          0.575808191,0.595699304, 0.615231591, 0.634393284,
          0.653172843,0.671558955, 0.689540545, 0.707106781,
          0.724247083,0.740951125, 0.757208847,0.773010453,
          0.788346428,0.803207531,0.817584813,0.831469612,
          0.844853565,0.85772861, 0.870086991, 0.881921264,
          0.893224301,0.903989293,0.914209756, 0.923879533,
          0.932992799,0.941544065,0.949528181,0.956940336,
          0.963776066,0.970031253,0.97570213, 0.98078528,
          0.985277642,0.98917651, 0.992479535,0.995184727,
          
          0.997290457,0.998795456,0.999698819,
         };              
         
  int a[]={0,128,64,192,32,160, 96,224,16,144,80,208,48,176,112,240,    
          8,136,72,200,40,168,104,232,24,152,88,216,56,184,120,248,    
          4,132,68,196,36,164,100,228,20,148,84,212,52,180,116,244,      
         12,140,76,204,44,172,108,236,28,156,92,220,60,188,124,252,    
          2,130,66,194,34,162, 98,226,18,146,82,210,50,178,114,242,    
         10,138,74,202,42,170,106,234,26,154,90,218,58,186,122,250,    
          6,134,70,198,38,166,102,230,22,150,86,214,54,182,118,246,    
         14,142,78,206,46,174,110,238,30,158,94,222,62,190,126,254,    
          1,129,65,193,33,161, 97,225,17,145,81,209,49,177,113,241,    
          9,137,73,201,41,169,105,233,25,153,89,217,57,185,121,249,    
          5,133,69,197,37,165,101,229,21,149,85,213,53,181,117,245,    
         13,141,77,205,45,173,109,237,29,157,93,221,61,189,125,253,    
          3,131,67,195,35,163, 99,227,19,147,83,211,51,179,115,243,    
         11,139,75,203,43,171,107,235,27,155,91,219,59,187,123,251,    
          7,135,71,199,39,167,103,231,23,151,87,215,55,183,119,247,    
         15,143,79,207,47,175,111,239,31,159,95,223,63,191,127,255                         
        }; 
   for(i=0;I<64;i++)   
{
sintab[i]=pi2[i];sintab[i+64]=pi1[i];sintab[i+128]=-pi2[i];sintab[i+192]=-pi1[i];sintab[i+256]=pi2[i];
    }
     for(i=0;I<256;i++)
     bitrev_index[i]=a[i]*2; 
     for(i=0;I<512;i++)
     {input[i]=0;output[i]=0;fft_in[i]=0;output1[i];}
   hanning(); han[255]=0; point=0;first=0;start=0;
   
   count=0;junzhi0=0.0;sum0=0.0;
 }    

 

⌨️ 快捷键说明

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