aec.h
4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
#ifndef __AEC_H__
#define __AEC_H__
#include "optek_hifi2.h"
#define __AEC_TEXT // __attribute__ ((section (".internal_ram_1_text")))
#define AEC_CVSD_LIB_RELEASE
//#define AEC_CALIBRATE_RAM_DUMP
//#define AEC_CVSD_CALIBRATE_PRINT <- can't work, too slow
//#define AEC_PROCESS
//#define AEC_TEST : dead ? why?
#define AEC_BUF_ALLOC_DYNAMIC
#define AEC_DT_BY_FREQUENCY
// https://developer.android.com/about/dashboards/index.html
typedef enum {
en_AEC_PRINT_DISABLE,
//en_AEC_PRINT_ENABLE_ALL,
//giegel
en_GIEGEL_PFAR,
en_GIEGEL_MAX_ABS_FAR,
en_GIEGEL_ABS_MIC,
en_GIEGEL_GIEGEL,
//freq
en_FREQ_P_FAR,
en_FREQ_P_MIC_LOW,
en_FREQ_P_MIC_HIGH,
//common
en_DATA_FAR,
en_DATA_MIC,
en_DATA_ERR,
//debug
en_FAR_CVSD,
en_FAR_CVSD_DEC,
en_FAR_CVSD_DEC_FILT
} enum_AEC_PRINT_TYPE;
/*
common mode for ramdump:
en_DATA_FAR + en_DATA_MIC; U16x2/8k
en_DATA_MIC: U16/32k
en_GIEGEL_MAX_ABS_FAR + en_GIEGEL_ABS_MIC: U16x2/8K
en_FREQ_P_MIC_LOW + en_FREQ_P_MIC_HIGH: U32x2/8k
en_FREQ_P_FAR/en_GIEGEL_PFAR: U32/8k
*/
#ifdef AEC_CALIBRATE_RAM_DUMP
//#define RAM_DUMP_NONE
//#define RAM_DUMP_DATA_FAR_MIC // U16x2, 8K
//#define RAM_DUMP_DATA_MIC // U16, 32K
//#define RAM_DUMP_DATA_ERR // U16, 8K
//#define RAM_DUMP_FREQ_P_MIC_LOW_HIGH // U32x2 -> U16x2 32K
//#define RAM_DUMP_FREQ_P_FAR // U32 -> U16 8K
//below are all 8K Hz
//#define RAM_DUMP_GIEGEL_P_FAR // U32 -> U16
//#define RAM_DUMP_GIGEL_ABS_FAR_MIC // U16x2 , 8K
//#define RAM_DUMP_GIEGEL_GEIGEL // U16
//#define RAM_DUMP_FAR_END_CVSD // 64k, 1bit per sample --> 8KB/s U8
//#define RAM_DUMP_FAR_END_CVSD_DEC // 64k/16bits --> 128KB/s U16
//#define RAM_DUMP_FAR_END_CVSD_DEC_FILT // same as RAM_DUMP_FAR_END_CVSD_DEC U16
//#define RAM_DUMP_MIC_CVSD
#endif
void ramDump_dump( int dataSource, int data );
void ramDump_dump2( int dataSource, int data );
int aec_printf(int prtType, int data );
int aecFunc_isPrintEnable(void);
#define SHIFT_DOUBLE_BUFFER
#define FILTER_TAP_512 // 64ms
//#define FILTER_TAP_256 // 32ms
#define AEC_UNIT short
#define P_TYPE I64
//#define P_TYPE I32
typedef enum {
en_AEC_ALGO_GIEGEL,
en_AEC_ALGO_FREQ_DIVIDE
} enum_AEC_ALGORITHM;
typedef struct {
int enable;
int algorithm;
int nlpon;
int filterTaps;
AEC_UNIT *filterCoeff;
AEC_UNIT *filterCoeff0;
AEC_UNIT *filterCoeff1;
int pointCnt;
AEC_UNIT *inputVector;
#ifdef SHIFT_DOUBLE_BUFFER
AEC_UNIT *inputVectorBuf;
int vectorBufLen;
#endif
int mu;
//int lambda;
P_TYPE lambda;
// int farEndIndx;
// int nearEndIndex;
P_TYPE P0;
int tt;
int inOld;
// nlp
int nlpResidualThreshold;
int nlpDelta_f;
int nlpDelta_r;
int nlpAmp0;
//lfsr
U16 lfsr;
//aec data buffer
I16 *farEndData;
I16 *farEndData2;
int farEndDataIndx;
I16 *nearEndData;
I16 *errSigData;
int maxDataBufNums;
int dataSamples;
//double talk
int hangoverMaxCnt;
int dtHangoverCnt;
int dtFlag;
int flagFarSpeech;
int hangcntFar;
int powerFar;
int powerFar0;
// int farAlpha;
int farAlphaRshift;
int maxAbsFarend;
int flagNearSpeech;
int hangcntNear;
int powerNear;
int powerNear0;
//threshold
int farSpeechPowerthreshold;
int giegelThreshold;
#ifdef AEC_DT_BY_FREQUENCY
// near end low/high power
int powerLow;
int powerLow0;
int powerLowThreshold;
//int powerLowFlag;
int powerHigh;
int powerHigh0;
int powerHighThreshold;
//int powerHighFlag;
int freqAlphaShift;
I16 *nearLowData;
I16 *nearHighData;
int nearDataSzBytes;
#endif
/*
int errSigPowerThreshold;
int farEndPowerThreshold;
int dtCheckThreshold;
*/
} AEC_DATA;
#define IN
#define OUT
#define INOUT
int aec_init( int algorithm );
int aec_enable( int ena );
/*
far end/near end/output signal data always have same sample size
*/
int aec_process( IN I16 *farEndData, IN I16 *nearEndData, OUT I16 *outData, int sampleNum );
int aec_processII( void );
int aec_farEndSigProc( INOUT I16 *data, int size ); // data filtered
int aec_micSigProc( INOUT I16 *data, int size );
int aec_errSigPostProc( I16 *data, int maxSize );
int aec_isFarEndSignalSilent(void);
#endif