| 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)
|
|
|
|
|