Exemplo n.º 1
0
Arquivo: wb_vad.c Projeto: Leephan/vad
 /******************************************************************************  
 *  
 *     Function     : filter_bank  
 *     Purpose      : Divide input signal into bands and calculate level of  
 *                    the signal in each band  
 *  
 *******************************************************************************  
 */   
 static void filter_bank(   
   VadVars *st,   /* i/o : State struct               */   
   float in[],   /* i   : input frame                */   
   float level[] /* 0   : signal levels at each band */   
 )   
 {   
   Word16 i;   
   float tmp_buf[FRAME_LEN];   
   /* shift input 1 bit down for safe scaling */   
   for (i = 0; i < FRAME_LEN; i++) {   
     tmp_buf[i] = in[i]/2.0f;   
   }   
   /* run the filter bank */   
   for (i = 0;i < FRAME_LEN/2; i++) {   
     filter5(&tmp_buf[2*i],&tmp_buf[2*i+1],st->a_data5[0]);   
   }   
   for (i = 0;i < FRAME_LEN/4; i++) {   
     filter5(&tmp_buf[4*i],&tmp_buf[4*i+2],st->a_data5[1]);   
     filter5(&tmp_buf[4*i+1],&tmp_buf[4*i+3],st->a_data5[2]);   
   }   
   for (i = 0; i < FRAME_LEN/8; i++)   
   {   
      filter5(&tmp_buf[8*i], &tmp_buf[8*i+4], st->a_data5[3]);   
      filter5(&tmp_buf[8*i+2], &tmp_buf[8*i+6], st->a_data5[4]);   
      filter3(&tmp_buf[8*i+3],&tmp_buf[8*i+7],&st->a_data3[0]);   
   }   
   for (i = 0; i < FRAME_LEN/16; i++)   
   {   
      filter3(&tmp_buf[16*i+0], &tmp_buf[16*i+8], &st->a_data3[1]);   
      filter3(&tmp_buf[16*i+4], &tmp_buf[16*i+12], &st->a_data3[2]);   
      filter3(&tmp_buf[16*i+6], &tmp_buf[16*i+14], &st->a_data3[3]);   
   }   
   for (i = 0; i < FRAME_LEN/32; i++)   
   {   
      filter3(&tmp_buf[32*i+0], &tmp_buf[32*i+16], &st->a_data3[4]);   
      filter3(&tmp_buf[32*i+8], &tmp_buf[32*i+24], &st->a_data3[5]);   
   }   
   /* calculate levels in each frequency band */   
   /* 4800 - 6400 Hz*/   
   level[11] = level_calculation(tmp_buf, &st->sub_level[11],   
                 FRAME_LEN/4-48, FRAME_LEN/4, 4, 1, 0.25);   
   /* 4000 - 4800 Hz*/   
   level[10] = level_calculation(tmp_buf, &st->sub_level[10],   
                 FRAME_LEN/8-24, FRAME_LEN/8, 8, 7, 0.5);   
   /* 3200 - 4000 Hz*/   
   level[9] = level_calculation(tmp_buf, &st->sub_level[9],   
                FRAME_LEN/8-24, FRAME_LEN/8, 8, 3, 0.5);   
   /* 2400 - 3200 Hz*/   
   level[8] = level_calculation(tmp_buf, &st->sub_level[8],   
                FRAME_LEN/8-24, FRAME_LEN/8, 8, 2, 0.5);   
   /* 2000 - 2400 Hz*/   
   level[7] = level_calculation(tmp_buf, &st->sub_level[7],   
                FRAME_LEN/16-12, FRAME_LEN/16, 16, 14, 1.0);   
   /* 1600 - 2000 Hz*/   
   level[6] = level_calculation(tmp_buf, &st->sub_level[6],   
                FRAME_LEN/16-12, FRAME_LEN/16, 16, 6, 1.0);   
   /* 1200 - 1600 Hz*/   
   level[5] = level_calculation(tmp_buf, &st->sub_level[5],   
                FRAME_LEN/16-12, FRAME_LEN/16, 16, 4, 1.0);   
   /* 800 - 1200 Hz*/   
   level[4] = level_calculation(tmp_buf, &st->sub_level[4],   
                FRAME_LEN/16-12, FRAME_LEN/16, 16, 12, 1.0);   
   /* 600 - 800 Hz*/   
   level[3] = level_calculation(tmp_buf, &st->sub_level[3],   
                FRAME_LEN/32-6, FRAME_LEN/32, 32, 8, 2.0);   
   /* 400 - 600 Hz*/   
   level[2] = level_calculation(tmp_buf, &st->sub_level[2],   
                FRAME_LEN/32-6, FRAME_LEN/32, 32, 24, 2.0);   
   /* 200 - 400 Hz*/   
   level[1] = level_calculation(tmp_buf, &st->sub_level[1],   
                FRAME_LEN/32-6, FRAME_LEN/32, 32, 16, 2.0);   
   /* 0 - 200 Hz*/   
   level[0] = level_calculation(tmp_buf, &st->sub_level[0],   
                FRAME_LEN/32-6, FRAME_LEN/32, 32, 0, 2.0);   
 }   
