aluebs | 3ece971 | 2015-10-20 01:02:39 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (c) 2015 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 | |
Alejandro Luebs | 3f0f90e | 2015-10-30 01:21:34 | [diff] [blame] | 11 | // MSVC++ requires this to be set before any other includes to get M_PI. |
| 12 | #define _USE_MATH_DEFINES |
| 13 | |
aluebs | 3ece971 | 2015-10-20 01:02:39 | [diff] [blame] | 14 | #include "webrtc/modules/audio_processing/beamformer/array_util.h" |
| 15 | |
Alejandro Luebs | 3f0f90e | 2015-10-30 01:21:34 | [diff] [blame] | 16 | #include <math.h> |
aluebs | 3ece971 | 2015-10-20 01:02:39 | [diff] [blame] | 17 | #include <vector> |
| 18 | |
kwiberg | 15b966d | 2016-09-29 00:42:01 | [diff] [blame] | 19 | #include "webrtc/test/gtest.h" |
aluebs | 3ece971 | 2015-10-20 01:02:39 | [diff] [blame] | 20 | |
| 21 | namespace webrtc { |
| 22 | |
Alejandro Luebs | 3f0f90e | 2015-10-30 01:21:34 | [diff] [blame] | 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 | |
aluebs | 3ece971 | 2015-10-20 01:02:39 | [diff] [blame] | 82 | TEST(ArrayUtilTest, GetMinimumSpacing) { |
Alejandro Luebs | 3f0f90e | 2015-10-30 01:21:34 | [diff] [blame] | 83 | std::vector<Point> geometry; |
| 84 | geometry.push_back(Point(0.f, 0.f, 0.f)); |
| 85 | geometry.push_back(Point(0.1f, 0.f, 0.f)); |
| 86 | EXPECT_FLOAT_EQ(0.1f, GetMinimumSpacing(geometry)); |
| 87 | geometry.push_back(Point(0.f, 0.05f, 0.f)); |
| 88 | EXPECT_FLOAT_EQ(0.05f, GetMinimumSpacing(geometry)); |
| 89 | geometry.push_back(Point(0.f, 0.f, 0.02f)); |
| 90 | EXPECT_FLOAT_EQ(0.02f, GetMinimumSpacing(geometry)); |
| 91 | geometry.push_back(Point(-0.003f, -0.004f, 0.02f)); |
| 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)); |
aluebs | 3ece971 | 2015-10-20 01:02:39 | [diff] [blame] | 183 | } |
| 184 | |
| 185 | } // namespace webrtc |