annotate libtwamr/vad2.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 0152c069d01f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
410
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 *****************************************************************************
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * GSM AMR-NB speech codec R98 Version 7.6.0 December 12, 2001
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * R99 Version 3.3.0
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 * REL-4 Version 4.1.0
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8 *****************************************************************************
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 * File : vad2.c
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 * Purpose : Voice Activity Detection (VAD) for AMR (option 2)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 *****************************************************************************
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16 /***************************************************************************
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 * FUNCTION NAME: vad2()
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20 * PURPOSE:
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 * This function provides the Voice Activity Detection function option 2
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 * for the Adaptive Multi-rate (AMR) codec.
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 * INPUTS:
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 * farray_ptr
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 * pointer to Word16[80] input array
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 * vadState2
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29 * pointer to vadState2 state structure
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 * OUTPUTS:
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 * state variables are updated
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 * RETURN VALUE:
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 * Word16
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 * VAD(m) - two successive calls to vad2() yield
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 * the VAD decision for the 20 ms frame:
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 * VAD_flag = VAD(m-1) || VAD(m)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 *************************************************************************/
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 /* Includes */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 #include <stdint.h>
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 #include <string.h>
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 #include "tw_amr.h"
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 #include "namespace.h"
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 #include "typedef.h"
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 #include "cnst.h"
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 #include "basic_op.h"
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 #include "oper_32b.h"
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 #include "no_count.h"
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 #include "log2.h"
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 #include "pow2.h"
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 #include "vad2.h"
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 /* Local functions */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 /***************************************************************************
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 * FUNCTION NAME: fn10Log10
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 * PURPOSE:
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 * The purpose of this function is to take the 10*log base 10 of input and
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 * divide by 128 and return; i.e. output = 10*log10(input)/128 (scaled as 7,8)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 * INPUTS:
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 * L_Input
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 * input (scaled as 31-fbits,fbits)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 * fbits
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 * number of fractional bits on input
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 * OUTPUTS:
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 * none
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 * RETURN VALUE:
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
83 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
84 * Word16
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 * output (scaled as 7,8)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87 * DESCRIPTION:
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89 * 10*log10(x)/128 = 10*(log10(2) * (log2(x<<fbits)-log2(1<<fbits)) >> 7
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 * = 3.0103 * (log2(x<<fbits) - fbits) >> 7
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 * = ((3.0103/4.0 * (log2(x<<fbits) - fbits) << 2) >> 7
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 * = (3.0103/4.0 * (log2(x<<fbits) - fbits) >> 5
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 *************************************************************************/
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96 static Word16 fn10Log10 (Word32 L_Input, Word16 fbits)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
98
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
99 Word16 integer; /* Integer part of Log2. (range: 0<=val<=30) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 Word16 fraction; /* Fractional part of Log2. (range: 0<=val<1) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102 Word32 Ltmp;
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 Word16 tmp;
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
104
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
105 Log2(L_Input, &integer, &fraction);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
106
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
107 integer = sub(integer, fbits);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 Ltmp = Mpy_32_16 (integer, fraction, 24660); /* 24660 = 10*log10(2)/4 scaled 0,15 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109 Ltmp = L_shr_r(Ltmp, 5+1); /* extra shift for 30,1 => 15,0 extract correction */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 tmp = extract_l(Ltmp);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112 return (tmp);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
114
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
115
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
116 /***************************************************************************
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
117 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
118 * FUNCTION NAME: block_norm
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
119 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
120 * PURPOSE:
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
121 * The purpose of this function is block normalise the input data sequence
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
122 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
123 * INPUTS:
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
124 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
125 * &in[0]
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
126 * pointer to data sequence to be normalised
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
127 * length
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
128 * number of elements in data sequence
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
129 * headroom
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
130 * number of headroom bits (i.e.,
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
131 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
132 * OUTPUTS:
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
133 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
134 * &out[0]
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
135 * normalised output data sequence pointed to by &out[0]
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
136 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
137 * RETURN VALUE:
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
138 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
139 * Word16
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
140 * number of bits sequence was left shifted
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
141 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
142 * DESCRIPTION:
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
143 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
144 * 1) Search for maximum absolute valued data element
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
145 * 2) Normalise the max element with "headroom"
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
146 * 3) Transfer/shift the input sequence to the output buffer
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
147 * 4) Return the number of left shifts
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
148 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
149 * CAVEATS:
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
150 * An input sequence of all zeros will return the maximum
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
151 * number of left shifts allowed, NOT the value returned
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
152 * by a norm_s(0) call, since it desired to associate an
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
153 * all zeros sequence with low energy.
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
154 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
155 *************************************************************************/
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
156
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
157 static
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
158 Word16 block_norm (Word16 * in, Word16 * out, Word16 length, Word16 headroom)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
159 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
160
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
161 Word16 i, max, scnt, adata;
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
162
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
163 max = abs_s(in[0]);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
164 for (i = 1; i < length; i++)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
165 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
166 adata = abs_s(in[i]); test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
167 if (sub(adata, max) > 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
168 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
169 max = adata; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
170 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
171 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
172 test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
173 if (max != 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
174 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
175 scnt = sub(norm_s(max), headroom);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
176 for (i = 0; i < length; i++)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
177 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
178 out[i] = shl(in[i], scnt); move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
179 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
180 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
181 else
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
182 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
183 scnt = sub(16, headroom);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
184 for (i = 0; i < length; i++)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
185 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
186 out[i] = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
187 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
188 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
189 return (scnt);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
190 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
191
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
192
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
193 /********************************************* The VAD function ***************************************************/
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
194
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
195 Word16 vad2 (Word16 * farray_ptr, vadState2 * st)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
196 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
197
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
198 /*
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
199 * The channel table is defined below. In this table, the
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
200 * lower and higher frequency coefficients for each of the 16
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
201 * channels are specified. The table excludes the coefficients
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
202 * with numbers 0 (DC), 1, and 64 (Foldover frequency).
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
203 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
204
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
205 static const Word16 ch_tbl[NUM_CHAN][2] =
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
206 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
207
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
208 {2, 3},
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
209 {4, 5},
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
210 {6, 7},
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
211 {8, 9},
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
212 {10, 11},
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
213 {12, 13},
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
214 {14, 16},
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
215 {17, 19},
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
216 {20, 22},
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
217 {23, 26},
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
218 {27, 30},
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
219 {31, 35},
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
220 {36, 41},
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
221 {42, 48},
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
222 {49, 55},
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
223 {56, 63}
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
224
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
225 };
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
226
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
227 /* channel energy scaling table - allows efficient division by number
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
228 * of DFT bins in the channel: 1/2, 1/3, 1/4, etc.
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
229 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
230
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
231 static const Word16 ch_tbl_sh[NUM_CHAN] =
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
232 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
233 16384, 16384, 16384, 16384, 16384, 16384, 10923, 10923,
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
234 10923, 8192, 8192, 6554, 5461, 4681, 4681, 4096
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
235 };
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
236
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
237 /*
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
238 * The voice metric table is defined below. It is a non-
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
239 * linear table with a deadband near zero. It maps the SNR
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
240 * index (quantized SNR value) to a number that is a measure
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
241 * of voice quality.
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
242 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
243
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
244 static const Word16 vm_tbl[90] =
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
245 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
246 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
247 3, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 7, 7,
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
248 8, 8, 9, 9, 10, 10, 11, 12, 12, 13, 13, 14, 15,
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
249 15, 16, 17, 17, 18, 19, 20, 20, 21, 22, 23, 24,
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
250 24, 25, 26, 27, 28, 28, 29, 30, 31, 32, 33, 34,
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
251 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45,
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
252 46, 47, 48, 49, 50, 50, 50, 50, 50, 50, 50, 50,
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
253 50, 50
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
254 };
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
255
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
256 /* hangover as a function of peak SNR (3 dB steps) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
257 static const Word16 hangover_table[20] =
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
258 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
259 30, 30, 30, 30, 30, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 8, 8, 8
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
260 };
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
261
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
262 /* burst sensitivity as a function of peak SNR (3 dB steps) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
263 static const Word16 burstcount_table[20] =
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
264 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
265 8, 8, 8, 8, 8, 8, 8, 8, 7, 6, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
266 };
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
267
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
268 /* voice metric sensitivity as a function of peak SNR (3 dB steps) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
269 static const Word16 vm_threshold_table[20] =
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
270 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
271 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 40, 51, 71, 100, 139, 191, 257, 337, 432
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
272 };
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
273
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
274
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
275 /* State tables that use 22,9 or 27,4 scaling for ch_enrg[] */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
276
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
277 static const Word16 noise_floor_chan[2] = {NOISE_FLOOR_CHAN_0, NOISE_FLOOR_CHAN_1};
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
278 static const Word16 min_chan_enrg[2] = {MIN_CHAN_ENRG_0, MIN_CHAN_ENRG_1};
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
279 static const Word16 ine_noise[2] = {INE_NOISE_0, INE_NOISE_1};
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
280 static const Word16 fbits[2] = {FRACTIONAL_BITS_0, FRACTIONAL_BITS_1};
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
281 static const Word16 state_change_shift_r[2] = {STATE_1_TO_0_SHIFT_R, STATE_0_TO_1_SHIFT_R};
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
282
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
283 /* Energy scale table given 30,1 input scaling (also account for -6 dB shift on input) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
284 static const Word16 enrg_norm_shift[2] = {(FRACTIONAL_BITS_0-1+2), (FRACTIONAL_BITS_1-1+2)};
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
285
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
286
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
287 /* Automatic variables */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
288
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
289 Word32 Lenrg; /* scaled as 30,1 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
290 Word32 Ltne; /* scaled as 22,9 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
291 Word32 Ltce; /* scaled as 22,9 or 27,4 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
292
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
293 Word16 tne_db; /* scaled as 7,8 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
294 Word16 tce_db; /* scaled as 7,8 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
295
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
296 Word16 input_buffer[FRM_LEN]; /* used for block normalising input data */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
297 Word16 data_buffer[FFT_LEN]; /* used for in-place FFT */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
298
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
299 Word16 ch_snr[NUM_CHAN]; /* scaled as 7,8 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
300 Word16 ch_snrq; /* scaled as 15,0 (in 0.375 dB steps) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
301 Word16 vm_sum; /* scaled as 15,0 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
302 Word16 ch_enrg_dev; /* scaled as 7,8 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
303
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
304 Word32 Lpeak; /* maximum channel energy */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
305 Word16 p2a_flag; /* flag to indicate spectral peak-to-average ratio > 10 dB */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
306
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
307 Word16 ch_enrg_db[NUM_CHAN]; /* scaled as 7,8 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
308 Word16 ch_noise_db; /* scaled as 7,8 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
309
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
310 Word16 alpha; /* scaled as 0,15 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
311 Word16 one_m_alpha; /* scaled as 0,15 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
312 Word16 update_flag; /* set to indicate a background noise estimate update */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
313
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
314 Word16 i, j, j1, j2; /* Scratch variables */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
315 Word16 hi1, lo1;
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
316
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
317 Word32 Ltmp, Ltmp1, Ltmp2;
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
318 Word16 tmp;
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
319
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
320 Word16 normb_shift; /* block norm shift count */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
321
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
322 Word16 ivad; /* intermediate VAD decision (return value) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
323 Word16 tsnrq; /* total signal-to-noise ratio (quantized 3 dB steps) scaled as 15,0 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
324 Word16 xt; /* instantaneous frame SNR in dB, scaled as 7,8 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
325
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
326 Word16 state_change;
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
327
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
328
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
329 /* Increment frame counter */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
330 st->Lframe_cnt = L_add(st->Lframe_cnt, 1);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
331
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
332 /* Block normalize the input */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
333 normb_shift = block_norm(farray_ptr, input_buffer, FRM_LEN, FFT_HEADROOM);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
334
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
335 /* Pre-emphasize the input data and store in the data buffer with the appropriate offset */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
336 for (i = 0; i < DELAY; i++)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
337 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
338 data_buffer[i] = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
339 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
340
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
341 st->pre_emp_mem = shr_r(st->pre_emp_mem, sub(st->last_normb_shift, normb_shift));
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
342 st->last_normb_shift = normb_shift; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
343
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
344 data_buffer[DELAY] = add(input_buffer[0], mult(PRE_EMP_FAC, st->pre_emp_mem)); move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
345
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
346 for (i = DELAY + 1, j = 1; i < DELAY + FRM_LEN; i++, j++)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
347 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
348 data_buffer[i] = add(input_buffer[j], mult(PRE_EMP_FAC, input_buffer[j-1])); move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
349 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
350 st->pre_emp_mem = input_buffer[FRM_LEN-1]; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
351
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
352 for (i = DELAY + FRM_LEN; i < FFT_LEN; i++)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
353 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
354 data_buffer[i] = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
355 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
356
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
357
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
358 /* Perform FFT on the data buffer */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
359 r_fft(data_buffer);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
360
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
361
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
362 /* Use normb_shift factor to determine the scaling of the energy estimates */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
363 state_change = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
364 test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
365 if (st->shift_state == 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
366 { test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
367 if (sub(normb_shift, -FFT_HEADROOM+2) <= 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
368 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
369 state_change = 1; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
370 st->shift_state = 1; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
371 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
372 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
373 else
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
374 { test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
375 if (sub(normb_shift, -FFT_HEADROOM+5) >= 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
376 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
377 state_change = 1; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
378 st->shift_state = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
379 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
380 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
381
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
382 /* Scale channel energy estimate */ test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
383 if (state_change)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
384 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
385 for (i = LO_CHAN; i <= HI_CHAN; i++)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
386 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
387 st->Lch_enrg[i] = L_shr(st->Lch_enrg[i], state_change_shift_r[st->shift_state]); move32();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
388 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
389 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
390
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
391
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
392 /* Estimate the energy in each channel */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
393 test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
394 if (L_sub(st->Lframe_cnt, 1) == 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
395 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
396 alpha = 32767; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
397 one_m_alpha = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
398 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
399 else
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
400 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
401 alpha = CEE_SM_FAC; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
402 one_m_alpha = ONE_MINUS_CEE_SM_FAC; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
403 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
404
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
405 for (i = LO_CHAN; i <= HI_CHAN; i++)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
406 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
407 Lenrg = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
408 j1 = ch_tbl[i][0]; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
409 j2 = ch_tbl[i][1]; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
410
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
411 for (j = j1; j <= j2; j++)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
412 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
413 Lenrg = L_mac(Lenrg, data_buffer[2 * j], data_buffer[2 * j]);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
414 Lenrg = L_mac(Lenrg, data_buffer[2 * j + 1], data_buffer[2 * j + 1]);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
415 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
416
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
417 /* Denorm energy & scale 30,1 according to the state */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
418 Lenrg = L_shr_r(Lenrg, sub(shl(normb_shift, 1), enrg_norm_shift[st->shift_state]));
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
419
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
420 /* integrate over time: e[i] = (1-alpha)*e[i] + alpha*enrg/num_bins_in_chan */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
421 tmp = mult(alpha, ch_tbl_sh[i]);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
422 L_Extract (Lenrg, &hi1, &lo1);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
423 Ltmp = Mpy_32_16(hi1, lo1, tmp);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
424
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
425 L_Extract (st->Lch_enrg[i], &hi1, &lo1);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
426 st->Lch_enrg[i] = L_add(Ltmp, Mpy_32_16(hi1, lo1, one_m_alpha)); move32();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
427 test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
428 if (L_sub(st->Lch_enrg[i], min_chan_enrg[st->shift_state]) < 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
429 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
430 st->Lch_enrg[i] = min_chan_enrg[st->shift_state]; move32();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
431 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
432
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
433 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
434
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
435
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
436 /* Compute the total channel energy estimate (Ltce) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
437 Ltce = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
438 for (i = LO_CHAN; i <= HI_CHAN; i++)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
439 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
440 Ltce = L_add(Ltce, st->Lch_enrg[i]);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
441 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
442
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
443
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
444 /* Calculate spectral peak-to-average ratio, set flag if p2a > 10 dB */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
445 Lpeak = 0; move32();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
446 for (i = LO_CHAN+2; i <= HI_CHAN; i++) /* Sine waves not valid for low frequencies */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
447 { test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
448 if (L_sub(st->Lch_enrg [i], Lpeak) > 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
449 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
450 Lpeak = st->Lch_enrg [i]; move32();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
451 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
452 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
453
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
454 /* Set p2a_flag if peak (dB) > average channel energy (dB) + 10 dB */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
455 /* Lpeak > Ltce/num_channels * 10^(10/10) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
456 /* Lpeak > (10/16)*Ltce */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
457
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
458 L_Extract (Ltce, &hi1, &lo1);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
459 Ltmp = Mpy_32_16(hi1, lo1, 20480);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
460 test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
461 if (L_sub(Lpeak, Ltmp) > 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
462 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
463 p2a_flag = TRUE; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
464 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
465 else
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
466 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
467 p2a_flag = FALSE; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
468 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
469
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
470
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
471 /* Initialize channel noise estimate to either the channel energy or fixed level */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
472 /* Scale the energy appropriately to yield state 0 (22,9) scaling for noise */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
473 test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
474 if (L_sub(st->Lframe_cnt, 4) <= 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
475 { test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
476 if (p2a_flag == TRUE)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
477 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
478 for (i = LO_CHAN; i <= HI_CHAN; i++)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
479 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
480 st->Lch_noise[i] = INE_NOISE_0; move32();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
481 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
482 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
483 else
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
484 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
485 for (i = LO_CHAN; i <= HI_CHAN; i++)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
486 { test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
487 if (L_sub(st->Lch_enrg[i], ine_noise[st->shift_state]) < 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
488 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
489 st->Lch_noise[i] = INE_NOISE_0; move32();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
490 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
491 else
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
492 { test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
493 if (st->shift_state == 1)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
494 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
495 st->Lch_noise[i] = L_shr(st->Lch_enrg[i], state_change_shift_r[0]);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
496 move32();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
497 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
498 else
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
499 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
500 st->Lch_noise[i] = st->Lch_enrg[i]; move32();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
501 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
502 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
503 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
504 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
505 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
506
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
507
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
508 /* Compute the channel energy (in dB), the channel SNRs, and the sum of voice metrics */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
509 vm_sum = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
510 for (i = LO_CHAN; i <= HI_CHAN; i++)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
511 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
512 ch_enrg_db[i] = fn10Log10(st->Lch_enrg[i], fbits[st->shift_state]); move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
513 ch_noise_db = fn10Log10(st->Lch_noise[i], FRACTIONAL_BITS_0);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
514
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
515 ch_snr[i] = sub(ch_enrg_db[i], ch_noise_db); move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
516
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
517 /* quantize channel SNR in 3/8 dB steps (scaled 7,8 => 15,0) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
518 /* ch_snr = round((snr/(3/8))>>8) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
519 /* = round(((0.6667*snr)<<2)>>8) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
520 /* = round((0.6667*snr)>>6) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
521
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
522 ch_snrq = shr_r(mult(21845, ch_snr[i]), 6);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
523
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
524 /* Accumulate the sum of voice metrics */ test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
525 if (sub(ch_snrq, 89) < 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
526 { test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
527 if (ch_snrq > 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
528 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
529 j = ch_snrq; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
530 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
531 else
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
532 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
533 j = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
534 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
535 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
536 else
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
537 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
538 j = 89; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
539 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
540 vm_sum = add(vm_sum, vm_tbl[j]);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
541 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
542
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
543
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
544 /* Initialize NOMINAL peak voice energy and average noise energy, calculate instantaneous SNR */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
545 test(),test(),logic16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
546 if (L_sub(st->Lframe_cnt, 4) <= 0 || st->fupdate_flag == TRUE)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
547 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
548 /* tce_db = (96 - 22 - 10*log10(64) (due to FFT)) scaled as 7,8 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
549 tce_db = 14320; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
550 st->negSNRvar = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
551 st->negSNRbias = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
552
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
553 /* Compute the total noise estimate (Ltne) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
554 Ltne = 0; move32();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
555 for (i = LO_CHAN; i <= HI_CHAN; i++)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
556 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
557 Ltne = L_add(Ltne, st->Lch_noise[i]);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
558 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
559
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
560 /* Get total noise in dB */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
561 tne_db = fn10Log10(Ltne, FRACTIONAL_BITS_0);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
562
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
563 /* Initialise instantaneous and long-term peak signal-to-noise ratios */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
564 xt = sub(tce_db, tne_db);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
565 st->tsnr = xt; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
566 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
567 else
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
568 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
569 /* Calculate instantaneous frame signal-to-noise ratio */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
570 /* xt = 10*log10( sum(2.^(ch_snr*0.1*log2(10)))/length(ch_snr) ) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
571 Ltmp1 = 0; move32();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
572 for (i=LO_CHAN; i<=HI_CHAN; i++) {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
573 /* Ltmp2 = ch_snr[i] * 0.1 * log2(10); (ch_snr scaled as 7,8) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
574 Ltmp2 = L_shr(L_mult(ch_snr[i], 10885), 8);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
575 L_Extract(Ltmp2, &hi1, &lo1);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
576 hi1 = add(hi1, 3); /* 2^3 to compensate for negative SNR */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
577 Ltmp1 = L_add(Ltmp1, Pow2(hi1, lo1));
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
578 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
579 xt = fn10Log10(Ltmp1, 4+3); /* average by 16, inverse compensation 2^3 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
580
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
581 /* Estimate long-term "peak" SNR */ test(),test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
582 if (sub(xt, st->tsnr) > 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
583 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
584 /* tsnr = 0.9*tsnr + 0.1*xt; */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
585 st->tsnr = round(L_add(L_mult(29491, st->tsnr), L_mult(3277, xt)));
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
586 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
587 /* else if (xt > 0.625*tsnr) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
588 else if (sub(xt, mult(20480, st->tsnr)) > 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
589 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
590 /* tsnr = 0.998*tsnr + 0.002*xt; */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
591 st->tsnr = round(L_add(L_mult(32702, st->tsnr), L_mult(66, xt)));
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
592 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
593 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
594
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
595 /* Quantize the long-term SNR in 3 dB steps, limit to 0 <= tsnrq <= 19 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
596 tsnrq = shr(mult(st->tsnr, 10923), 8);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
597
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
598 /* tsnrq = min(19, max(0, tsnrq)); */ test(),test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
599 if (sub(tsnrq, 19) > 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
600 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
601 tsnrq = 19; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
602 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
603 else if (tsnrq < 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
604 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
605 tsnrq = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
606 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
607
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
608 /* Calculate the negative SNR sensitivity bias */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
609 test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
610 if (xt < 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
611 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
612 /* negSNRvar = 0.99*negSNRvar + 0.01*xt*xt; */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
613 /* xt scaled as 7,8 => xt*xt scaled as 14,17, shift to 7,8 and round */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
614 tmp = round(L_shl(L_mult(xt, xt), 7));
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
615 st->negSNRvar = round(L_add(L_mult(32440, st->negSNRvar), L_mult(328, tmp)));
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
616
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
617 /* if (negSNRvar > 4.0) negSNRvar = 4.0; */ test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
618 if (sub(st->negSNRvar, 1024) > 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
619 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
620 st->negSNRvar = 1024; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
621 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
622
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
623 /* negSNRbias = max(12.0*(negSNRvar - 0.65), 0.0); */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
624 tmp = mult_r(shl(sub(st->negSNRvar, 166), 4), 24576); test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
625
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
626 if (tmp < 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
627 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
628 st->negSNRbias = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
629 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
630 else
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
631 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
632 st->negSNRbias = shr(tmp, 8);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
633 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
634 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
635
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
636
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
637 /* Determine VAD as a function of the voice metric sum and quantized SNR */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
638
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
639 tmp = add(vm_threshold_table[tsnrq], st->negSNRbias); test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
640 if (sub(vm_sum, tmp) > 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
641 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
642 ivad = 1; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
643 st->burstcount = add(st->burstcount, 1); test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
644 if (sub(st->burstcount, burstcount_table[tsnrq]) > 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
645 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
646 st->hangover = hangover_table[tsnrq]; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
647 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
648 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
649 else
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
650 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
651 st->burstcount = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
652 st->hangover = sub(st->hangover, 1); test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
653 if (st->hangover <= 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
654 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
655 ivad = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
656 st->hangover = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
657 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
658 else
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
659 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
660 ivad = 1; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
661 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
662 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
663
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
664
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
665 /* Calculate log spectral deviation */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
666 ch_enrg_dev = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
667 test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
668 if (L_sub(st->Lframe_cnt, 1) == 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
669 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
670 for (i = LO_CHAN; i <= HI_CHAN; i++)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
671 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
672 st->ch_enrg_long_db[i] = ch_enrg_db[i]; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
673 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
674 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
675 else
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
676 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
677 for (i = LO_CHAN; i <= HI_CHAN; i++)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
678 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
679 tmp = abs_s(sub(st->ch_enrg_long_db[i], ch_enrg_db[i]));
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
680 ch_enrg_dev = add(ch_enrg_dev, tmp);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
681 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
682 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
683
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
684 /*
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
685 * Calculate long term integration constant as a function of instantaneous SNR
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
686 * (i.e., high SNR (tsnr dB) -> slower integration (alpha = HIGH_ALPHA),
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
687 * low SNR (0 dB) -> faster integration (alpha = LOW_ALPHA)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
688 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
689
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
690 /* alpha = HIGH_ALPHA - ALPHA_RANGE * (tsnr - xt) / tsnr, low <= alpha <= high */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
691 tmp = sub(st->tsnr, xt); test(),logic16(),test(),test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
692 if (tmp <= 0 || st->tsnr <= 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
693 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
694 alpha = HIGH_ALPHA; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
695 one_m_alpha = 32768L-HIGH_ALPHA; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
696 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
697 else if (sub(tmp, st->tsnr) > 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
698 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
699 alpha = LOW_ALPHA; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
700 one_m_alpha = 32768L-LOW_ALPHA; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
701 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
702 else
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
703 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
704 tmp = div_s(tmp, st->tsnr);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
705 alpha = sub(HIGH_ALPHA, mult(ALPHA_RANGE, tmp));
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
706 one_m_alpha = sub(32767, alpha);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
707 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
708
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
709 /* Calc long term log spectral energy */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
710 for (i = LO_CHAN; i <= HI_CHAN; i++)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
711 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
712 Ltmp1 = L_mult(one_m_alpha, ch_enrg_db[i]);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
713 Ltmp2 = L_mult(alpha, st->ch_enrg_long_db[i]);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
714 st->ch_enrg_long_db[i] = round(L_add(Ltmp1, Ltmp2));
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
715 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
716
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
717
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
718 /* Set or clear the noise update flags */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
719 update_flag = FALSE; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
720 st->fupdate_flag = FALSE; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
721 test(),test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
722 if (sub(vm_sum, UPDATE_THLD) <= 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
723 { test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
724 if (st->burstcount == 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
725 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
726 update_flag = TRUE; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
727 st->update_cnt = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
728 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
729 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
730 else if (L_sub(Ltce, noise_floor_chan[st->shift_state]) > 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
731 { test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
732 if (sub(ch_enrg_dev, DEV_THLD) < 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
733 { test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
734 if (p2a_flag == FALSE)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
735 { test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
736 if (st->LTP_flag == FALSE)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
737 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
738 st->update_cnt = add(st->update_cnt, 1); test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
739 if (sub(st->update_cnt, UPDATE_CNT_THLD) >= 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
740 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
741 update_flag = TRUE; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
742 st->fupdate_flag = TRUE; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
743 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
744 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
745 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
746 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
747 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
748 test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
749 if (sub(st->update_cnt, st->last_update_cnt) == 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
750 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
751 st->hyster_cnt = add(st->hyster_cnt, 1);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
752 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
753 else
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
754 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
755 st->hyster_cnt = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
756 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
757
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
758 st->last_update_cnt = st->update_cnt; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
759 test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
760 if (sub(st->hyster_cnt, HYSTER_CNT_THLD) > 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
761 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
762 st->update_cnt = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
763 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
764
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
765
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
766 /* Conditionally update the channel noise estimates */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
767 test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
768 if (update_flag == TRUE)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
769 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
770 /* Check shift state */ test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
771 if (st->shift_state == 1)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
772 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
773 /* get factor to shift ch_enrg[] from state 1 to 0 (noise always state 0) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
774 tmp = state_change_shift_r[0]; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
775 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
776 else
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
777 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
778 /* No shift if already state 0 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
779 tmp = 0; move16();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
780 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
781
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
782 /* Update noise energy estimate */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
783 for (i = LO_CHAN; i <= HI_CHAN; i++)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
784 { test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
785 /* integrate over time: en[i] = (1-alpha)*en[i] + alpha*e[n] */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
786 /* (extract with shift compensation for state 1) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
787 L_Extract (L_shr(st->Lch_enrg[i], tmp), &hi1, &lo1);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
788 Ltmp = Mpy_32_16(hi1, lo1, CNE_SM_FAC);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
789
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
790 L_Extract (st->Lch_noise[i], &hi1, &lo1);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
791 st->Lch_noise[i] = L_add(Ltmp, Mpy_32_16(hi1, lo1, ONE_MINUS_CNE_SM_FAC)); move32();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
792
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
793 /* Limit low level noise */ test();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
794 if (L_sub(st->Lch_noise[i], MIN_NOISE_ENRG_0) < 0)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
795 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
796 st->Lch_noise[i] = MIN_NOISE_ENRG_0; move32();
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
797 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
798 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
799 }
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
800
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
801 return(ivad);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
802 } /* end of vad2 () */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
803
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
804
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
805 /**** Other related functions *****/
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
806
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
807 /***************************************************************************
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
808 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
809 * FUNCTION NAME: vad2_reset()
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
810 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
811 * PURPOSE:
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
812 * The purpose of this function is to initialise the vad2() state
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
813 * variables.
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
814 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
815 * INPUTS:
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
816 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
817 * &st
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
818 * pointer to data structure of vad2 state variables
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
819 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
820 * OUTPUTS:
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
821 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
822 * none
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
823 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
824 * RETURN VALUE:
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
825 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
826 * none
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
827 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
828 * DESCRIPTION:
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
829 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
830 * Set all values in vad2 state to zero. Since it is
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
831 * known that all elements in the structure contain
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
832 * 16 and 32 bit fixed point elements, the initialisation
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
833 * is performed by zeroing out the number of bytes in the
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
834 * structure divided by two.
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
835 *
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
836 *************************************************************************/
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
837
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
838 void vad2_reset (vadState2 * st)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
839 {
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
840 memset(st, 0, sizeof(vadState2));
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
841 } /* end of vad2_reset () */