blob: 0ec9e7b7380192e1492e9a4b678fc3098975dab0 [file] [log] [blame]
aluebs3ece9712015-10-20 01:02:391/*
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 Luebs3f0f90e2015-10-30 01:21:3411// MSVC++ requires this to be set before any other includes to get M_PI.
12#define _USE_MATH_DEFINES
13
aluebs3ece9712015-10-20 01:02:3914#include "webrtc/modules/audio_processing/beamformer/array_util.h"
15
Alejandro Luebs3f0f90e2015-10-30 01:21:3416#include <math.h>
aluebs3ece9712015-10-20 01:02:3917#include <vector>
18
kwiberg15b966d2016-09-29 00:42:0119#include "webrtc/test/gtest.h"
aluebs3ece9712015-10-20 01:02:3920
21namespace webrtc {
22
Alejandro Luebs3f0f90e2015-10-30 01:21:3423bool operator==(const Point& lhs, const Point& rhs) {
24 return lhs.x() == rhs.x() && lhs.y() == rhs.y() && lhs.z() == rhs.z();
25}
26
27TEST(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
40TEST(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
51TEST(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
64TEST(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
73TEST(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
aluebs3ece9712015-10-20 01:02:3982TEST(ArrayUtilTest, GetMinimumSpacing) {
Alejandro Luebs3f0f90e2015-10-30 01:21:3483 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
95TEST(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
116TEST(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
135TEST(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
158TEST(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
173TEST(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));
aluebs3ece9712015-10-20 01:02:39183}
184
185} // namespace webrtc