OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2015 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 |
| 11 // MSVC++ requires this to be set before any other includes to get M_PI. |
| 12 #define _USE_MATH_DEFINES |
| 13 |
11 #include "webrtc/modules/audio_processing/beamformer/array_util.h" | 14 #include "webrtc/modules/audio_processing/beamformer/array_util.h" |
12 | 15 |
| 16 #include <math.h> |
13 #include <vector> | 17 #include <vector> |
14 | 18 |
15 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
16 | 20 |
17 namespace webrtc { | 21 namespace webrtc { |
18 | 22 |
| 23 bool operator==(const Point& lhs, const Point& rhs) { |
| 24 return lhs.x() == rhs.x() && lhs.y() == rhs.y() && lhs.z() == rhs.z(); |
| 25 } |
| 26 |
| 27 TEST(ArrayUtilTest, PairDirection) { |
| 28 EXPECT_EQ(Point(1.f, 2.f, 3.f), |
| 29 PairDirection(Point(0.f, 0.f, 0.f), Point(1.f, 2.f, 3.f))); |
| 30 EXPECT_EQ(Point(-1.f, -2.f, -3.f), |
| 31 PairDirection(Point(1.f, 2.f, 3.f), Point(0.f, 0.f, 0.f))); |
| 32 EXPECT_EQ(Point(0.f, 0.f, 0.f), |
| 33 PairDirection(Point(1.f, 0.f, 0.f), Point(1.f, 0.f, 0.f))); |
| 34 EXPECT_EQ(Point(-1.f, 2.f, 0.f), |
| 35 PairDirection(Point(1.f, 0.f, 0.f), Point(0.f, 2.f, 0.f))); |
| 36 EXPECT_EQ(Point(-4.f, 4.f, -4.f), |
| 37 PairDirection(Point(1.f, -2.f, 3.f), Point(-3.f, 2.f, -1.f))); |
| 38 } |
| 39 |
| 40 TEST(ArrayUtilTest, DotProduct) { |
| 41 EXPECT_FLOAT_EQ(0.f, DotProduct(Point(0.f, 0.f, 0.f), Point(1.f, 2.f, 3.f))); |
| 42 EXPECT_FLOAT_EQ(0.f, DotProduct(Point(1.f, 0.f, 2.f), Point(0.f, 3.f, 0.f))); |
| 43 EXPECT_FLOAT_EQ(0.f, DotProduct(Point(1.f, 1.f, 0.f), Point(1.f, -1.f, 0.f))); |
| 44 EXPECT_FLOAT_EQ(2.f, DotProduct(Point(1.f, 0.f, 0.f), Point(2.f, 0.f, 0.f))); |
| 45 EXPECT_FLOAT_EQ(-6.f, |
| 46 DotProduct(Point(-2.f, 0.f, 0.f), Point(3.f, 0.f, 0.f))); |
| 47 EXPECT_FLOAT_EQ(-10.f, |
| 48 DotProduct(Point(1.f, -2.f, 3.f), Point(-3.f, 2.f, -1.f))); |
| 49 } |
| 50 |
| 51 TEST(ArrayUtilTest, CrossProduct) { |
| 52 EXPECT_EQ(Point(0.f, 0.f, 0.f), |
| 53 CrossProduct(Point(0.f, 0.f, 0.f), Point(1.f, 2.f, 3.f))); |
| 54 EXPECT_EQ(Point(0.f, 0.f, 1.f), |
| 55 CrossProduct(Point(1.f, 0.f, 0.f), Point(0.f, 1.f, 0.f))); |
| 56 EXPECT_EQ(Point(1.f, 0.f, 0.f), |
| 57 CrossProduct(Point(0.f, 1.f, 0.f), Point(0.f, 0.f, 1.f))); |
| 58 EXPECT_EQ(Point(0.f, -1.f, 0.f), |
| 59 CrossProduct(Point(1.f, 0.f, 0.f), Point(0.f, 0.f, 1.f))); |
| 60 EXPECT_EQ(Point(-4.f, -8.f, -4.f), |
| 61 CrossProduct(Point(1.f, -2.f, 3.f), Point(-3.f, 2.f, -1.f))); |
| 62 } |
| 63 |
| 64 TEST(ArrayUtilTest, AreParallel) { |
| 65 EXPECT_TRUE(AreParallel(Point(0.f, 0.f, 0.f), Point(1.f, 2.f, 3.f))); |
| 66 EXPECT_FALSE(AreParallel(Point(1.f, 0.f, 2.f), Point(0.f, 3.f, 0.f))); |
| 67 EXPECT_FALSE(AreParallel(Point(1.f, 2.f, 0.f), Point(1.f, -0.5f, 0.f))); |
| 68 EXPECT_FALSE(AreParallel(Point(1.f, -2.f, 3.f), Point(-3.f, 2.f, -1.f))); |
| 69 EXPECT_TRUE(AreParallel(Point(1.f, 0.f, 0.f), Point(2.f, 0.f, 0.f))); |
| 70 EXPECT_TRUE(AreParallel(Point(1.f, 2.f, 3.f), Point(-2.f, -4.f, -6.f))); |
| 71 } |
| 72 |
| 73 TEST(ArrayUtilTest, ArePerpendicular) { |
| 74 EXPECT_TRUE(ArePerpendicular(Point(0.f, 0.f, 0.f), Point(1.f, 2.f, 3.f))); |
| 75 EXPECT_TRUE(ArePerpendicular(Point(1.f, 0.f, 2.f), Point(0.f, 3.f, 0.f))); |
| 76 EXPECT_TRUE(ArePerpendicular(Point(1.f, 2.f, 0.f), Point(1.f, -0.5f, 0.f))); |
| 77 EXPECT_FALSE(ArePerpendicular(Point(1.f, -2.f, 3.f), Point(-3.f, 2.f, -1.f))); |
| 78 EXPECT_FALSE(ArePerpendicular(Point(1.f, 0.f, 0.f), Point(2.f, 0.f, 0.f))); |
| 79 EXPECT_FALSE(ArePerpendicular(Point(1.f, 2.f, 3.f), Point(-2.f, -4.f, -6.f))); |
| 80 } |
| 81 |
19 TEST(ArrayUtilTest, GetMinimumSpacing) { | 82 TEST(ArrayUtilTest, GetMinimumSpacing) { |
20 std::vector<Point> array_geometry; | 83 std::vector<Point> geometry; |
21 array_geometry.push_back(Point(0.f, 0.f, 0.f)); | 84 geometry.push_back(Point(0.f, 0.f, 0.f)); |
22 array_geometry.push_back(Point(0.1f, 0.f, 0.f)); | 85 geometry.push_back(Point(0.1f, 0.f, 0.f)); |
23 EXPECT_FLOAT_EQ(0.1f, GetMinimumSpacing(array_geometry)); | 86 EXPECT_FLOAT_EQ(0.1f, GetMinimumSpacing(geometry)); |
24 array_geometry.push_back(Point(0.f, 0.05f, 0.f)); | 87 geometry.push_back(Point(0.f, 0.05f, 0.f)); |
25 EXPECT_FLOAT_EQ(0.05f, GetMinimumSpacing(array_geometry)); | 88 EXPECT_FLOAT_EQ(0.05f, GetMinimumSpacing(geometry)); |
26 array_geometry.push_back(Point(0.f, 0.f, 0.02f)); | 89 geometry.push_back(Point(0.f, 0.f, 0.02f)); |
27 EXPECT_FLOAT_EQ(0.02f, GetMinimumSpacing(array_geometry)); | 90 EXPECT_FLOAT_EQ(0.02f, GetMinimumSpacing(geometry)); |
28 array_geometry.push_back(Point(-0.003f, -0.004f, 0.02f)); | 91 geometry.push_back(Point(-0.003f, -0.004f, 0.02f)); |
29 EXPECT_FLOAT_EQ(0.005f, GetMinimumSpacing(array_geometry)); | 92 EXPECT_FLOAT_EQ(0.005f, GetMinimumSpacing(geometry)); |
| 93 } |
| 94 |
| 95 TEST(ArrayUtilTest, GetDirectionIfLinear) { |
| 96 std::vector<Point> geometry; |
| 97 geometry.push_back(Point(0.f, 0.f, 0.f)); |
| 98 geometry.push_back(Point(0.1f, 0.f, 0.f)); |
| 99 EXPECT_TRUE( |
| 100 AreParallel(Point(1.f, 0.f, 0.f), *GetDirectionIfLinear(geometry))); |
| 101 geometry.push_back(Point(0.15f, 0.f, 0.f)); |
| 102 EXPECT_TRUE( |
| 103 AreParallel(Point(1.f, 0.f, 0.f), *GetDirectionIfLinear(geometry))); |
| 104 geometry.push_back(Point(-0.2f, 0.f, 0.f)); |
| 105 EXPECT_TRUE( |
| 106 AreParallel(Point(1.f, 0.f, 0.f), *GetDirectionIfLinear(geometry))); |
| 107 geometry.push_back(Point(0.05f, 0.f, 0.f)); |
| 108 EXPECT_TRUE( |
| 109 AreParallel(Point(1.f, 0.f, 0.f), *GetDirectionIfLinear(geometry))); |
| 110 geometry.push_back(Point(0.1f, 0.1f, 0.f)); |
| 111 EXPECT_FALSE(GetDirectionIfLinear(geometry)); |
| 112 geometry.push_back(Point(0.f, 0.f, -0.2f)); |
| 113 EXPECT_FALSE(GetDirectionIfLinear(geometry)); |
| 114 } |
| 115 |
| 116 TEST(ArrayUtilTest, GetNormalIfPlanar) { |
| 117 std::vector<Point> geometry; |
| 118 geometry.push_back(Point(0.f, 0.f, 0.f)); |
| 119 geometry.push_back(Point(0.1f, 0.f, 0.f)); |
| 120 EXPECT_FALSE(GetNormalIfPlanar(geometry)); |
| 121 geometry.push_back(Point(0.15f, 0.f, 0.f)); |
| 122 EXPECT_FALSE(GetNormalIfPlanar(geometry)); |
| 123 geometry.push_back(Point(0.1f, 0.2f, 0.f)); |
| 124 EXPECT_TRUE(AreParallel(Point(0.f, 0.f, 1.f), *GetNormalIfPlanar(geometry))); |
| 125 geometry.push_back(Point(0.f, -0.15f, 0.f)); |
| 126 EXPECT_TRUE(AreParallel(Point(0.f, 0.f, 1.f), *GetNormalIfPlanar(geometry))); |
| 127 geometry.push_back(Point(0.f, 0.1f, 0.2f)); |
| 128 EXPECT_FALSE(GetNormalIfPlanar(geometry)); |
| 129 geometry.push_back(Point(0.f, 0.f, -0.15f)); |
| 130 EXPECT_FALSE(GetNormalIfPlanar(geometry)); |
| 131 geometry.push_back(Point(0.1f, 0.2f, 0.f)); |
| 132 EXPECT_FALSE(GetNormalIfPlanar(geometry)); |
| 133 } |
| 134 |
| 135 TEST(ArrayUtilTest, GetArrayNormalIfExists) { |
| 136 std::vector<Point> geometry; |
| 137 geometry.push_back(Point(0.f, 0.f, 0.f)); |
| 138 geometry.push_back(Point(0.1f, 0.f, 0.f)); |
| 139 EXPECT_TRUE( |
| 140 AreParallel(Point(0.f, 1.f, 0.f), *GetArrayNormalIfExists(geometry))); |
| 141 geometry.push_back(Point(0.15f, 0.f, 0.f)); |
| 142 EXPECT_TRUE( |
| 143 AreParallel(Point(0.f, 1.f, 0.f), *GetArrayNormalIfExists(geometry))); |
| 144 geometry.push_back(Point(0.1f, 0.f, 0.2f)); |
| 145 EXPECT_TRUE( |
| 146 AreParallel(Point(0.f, 1.f, 0.f), *GetArrayNormalIfExists(geometry))); |
| 147 geometry.push_back(Point(0.f, 0.f, -0.1f)); |
| 148 EXPECT_TRUE( |
| 149 AreParallel(Point(0.f, 1.f, 0.f), *GetArrayNormalIfExists(geometry))); |
| 150 geometry.push_back(Point(0.1f, 0.2f, 0.3f)); |
| 151 EXPECT_FALSE(GetArrayNormalIfExists(geometry)); |
| 152 geometry.push_back(Point(0.f, -0.1f, 0.f)); |
| 153 EXPECT_FALSE(GetArrayNormalIfExists(geometry)); |
| 154 geometry.push_back(Point(1.f, 0.f, -0.2f)); |
| 155 EXPECT_FALSE(GetArrayNormalIfExists(geometry)); |
| 156 } |
| 157 |
| 158 TEST(ArrayUtilTest, DegreesToRadians) { |
| 159 EXPECT_FLOAT_EQ(0.f, DegreesToRadians(0.f)); |
| 160 EXPECT_FLOAT_EQ(static_cast<float>(M_PI) / 6.f, DegreesToRadians(30.f)); |
| 161 EXPECT_FLOAT_EQ(-static_cast<float>(M_PI) / 4.f, DegreesToRadians(-45.f)); |
| 162 EXPECT_FLOAT_EQ(static_cast<float>(M_PI) / 3.f, DegreesToRadians(60.f)); |
| 163 EXPECT_FLOAT_EQ(-static_cast<float>(M_PI) / 2.f, DegreesToRadians(-90.f)); |
| 164 EXPECT_FLOAT_EQ(2.f * static_cast<float>(M_PI) / 3.f, |
| 165 DegreesToRadians(120.f)); |
| 166 EXPECT_FLOAT_EQ(-3.f * static_cast<float>(M_PI) / 4.f, |
| 167 DegreesToRadians(-135.f)); |
| 168 EXPECT_FLOAT_EQ(5.f * static_cast<float>(M_PI) / 6.f, |
| 169 DegreesToRadians(150.f)); |
| 170 EXPECT_FLOAT_EQ(-static_cast<float>(M_PI), DegreesToRadians(-180.f)); |
| 171 } |
| 172 |
| 173 TEST(ArrayUtilTest, RadiansToDegrees) { |
| 174 EXPECT_FLOAT_EQ(0.f, RadiansToDegrees(0.f)); |
| 175 EXPECT_FLOAT_EQ(30.f, RadiansToDegrees(M_PI / 6.f)); |
| 176 EXPECT_FLOAT_EQ(-45.f, RadiansToDegrees(-M_PI / 4.f)); |
| 177 EXPECT_FLOAT_EQ(60.f, RadiansToDegrees(M_PI / 3.f)); |
| 178 EXPECT_FLOAT_EQ(-90.f, RadiansToDegrees(-M_PI / 2.f)); |
| 179 EXPECT_FLOAT_EQ(120.f, RadiansToDegrees(2.f * M_PI / 3.f)); |
| 180 EXPECT_FLOAT_EQ(-135.f, RadiansToDegrees(-3.f * M_PI / 4.f)); |
| 181 EXPECT_FLOAT_EQ(150.f, RadiansToDegrees(5.f * M_PI / 6.f)); |
| 182 EXPECT_FLOAT_EQ(-180.f, RadiansToDegrees(-M_PI)); |
30 } | 183 } |
31 | 184 |
32 } // namespace webrtc | 185 } // namespace webrtc |
OLD | NEW |