| /* |
| * Copyright (c) 2020 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. |
| */ |
| |
| #include "modules/audio_processing/agc2/rnn_vad/vector_math.h" |
| |
| #include <vector> |
| |
| #include "modules/audio_processing/agc2/cpu_features.h" |
| #include "test/gtest.h" |
| |
| namespace webrtc { |
| namespace rnn_vad { |
| namespace { |
| |
| constexpr int kSizeOfX = 19; |
| constexpr float kX[kSizeOfX] = { |
| 0.31593041f, 0.9350786f, -0.25252445f, -0.86956251f, -0.9673632f, |
| 0.54571901f, -0.72504495f, -0.79509912f, -0.25525012f, -0.73340473f, |
| 0.15747377f, -0.04370565f, 0.76135145f, -0.57239645f, 0.68616848f, |
| 0.3740298f, 0.34710799f, -0.92207423f, 0.10738454f}; |
| constexpr int kSizeOfXSubSpan = 16; |
| static_assert(kSizeOfXSubSpan < kSizeOfX, ""); |
| constexpr float kEnergyOfX = 7.315563958160327f; |
| constexpr float kEnergyOfXSubspan = 6.333327669592963f; |
| |
| class VectorMathParametrization |
| : public ::testing::TestWithParam<AvailableCpuFeatures> {}; |
| |
| TEST_P(VectorMathParametrization, TestDotProduct) { |
| VectorMath vector_math(/*cpu_features=*/GetParam()); |
| EXPECT_FLOAT_EQ(vector_math.DotProduct(kX, kX), kEnergyOfX); |
| EXPECT_FLOAT_EQ( |
| vector_math.DotProduct({kX, kSizeOfXSubSpan}, {kX, kSizeOfXSubSpan}), |
| kEnergyOfXSubspan); |
| } |
| |
| // Finds the relevant CPU features combinations to test. |
| std::vector<AvailableCpuFeatures> GetCpuFeaturesToTest() { |
| std::vector<AvailableCpuFeatures> v; |
| v.push_back({/*sse2=*/false, /*avx2=*/false, /*neon=*/false}); |
| AvailableCpuFeatures available = GetAvailableCpuFeatures(); |
| if (available.avx2) { |
| v.push_back({/*sse2=*/false, /*avx2=*/true, /*neon=*/false}); |
| } |
| if (available.sse2) { |
| v.push_back({/*sse2=*/true, /*avx2=*/false, /*neon=*/false}); |
| } |
| if (available.neon) { |
| v.push_back({/*sse2=*/false, /*avx2=*/false, /*neon=*/true}); |
| } |
| return v; |
| } |
| |
| INSTANTIATE_TEST_SUITE_P( |
| RnnVadTest, |
| VectorMathParametrization, |
| ::testing::ValuesIn(GetCpuFeaturesToTest()), |
| [](const ::testing::TestParamInfo<AvailableCpuFeatures>& info) { |
| return info.param.ToString(); |
| }); |
| |
| } // namespace |
| } // namespace rnn_vad |
| } // namespace webrtc |