OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
130 std::vector<float>(kBlockSize, 0.f)); | 130 std::vector<float>(kBlockSize, 0.f)); |
131 std::array<float, kBlockSize> capture; | 131 std::array<float, kBlockSize> capture; |
132 capture.fill(0.f); | 132 capture.fill(0.f); |
133 ApmDataDumper data_dumper(0); | 133 ApmDataDumper data_dumper(0); |
134 for (size_t delay_samples : {5, 64, 150, 200, 800, 1000}) { | 134 for (size_t delay_samples : {5, 64, 150, 200, 800, 1000}) { |
135 SCOPED_TRACE(ProduceDebugText(delay_samples)); | 135 SCOPED_TRACE(ProduceDebugText(delay_samples)); |
136 DecimatorBy4 capture_decimator; | 136 DecimatorBy4 capture_decimator; |
137 DelayBuffer<float> signal_delay_buffer(4 * delay_samples); | 137 DelayBuffer<float> signal_delay_buffer(4 * delay_samples); |
138 MatchedFilter filter(&data_dumper, DetectOptimization(), | 138 MatchedFilter filter(&data_dumper, DetectOptimization(), |
139 kWindowSizeSubBlocks, kNumMatchedFilters, | 139 kWindowSizeSubBlocks, kNumMatchedFilters, |
140 kAlignmentShiftSubBlocks); | 140 kAlignmentShiftSubBlocks, 150); |
141 std::unique_ptr<RenderDelayBuffer> render_delay_buffer( | 141 std::unique_ptr<RenderDelayBuffer> render_delay_buffer( |
142 RenderDelayBuffer::Create(3)); | 142 RenderDelayBuffer::Create(3)); |
143 | 143 |
144 // Analyze the correlation between render and capture. | 144 // Analyze the correlation between render and capture. |
145 for (size_t k = 0; k < (100 + delay_samples / kSubBlockSize); ++k) { | 145 for (size_t k = 0; k < (100 + delay_samples / kSubBlockSize); ++k) { |
146 RandomizeSampleVector(&random_generator, render[0]); | 146 RandomizeSampleVector(&random_generator, render[0]); |
147 signal_delay_buffer.Delay(render[0], capture); | 147 signal_delay_buffer.Delay(render[0], capture); |
148 render_delay_buffer->Insert(render); | 148 render_delay_buffer->Insert(render); |
149 render_delay_buffer->UpdateBuffers(); | 149 render_delay_buffer->UpdateBuffers(); |
150 std::array<float, kSubBlockSize> downsampled_capture; | 150 std::array<float, kSubBlockSize> downsampled_capture; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 TEST(MatchedFilter, LagNotReliableForUncorrelatedRenderAndCapture) { | 199 TEST(MatchedFilter, LagNotReliableForUncorrelatedRenderAndCapture) { |
200 Random random_generator(42U); | 200 Random random_generator(42U); |
201 std::vector<std::vector<float>> render(3, | 201 std::vector<std::vector<float>> render(3, |
202 std::vector<float>(kBlockSize, 0.f)); | 202 std::vector<float>(kBlockSize, 0.f)); |
203 std::array<float, kSubBlockSize> capture; | 203 std::array<float, kSubBlockSize> capture; |
204 capture.fill(0.f); | 204 capture.fill(0.f); |
205 ApmDataDumper data_dumper(0); | 205 ApmDataDumper data_dumper(0); |
206 std::unique_ptr<RenderDelayBuffer> render_delay_buffer( | 206 std::unique_ptr<RenderDelayBuffer> render_delay_buffer( |
207 RenderDelayBuffer::Create(3)); | 207 RenderDelayBuffer::Create(3)); |
208 MatchedFilter filter(&data_dumper, DetectOptimization(), kWindowSizeSubBlocks, | 208 MatchedFilter filter(&data_dumper, DetectOptimization(), kWindowSizeSubBlocks, |
209 kNumMatchedFilters, kAlignmentShiftSubBlocks); | 209 kNumMatchedFilters, kAlignmentShiftSubBlocks, 150); |
210 | 210 |
211 // Analyze the correlation between render and capture. | 211 // Analyze the correlation between render and capture. |
212 for (size_t k = 0; k < 100; ++k) { | 212 for (size_t k = 0; k < 100; ++k) { |
213 RandomizeSampleVector(&random_generator, render[0]); | 213 RandomizeSampleVector(&random_generator, render[0]); |
214 RandomizeSampleVector(&random_generator, capture); | 214 RandomizeSampleVector(&random_generator, capture); |
215 render_delay_buffer->Insert(render); | 215 render_delay_buffer->Insert(render); |
216 filter.Update(render_delay_buffer->GetDownsampledRenderBuffer(), capture); | 216 filter.Update(render_delay_buffer->GetDownsampledRenderBuffer(), capture); |
217 } | 217 } |
218 | 218 |
219 // Obtain the lag estimates. | 219 // Obtain the lag estimates. |
220 auto lag_estimates = filter.GetLagEstimates(); | 220 auto lag_estimates = filter.GetLagEstimates(); |
221 EXPECT_EQ(kNumMatchedFilters, lag_estimates.size()); | 221 EXPECT_EQ(kNumMatchedFilters, lag_estimates.size()); |
222 | 222 |
223 // Verify that no lag estimates are reliable. | 223 // Verify that no lag estimates are reliable. |
224 for (auto& le : lag_estimates) { | 224 for (auto& le : lag_estimates) { |
225 EXPECT_FALSE(le.reliable); | 225 EXPECT_FALSE(le.reliable); |
226 } | 226 } |
227 } | 227 } |
228 | 228 |
229 // Verifies that the matched filter does not produce updated lag estimates for | 229 // Verifies that the matched filter does not produce updated lag estimates for |
230 // render signals of low level. | 230 // render signals of low level. |
231 TEST(MatchedFilter, LagNotUpdatedForLowLevelRender) { | 231 TEST(MatchedFilter, LagNotUpdatedForLowLevelRender) { |
232 Random random_generator(42U); | 232 Random random_generator(42U); |
233 std::vector<std::vector<float>> render(3, | 233 std::vector<std::vector<float>> render(3, |
234 std::vector<float>(kBlockSize, 0.f)); | 234 std::vector<float>(kBlockSize, 0.f)); |
235 std::array<float, kBlockSize> capture; | 235 std::array<float, kBlockSize> capture; |
236 capture.fill(0.f); | 236 capture.fill(0.f); |
237 ApmDataDumper data_dumper(0); | 237 ApmDataDumper data_dumper(0); |
238 MatchedFilter filter(&data_dumper, DetectOptimization(), kWindowSizeSubBlocks, | 238 MatchedFilter filter(&data_dumper, DetectOptimization(), kWindowSizeSubBlocks, |
239 kNumMatchedFilters, kAlignmentShiftSubBlocks); | 239 kNumMatchedFilters, kAlignmentShiftSubBlocks, 150); |
240 std::unique_ptr<RenderDelayBuffer> render_delay_buffer( | 240 std::unique_ptr<RenderDelayBuffer> render_delay_buffer( |
241 RenderDelayBuffer::Create(3)); | 241 RenderDelayBuffer::Create(3)); |
242 DecimatorBy4 capture_decimator; | 242 DecimatorBy4 capture_decimator; |
243 | 243 |
244 // Analyze the correlation between render and capture. | 244 // Analyze the correlation between render and capture. |
245 for (size_t k = 0; k < 100; ++k) { | 245 for (size_t k = 0; k < 100; ++k) { |
246 RandomizeSampleVector(&random_generator, render[0]); | 246 RandomizeSampleVector(&random_generator, render[0]); |
247 for (auto& render_k : render[0]) { | 247 for (auto& render_k : render[0]) { |
248 render_k *= 149.f / 32767.f; | 248 render_k *= 149.f / 32767.f; |
249 } | 249 } |
(...skipping 16 matching lines...) Expand all Loading... |
266 } | 266 } |
267 } | 267 } |
268 | 268 |
269 // Verifies that the correct number of lag estimates are produced for a certain | 269 // Verifies that the correct number of lag estimates are produced for a certain |
270 // number of alignment shifts. | 270 // number of alignment shifts. |
271 TEST(MatchedFilter, NumberOfLagEstimates) { | 271 TEST(MatchedFilter, NumberOfLagEstimates) { |
272 ApmDataDumper data_dumper(0); | 272 ApmDataDumper data_dumper(0); |
273 for (size_t num_matched_filters = 0; num_matched_filters < 10; | 273 for (size_t num_matched_filters = 0; num_matched_filters < 10; |
274 ++num_matched_filters) { | 274 ++num_matched_filters) { |
275 MatchedFilter filter(&data_dumper, DetectOptimization(), 32, | 275 MatchedFilter filter(&data_dumper, DetectOptimization(), 32, |
276 num_matched_filters, 1); | 276 num_matched_filters, 1, 150); |
277 EXPECT_EQ(num_matched_filters, filter.GetLagEstimates().size()); | 277 EXPECT_EQ(num_matched_filters, filter.GetLagEstimates().size()); |
278 } | 278 } |
279 } | 279 } |
280 | 280 |
281 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) | 281 #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) |
282 | 282 |
283 // Verifies the check for non-zero windows size. | 283 // Verifies the check for non-zero windows size. |
284 TEST(MatchedFilter, ZeroWindowSize) { | 284 TEST(MatchedFilter, ZeroWindowSize) { |
285 ApmDataDumper data_dumper(0); | 285 ApmDataDumper data_dumper(0); |
286 EXPECT_DEATH(MatchedFilter(&data_dumper, DetectOptimization(), 0, 1, 1), ""); | 286 EXPECT_DEATH(MatchedFilter(&data_dumper, DetectOptimization(), 0, 1, 1, 150), |
| 287 ""); |
287 } | 288 } |
288 | 289 |
289 // Verifies the check for non-null data dumper. | 290 // Verifies the check for non-null data dumper. |
290 TEST(MatchedFilter, NullDataDumper) { | 291 TEST(MatchedFilter, NullDataDumper) { |
291 EXPECT_DEATH(MatchedFilter(nullptr, DetectOptimization(), 1, 1, 1), ""); | 292 EXPECT_DEATH(MatchedFilter(nullptr, DetectOptimization(), 1, 1, 1, 150), ""); |
292 } | 293 } |
293 | 294 |
294 #endif | 295 #endif |
295 | 296 |
296 } // namespace aec3 | 297 } // namespace aec3 |
297 } // namespace webrtc | 298 } // namespace webrtc |
OLD | NEW |