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