/****************************************************************************** * * 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); }
/**************************************************************************** * * 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); }