123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914 |
- const char vad2_id[] = "@(#)$Id $";
- #include <stdio.h>
- #include <stdlib.h>
- #include "typedef.h"
- #include "cnst.h"
- #include "basic_op.h"
- #include "oper_32b.h"
- #include "count.h"
- #include "log2.h"
- #include "pow2.h"
- #include "vad2.h"
- Word16 fn10Log10 (Word32 L_Input, Word16 fbits)
- {
- Word16 integer;
- Word16 fraction;
- Word32 Ltmp;
- Word16 tmp;
- Log2(L_Input, &integer, &fraction);
- integer = sub_ex(integer, fbits);
- Ltmp = Mpy_32_16 (integer, fraction, 24660);
- Ltmp = L_shr_r_ex(Ltmp, 5+1);
- tmp = extract_l_ex(Ltmp);
- return (tmp);
- }
- Word16 block_norm_ex (Word16 * in, Word16 * out, Word16 length, Word16 headroom)
- {
- Word16 i, max, scnt, adata;
- max = abs_s_ex(in[0]);
- for (i = 1; i < length; i++)
- {
- adata = abs_s_ex(in[i]); test();
- if (sub_ex(adata, max) > 0)
- {
- max = adata; move16();
- }
- }
- test();
- if (max != 0)
- {
- scnt = sub_ex(norm_s_ex(max), headroom);
- for (i = 0; i < length; i++)
- {
- out[i] = shl_ex(in[i], scnt); move16();
- }
- }
- else
- {
- scnt = sub_ex(16, headroom);
- for (i = 0; i < length; i++)
- {
- out[i] = 0; move16();
- }
- }
- return (scnt);
- }
- Word16 vad2 (Word16 * farray_ptr, vadState2 * st)
- {
-
- static Word16 ch_tbl[NUM_CHAN][2] =
- {
- {2, 3},
- {4, 5},
- {6, 7},
- {8, 9},
- {10, 11},
- {12, 13},
- {14, 16},
- {17, 19},
- {20, 22},
- {23, 26},
- {27, 30},
- {31, 35},
- {36, 41},
- {42, 48},
- {49, 55},
- {56, 63}
- };
-
- static Word16 ch_tbl_sh[NUM_CHAN] =
- {
- 16384, 16384, 16384, 16384, 16384, 16384, 10923, 10923,
- 10923, 8192, 8192, 6554, 5461, 4681, 4681, 4096
- };
-
- static Word16 vm_tbl[90] =
- {
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7,
- 8, 8, 9, 9, 10, 10, 11, 12, 12, 13, 13, 14, 15,
- 15, 16, 17, 17, 18, 19, 20, 20, 21, 22, 23, 24,
- 24, 25, 26, 27, 28, 28, 29, 30, 31, 32, 33, 34,
- 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45,
- 46, 47, 48, 49, 50, 50, 50, 50, 50, 50, 50, 50,
- 50, 50
- };
-
- static Word16 hangover_table[20] =
- {
- 30, 30, 30, 30, 30, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 8, 8, 8
- };
-
- static Word16 burstcount_table[20] =
- {
- 8, 8, 8, 8, 8, 8, 8, 8, 7, 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4
- };
-
- static Word16 vm_threshold_table[20] =
- {
- 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 40, 51, 71, 100, 139, 191, 257, 337, 432
- };
-
- static Word16 noise_floor_chan[2] = {NOISE_FLOOR_CHAN_0, NOISE_FLOOR_CHAN_1};
- static Word16 min_chan_enrg[2] = {MIN_CHAN_ENRG_0, MIN_CHAN_ENRG_1};
- static Word16 ine_noise[2] = {INE_NOISE_0, INE_NOISE_1};
- static Word16 fbits[2] = {FRACTIONAL_BITS_0, FRACTIONAL_BITS_1};
- static Word16 state_change_shift_r[2] = {STATE_1_TO_0_SHIFT_R, STATE_0_TO_1_SHIFT_R};
-
- static Word16 enrg_norm_shift[2] = {(FRACTIONAL_BITS_0-1+2), (FRACTIONAL_BITS_1-1+2)};
-
- Word32 Lenrg;
- Word32 Ltne;
- Word32 Ltce;
- Word16 tne_db;
- Word16 tce_db;
- Word16 input_buffer[FRM_LEN];
- Word16 data_buffer[FFT_LEN];
- Word16 ch_snr[NUM_CHAN];
- Word16 ch_snrq;
- Word16 vm_sum;
- Word16 ch_enrg_dev;
- Word32 Lpeak;
- Word16 p2a_flag;
- Word16 ch_enrg_db[NUM_CHAN];
- Word16 ch_noise_db;
- Word16 alpha;
- Word16 one_m_alpha;
- Word16 update_flag;
- Word16 i, j, j1, j2;
- Word16 hi1, lo1;
- Word32 Ltmp, Ltmp1, Ltmp2;
- Word16 tmp;
- Word16 normb_shift;
- Word16 ivad;
- Word16 tsnrq;
- Word16 xt;
- Word16 state_change;
-
- st->Lframe_cnt = L_add_ex(st->Lframe_cnt, 1);
-
- normb_shift = block_norm_ex(farray_ptr, input_buffer, FRM_LEN, FFT_HEADROOM);
-
- for (i = 0; i < DELAY; i++)
- {
- data_buffer[i] = 0; move16();
- }
- st->pre_emp_mem = shr_r_ex(st->pre_emp_mem, sub_ex(st->last_normb_shift, normb_shift));
- st->last_normb_shift = normb_shift; move16();
- data_buffer[DELAY] = add_ex(input_buffer[0], mult_ex(PRE_EMP_FAC, st->pre_emp_mem)); move16();
- for (i = DELAY + 1, j = 1; i < DELAY + FRM_LEN; i++, j++)
- {
- data_buffer[i] = add_ex(input_buffer[j], mult_ex(PRE_EMP_FAC, input_buffer[j-1])); move16();
- }
- st->pre_emp_mem = input_buffer[FRM_LEN-1]; move16();
- for (i = DELAY + FRM_LEN; i < FFT_LEN; i++)
- {
- data_buffer[i] = 0; move16();
- }
-
- r_fft_ex(data_buffer);
-
- state_change = 0; move16();
- test();
- if (st->shift_state == 0)
- { test();
- if (sub_ex(normb_shift, -FFT_HEADROOM+2) <= 0)
- {
- state_change = 1; move16();
- st->shift_state = 1; move16();
- }
- }
- else
- { test();
- if (sub_ex(normb_shift, -FFT_HEADROOM+5) >= 0)
- {
- state_change = 1; move16();
- st->shift_state = 0; move16();
- }
- }
- test();
- if (state_change)
- {
- for (i = LO_CHAN; i <= HI_CHAN; i++)
- {
- st->Lch_enrg[i] = L_shr_ex(st->Lch_enrg[i], state_change_shift_r[st->shift_state]); move32();
- }
- }
-
- test();
- if (L_sub_ex(st->Lframe_cnt, 1) == 0)
- {
- alpha = 32767; move16();
- one_m_alpha = 0; move16();
- }
- else
- {
- alpha = CEE_SM_FAC; move16();
- one_m_alpha = ONE_MINUS_CEE_SM_FAC; move16();
- }
- for (i = LO_CHAN; i <= HI_CHAN; i++)
- {
- Lenrg = 0; move16();
- j1 = ch_tbl[i][0]; move16();
- j2 = ch_tbl[i][1]; move16();
- for (j = j1; j <= j2; j++)
- {
- Lenrg = L_mac_ex(Lenrg, data_buffer[2 * j], data_buffer[2 * j]);
- Lenrg = L_mac_ex(Lenrg, data_buffer[2 * j + 1], data_buffer[2 * j + 1]);
- }
-
- Lenrg = L_shr_r_ex(Lenrg, sub_ex(shl_ex(normb_shift, 1), enrg_norm_shift[st->shift_state]));
-
- tmp = mult_ex(alpha, ch_tbl_sh[i]);
- L_Extract (Lenrg, &hi1, &lo1);
- Ltmp = Mpy_32_16(hi1, lo1, tmp);
- L_Extract (st->Lch_enrg[i], &hi1, &lo1);
- st->Lch_enrg[i] = L_add_ex(Ltmp, Mpy_32_16(hi1, lo1, one_m_alpha)); move32();
- test();
- if (L_sub_ex(st->Lch_enrg[i], min_chan_enrg[st->shift_state]) < 0)
- {
- st->Lch_enrg[i] = min_chan_enrg[st->shift_state]; move32();
- }
- }
-
- Ltce = 0; move16();
- for (i = LO_CHAN; i <= HI_CHAN; i++)
- {
- Ltce = L_add_ex(Ltce, st->Lch_enrg[i]);
- }
-
- Lpeak = 0; move32();
- for (i = LO_CHAN+2; i <= HI_CHAN; i++)
- { test();
- if (L_sub_ex(st->Lch_enrg [i], Lpeak) > 0)
- {
- Lpeak = st->Lch_enrg [i]; move32();
- }
- }
-
-
-
- L_Extract (Ltce, &hi1, &lo1);
- Ltmp = Mpy_32_16(hi1, lo1, 20480);
- test();
- if (L_sub_ex(Lpeak, Ltmp) > 0)
- {
- p2a_flag = TRUE; move16();
- }
- else
- {
- p2a_flag = FALSE; move16();
- }
-
-
- test();
- if (L_sub_ex(st->Lframe_cnt, 4) <= 0)
- { test();
- if (p2a_flag == TRUE)
- {
- for (i = LO_CHAN; i <= HI_CHAN; i++)
- {
- st->Lch_noise[i] = INE_NOISE_0; move32();
- }
- }
- else
- {
- for (i = LO_CHAN; i <= HI_CHAN; i++)
- { test();
- if (L_sub_ex(st->Lch_enrg[i], ine_noise[st->shift_state]) < 0)
- {
- st->Lch_noise[i] = INE_NOISE_0; move32();
- }
- else
- { test();
- if (st->shift_state == 1)
- {
- st->Lch_noise[i] = L_shr_ex(st->Lch_enrg[i], state_change_shift_r[0]);
- move32();
- }
- else
- {
- st->Lch_noise[i] = st->Lch_enrg[i]; move32();
- }
- }
- }
- }
- }
-
- vm_sum = 0; move16();
- for (i = LO_CHAN; i <= HI_CHAN; i++)
- {
- ch_enrg_db[i] = fn10Log10(st->Lch_enrg[i], fbits[st->shift_state]); move16();
- ch_noise_db = fn10Log10(st->Lch_noise[i], FRACTIONAL_BITS_0);
- ch_snr[i] = sub_ex(ch_enrg_db[i], ch_noise_db); move16();
-
-
-
-
- ch_snrq = shr_r_ex(mult_ex(21845, ch_snr[i]), 6);
- test();
- if (sub_ex(ch_snrq, 89) < 0)
- { test();
- if (ch_snrq > 0)
- {
- j = ch_snrq; move16();
- }
- else
- {
- j = 0; move16();
- }
- }
- else
- {
- j = 89; move16();
- }
- vm_sum = add_ex(vm_sum, vm_tbl[j]);
- }
-
- test(),test(),logic16();
- if (L_sub_ex(st->Lframe_cnt, 4) <= 0 || st->fupdate_flag == TRUE)
- {
-
- tce_db = 14320; move16();
- st->negSNRvar = 0; move16();
- st->negSNRbias = 0; move16();
-
- Ltne = 0; move32();
- for (i = LO_CHAN; i <= HI_CHAN; i++)
- {
- Ltne = L_add_ex(Ltne, st->Lch_noise[i]);
- }
-
- tne_db = fn10Log10(Ltne, FRACTIONAL_BITS_0);
-
- xt = sub_ex(tce_db, tne_db);
- st->tsnr = xt; move16();
- }
- else
- {
-
-
- Ltmp1 = 0; move32();
- for (i=LO_CHAN; i<=HI_CHAN; i++) {
-
- Ltmp2 = L_shr_ex(L_mult_ex(ch_snr[i], 10885), 8);
- L_Extract(Ltmp2, &hi1, &lo1);
- hi1 = add_ex(hi1, 3);
- Ltmp1 = L_add_ex(Ltmp1, Pow2(hi1, lo1));
- }
- xt = fn10Log10(Ltmp1, 4+3);
- test(),test();
- if (sub_ex(xt, st->tsnr) > 0)
- {
-
- st->tsnr = round_ex(L_add_ex(L_mult_ex(29491, st->tsnr), L_mult_ex(3277, xt)));
- }
-
- else if (sub_ex(xt, mult_ex(20480, st->tsnr)) > 0)
- {
-
- st->tsnr = round_ex(L_add_ex(L_mult_ex(32702, st->tsnr), L_mult_ex(66, xt)));
- }
- }
-
- tsnrq = shr_ex(mult_ex(st->tsnr, 10923), 8);
- test(),test();
- if (sub_ex(tsnrq, 19) > 0)
- {
- tsnrq = 19; move16();
- }
- else if (tsnrq < 0)
- {
- tsnrq = 0; move16();
- }
-
- test();
- if (xt < 0)
- {
-
-
- tmp = round_ex(L_shl_ex(L_mult_ex(xt, xt), 7));
- st->negSNRvar = round_ex(L_add_ex(L_mult_ex(32440, st->negSNRvar), L_mult_ex(328, tmp)));
- test();
- if (sub_ex(st->negSNRvar, 1024) > 0)
- {
- st->negSNRvar = 1024; move16();
- }
-
- tmp = mult_r_ex(shl_ex(sub_ex(st->negSNRvar, 166), 4), 24576); test();
- if (tmp < 0)
- {
- st->negSNRbias = 0; move16();
- }
- else
- {
- st->negSNRbias = shr_ex(tmp, 8);
- }
- }
-
- tmp = add_ex(vm_threshold_table[tsnrq], st->negSNRbias); test();
- if (sub_ex(vm_sum, tmp) > 0)
- {
- ivad = 1; move16();
- st->burstcount = add_ex(st->burstcount, 1); test();
- if (sub_ex(st->burstcount, burstcount_table[tsnrq]) > 0)
- {
- st->hangover = hangover_table[tsnrq]; move16();
- }
- }
- else
- {
- st->burstcount = 0; move16();
- st->hangover = sub_ex(st->hangover, 1); test();
- if (st->hangover <= 0)
- {
- ivad = 0; move16();
- st->hangover = 0; move16();
- }
- else
- {
- ivad = 1; move16();
- }
- }
-
- ch_enrg_dev = 0; move16();
- test();
- if (L_sub_ex(st->Lframe_cnt, 1) == 0)
- {
- for (i = LO_CHAN; i <= HI_CHAN; i++)
- {
- st->ch_enrg_long_db[i] = ch_enrg_db[i]; move16();
- }
- }
- else
- {
- for (i = LO_CHAN; i <= HI_CHAN; i++)
- {
- tmp = abs_s_ex(sub_ex(st->ch_enrg_long_db[i], ch_enrg_db[i]));
- ch_enrg_dev = add_ex(ch_enrg_dev, tmp);
- }
- }
-
-
- tmp = sub_ex(st->tsnr, xt); test(),logic16(),test(),test();
- if (tmp <= 0 || st->tsnr <= 0)
- {
- alpha = HIGH_ALPHA; move16();
- one_m_alpha = 32768L-HIGH_ALPHA; move16();
- }
- else if (sub_ex(tmp, st->tsnr) > 0)
- {
- alpha = LOW_ALPHA; move16();
- one_m_alpha = 32768L-LOW_ALPHA; move16();
- }
- else
- {
- tmp = div_s(tmp, st->tsnr);
- alpha = sub_ex(HIGH_ALPHA, mult_ex(ALPHA_RANGE, tmp));
- one_m_alpha = sub_ex(32767, alpha);
- }
-
- for (i = LO_CHAN; i <= HI_CHAN; i++)
- {
- Ltmp1 = L_mult_ex(one_m_alpha, ch_enrg_db[i]);
- Ltmp2 = L_mult_ex(alpha, st->ch_enrg_long_db[i]);
- st->ch_enrg_long_db[i] = round_ex(L_add_ex(Ltmp1, Ltmp2));
- }
-
- update_flag = FALSE; move16();
- st->fupdate_flag = FALSE; move16();
- test(),test();
- if (sub_ex(vm_sum, UPDATE_THLD) <= 0)
- { test();
- if (st->burstcount == 0)
- {
- update_flag = TRUE; move16();
- st->update_cnt = 0; move16();
- }
- }
- else if (L_sub_ex(Ltce, noise_floor_chan[st->shift_state]) > 0)
- { test();
- if (sub_ex(ch_enrg_dev, DEV_THLD) < 0)
- { test();
- if (p2a_flag == FALSE)
- { test();
- if (st->LTP_flag == FALSE)
- {
- st->update_cnt = add_ex(st->update_cnt, 1); test();
- if (sub_ex(st->update_cnt, UPDATE_CNT_THLD) >= 0)
- {
- update_flag = TRUE; move16();
- st->fupdate_flag = TRUE; move16();
- }
- }
- }
- }
- }
- test();
- if (sub_ex(st->update_cnt, st->last_update_cnt) == 0)
- {
- st->hyster_cnt = add_ex(st->hyster_cnt, 1);
- }
- else
- {
- st->hyster_cnt = 0; move16();
- }
- st->last_update_cnt = st->update_cnt; move16();
- test();
- if (sub_ex(st->hyster_cnt, HYSTER_CNT_THLD) > 0)
- {
- st->update_cnt = 0; move16();
- }
-
- test();
- if (update_flag == TRUE)
- {
- test();
- if (st->shift_state == 1)
- {
-
- tmp = state_change_shift_r[0]; move16();
- }
- else
- {
-
- tmp = 0; move16();
- }
-
- for (i = LO_CHAN; i <= HI_CHAN; i++)
- { test();
-
-
- L_Extract (L_shr_ex(st->Lch_enrg[i], tmp), &hi1, &lo1);
- Ltmp = Mpy_32_16(hi1, lo1, CNE_SM_FAC);
- L_Extract (st->Lch_noise[i], &hi1, &lo1);
- st->Lch_noise[i] = L_add_ex(Ltmp, Mpy_32_16(hi1, lo1, ONE_MINUS_CNE_SM_FAC)); move32();
- test();
- if (L_sub_ex(st->Lch_noise[i], MIN_NOISE_ENRG_0) < 0)
- {
- st->Lch_noise[i] = MIN_NOISE_ENRG_0; move32();
- }
- }
- }
- return(ivad);
- }
- int vad2_init (vadState2 **state)
- {
- vadState2* s;
-
- if (state == (vadState2 **) NULL){
- wfprintf(stderr, "vad2_init: invalid parameter\n");
- return -1;
- }
- *state = NULL;
-
-
- if ((s = (vadState2 *) wmalloc(sizeof(vadState2))) == NULL){
- wfprintf(stderr, "vad2_init: can not malloc state structure\n");
- return -1;
- }
-
- vad2_reset(s);
-
- *state = s;
-
- return 0;
- }
- int vad2_reset (vadState2 * st)
- {
- Word16 i;
- Word16 *ptr;
- if (st == (vadState2 *) NULL){
- wfprintf(stderr, "vad2_reset: invalid parameter\n");
- return -1;
- }
- ptr = (Word16 *)st; move16();
- for (i = 0; i < sizeof(vadState2)/2; i++)
- {
- *ptr++ = 0; move16();
- }
- return 0;
- }
- void vad2_exit (vadState2 **state)
- {
- if (state == NULL || *state == NULL)
- return;
-
-
- wfree(*state);
- *state = NULL;
-
- return;
- }
|