annotate libtwamr/vad2.h @ 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.h
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 #ifndef vad2_h
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 #define vad2_h "$Id $"
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 #include "typedef.h"
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 /***** Defines ****/
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23 #define YES 1
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 #define NO 0
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 #define ON 1
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 #define OFF 0
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 #define TRUE 1
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 #define FALSE 0
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 #define FRM_LEN 80
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 #define DELAY 24
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 #define FFT_LEN 128
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 #define NUM_CHAN 16
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 #define LO_CHAN 0
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 #define HI_CHAN 15
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 #define UPDATE_THLD 35
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 #define HYSTER_CNT_THLD 6
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 #define UPDATE_CNT_THLD 50
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 #define SHIFT_STATE_0 0 /* channel energy scaled as 22,9 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 #define SHIFT_STATE_1 1 /* channel energy scaled as 27,4 */
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 #define NOISE_FLOOR_CHAN_0 512 /* 1.0 scaled as 22,9 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 #define MIN_CHAN_ENRG_0 32 /* 0.0625 scaled as 22,9 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 #define MIN_NOISE_ENRG_0 32 /* 0.0625 scaled as 22,9 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 #define INE_NOISE_0 8192 /* 16.0 scaled as 22,9 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 #define FRACTIONAL_BITS_0 9 /* used as input to fn10Log10() */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 #define NOISE_FLOOR_CHAN_1 16 /* 1.0 scaled as 27,4 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52 #define MIN_CHAN_ENRG_1 1 /* 0.0625 scaled as 27,4 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 #define MIN_NOISE_ENRG_1 1 /* 0.0625 scaled as 27,4 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 #define INE_NOISE_1 256 /* 16.0 scaled as 27,4 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 #define FRACTIONAL_BITS_1 4 /* used as input to fn10Log10() */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 #define STATE_1_TO_0_SHIFT_R (FRACTIONAL_BITS_1-FRACTIONAL_BITS_0) /* state correction factor */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58 #define STATE_0_TO_1_SHIFT_R (FRACTIONAL_BITS_0-FRACTIONAL_BITS_1) /* state correction factor */
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 #define HIGH_ALPHA 29491 /* 0.9 scaled as 0,15 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 #define LOW_ALPHA 22938 /* 0.7 scaled as 0,15 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 #define ALPHA_RANGE (HIGH_ALPHA - LOW_ALPHA)
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 #define DEV_THLD 7168 /* 28.0 scaled as 7,8 */
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 #define PRE_EMP_FAC (-26214) /* -0.8 scaled as 0,15 */
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 #define CEE_SM_FAC 18022 /* 0.55 scaled as 0,15 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 #define ONE_MINUS_CEE_SM_FAC 14746 /* 0.45 scaled as 0,15 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 #define CNE_SM_FAC 3277 /* 0.1 scaled as 0,15 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71 #define ONE_MINUS_CNE_SM_FAC 29491 /* 0.9 scaled as 0,15 */
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 #define FFT_HEADROOM 2
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 typedef struct
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 Word16 pre_emp_mem;
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 Word16 update_cnt;
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 Word16 hyster_cnt;
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 Word16 last_update_cnt;
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 Word16 ch_enrg_long_db[NUM_CHAN]; /* scaled as 7,8 */
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 Word32 Lframe_cnt;
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
85 Word32 Lch_enrg[NUM_CHAN]; /* scaled as 22,9 or 27,4 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
86 Word32 Lch_noise[NUM_CHAN]; /* scaled as 22,9 */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
87
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
88 Word16 last_normb_shift; /* last block norm shift count */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
89
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
90 Word16 tsnr; /* total signal-to-noise ratio in dB (scaled as 7,8) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
91 Word16 hangover;
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
92 Word16 burstcount;
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
93 Word16 fupdate_flag; /* forced update flag from previous frame */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
94 Word16 negSNRvar; /* Negative SNR variance (scaled as 7,8) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
95 Word16 negSNRbias; /* sensitivity bias from negative SNR variance (scaled as 15,0) */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
96
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
97 Word16 shift_state; /* use 22,9 or 27,4 scaling for ch_enrg[] */
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 Word32 L_R0;
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
100 Word32 L_Rmax;
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
101 Flag LTP_flag; /* Use to indicate the the LTP gain is > LTP_THRESH */
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
102
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
103 } vadState2;
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 /**** Prototypes ****/
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 Word16 vad2 (Word16 *farray_ptr, vadState2 *st);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
108 void vad2_reset (vadState2 *st);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
109
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
110 void r_fft (Word16 *farray_ptr);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
111 void LTP_flag_update (vadState2 *st, Word16 mode);
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
112
0152c069d01f libtwamr: integrate VAD2 main body
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
113 #endif