1 /*
2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 // Performs delay estimation on binary converted spectra.
12 // The return value is  0 - OK and -1 - Error, unless otherwise stated.
13 
14 #ifndef MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_H_
15 #define MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_H_
16 
17 #include <stdint.h>
18 
19 namespace webrtc {
20 
21 static const int32_t kMaxBitCountsQ9 = (32 << 9);  // 32 matching bits in Q9.
22 
23 typedef struct {
24   // Pointer to bit counts.
25   int* far_bit_counts;
26   // Binary history variables.
27   uint32_t* binary_far_history;
28   int history_size;
29 } BinaryDelayEstimatorFarend;
30 
31 typedef struct {
32   // Pointer to bit counts.
33   int32_t* mean_bit_counts;
34   // Array only used locally in ProcessBinarySpectrum() but whose size is
35   // determined at run-time.
36   int32_t* bit_counts;
37 
38   // Binary history variables.
39   uint32_t* binary_near_history;
40   int near_history_size;
41   int history_size;
42 
43   // Delay estimation variables.
44   int32_t minimum_probability;
45   int last_delay_probability;
46 
47   // Delay memory.
48   int last_delay;
49 
50   // Robust validation
51   int robust_validation_enabled;
52   int allowed_offset;
53   int last_candidate_delay;
54   int compare_delay;
55   int candidate_hits;
56   float* histogram;
57   float last_delay_histogram;
58 
59   // For dynamically changing the lookahead when using SoftReset...().
60   int lookahead;
61 
62   // Far-end binary spectrum history buffer etc.
63   BinaryDelayEstimatorFarend* farend;
64 } BinaryDelayEstimator;
65 
66 // Releases the memory allocated by
67 // WebRtc_CreateBinaryDelayEstimatorFarend(...).
68 // Input:
69 //    - self              : Pointer to the binary delay estimation far-end
70 //                          instance which is the return value of
71 //                          WebRtc_CreateBinaryDelayEstimatorFarend().
72 //
73 void WebRtc_FreeBinaryDelayEstimatorFarend(BinaryDelayEstimatorFarend* self);
74 
75 // Allocates the memory needed by the far-end part of the binary delay
76 // estimation. The memory needs to be initialized separately through
77 // WebRtc_InitBinaryDelayEstimatorFarend(...).
78 //
79 // Inputs:
80 //      - history_size    : Size of the far-end binary spectrum history.
81 //
82 // Return value:
83 //      - BinaryDelayEstimatorFarend*
84 //                        : Created |handle|. If the memory can't be allocated
85 //                          or if any of the input parameters are invalid NULL
86 //                          is returned.
87 //
88 BinaryDelayEstimatorFarend* WebRtc_CreateBinaryDelayEstimatorFarend(
89     int history_size);
90 
91 // Re-allocates the buffers.
92 //
93 // Inputs:
94 //      - self            : Pointer to the binary estimation far-end instance
95 //                          which is the return value of
96 //                          WebRtc_CreateBinaryDelayEstimatorFarend().
97 //      - history_size    : Size of the far-end binary spectrum history.
98 //
99 // Return value:
100 //      - history_size    : The history size allocated.
101 int WebRtc_AllocateFarendBufferMemory(BinaryDelayEstimatorFarend* self,
102                                       int history_size);
103 
104 // Initializes the delay estimation far-end instance created with
105 // WebRtc_CreateBinaryDelayEstimatorFarend(...).
106 //
107 // Input:
108 //    - self              : Pointer to the delay estimation far-end instance.
109 //
110 // Output:
111 //    - self              : Initialized far-end instance.
112 //
113 void WebRtc_InitBinaryDelayEstimatorFarend(BinaryDelayEstimatorFarend* self);
114 
115 // Soft resets the delay estimation far-end instance created with
116 // WebRtc_CreateBinaryDelayEstimatorFarend(...).
117 //
118 // Input:
119 //    - delay_shift   : The amount of blocks to shift history buffers.
120 //
121 void WebRtc_SoftResetBinaryDelayEstimatorFarend(
122     BinaryDelayEstimatorFarend* self,
123     int delay_shift);
124 
125 // Adds the binary far-end spectrum to the internal far-end history buffer. This
126 // spectrum is used as reference when calculating the delay using
127 // WebRtc_ProcessBinarySpectrum().
128 //
129 // Inputs:
130 //    - self                  : Pointer to the delay estimation far-end
131 //                              instance.
132 //    - binary_far_spectrum   : Far-end binary spectrum.
133 //
134 // Output:
135 //    - self                  : Updated far-end instance.
136 //
137 void WebRtc_AddBinaryFarSpectrum(BinaryDelayEstimatorFarend* self,
138                                  uint32_t binary_far_spectrum);
139 
140 // Releases the memory allocated by WebRtc_CreateBinaryDelayEstimator(...).
141 //
142 // Note that BinaryDelayEstimator utilizes BinaryDelayEstimatorFarend, but does
143 // not take ownership of it, hence the BinaryDelayEstimator has to be torn down
144 // before the far-end.
145 //
146 // Input:
147 //    - self              : Pointer to the binary delay estimation instance
148 //                          which is the return value of
149 //                          WebRtc_CreateBinaryDelayEstimator().
150 //
151 void WebRtc_FreeBinaryDelayEstimator(BinaryDelayEstimator* self);
152 
153 // Allocates the memory needed by the binary delay estimation. The memory needs
154 // to be initialized separately through WebRtc_InitBinaryDelayEstimator(...).
155 //
156 // See WebRtc_CreateDelayEstimator(..) in delay_estimator_wrapper.c for detailed
157 // description.
158 BinaryDelayEstimator* WebRtc_CreateBinaryDelayEstimator(
159     BinaryDelayEstimatorFarend* farend,
160     int max_lookahead);
161 
162 // Re-allocates |history_size| dependent buffers. The far-end buffers will be
163 // updated at the same time if needed.
164 //
165 // Input:
166 //      - self            : Pointer to the binary estimation instance which is
167 //                          the return value of
168 //                          WebRtc_CreateBinaryDelayEstimator().
169 //      - history_size    : Size of the history buffers.
170 //
171 // Return value:
172 //      - history_size    : The history size allocated.
173 int WebRtc_AllocateHistoryBufferMemory(BinaryDelayEstimator* self,
174                                        int history_size);
175 
176 // Initializes the delay estimation instance created with
177 // WebRtc_CreateBinaryDelayEstimator(...).
178 //
179 // Input:
180 //    - self              : Pointer to the delay estimation instance.
181 //
182 // Output:
183 //    - self              : Initialized instance.
184 //
185 void WebRtc_InitBinaryDelayEstimator(BinaryDelayEstimator* self);
186 
187 // Soft resets the delay estimation instance created with
188 // WebRtc_CreateBinaryDelayEstimator(...).
189 //
190 // Input:
191 //    - delay_shift   : The amount of blocks to shift history buffers.
192 //
193 // Return value:
194 //    - actual_shifts : The actual number of shifts performed.
195 //
196 int WebRtc_SoftResetBinaryDelayEstimator(BinaryDelayEstimator* self,
197                                          int delay_shift);
198 
199 // Estimates and returns the delay between the binary far-end and binary near-
200 // end spectra. It is assumed the binary far-end spectrum has been added using
201 // WebRtc_AddBinaryFarSpectrum() prior to this call. The value will be offset by
202 // the lookahead (i.e. the lookahead should be subtracted from the returned
203 // value).
204 //
205 // Inputs:
206 //    - self                  : Pointer to the delay estimation instance.
207 //    - binary_near_spectrum  : Near-end binary spectrum of the current block.
208 //
209 // Output:
210 //    - self                  : Updated instance.
211 //
212 // Return value:
213 //    - delay                 :  >= 0 - Calculated delay value.
214 //                              -2    - Insufficient data for estimation.
215 //
216 int WebRtc_ProcessBinarySpectrum(BinaryDelayEstimator* self,
217                                  uint32_t binary_near_spectrum);
218 
219 // Returns the last calculated delay updated by the function
220 // WebRtc_ProcessBinarySpectrum(...).
221 //
222 // Input:
223 //    - self                  : Pointer to the delay estimation instance.
224 //
225 // Return value:
226 //    - delay                 :  >= 0 - Last calculated delay value
227 //                              -2    - Insufficient data for estimation.
228 //
229 int WebRtc_binary_last_delay(BinaryDelayEstimator* self);
230 
231 // Returns the estimation quality of the last calculated delay updated by the
232 // function WebRtc_ProcessBinarySpectrum(...). The estimation quality is a value
233 // in the interval [0, 1].  The higher the value, the better the quality.
234 //
235 // Return value:
236 //    - delay_quality         :  >= 0 - Estimation quality of last calculated
237 //                                      delay value.
238 float WebRtc_binary_last_delay_quality(BinaryDelayEstimator* self);
239 
240 // Updates the |mean_value| recursively with a step size of 2^-|factor|. This
241 // function is used internally in the Binary Delay Estimator as well as the
242 // Fixed point wrapper.
243 //
244 // Inputs:
245 //    - new_value             : The new value the mean should be updated with.
246 //    - factor                : The step size, in number of right shifts.
247 //
248 // Input/Output:
249 //    - mean_value            : Pointer to the mean value.
250 //
251 void WebRtc_MeanEstimatorFix(int32_t new_value,
252                              int factor,
253                              int32_t* mean_value);
254 
255 }  // namespace webrtc
256 
257 #endif  // MODULES_AUDIO_PROCESSING_UTILITY_DELAY_ESTIMATOR_H_
258