Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(238)

Side by Side Diff: webrtc/modules/audio_processing/beamformer/nonlinear_beamformer_unittest.cc

Issue 1394103003: Make the nonlinear beamformer steerable (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@highfreq
Patch Set: Formatting Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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
11 #include "webrtc/modules/audio_processing/beamformer/nonlinear_beamformer.h"
12
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 namespace webrtc {
16 namespace {
17
18 const int kChunkSizeMs = 10;
19 const int kSampleRateHz = 16000;
20
21 SphericalPointf AzimuthToSphericalPoint(float azimuth_radians) {
22 return SphericalPointf(azimuth_radians, 0.f, 1.f);
23 }
24
25 void Verify(NonlinearBeamformer* bf, float target_azimuth_radians) {
26 EXPECT_TRUE(bf->IsInBeam(AzimuthToSphericalPoint(target_azimuth_radians)));
27 EXPECT_TRUE(bf->IsInBeam(AzimuthToSphericalPoint(
28 target_azimuth_radians - NonlinearBeamformer::kHalfBeamWidthRadians +
29 0.001f)));
30 EXPECT_TRUE(bf->IsInBeam(AzimuthToSphericalPoint(
31 target_azimuth_radians + NonlinearBeamformer::kHalfBeamWidthRadians -
32 0.001f)));
33 EXPECT_FALSE(bf->IsInBeam(AzimuthToSphericalPoint(
34 target_azimuth_radians - NonlinearBeamformer::kHalfBeamWidthRadians -
35 0.001f)));
36 EXPECT_FALSE(bf->IsInBeam(AzimuthToSphericalPoint(
37 target_azimuth_radians + NonlinearBeamformer::kHalfBeamWidthRadians +
38 0.001f)));
39 }
40
41 void AimAndVerify(NonlinearBeamformer* bf, float target_azimuth_radians) {
42 bf->AimAt(AzimuthToSphericalPoint(target_azimuth_radians));
43 Verify(bf, target_azimuth_radians);
44 }
45
46 } // namespace
47
48 TEST(NonlinearBeamformerTest, AimingModifiesBeam) {
49 std::vector<Point> array_geometry;
50 array_geometry.push_back(Point(-0.025f, 0.f, 0.f));
51 array_geometry.push_back(Point(0.025f, 0.f, 0.f));
52 NonlinearBeamformer bf(array_geometry);
53 bf.Initialize(kChunkSizeMs, kSampleRateHz);
54 // The default constructor parameter sets the target angle to PI / 2.
55 Verify(&bf, M_PI / 2.f);
56 AimAndVerify(&bf, M_PI / 3.f);
57 AimAndVerify(&bf, 3.f * M_PI / 4.f);
58 AimAndVerify(&bf, M_PI / 6.f);
59 AimAndVerify(&bf, M_PI);
60 }
61
62 TEST(NonlinearBeamformerTest, InterfAnglesTakeAmbiguityIntoAccount) {
63 {
64 // For linear arrays there is ambiguity.
65 std::vector<Point> array_geometry;
66 array_geometry.push_back(Point(-0.1f, 0.f, 0.f));
67 array_geometry.push_back(Point(0.f, 0.f, 0.f));
68 array_geometry.push_back(Point(0.2f, 0.f, 0.f));
69 NonlinearBeamformer bf(array_geometry);
70 bf.Initialize(kChunkSizeMs, kSampleRateHz);
71 EXPECT_EQ(2u, bf.interf_angles_radians_.size());
72 EXPECT_FLOAT_EQ(M_PI / 2.f - bf.away_radians_,
73 bf.interf_angles_radians_[0]);
74 EXPECT_FLOAT_EQ(M_PI / 2.f + bf.away_radians_,
75 bf.interf_angles_radians_[1]);
76 bf.AimAt(AzimuthToSphericalPoint(bf.away_radians_ / 2.f));
77 EXPECT_EQ(2u, bf.interf_angles_radians_.size());
78 EXPECT_FLOAT_EQ(M_PI - bf.away_radians_ / 2.f,
79 bf.interf_angles_radians_[0]);
80 EXPECT_FLOAT_EQ(3.f * bf.away_radians_ / 2.f, bf.interf_angles_radians_[1]);
81 }
82 {
83 // For planar arrays with normal in the xy-plane there is ambiguity.
84 std::vector<Point> array_geometry;
85 array_geometry.push_back(Point(-0.1f, 0.f, 0.f));
86 array_geometry.push_back(Point(0.f, 0.f, 0.f));
87 array_geometry.push_back(Point(0.2f, 0.f, 0.f));
88 array_geometry.push_back(Point(0.1f, 0.f, 0.2f));
89 array_geometry.push_back(Point(0.f, 0.f, -0.1f));
90 NonlinearBeamformer bf(array_geometry);
91 bf.Initialize(kChunkSizeMs, kSampleRateHz);
92 EXPECT_EQ(2u, bf.interf_angles_radians_.size());
93 EXPECT_FLOAT_EQ(M_PI / 2.f - bf.away_radians_,
94 bf.interf_angles_radians_[0]);
95 EXPECT_FLOAT_EQ(M_PI / 2.f + bf.away_radians_,
96 bf.interf_angles_radians_[1]);
97 bf.AimAt(AzimuthToSphericalPoint(bf.away_radians_ / 2.f));
98 EXPECT_EQ(2u, bf.interf_angles_radians_.size());
99 EXPECT_FLOAT_EQ(M_PI - bf.away_radians_ / 2.f,
100 bf.interf_angles_radians_[0]);
101 EXPECT_FLOAT_EQ(3.f * bf.away_radians_ / 2.f, bf.interf_angles_radians_[1]);
102 }
103 {
104 // For planar arrays with normal not in the xy-plane there is no ambiguity.
105 std::vector<Point> array_geometry;
106 array_geometry.push_back(Point(0.f, 0.f, 0.f));
107 array_geometry.push_back(Point(0.2f, 0.f, 0.f));
108 array_geometry.push_back(Point(0.f, 0.1f, -0.2f));
109 NonlinearBeamformer bf(array_geometry);
110 bf.Initialize(kChunkSizeMs, kSampleRateHz);
111 EXPECT_EQ(2u, bf.interf_angles_radians_.size());
112 EXPECT_FLOAT_EQ(M_PI / 2.f - bf.away_radians_,
113 bf.interf_angles_radians_[0]);
114 EXPECT_FLOAT_EQ(M_PI / 2.f + bf.away_radians_,
115 bf.interf_angles_radians_[1]);
116 bf.AimAt(AzimuthToSphericalPoint(bf.away_radians_ / 2.f));
117 EXPECT_EQ(2u, bf.interf_angles_radians_.size());
118 EXPECT_FLOAT_EQ(-bf.away_radians_ / 2.f, bf.interf_angles_radians_[0]);
119 EXPECT_FLOAT_EQ(3.f * bf.away_radians_ / 2.f, bf.interf_angles_radians_[1]);
120 }
121 {
122 // For arrays which are not linear or planar there is no ambiguity.
123 std::vector<Point> array_geometry;
124 array_geometry.push_back(Point(0.f, 0.f, 0.f));
125 array_geometry.push_back(Point(0.1f, 0.f, 0.f));
126 array_geometry.push_back(Point(0.f, 0.2f, 0.f));
127 array_geometry.push_back(Point(0.f, 0.f, 0.3f));
128 NonlinearBeamformer bf(array_geometry);
129 bf.Initialize(kChunkSizeMs, kSampleRateHz);
130 EXPECT_EQ(2u, bf.interf_angles_radians_.size());
131 EXPECT_FLOAT_EQ(M_PI / 2.f - bf.away_radians_,
132 bf.interf_angles_radians_[0]);
133 EXPECT_FLOAT_EQ(M_PI / 2.f + bf.away_radians_,
134 bf.interf_angles_radians_[1]);
135 bf.AimAt(AzimuthToSphericalPoint(bf.away_radians_ / 2.f));
136 EXPECT_EQ(2u, bf.interf_angles_radians_.size());
137 EXPECT_FLOAT_EQ(-bf.away_radians_ / 2.f, bf.interf_angles_radians_[0]);
138 EXPECT_FLOAT_EQ(3.f * bf.away_radians_ / 2.f, bf.interf_angles_radians_[1]);
139 }
140 }
141
142 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698