moving_average_unittest.cc (3264B)
1 /* 2 * Copyright (c) 2018 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 #include "modules/audio_processing/aec3/moving_average.h" 12 13 #include <array> 14 #include <cstddef> 15 16 #include "test/gtest.h" 17 18 namespace webrtc { 19 20 TEST(MovingAverage, Average) { 21 constexpr size_t num_elem = 4; 22 constexpr size_t mem_len = 3; 23 constexpr float e = 1e-6f; 24 aec3::MovingAverage ma(num_elem, mem_len); 25 std::array<float, num_elem> data1 = {1, 2, 3, 4}; 26 std::array<float, num_elem> data2 = {5, 1, 9, 7}; 27 std::array<float, num_elem> data3 = {3, 3, 5, 6}; 28 std::array<float, num_elem> data4 = {8, 4, 2, 1}; 29 std::array<float, num_elem> output; 30 31 ma.Average(data1, output); 32 EXPECT_NEAR(output[0], data1[0] / 3.0f, e); 33 EXPECT_NEAR(output[1], data1[1] / 3.0f, e); 34 EXPECT_NEAR(output[2], data1[2] / 3.0f, e); 35 EXPECT_NEAR(output[3], data1[3] / 3.0f, e); 36 37 ma.Average(data2, output); 38 EXPECT_NEAR(output[0], (data1[0] + data2[0]) / 3.0f, e); 39 EXPECT_NEAR(output[1], (data1[1] + data2[1]) / 3.0f, e); 40 EXPECT_NEAR(output[2], (data1[2] + data2[2]) / 3.0f, e); 41 EXPECT_NEAR(output[3], (data1[3] + data2[3]) / 3.0f, e); 42 43 ma.Average(data3, output); 44 EXPECT_NEAR(output[0], (data1[0] + data2[0] + data3[0]) / 3.0f, e); 45 EXPECT_NEAR(output[1], (data1[1] + data2[1] + data3[1]) / 3.0f, e); 46 EXPECT_NEAR(output[2], (data1[2] + data2[2] + data3[2]) / 3.0f, e); 47 EXPECT_NEAR(output[3], (data1[3] + data2[3] + data3[3]) / 3.0f, e); 48 49 ma.Average(data4, output); 50 EXPECT_NEAR(output[0], (data2[0] + data3[0] + data4[0]) / 3.0f, e); 51 EXPECT_NEAR(output[1], (data2[1] + data3[1] + data4[1]) / 3.0f, e); 52 EXPECT_NEAR(output[2], (data2[2] + data3[2] + data4[2]) / 3.0f, e); 53 EXPECT_NEAR(output[3], (data2[3] + data3[3] + data4[3]) / 3.0f, e); 54 } 55 56 TEST(MovingAverage, PassThrough) { 57 constexpr size_t num_elem = 4; 58 constexpr size_t mem_len = 1; 59 constexpr float e = 1e-6f; 60 aec3::MovingAverage ma(num_elem, mem_len); 61 std::array<float, num_elem> data1 = {1, 2, 3, 4}; 62 std::array<float, num_elem> data2 = {5, 1, 9, 7}; 63 std::array<float, num_elem> data3 = {3, 3, 5, 6}; 64 std::array<float, num_elem> data4 = {8, 4, 2, 1}; 65 std::array<float, num_elem> output; 66 67 ma.Average(data1, output); 68 EXPECT_NEAR(output[0], data1[0], e); 69 EXPECT_NEAR(output[1], data1[1], e); 70 EXPECT_NEAR(output[2], data1[2], e); 71 EXPECT_NEAR(output[3], data1[3], e); 72 73 ma.Average(data2, output); 74 EXPECT_NEAR(output[0], data2[0], e); 75 EXPECT_NEAR(output[1], data2[1], e); 76 EXPECT_NEAR(output[2], data2[2], e); 77 EXPECT_NEAR(output[3], data2[3], e); 78 79 ma.Average(data3, output); 80 EXPECT_NEAR(output[0], data3[0], e); 81 EXPECT_NEAR(output[1], data3[1], e); 82 EXPECT_NEAR(output[2], data3[2], e); 83 EXPECT_NEAR(output[3], data3[3], e); 84 85 ma.Average(data4, output); 86 EXPECT_NEAR(output[0], data4[0], e); 87 EXPECT_NEAR(output[1], data4[1], e); 88 EXPECT_NEAR(output[2], data4[2], e); 89 EXPECT_NEAR(output[3], data4[3], e); 90 } 91 92 } // namespace webrtc