Index: webrtc/modules/audio_processing/aec3/vector_math_unittest.cc |
diff --git a/webrtc/modules/audio_processing/aec3/vector_math_unittest.cc b/webrtc/modules/audio_processing/aec3/vector_math_unittest.cc |
index b40cf8d2a5b7e73bdd9354c6227b7be8b8fd8529..924ce31e88835dcbb51481545f58c85b364144a4 100644 |
--- a/webrtc/modules/audio_processing/aec3/vector_math_unittest.cc |
+++ b/webrtc/modules/audio_processing/aec3/vector_math_unittest.cc |
@@ -17,6 +17,65 @@ |
#include "webrtc/typedefs.h" |
namespace webrtc { |
+ |
+#if defined(WEBRTC_HAS_NEON) |
+ |
+TEST(VectorMath, Sqrt) { |
+ std::array<float, kFftLengthBy2Plus1> x; |
+ std::array<float, kFftLengthBy2Plus1> z; |
+ std::array<float, kFftLengthBy2Plus1> z_neon; |
+ |
+ for (size_t k = 0; k < x.size(); ++k) { |
+ x[k] = (2.f / 3.f) * k; |
+ } |
+ |
+ std::copy(x.begin(), x.end(), z.begin()); |
+ aec3::VectorMath(Aec3Optimization::kNone).Sqrt(z); |
+ std::copy(x.begin(), x.end(), z_neon.begin()); |
+ aec3::VectorMath(Aec3Optimization::kNeon).Sqrt(z_neon); |
+ for (size_t k = 0; k < z.size(); ++k) { |
+ EXPECT_NEAR(z[k], z_neon[k], 0.0001f); |
+ EXPECT_NEAR(sqrtf(x[k]), z_neon[k], 0.0001f); |
+ } |
+} |
+ |
+TEST(VectorMath, Multiply) { |
+ std::array<float, kFftLengthBy2Plus1> x; |
+ std::array<float, kFftLengthBy2Plus1> y; |
+ std::array<float, kFftLengthBy2Plus1> z; |
+ std::array<float, kFftLengthBy2Plus1> z_neon; |
+ |
+ for (size_t k = 0; k < x.size(); ++k) { |
+ x[k] = k; |
+ y[k] = (2.f / 3.f) * k; |
+ } |
+ |
+ aec3::VectorMath(Aec3Optimization::kNone).Multiply(x, y, z); |
+ aec3::VectorMath(Aec3Optimization::kNeon).Multiply(x, y, z_neon); |
+ for (size_t k = 0; k < z.size(); ++k) { |
+ EXPECT_FLOAT_EQ(z[k], z_neon[k]); |
+ EXPECT_FLOAT_EQ(x[k] * y[k], z_neon[k]); |
+ } |
+} |
+ |
+TEST(VectorMath, Accumulate) { |
+ std::array<float, kFftLengthBy2Plus1> x; |
+ std::array<float, kFftLengthBy2Plus1> z; |
+ std::array<float, kFftLengthBy2Plus1> z_neon; |
+ |
+ for (size_t k = 0; k < x.size(); ++k) { |
+ x[k] = k; |
+ z[k] = z_neon[k] = 2.f * k; |
+ } |
+ |
+ aec3::VectorMath(Aec3Optimization::kNone).Accumulate(x, z); |
+ aec3::VectorMath(Aec3Optimization::kNeon).Accumulate(x, z_neon); |
+ for (size_t k = 0; k < z.size(); ++k) { |
+ EXPECT_FLOAT_EQ(z[k], z_neon[k]); |
+ EXPECT_FLOAT_EQ(x[k] + 2.f * x[k], z_neon[k]); |
+ } |
+} |
+#endif |
#if defined(WEBRTC_ARCH_X86_FAMILY) |