| /* |
| * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| // MSVC++ requires this to be set before any other includes to get M_PI. |
| #define _USE_MATH_DEFINES |
| |
| #include "webrtc/modules/audio_processing/beamformer/array_util.h" |
| |
| #include <math.h> |
| #include <vector> |
| |
| #include "webrtc/test/gtest.h" |
| |
| namespace webrtc { |
| |
| bool operator==(const Point& lhs, const Point& rhs) { |
| return lhs.x() == rhs.x() && lhs.y() == rhs.y() && lhs.z() == rhs.z(); |
| } |
| |
| TEST(ArrayUtilTest, PairDirection) { |
| EXPECT_EQ(Point(1.f, 2.f, 3.f), |
| PairDirection(Point(0.f, 0.f, 0.f), Point(1.f, 2.f, 3.f))); |
| EXPECT_EQ(Point(-1.f, -2.f, -3.f), |
| PairDirection(Point(1.f, 2.f, 3.f), Point(0.f, 0.f, 0.f))); |
| EXPECT_EQ(Point(0.f, 0.f, 0.f), |
| PairDirection(Point(1.f, 0.f, 0.f), Point(1.f, 0.f, 0.f))); |
| EXPECT_EQ(Point(-1.f, 2.f, 0.f), |
| PairDirection(Point(1.f, 0.f, 0.f), Point(0.f, 2.f, 0.f))); |
| EXPECT_EQ(Point(-4.f, 4.f, -4.f), |
| PairDirection(Point(1.f, -2.f, 3.f), Point(-3.f, 2.f, -1.f))); |
| } |
| |
| TEST(ArrayUtilTest, DotProduct) { |
| EXPECT_FLOAT_EQ(0.f, DotProduct(Point(0.f, 0.f, 0.f), Point(1.f, 2.f, 3.f))); |
| EXPECT_FLOAT_EQ(0.f, DotProduct(Point(1.f, 0.f, 2.f), Point(0.f, 3.f, 0.f))); |
| EXPECT_FLOAT_EQ(0.f, DotProduct(Point(1.f, 1.f, 0.f), Point(1.f, -1.f, 0.f))); |
| EXPECT_FLOAT_EQ(2.f, DotProduct(Point(1.f, 0.f, 0.f), Point(2.f, 0.f, 0.f))); |
| EXPECT_FLOAT_EQ(-6.f, |
| DotProduct(Point(-2.f, 0.f, 0.f), Point(3.f, 0.f, 0.f))); |
| EXPECT_FLOAT_EQ(-10.f, |
| DotProduct(Point(1.f, -2.f, 3.f), Point(-3.f, 2.f, -1.f))); |
| } |
| |
| TEST(ArrayUtilTest, CrossProduct) { |
| EXPECT_EQ(Point(0.f, 0.f, 0.f), |
| CrossProduct(Point(0.f, 0.f, 0.f), Point(1.f, 2.f, 3.f))); |
| EXPECT_EQ(Point(0.f, 0.f, 1.f), |
| CrossProduct(Point(1.f, 0.f, 0.f), Point(0.f, 1.f, 0.f))); |
| EXPECT_EQ(Point(1.f, 0.f, 0.f), |
| CrossProduct(Point(0.f, 1.f, 0.f), Point(0.f, 0.f, 1.f))); |
| EXPECT_EQ(Point(0.f, -1.f, 0.f), |
| CrossProduct(Point(1.f, 0.f, 0.f), Point(0.f, 0.f, 1.f))); |
| EXPECT_EQ(Point(-4.f, -8.f, -4.f), |
| CrossProduct(Point(1.f, -2.f, 3.f), Point(-3.f, 2.f, -1.f))); |
| } |
| |
| TEST(ArrayUtilTest, AreParallel) { |
| EXPECT_TRUE(AreParallel(Point(0.f, 0.f, 0.f), Point(1.f, 2.f, 3.f))); |
| EXPECT_FALSE(AreParallel(Point(1.f, 0.f, 2.f), Point(0.f, 3.f, 0.f))); |
| EXPECT_FALSE(AreParallel(Point(1.f, 2.f, 0.f), Point(1.f, -0.5f, 0.f))); |
| EXPECT_FALSE(AreParallel(Point(1.f, -2.f, 3.f), Point(-3.f, 2.f, -1.f))); |
| EXPECT_TRUE(AreParallel(Point(1.f, 0.f, 0.f), Point(2.f, 0.f, 0.f))); |
| EXPECT_TRUE(AreParallel(Point(1.f, 2.f, 3.f), Point(-2.f, -4.f, -6.f))); |
| } |
| |
| TEST(ArrayUtilTest, ArePerpendicular) { |
| EXPECT_TRUE(ArePerpendicular(Point(0.f, 0.f, 0.f), Point(1.f, 2.f, 3.f))); |
| EXPECT_TRUE(ArePerpendicular(Point(1.f, 0.f, 2.f), Point(0.f, 3.f, 0.f))); |
| EXPECT_TRUE(ArePerpendicular(Point(1.f, 2.f, 0.f), Point(1.f, -0.5f, 0.f))); |
| EXPECT_FALSE(ArePerpendicular(Point(1.f, -2.f, 3.f), Point(-3.f, 2.f, -1.f))); |
| EXPECT_FALSE(ArePerpendicular(Point(1.f, 0.f, 0.f), Point(2.f, 0.f, 0.f))); |
| EXPECT_FALSE(ArePerpendicular(Point(1.f, 2.f, 3.f), Point(-2.f, -4.f, -6.f))); |
| } |
| |
| TEST(ArrayUtilTest, GetMinimumSpacing) { |
| std::vector<Point> geometry; |
| geometry.push_back(Point(0.f, 0.f, 0.f)); |
| geometry.push_back(Point(0.1f, 0.f, 0.f)); |
| EXPECT_FLOAT_EQ(0.1f, GetMinimumSpacing(geometry)); |
| geometry.push_back(Point(0.f, 0.05f, 0.f)); |
| EXPECT_FLOAT_EQ(0.05f, GetMinimumSpacing(geometry)); |
| geometry.push_back(Point(0.f, 0.f, 0.02f)); |
| EXPECT_FLOAT_EQ(0.02f, GetMinimumSpacing(geometry)); |
| geometry.push_back(Point(-0.003f, -0.004f, 0.02f)); |
| EXPECT_FLOAT_EQ(0.005f, GetMinimumSpacing(geometry)); |
| } |
| |
| TEST(ArrayUtilTest, GetDirectionIfLinear) { |
| std::vector<Point> geometry; |
| geometry.push_back(Point(0.f, 0.f, 0.f)); |
| geometry.push_back(Point(0.1f, 0.f, 0.f)); |
| EXPECT_TRUE( |
| AreParallel(Point(1.f, 0.f, 0.f), *GetDirectionIfLinear(geometry))); |
| geometry.push_back(Point(0.15f, 0.f, 0.f)); |
| EXPECT_TRUE( |
| AreParallel(Point(1.f, 0.f, 0.f), *GetDirectionIfLinear(geometry))); |
| geometry.push_back(Point(-0.2f, 0.f, 0.f)); |
| EXPECT_TRUE( |
| AreParallel(Point(1.f, 0.f, 0.f), *GetDirectionIfLinear(geometry))); |
| geometry.push_back(Point(0.05f, 0.f, 0.f)); |
| EXPECT_TRUE( |
| AreParallel(Point(1.f, 0.f, 0.f), *GetDirectionIfLinear(geometry))); |
| geometry.push_back(Point(0.1f, 0.1f, 0.f)); |
| EXPECT_FALSE(GetDirectionIfLinear(geometry)); |
| geometry.push_back(Point(0.f, 0.f, -0.2f)); |
| EXPECT_FALSE(GetDirectionIfLinear(geometry)); |
| } |
| |
| TEST(ArrayUtilTest, GetNormalIfPlanar) { |
| std::vector<Point> geometry; |
| geometry.push_back(Point(0.f, 0.f, 0.f)); |
| geometry.push_back(Point(0.1f, 0.f, 0.f)); |
| EXPECT_FALSE(GetNormalIfPlanar(geometry)); |
| geometry.push_back(Point(0.15f, 0.f, 0.f)); |
| EXPECT_FALSE(GetNormalIfPlanar(geometry)); |
| geometry.push_back(Point(0.1f, 0.2f, 0.f)); |
| EXPECT_TRUE(AreParallel(Point(0.f, 0.f, 1.f), *GetNormalIfPlanar(geometry))); |
| geometry.push_back(Point(0.f, -0.15f, 0.f)); |
| EXPECT_TRUE(AreParallel(Point(0.f, 0.f, 1.f), *GetNormalIfPlanar(geometry))); |
| geometry.push_back(Point(0.f, 0.1f, 0.2f)); |
| EXPECT_FALSE(GetNormalIfPlanar(geometry)); |
| geometry.push_back(Point(0.f, 0.f, -0.15f)); |
| EXPECT_FALSE(GetNormalIfPlanar(geometry)); |
| geometry.push_back(Point(0.1f, 0.2f, 0.f)); |
| EXPECT_FALSE(GetNormalIfPlanar(geometry)); |
| } |
| |
| TEST(ArrayUtilTest, GetArrayNormalIfExists) { |
| std::vector<Point> geometry; |
| geometry.push_back(Point(0.f, 0.f, 0.f)); |
| geometry.push_back(Point(0.1f, 0.f, 0.f)); |
| EXPECT_TRUE( |
| AreParallel(Point(0.f, 1.f, 0.f), *GetArrayNormalIfExists(geometry))); |
| geometry.push_back(Point(0.15f, 0.f, 0.f)); |
| EXPECT_TRUE( |
| AreParallel(Point(0.f, 1.f, 0.f), *GetArrayNormalIfExists(geometry))); |
| geometry.push_back(Point(0.1f, 0.f, 0.2f)); |
| EXPECT_TRUE( |
| AreParallel(Point(0.f, 1.f, 0.f), *GetArrayNormalIfExists(geometry))); |
| geometry.push_back(Point(0.f, 0.f, -0.1f)); |
| EXPECT_TRUE( |
| AreParallel(Point(0.f, 1.f, 0.f), *GetArrayNormalIfExists(geometry))); |
| geometry.push_back(Point(0.1f, 0.2f, 0.3f)); |
| EXPECT_FALSE(GetArrayNormalIfExists(geometry)); |
| geometry.push_back(Point(0.f, -0.1f, 0.f)); |
| EXPECT_FALSE(GetArrayNormalIfExists(geometry)); |
| geometry.push_back(Point(1.f, 0.f, -0.2f)); |
| EXPECT_FALSE(GetArrayNormalIfExists(geometry)); |
| } |
| |
| TEST(ArrayUtilTest, DegreesToRadians) { |
| EXPECT_FLOAT_EQ(0.f, DegreesToRadians(0.f)); |
| EXPECT_FLOAT_EQ(static_cast<float>(M_PI) / 6.f, DegreesToRadians(30.f)); |
| EXPECT_FLOAT_EQ(-static_cast<float>(M_PI) / 4.f, DegreesToRadians(-45.f)); |
| EXPECT_FLOAT_EQ(static_cast<float>(M_PI) / 3.f, DegreesToRadians(60.f)); |
| EXPECT_FLOAT_EQ(-static_cast<float>(M_PI) / 2.f, DegreesToRadians(-90.f)); |
| EXPECT_FLOAT_EQ(2.f * static_cast<float>(M_PI) / 3.f, |
| DegreesToRadians(120.f)); |
| EXPECT_FLOAT_EQ(-3.f * static_cast<float>(M_PI) / 4.f, |
| DegreesToRadians(-135.f)); |
| EXPECT_FLOAT_EQ(5.f * static_cast<float>(M_PI) / 6.f, |
| DegreesToRadians(150.f)); |
| EXPECT_FLOAT_EQ(-static_cast<float>(M_PI), DegreesToRadians(-180.f)); |
| } |
| |
| TEST(ArrayUtilTest, RadiansToDegrees) { |
| EXPECT_FLOAT_EQ(0.f, RadiansToDegrees(0.f)); |
| EXPECT_FLOAT_EQ(30.f, RadiansToDegrees(M_PI / 6.f)); |
| EXPECT_FLOAT_EQ(-45.f, RadiansToDegrees(-M_PI / 4.f)); |
| EXPECT_FLOAT_EQ(60.f, RadiansToDegrees(M_PI / 3.f)); |
| EXPECT_FLOAT_EQ(-90.f, RadiansToDegrees(-M_PI / 2.f)); |
| EXPECT_FLOAT_EQ(120.f, RadiansToDegrees(2.f * M_PI / 3.f)); |
| EXPECT_FLOAT_EQ(-135.f, RadiansToDegrees(-3.f * M_PI / 4.f)); |
| EXPECT_FLOAT_EQ(150.f, RadiansToDegrees(5.f * M_PI / 6.f)); |
| EXPECT_FLOAT_EQ(-180.f, RadiansToDegrees(-M_PI)); |
| } |
| |
| } // namespace webrtc |