annotate libtwamr/vad1.c @ 581:e2d5cad04cbf

libgsmhr1 RxFE: store CN R0+LPC separately from speech In the original GSM 06.06 code the ECU for speech mode is entirely separate from the CN generator, maintaining separate state. (The main intertie between them is the speech vs CN state variable, distinguishing between speech and CN BFIs, in addition to the CN-specific function of distinguishing between initial and update SIDs.) In the present RxFE implementation I initially thought that we could use the same saved_frame buffer for both ECU and CN, overwriting just the first 4 params (R0 and LPC) when a valid SID comes in. However, I now realize it was a bad idea: the original code has a corner case (long sequence of speech-mode BFIs to put the ECU in state 6, then SID and CN-mode BFIs, then a good speech frame) that would be broken by that buffer reuse approach. We could eliminate this corner case by resetting the ECU state when passing through a CN insertion period, but doing so would needlessly increase the behavioral diffs between GSM 06.06 and our version. Solution: use a separate CN-specific buffer for CN R0+LPC parameters, and match the behavior of GSM 06.06 code in this regard.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 13 Feb 2025 10:02:45 +0000
parents 8847c1740e78
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
408
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 *****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 **-------------------------------------------------------------------------**
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 ** **
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 ** GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001 **
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 ** R99 Version 3.3.0 **
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 ** REL-4 Version 4.1.0 **
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 ** **
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 **-------------------------------------------------------------------------**
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 *****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 * File : vad1.c
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 * Purpose : Voice Activity Detection (VAD) for AMR (option 1)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 *****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 /*
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 *****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 * MODULE INCLUDE FILE AND VERSION ID
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 *****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 #include "namespace.h"
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 #include "vad1.h"
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 /*
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 *****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 * INCLUDE FILES
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 *****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 #include "typedef.h"
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 #include "basic_op.h"
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 #include "no_count.h"
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 #include "oper_32b.h"
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 #include "cnst_vad.h"
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 /*
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 *****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 * LOCAL VARIABLES AND TABLES
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 *****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 /*
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 ********************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 * PRIVATE PROGRAM CODE
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 ********************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 /****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 * Function : first_filter_stage
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 * Purpose : Scale input down by one bit. Calculate 5th order
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 * half-band lowpass/highpass filter pair with
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 * decimation.
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 ***************************************************************************/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 static void first_filter_stage(Word16 in[], /* i : input signal */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 Word16 out[], /* o : output values, every other */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 /* output is low-pass part and */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 /* other is high-pass part every */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 Word16 data[] /* i/o : filter memory */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 )
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 Word16 temp0, temp1, temp2, temp3, i;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 Word16 data0, data1;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 data0 = data[0]; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 data1 = data[1]; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 for (i = 0; i < FRAME_LEN/4; i++)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 temp0 = sub(shr(in[4*i+0], 2), mult(COEFF5_1, data0));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 temp1 = add(data0, mult(COEFF5_1, temp0));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 temp3 = sub(shr(in[4*i+1], 2), mult(COEFF5_2, data1));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 temp2 = add(data1, mult(COEFF5_2, temp3));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 out[4*i+0] = add(temp1, temp2); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 out[4*i+1] = sub(temp1, temp2); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 data0 = sub(shr(in[4*i+2], 2), mult(COEFF5_1, temp0));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 temp1 = add(temp0, mult(COEFF5_1, data0));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 data1 = sub(shr(in[4*i+3], 2), mult(COEFF5_2, temp3));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 temp2 = add(temp3, mult(COEFF5_2, data1));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 out[4*i+2] = add(temp1, temp2); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 out[4*i+3] = sub(temp1, temp2); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 data[0] = data0; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 data[1] = data1; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 /****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 * Function : filter5
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97 * Purpose : Fifth-order half-band lowpass/highpass filter pair with
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98 * decimation.
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 ***************************************************************************/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 static void filter5(Word16 *in0, /* i/o : input values; output low-pass part */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 Word16 *in1, /* i/o : input values; output high-pass part */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 Word16 data[] /* i/o : updated filter memory */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104 )
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106 Word16 temp0, temp1, temp2;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 temp0 = sub(*in0, mult(COEFF5_1, data[0]));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 temp1 = add(data[0], mult(COEFF5_1, temp0));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 data[0] = temp0; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 temp0 = sub(*in1, mult(COEFF5_2, data[1]));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 temp2 = add(data[1], mult(COEFF5_2, temp0));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114 data[1] = temp0; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 *in0 = shr(add(temp1, temp2), 1); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 *in1 = shr(sub(temp1, temp2), 1); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 /****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 * Function : filter3
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123 * Purpose : Third-order half-band lowpass/highpass filter pair with
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124 * decimation.
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125 * Return value :
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127 ***************************************************************************/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128 static void filter3(Word16 *in0, /* i/o : input values; output low-pass part */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129 Word16 *in1, /* i/o : input values; output high-pass part */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130 Word16 *data /* i/o : updated filter memory */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131 )
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133 Word16 temp1, temp2;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135 temp1 = sub(*in1, mult(COEFF3, *data));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136 temp2 = add(*data, mult(COEFF3, temp1));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137 *data = temp1; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139 *in1 = shr(sub(*in0, temp2), 1); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140 *in0 = shr(add(*in0, temp2), 1); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143 /****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
145 * Function : level_calculation
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146 * Purpose : Calculate signal level in a sub-band. Level is calculated
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147 * by summing absolute values of the input data.
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148 * Return value : signal level
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150 ***************************************************************************/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151 static Word16 level_calculation(
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
152 Word16 data[], /* i : signal buffer */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
153 Word16 *sub_level, /* i : level calculate at the end of the previous frame */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
154 /* o : level of signal calculated from the last */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155 /* (count2 - count1) samples */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156 Word16 count1, /* i : number of samples to be counted */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157 Word16 count2, /* i : number of samples to be counted */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 Word16 ind_m, /* i : step size for the index of the data buffer */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 Word16 ind_a, /* i : starting index of the data buffer */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160 Word16 scale /* i : scaling for the level calculation */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 )
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163 Word32 l_temp1, l_temp2;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164 Word16 level, i;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166 l_temp1 = 0L; move32 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167 for (i = count1; i < count2; i++)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
168 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169 l_temp1 = L_mac(l_temp1, 1, abs_s(data[ind_m*i+ind_a]));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
171
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172 l_temp2 = L_add(l_temp1, L_shl(*sub_level, sub(16, scale)));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173 *sub_level = extract_h(L_shl(l_temp1, scale));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175 for (i = 0; i < count1; i++)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
177 l_temp2 = L_mac(l_temp2, 1, abs_s(data[ind_m*i+ind_a]));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 level = extract_h(L_shl(l_temp2, scale));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
180
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
181 return level;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
182 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
183
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
184 /****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
185 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
186 * Function : filter_bank
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187 * Purpose : Divides input signal into 9-bands and calculas level of
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
188 * the signal in each band
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
189 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190 ***************************************************************************/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191 static void filter_bank(vadState1 *st, /* i/o : State struct */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
192 Word16 in[], /* i : input frame */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
193 Word16 level[] /* 0 : signal levels at each band */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
194 )
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
195 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
196 Word16 i;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
197 Word16 tmp_buf[FRAME_LEN];
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
198
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199 /* calculate the filter bank */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
200
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
201 first_filter_stage(in, tmp_buf, st->a_data5[0]);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
202
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
203 for (i = 0; i < FRAME_LEN/4; i++)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
204 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
205 filter5(&tmp_buf[4*i], &tmp_buf[4*i+2], st->a_data5[1]);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
206 filter5(&tmp_buf[4*i+1], &tmp_buf[4*i+3], st->a_data5[2]);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
207 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
208 for (i = 0; i < FRAME_LEN/8; i++)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
209 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
210 filter3(&tmp_buf[8*i+0], &tmp_buf[8*i+4], &st->a_data3[0]);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
211 filter3(&tmp_buf[8*i+2], &tmp_buf[8*i+6], &st->a_data3[1]);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
212 filter3(&tmp_buf[8*i+3], &tmp_buf[8*i+7], &st->a_data3[4]);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
213 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
214
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
215 for (i = 0; i < FRAME_LEN/16; i++)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
216 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
217 filter3(&tmp_buf[16*i+0], &tmp_buf[16*i+8], &st->a_data3[2]);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
218 filter3(&tmp_buf[16*i+4], &tmp_buf[16*i+12], &st->a_data3[3]);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
219 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
220
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
221 /* calculate levels in each frequency band */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
222
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
223 /* 3000 - 4000 Hz*/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
224 level[8] = level_calculation(tmp_buf, &st->sub_level[8], FRAME_LEN/4-8,
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
225 FRAME_LEN/4, 4, 1, 15);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
226 move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
227 /* 2500 - 3000 Hz*/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
228 level[7] = level_calculation(tmp_buf, &st->sub_level[7], FRAME_LEN/8-4,
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
229 FRAME_LEN/8, 8, 7, 16);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
230 move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
231 /* 2000 - 2500 Hz*/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
232 level[6] = level_calculation(tmp_buf, &st->sub_level[6], FRAME_LEN/8-4,
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
233 FRAME_LEN/8, 8, 3, 16);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
234 move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
235 /* 1500 - 2000 Hz*/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
236 level[5] = level_calculation(tmp_buf, &st->sub_level[5], FRAME_LEN/8-4,
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
237 FRAME_LEN/8, 8, 2, 16);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
238 move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
239 /* 1000 - 1500 Hz*/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
240 level[4] = level_calculation(tmp_buf, &st->sub_level[4], FRAME_LEN/8-4,
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
241 FRAME_LEN/8, 8, 6, 16);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
242 move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
243 /* 750 - 1000 Hz*/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
244 level[3] = level_calculation(tmp_buf, &st->sub_level[3], FRAME_LEN/16-2,
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
245 FRAME_LEN/16, 16, 4, 16);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
246 move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
247 /* 500 - 750 Hz*/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
248 level[2] = level_calculation(tmp_buf, &st->sub_level[2], FRAME_LEN/16-2,
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
249 FRAME_LEN/16, 16, 12, 16);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
250 move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
251 /* 250 - 500 Hz*/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
252 level[1] = level_calculation(tmp_buf, &st->sub_level[1], FRAME_LEN/16-2,
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
253 FRAME_LEN/16, 16, 8, 16);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
254 move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
255 /* 0 - 250 Hz*/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
256 level[0] = level_calculation(tmp_buf, &st->sub_level[0], FRAME_LEN/16-2,
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
257 FRAME_LEN/16, 16, 0, 16);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
258 move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
259 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
260
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
261 /****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
262 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
263 * Function : update_cntrl
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
264 * Purpose : Control update of the background noise estimate.
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
265 * Inputs : pitch: flags for pitch detection
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
266 * stat_count: stationary counter
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
267 * tone: flags indicating presence of a tone
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
268 * complex: flags for complex detection
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
269 * vadreg: intermediate VAD flags
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
270 * Output : stat_count: stationary counter
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
271 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
272 ***************************************************************************/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
273 static void update_cntrl(vadState1 *st, /* i/o : State struct */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
274 Word16 level[] /* i : sub-band levels of the input frame */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
275 )
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
276 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
277 Word16 i, temp, stat_rat, exp;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
278 Word16 num, denom;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
279 Word16 alpha;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
280
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
281 /* handle highband complex signal input separately */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
282 /* if ther has been highband correlation for some time */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
283 /* make sure that the VAD update speed is low for a while */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
284 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
285 if (st->complex_warning != 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
286 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
287 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
288 if (sub(st->stat_count, CAD_MIN_STAT_COUNT) < 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
289 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
290 st->stat_count = CAD_MIN_STAT_COUNT; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
291 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
292 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
293 /* NB stat_count is allowed to be decreased by one below again */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
294 /* deadlock in speech is not possible unless the signal is very */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
295 /* complex and need a high rate */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
296
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
297 /* if fullband pitch or tone have been detected for a while, initialize stat_count */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
298 logic16 (); test (); logic16 (); test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
299 if ((sub((st->pitch & 0x6000), 0x6000) == 0) ||
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
300 (sub((st->tone & 0x7c00), 0x7c00) == 0))
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
301 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
302 st->stat_count = STAT_COUNT; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
303 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
304 else
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
305 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
306 /* if 8 last vad-decisions have been "0", reinitialize stat_count */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
307 logic16 (); test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
308 if ((st->vadreg & 0x7f80) == 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
309 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
310 st->stat_count = STAT_COUNT; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
311 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
312 else
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
313 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
314 stat_rat = 0; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
315 for (i = 0; i < COMPLEN; i++)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
316 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
317 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
318 if (sub(level[i], st->ave_level[i]) > 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
319 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
320 num = level[i]; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
321 denom = st->ave_level[i]; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
322 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
323 else
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
324 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
325 num = st->ave_level[i]; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
326 denom = level[i]; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
327 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
328 /* Limit nimimum value of num and denom to STAT_THR_LEVEL */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
329 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
330 if (sub(num, STAT_THR_LEVEL) < 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
331 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
332 num = STAT_THR_LEVEL; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
333 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
334 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
335 if (sub(denom, STAT_THR_LEVEL) < 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
336 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
337 denom = STAT_THR_LEVEL; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
338 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
339
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
340 exp = norm_s(denom);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
341 denom = shl(denom, exp);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
342
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
343 /* stat_rat = num/denom * 64 */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
344 temp = div_s(shr(num, 1), denom);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
345 stat_rat = add(stat_rat, shr(temp, sub(8, exp)));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
346 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
347
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
348 /* compare stat_rat with a threshold and update stat_count */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
349 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
350 if (sub(stat_rat, STAT_THR) > 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
351 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
352 st->stat_count = STAT_COUNT; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
353 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
354 else
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
355 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
356 logic16 ();test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
357 if ((st->vadreg & 0x4000) != 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
358 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
359 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
360 if (st->stat_count != 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
361 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
362 st->stat_count = sub(st->stat_count, 1); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
363 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
364 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
365 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
366 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
367 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
368
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
369 /* Update average amplitude estimate for stationarity estimation */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
370 alpha = ALPHA4; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
371 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
372 if (sub(st->stat_count, STAT_COUNT) == 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
373 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
374 alpha = 32767; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
375 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
376 else if ((st->vadreg & 0x4000) == 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
377 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
378 logic16 (); test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
379 alpha = ALPHA5; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
380 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
381
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
382 for (i = 0; i < COMPLEN; i++)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
383 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
384 st->ave_level[i] = add(st->ave_level[i],
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
385 mult_r(alpha, sub(level[i], st->ave_level[i])));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
386 move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
387 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
388 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
389
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
390 /****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
391 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
392 * Function : hangover_addition
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
393 * Purpose : Add hangover for complex signal or after speech bursts
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
394 * Inputs : burst_count: counter for the length of speech bursts
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
395 * hang_count: hangover counter
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
396 * vadreg: intermediate VAD decision
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
397 * Outputs : burst_count: counter for the length of speech bursts
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
398 * hang_count: hangover counter
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
399 * Return value : VAD_flag indicating final VAD decision
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
400 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
401 ***************************************************************************/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
402 static Word16 hangover_addition(
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
403 vadState1 *st, /* i/o : State struct */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
404 Word16 noise_level, /* i : average level of the noise */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
405 /* estimates */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
406 Word16 low_power /* i : flag power of the input frame */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
407 )
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
408 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
409 Word16 hang_len, burst_len;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
410
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
411 /*
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
412 Calculate burst_len and hang_len
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
413 burst_len: number of consecutive intermediate vad flags with "1"-decision
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
414 required for hangover addition
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
415 hang_len: length of the hangover
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
416 */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
417
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
418 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
419 if (sub(noise_level, HANG_NOISE_THR) > 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
420 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
421 burst_len = BURST_LEN_HIGH_NOISE; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
422 hang_len = HANG_LEN_HIGH_NOISE; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
423 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
424 else
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
425 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
426 burst_len = BURST_LEN_LOW_NOISE; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
427 hang_len = HANG_LEN_LOW_NOISE; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
428 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
429
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
430 /* if the input power (pow_sum) is lower than a threshold, clear
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
431 counters and set VAD_flag to "0" "fast exit" */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
432 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
433 if (low_power != 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
434 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
435 st->burst_count = 0; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
436 st->hang_count = 0; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
437 st->complex_hang_count = 0; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
438 st->complex_hang_timer = 0; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
439 return 0;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
440 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
441
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
442 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
443 if (sub(st->complex_hang_timer, CVAD_HANG_LIMIT) > 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
444 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
445 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
446 if (sub(st->complex_hang_count, CVAD_HANG_LENGTH) < 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
447 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
448 st->complex_hang_count = CVAD_HANG_LENGTH; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
449 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
450 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
451
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
452 /* long time very complex signal override VAD output function */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
453 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
454 if (st->complex_hang_count != 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
455 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
456 st->burst_count = BURST_LEN_HIGH_NOISE; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
457 st->complex_hang_count = sub(st->complex_hang_count, 1); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
458 return 1;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
459 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
460 else
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
461 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
462 /* let hp_corr work in from a noise_period indicated by the VAD */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
463 test (); test (); logic16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
464 if (((st->vadreg & 0x3ff0) == 0) &&
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
465 (sub(st->corr_hp_fast, CVAD_THRESH_IN_NOISE) > 0))
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
466 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
467 return 1;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
468 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
469 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
470
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
471 /* update the counters (hang_count, burst_count) */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
472 logic16 (); test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
473 if ((st->vadreg & 0x4000) != 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
474 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
475 st->burst_count = add(st->burst_count, 1); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
476 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
477 if (sub(st->burst_count, burst_len) >= 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
478 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
479 st->hang_count = hang_len; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
480 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
481 return 1;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
482 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
483 else
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
484 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
485 st->burst_count = 0; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
486 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
487 if (st->hang_count > 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
488 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
489 st->hang_count = sub(st->hang_count, 1); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
490 return 1;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
491 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
492 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
493 return 0;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
494 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
495
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
496 /****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
497 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
498 * Function : noise_estimate_update
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
499 * Purpose : Update of background noise estimate
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
500 * Inputs : bckr_est: background noise estimate
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
501 * pitch: flags for pitch detection
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
502 * stat_count: stationary counter
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
503 * Outputs : bckr_est: background noise estimate
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
504 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
505 ***************************************************************************/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
506 static void noise_estimate_update(
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
507 vadState1 *st, /* i/o : State struct */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
508 Word16 level[] /* i : sub-band levels of the input frame */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
509 )
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
510 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
511 Word16 i, alpha_up, alpha_down, bckr_add;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
512
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
513 /* Control update of bckr_est[] */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
514 update_cntrl(st, level);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
515
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
516 /* Choose update speed */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
517 bckr_add = 2; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
518
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
519 logic16 (); test (); logic16 (); test (); test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
520 if (((0x7800 & st->vadreg) == 0) &&
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
521 ((st->pitch & 0x7800) == 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
522 && (st->complex_hang_count == 0))
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
523 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
524 alpha_up = ALPHA_UP1; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
525 alpha_down = ALPHA_DOWN1; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
526 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
527 else
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
528 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
529 test (); test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
530 if ((st->stat_count == 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
531 && (st->complex_hang_count == 0))
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
532 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
533 alpha_up = ALPHA_UP2; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
534 alpha_down = ALPHA_DOWN2; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
535 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
536 else
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
537 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
538 alpha_up = 0; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
539 alpha_down = ALPHA3; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
540 bckr_add = 0; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
541 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
542 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
543
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
544 /* Update noise estimate (bckr_est) */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
545 for (i = 0; i < COMPLEN; i++)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
546 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
547 Word16 temp;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
548 temp = sub(st->old_level[i], st->bckr_est[i]);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
549
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
550 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
551 if (temp < 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
552 { /* update downwards*/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
553 st->bckr_est[i] = add(-2, add(st->bckr_est[i], mult_r(alpha_down, temp)));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
554 move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
555
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
556 /* limit minimum value of the noise estimate to NOISE_MIN */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
557 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
558 if (sub(st->bckr_est[i], NOISE_MIN) < 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
559 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
560 st->bckr_est[i] = NOISE_MIN; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
561 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
562 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
563 else
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
564 { /* update upwards */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
565 st->bckr_est[i] = add(bckr_add, add(st->bckr_est[i], mult_r(alpha_up, temp)));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
566 move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
567
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
568 /* limit maximum value of the noise estimate to NOISE_MAX */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
569 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
570 if (sub(st->bckr_est[i], NOISE_MAX) > 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
571 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
572 st->bckr_est[i] = NOISE_MAX; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
573 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
574 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
575 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
576
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
577 /* Update signal levels of the previous frame (old_level) */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
578 for(i = 0; i < COMPLEN; i++)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
579 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
580 st->old_level[i] = level[i]; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
581 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
582 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
583
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
584 /****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
585 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
586 * Function : complex_estimate_adapt
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
587 * Purpose : Update/adapt of complex signal estimate
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
588 * Inputs : low_power: low signal power flag
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
589 * Outputs : st->corr_hp_fast: long term complex signal estimate
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
590 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
591 ***************************************************************************/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
592 static void complex_estimate_adapt(
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
593 vadState1 *st, /* i/o : VAD state struct */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
594 Word16 low_power /* i : very low level flag of the input frame */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
595 )
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
596 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
597 Word16 alpha; /* Q15 */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
598 Word32 L_tmp; /* Q31 */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
599
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
600
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
601 /* adapt speed on own state */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
602 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
603 if (sub(st->best_corr_hp, st->corr_hp_fast) < 0) /* decrease */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
604 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
605 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
606 if (sub(st->corr_hp_fast, CVAD_THRESH_ADAPT_HIGH) < 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
607 { /* low state */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
608 alpha = CVAD_ADAPT_FAST; move16();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
609 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
610 else
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
611 { /* high state */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
612 alpha = CVAD_ADAPT_REALLY_FAST; move16();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
613 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
614 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
615 else /* increase */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
616 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
617 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
618 if (sub(st->corr_hp_fast, CVAD_THRESH_ADAPT_HIGH) < 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
619 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
620 alpha = CVAD_ADAPT_FAST; move16();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
621 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
622 else
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
623 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
624 alpha = CVAD_ADAPT_SLOW; move16();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
625 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
626 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
627
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
628 L_tmp = L_deposit_h(st->corr_hp_fast);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
629 L_tmp = L_msu(L_tmp, alpha, st->corr_hp_fast);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
630 L_tmp = L_mac(L_tmp, alpha, st->best_corr_hp);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
631 st->corr_hp_fast = round(L_tmp); /* Q15 */ move16();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
632
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
633 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
634 if (sub(st->corr_hp_fast, CVAD_MIN_CORR) < 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
635 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
636 st->corr_hp_fast = CVAD_MIN_CORR; move16();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
637 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
638
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
639 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
640 if (low_power != 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
641 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
642 st->corr_hp_fast = CVAD_MIN_CORR; move16();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
643 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
644 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
645
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
646 /****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
647 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
648 * Function : complex_vad
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
649 * Purpose : complex background decision
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
650 * Return value : the complex background decision
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
651 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
652 ***************************************************************************/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
653 static Word16 complex_vad(vadState1 *st, /* i/o : VAD state struct */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
654 Word16 low_power /* i : flag power of the input frame */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
655 )
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
656 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
657 st->complex_high = shr(st->complex_high, 1); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
658 st->complex_low = shr(st->complex_low, 1); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
659
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
660 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
661 if (low_power == 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
662 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
663 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
664 if (sub(st->corr_hp_fast, CVAD_THRESH_ADAPT_HIGH) > 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
665 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
666 st->complex_high = st->complex_high | 0x4000; logic16 (); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
667 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
668
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
669 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
670 if (sub(st->corr_hp_fast, CVAD_THRESH_ADAPT_LOW) > 0 )
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
671 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
672 st->complex_low = st->complex_low | 0x4000; logic16 (); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
673 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
674 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
675
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
676 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
677 if (sub(st->corr_hp_fast, CVAD_THRESH_HANG) > 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
678 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
679 st->complex_hang_timer = add(st->complex_hang_timer, 1); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
680 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
681 else
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
682 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
683 st->complex_hang_timer = 0; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
684 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
685
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
686 test (); logic16 (); test (); logic16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
687 return ((sub((st->complex_high & 0x7f80), 0x7f80) == 0) ||
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
688 (sub((st->complex_low & 0x7fff), 0x7fff) == 0));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
689 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
690
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
691 /****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
692 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
693 * Function : vad_decision
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
694 * Purpose : Calculates VAD_flag
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
695 * Inputs : bckr_est: background noise estimate
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
696 * vadreg: intermediate VAD flags
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
697 * Outputs : noise_level: average level of the noise estimates
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
698 * vadreg: intermediate VAD flags
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
699 * Return value : VAD_flag
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
700 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
701 ***************************************************************************/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
702 static Word16 vad_decision(
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
703 vadState1 *st, /* i/o : State struct */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
704 Word16 level[COMPLEN], /* i : sub-band levels of the input frame */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
705 Word32 pow_sum /* i : power of the input frame */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
706 )
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
707 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
708 Word16 i;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
709 Word16 snr_sum;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
710 Word32 L_temp;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
711 Word16 vad_thr, temp, noise_level;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
712 Word16 low_power_flag;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
713
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
714 /*
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
715 Calculate squared sum of the input levels (level)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
716 divided by the background noise components (bckr_est).
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
717 */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
718 L_temp = 0; move32();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
719 for (i = 0; i < COMPLEN; i++)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
720 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
721 Word16 exp;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
722
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
723 exp = norm_s(st->bckr_est[i]);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
724 temp = shl(st->bckr_est[i], exp);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
725 temp = div_s(shr(level[i], 1), temp);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
726 temp = shl(temp, sub(exp, UNIRSHFT-1));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
727 L_temp = L_mac(L_temp, temp, temp);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
728 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
729 snr_sum = extract_h(L_shl(L_temp, 6));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
730 snr_sum = mult(snr_sum, INV_COMPLEN);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
731
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
732 /* Calculate average level of estimated background noise */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
733 L_temp = 0; move32();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
734 for (i = 0; i < COMPLEN; i++)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
735 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
736 L_temp = L_add(L_temp, st->bckr_est[i]);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
737 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
738
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
739 noise_level = extract_h(L_shl(L_temp, 13));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
740
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
741 /* Calculate VAD threshold */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
742 vad_thr = add(mult(VAD_SLOPE, sub(noise_level, VAD_P1)), VAD_THR_HIGH);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
743
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
744 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
745 if (sub(vad_thr, VAD_THR_LOW) < 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
746 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
747 vad_thr = VAD_THR_LOW; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
748 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
749
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
750 /* Shift VAD decision register */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
751 st->vadreg = shr(st->vadreg, 1); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
752
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
753 /* Make intermediate VAD decision */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
754 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
755 if (sub(snr_sum, vad_thr) > 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
756 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
757 st->vadreg = st->vadreg | 0x4000; logic16 (); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
758 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
759 /* primary vad decsion made */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
760
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
761 /* check if the input power (pow_sum) is lower than a threshold" */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
762 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
763 if (L_sub(pow_sum, VAD_POW_LOW) < 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
764 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
765 low_power_flag = 1; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
766 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
767 else
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
768 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
769 low_power_flag = 0; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
770 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
771
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
772 /* update complex signal estimate st->corr_hp_fast and hangover reset timer using */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
773 /* low_power_flag and corr_hp_fast and various adaptation speeds */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
774 complex_estimate_adapt(st, low_power_flag);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
775
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
776 /* check multiple thresholds of the st->corr_hp_fast value */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
777 st->complex_warning = complex_vad(st, low_power_flag); move16();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
778
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
779 /* Update speech subband vad background noise estimates */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
780 noise_estimate_update(st, level);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
781
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
782 /* Add speech and complex hangover and return speech VAD_flag */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
783 /* long term complex hangover may be added */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
784 st->speech_vad_decision = hangover_addition(st, noise_level, low_power_flag);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
785 move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
786
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
787 return (st->speech_vad_decision);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
788 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
789
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
790 /*
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
791 *****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
792 * PUBLIC PROGRAM CODE
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
793 *****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
794 */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
795
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
796 /*************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
797 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
798 * Function: vad1_reset
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
799 * Purpose: Initializes state memory to zero
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
800 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
801 **************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
802 */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
803 void vad1_reset (vadState1 *state)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
804 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
805 Word16 i, j;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
806
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
807 /* Initialize pitch detection variables */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
808 state->oldlag_count = 0;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
809 state->oldlag = 0;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
810 state->pitch = 0;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
811 state->tone = 0;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
812
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
813 state->complex_high = 0;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
814 state->complex_low = 0;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
815 state->complex_hang_timer = 0;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
816
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
817 state->vadreg = 0;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
818
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
819 state->stat_count = 0;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
820 state->burst_count = 0;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
821 state->hang_count = 0;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
822 state->complex_hang_count = 0;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
823
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
824 /* initialize memory used by the filter bank */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
825 for (i = 0; i < 3; i++)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
826 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
827 for (j = 0; j < 2; j++)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
828 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
829 state->a_data5[i][j] = 0;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
830 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
831 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
832
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
833 for (i = 0; i < 5; i++)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
834 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
835 state->a_data3[i] = 0;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
836 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
837
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
838 /* initialize the rest of the memory */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
839 for (i = 0; i < COMPLEN; i++)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
840 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
841 state->bckr_est[i] = NOISE_INIT;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
842 state->old_level[i] = NOISE_INIT;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
843 state->ave_level[i] = NOISE_INIT;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
844 state->sub_level[i] = 0;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
845 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
846
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
847 state->best_corr_hp = CVAD_LOWPOW_RESET;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
848
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
849 state->speech_vad_decision = 0;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
850 state->complex_warning = 0;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
851 state->sp_burst_count = 0;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
852
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
853 state->corr_hp_fast = CVAD_LOWPOW_RESET;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
854 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
855
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
856 /****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
857 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
858 * Function : vad_complex_detection_update
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
859 * Purpose : update vad->bestCorr_hp complex signal feature state
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
860 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
861 ***************************************************************************/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
862 void vad_complex_detection_update (vadState1 *st, /* i/o : State struct */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
863 Word16 best_corr_hp /* i : best Corr */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
864 )
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
865 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
866 st->best_corr_hp = best_corr_hp; move16();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
867 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
868
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
869 /****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
870 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
871 * Function : vad_tone_detection
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
872 * Purpose : Set tone flag if pitch gain is high. This is used to detect
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
873 * signaling tones and other signals with high pitch gain.
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
874 * Inputs : tone: flags indicating presence of a tone
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
875 * Outputs : tone: flags indicating presence of a tone
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
876 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
877 ***************************************************************************/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
878 void vad_tone_detection (vadState1 *st, /* i/o : State struct */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
879 Word32 t0, /* i : autocorrelation maxima */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
880 Word32 t1 /* i : energy */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
881 )
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
882 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
883 Word16 temp;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
884 /*
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
885 if (t0 > TONE_THR * t1)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
886 set tone flag
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
887 */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
888 temp = round(t1);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
889
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
890 test (); test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
891 if ((temp > 0) && (L_msu(t0, temp, TONE_THR) > 0))
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
892 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
893 st->tone = st->tone | 0x4000; logic16 (); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
894 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
895 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
896
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
897 /****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
898 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
899 * Function : vad_tone_detection_update
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
900 * Purpose : Update the tone flag register. Tone flags are shifted right
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
901 * by one bit. This function should be called from the speech
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
902 * encoder before call to Vad_tone_detection() function.
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
903 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
904 ***************************************************************************/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
905 void vad_tone_detection_update (
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
906 vadState1 *st, /* i/o : State struct */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
907 Word16 one_lag_per_frame /* i : 1 if one open-loop lag is
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
908 calculated per each frame,
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
909 otherwise 0 */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
910 )
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
911 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
912 /* Shift tone flags right by one bit */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
913 st->tone = shr(st->tone, 1); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
914
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
915 /* If open-loop lag is calculated only once in each frame, do extra update
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
916 and assume that the other tone flag of the frame is one. */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
917 if (one_lag_per_frame != 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
918 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
919 st->tone = shr(st->tone, 1);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
920 st->tone = st->tone | 0x2000; logic16 (); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
921 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
922 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
923
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
924 /****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
925 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
926 * Function : vad_pitch_detection
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
927 * Purpose : Test whether signal contains pitch or other periodic
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
928 * component.
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
929 * Return value : Boolean voiced / unvoiced decision in state variable
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
930 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
931 ***************************************************************************/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
932 void vad_pitch_detection (vadState1 *st, /* i/o : State struct */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
933 Word16 T_op[] /* i : speech encoder open loop lags */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
934 )
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
935 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
936 Word16 lagcount, i;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
937
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
938 lagcount = 0; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
939
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
940 for (i = 0; i < 2; i++)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
941 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
942 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
943 if (sub (abs_s (sub (st->oldlag, T_op[i])), LTHRESH) < 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
944 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
945 lagcount = add (lagcount, 1);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
946 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
947
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
948 /* Save the current LTP lag */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
949 st->oldlag = T_op[i]; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
950 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
951
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
952 /* Make pitch decision.
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
953 Save flag of the pitch detection to the variable pitch.
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
954 */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
955 st->pitch = shr(st->pitch, 1); move16();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
956
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
957 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
958 if (sub ( add (st->oldlag_count, lagcount), NTHRESH) >= 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
959 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
960 st->pitch = st->pitch | 0x4000; logic16(); move16();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
961 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
962
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
963 /* Update oldlagcount */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
964 st->oldlag_count = lagcount; move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
965 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
966
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
967 /****************************************************************************
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
968 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
969 * Function : vad
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
970 * Purpose : Main program for Voice Activity Detection (VAD) for AMR
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
971 * Return value : VAD Decision, 1 = speech, 0 = noise
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
972 *
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
973 ***************************************************************************/
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
974 Word16 vad1(vadState1 *st, /* i/o : State struct */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
975 Word16 in_buf[] /* i : samples of the input frame */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
976 )
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
977 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
978 Word16 level[COMPLEN];
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
979 Word32 pow_sum;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
980 Word16 i;
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
981
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
982 /* Calculate power of the input frame. */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
983 pow_sum = 0L; move32 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
984
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
985 for (i = 0; i < FRAME_LEN; i++)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
986 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
987 pow_sum = L_mac(pow_sum, in_buf[i-LOOKAHEAD], in_buf[i-LOOKAHEAD]);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
988 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
989
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
990 /* If input power is very low, clear pitch flag of the current frame */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
991 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
992 if (L_sub(pow_sum, POW_PITCH_THR) < 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
993 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
994 st->pitch = st->pitch & 0x3fff; logic16 (); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
995 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
996
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
997 /* If input power is very low, clear complex flag of the "current" frame */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
998 test ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
999 if (L_sub(pow_sum, POW_COMPLEX_THR) < 0)
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1000 {
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1001 st->complex_low = st->complex_low & 0x3fff; logic16 (); move16 ();
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1002 }
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1003
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1004 /* Run the filter bank which calculates signal levels at each band */
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1005 filter_bank(st, in_buf, level);
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1006
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1007 return (vad_decision(st, level, pow_sum));
8847c1740e78 libtwamr: integrate VAD1
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1008 }