Exemplo n.º 2
0
/****************************************************************************
 *
 *     Function     : filter_bank
 *     Purpose      : Divides input signal into 9-bands and calculas level of
 *                    the signal in each band 
 *
 ***************************************************************************/
void filter_bank(vadState1 *st,  /* i/o : State struct               */
                        Word16 in[],   /* i   : input frame                */
                        Word16 level[] /* 0   : signal levels at each band */
                        )
{
  Word16 i;
  Word16 tmp_buf[FRAME_LEN];

  /* calculate the filter bank */

  first_filter_stage(in, tmp_buf, st->a_data5[0]);
  
  for (i = 0; i < FRAME_LEN/4; i++)
  {
     filter5(&tmp_buf[4*i], &tmp_buf[4*i+2], st->a_data5[1]);
     filter5(&tmp_buf[4*i+1], &tmp_buf[4*i+3], st->a_data5[2]);
  }
  for (i = 0; i < FRAME_LEN/8; i++)
  {
     filter3(&tmp_buf[8*i+0], &tmp_buf[8*i+4], &st->a_data3[0]);
     filter3(&tmp_buf[8*i+2], &tmp_buf[8*i+6], &st->a_data3[1]);
     filter3(&tmp_buf[8*i+3], &tmp_buf[8*i+7], &st->a_data3[4]);
  }
  
  for (i = 0; i < FRAME_LEN/16; i++)
  {
     filter3(&tmp_buf[16*i+0], &tmp_buf[16*i+8], &st->a_data3[2]);
     filter3(&tmp_buf[16*i+4], &tmp_buf[16*i+12], &st->a_data3[3]);
  }
  
  /* calculate levels in each frequency band */
  
  /* 3000 - 4000 Hz*/
  level[8] = level_calculation(tmp_buf, &st->sub_level[8], FRAME_LEN/4-8,
                               FRAME_LEN/4, 4, 1, 15);
  
  /* 2500 - 3000 Hz*/  
  level[7] = level_calculation(tmp_buf, &st->sub_level[7], FRAME_LEN/8-4,
                               FRAME_LEN/8, 8, 7, 16);
  
  /* 2000 - 2500 Hz*/
  level[6] = level_calculation(tmp_buf, &st->sub_level[6], FRAME_LEN/8-4,
                               FRAME_LEN/8, 8, 3, 16);
  
  /* 1500 - 2000 Hz*/
  level[5] = level_calculation(tmp_buf, &st->sub_level[5], FRAME_LEN/8-4,
                               FRAME_LEN/8, 8, 2, 16);
  
  /* 1000 - 1500 Hz*/
  level[4] = level_calculation(tmp_buf, &st->sub_level[4], FRAME_LEN/8-4,
                               FRAME_LEN/8, 8, 6, 16);
  
  /* 750 - 1000 Hz*/
  level[3] = level_calculation(tmp_buf, &st->sub_level[3], FRAME_LEN/16-2,
                               FRAME_LEN/16, 16, 4, 16);
  
  /* 500 - 750 Hz*/
  level[2] = level_calculation(tmp_buf, &st->sub_level[2], FRAME_LEN/16-2,
                               FRAME_LEN/16, 16, 12, 16);
  
  /* 250 - 500 Hz*/
  level[1] = level_calculation(tmp_buf, &st->sub_level[1], FRAME_LEN/16-2,
                               FRAME_LEN/16, 16, 8, 16);
  
  /* 0 - 250 Hz*/
  level[0] = level_calculation(tmp_buf, &st->sub_level[0], FRAME_LEN/16-2,
                               FRAME_LEN/16, 16, 0, 16);
  
}