15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MSVC++ requires this to be set before any other includes to get M_PI.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define _USE_MATH_DEFINES
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cmath>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/aligned_memory.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/strings/stringize_macros.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/vector_math.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/vector_math_testing.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using std::fill;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
191e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)namespace media {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Default test values.
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const float kScale = 0.5;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const float kInputFillValue = 1.0;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const float kOutputFillValue = 3.0;
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)static const int kVectorSize = 8192;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class VectorMathTest : public testing::Test {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VectorMathTest() {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Initialize input and output vectors.
321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    input_vector_.reset(static_cast<float*>(base::AlignedAlloc(
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sizeof(float) * kVectorSize, vector_math::kRequiredAlignment)));
341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    output_vector_.reset(static_cast<float*>(base::AlignedAlloc(
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        sizeof(float) * kVectorSize, vector_math::kRequiredAlignment)));
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FillTestVectors(float input, float output) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Setup input and output vectors.
401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    fill(input_vector_.get(), input_vector_.get() + kVectorSize, input);
411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    fill(output_vector_.get(), output_vector_.get() + kVectorSize, output);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void VerifyOutput(float value) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i = 0; i < kVectorSize; ++i)
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ASSERT_FLOAT_EQ(output_vector_[i], value);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<float[], base::AlignedFreeDeleter> input_vector_;
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<float[], base::AlignedFreeDeleter> output_vector_;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(VectorMathTest);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Ensure each optimized vector_math::FMAC() method returns the same value.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(VectorMathTest, FMAC) {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const float kResult = kInputFillValue * kScale + kOutputFillValue;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("FMAC");
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FillTestVectors(kInputFillValue, kOutputFillValue);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vector_math::FMAC(
641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        input_vector_.get(), kScale, kVectorSize, output_vector_.get());
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VerifyOutput(kResult);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("FMAC_C");
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FillTestVectors(kInputFillValue, kOutputFillValue);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vector_math::FMAC_C(
721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        input_vector_.get(), kScale, kVectorSize, output_vector_.get());
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VerifyOutput(kResult);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(ARCH_CPU_X86_FAMILY)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SCOPED_TRACE("FMAC_SSE");
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FillTestVectors(kInputFillValue, kOutputFillValue);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    vector_math::FMAC_SSE(
811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        input_vector_.get(), kScale, kVectorSize, output_vector_.get());
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    VerifyOutput(kResult);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(ARCH_CPU_ARM_FAMILY) && defined(USE_NEON)
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SCOPED_TRACE("FMAC_NEON");
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FillTestVectors(kInputFillValue, kOutputFillValue);
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    vector_math::FMAC_NEON(
911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        input_vector_.get(), kScale, kVectorSize, output_vector_.get());
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    VerifyOutput(kResult);
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Ensure each optimized vector_math::FMUL() method returns the same value.
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(VectorMathTest, FMUL) {
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static const float kResult = kInputFillValue * kScale;
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SCOPED_TRACE("FMUL");
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FillTestVectors(kInputFillValue, kOutputFillValue);
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    vector_math::FMUL(
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        input_vector_.get(), kScale, kVectorSize, output_vector_.get());
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    VerifyOutput(kResult);
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SCOPED_TRACE("FMUL_C");
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FillTestVectors(kInputFillValue, kOutputFillValue);
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    vector_math::FMUL_C(
1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        input_vector_.get(), kScale, kVectorSize, output_vector_.get());
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    VerifyOutput(kResult);
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(ARCH_CPU_X86_FAMILY)
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SCOPED_TRACE("FMUL_SSE");
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FillTestVectors(kInputFillValue, kOutputFillValue);
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    vector_math::FMUL_SSE(
1221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        input_vector_.get(), kScale, kVectorSize, output_vector_.get());
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    VerifyOutput(kResult);
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(ARCH_CPU_ARM_FAMILY) && defined(USE_NEON)
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  {
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SCOPED_TRACE("FMUL_NEON");
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    FillTestVectors(kInputFillValue, kOutputFillValue);
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    vector_math::FMUL_NEON(
1321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)        input_vector_.get(), kScale, kVectorSize, output_vector_.get());
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    VerifyOutput(kResult);
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(VectorMathTest, Crossfade) {
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  FillTestVectors(0, 1);
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  vector_math::Crossfade(
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      input_vector_.get(), kVectorSize, output_vector_.get());
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  for (int i = 0; i < kVectorSize; ++i) {
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_FLOAT_EQ(i / static_cast<float>(kVectorSize), output_vector_[i])
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        << "i=" << i;
145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)}
147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class EWMATestScenario {
149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public:
150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EWMATestScenario(float initial_value, const float src[], int len,
151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                   float smoothing_factor)
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      : initial_value_(initial_value),
153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        data_(static_cast<float*>(
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            len == 0 ? NULL :
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)            base::AlignedAlloc(len * sizeof(float),
156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                               vector_math::kRequiredAlignment))),
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        data_len_(len),
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        smoothing_factor_(smoothing_factor),
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        expected_final_avg_(initial_value),
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        expected_max_(0.0f) {
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (data_len_ > 0)
162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      memcpy(data_.get(), src, len * sizeof(float));
163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Copy constructor and assignment operator for ::testing::Values(...).
166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EWMATestScenario(const EWMATestScenario& other) { *this = other; }
167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EWMATestScenario& operator=(const EWMATestScenario& other) {
168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    this->initial_value_ = other.initial_value_;
169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    this->smoothing_factor_ = other.smoothing_factor_;
170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    if (other.data_len_ == 0) {
171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      this->data_.reset();
172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    } else {
173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      this->data_.reset(static_cast<float*>(
174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        base::AlignedAlloc(other.data_len_ * sizeof(float),
175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                           vector_math::kRequiredAlignment)));
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      memcpy(this->data_.get(), other.data_.get(),
177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             other.data_len_ * sizeof(float));
178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    this->data_len_ = other.data_len_;
180f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    this->expected_final_avg_ = other.expected_final_avg_;
181f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    this->expected_max_ = other.expected_max_;
182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return *this;
183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EWMATestScenario ScaledBy(float scale) const {
186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EWMATestScenario result(*this);
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    float* p = result.data_.get();
188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    float* const p_end = p + result.data_len_;
189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    for (; p < p_end; ++p)
190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      *p *= scale;
191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return result;
192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
193f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EWMATestScenario WithImpulse(float value, int offset) const {
195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EWMATestScenario result(*this);
196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    result.data_.get()[offset] = value;
197f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return result;
198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EWMATestScenario HasExpectedResult(float final_avg_value,
201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                     float max_value) const {
202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EWMATestScenario result(*this);
203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    result.expected_final_avg_ = final_avg_value;
204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    result.expected_max_ = max_value;
205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    return result;
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void RunTest() const {
209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    {
210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SCOPED_TRACE("EWMAAndMaxPower");
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const std::pair<float, float>& result = vector_math::EWMAAndMaxPower(
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          initial_value_, data_.get(), data_len_, smoothing_factor_);
213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_NEAR(expected_final_avg_, result.first, 0.0000001f);
214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_NEAR(expected_max_, result.second, 0.0000001f);
215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    {
218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SCOPED_TRACE("EWMAAndMaxPower_C");
219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const std::pair<float, float>& result = vector_math::EWMAAndMaxPower_C(
220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          initial_value_, data_.get(), data_len_, smoothing_factor_);
221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_NEAR(expected_final_avg_, result.first, 0.0000001f);
222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_NEAR(expected_max_, result.second, 0.0000001f);
223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(ARCH_CPU_X86_FAMILY)
226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    {
227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SCOPED_TRACE("EWMAAndMaxPower_SSE");
228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const std::pair<float, float>& result = vector_math::EWMAAndMaxPower_SSE(
229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          initial_value_, data_.get(), data_len_, smoothing_factor_);
230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_NEAR(expected_final_avg_, result.first, 0.0000001f);
231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_NEAR(expected_max_, result.second, 0.0000001f);
232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(ARCH_CPU_ARM_FAMILY) && defined(USE_NEON)
236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    {
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      SCOPED_TRACE("EWMAAndMaxPower_NEON");
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const std::pair<float, float>& result = vector_math::EWMAAndMaxPower_NEON(
239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          initial_value_, data_.get(), data_len_, smoothing_factor_);
240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_NEAR(expected_final_avg_, result.first, 0.0000001f);
241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      EXPECT_NEAR(expected_max_, result.second, 0.0000001f);
242f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
243f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif
244f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
245f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
246f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) private:
247f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  float initial_value_;
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<float, base::AlignedFreeDeleter> data_;
249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int data_len_;
250f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  float smoothing_factor_;
251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  float expected_final_avg_;
252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  float expected_max_;
253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)typedef testing::TestWithParam<EWMATestScenario> VectorMathEWMAAndMaxPowerTest;
256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_P(VectorMathEWMAAndMaxPowerTest, Correctness) {
258f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  GetParam().RunTest();
259f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
260f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static const float kZeros[] = {  // 32 zeros
262f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
263f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
264f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
265f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
266f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static const float kOnes[] = {  // 32 ones
267f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static const float kCheckerboard[] = {  // 32 alternating 0, 1
272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1
274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)static const float kInverseCheckerboard[] = {  // 32 alternating 1, 0
277f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
278f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0
279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)};
280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(
282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    Scenarios, VectorMathEWMAAndMaxPowerTest,
283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ::testing::Values(
284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         // Zero-length input: Result should equal initial value.
285f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, NULL, 0, 0.0f).HasExpectedResult(0.0f, 0.0f),
286f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(1.0f, NULL, 0, 0.0f).HasExpectedResult(1.0f, 0.0f),
287f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
288f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         // Smoothing factor of zero: Samples have no effect on result.
289f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kOnes, 32, 0.0f).HasExpectedResult(0.0f, 1.0f),
290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(1.0f, kZeros, 32, 0.0f).HasExpectedResult(1.0f, 0.0f),
291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         // Smothing factor of one: Result = last sample squared.
293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kCheckerboard, 32, 1.0f)
294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .ScaledBy(2.0f)
295f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(4.0f, 4.0f),
296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(1.0f, kInverseCheckerboard, 32, 1.0f)
297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .ScaledBy(2.0f)
298f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.0f, 4.0f),
299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         // Smoothing factor of 1/4, muted signal.
301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(1.0f, kZeros, 1, 0.25f)
302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(powf(0.75, 1.0f), 0.0f),
303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(1.0f, kZeros, 2, 0.25f)
304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(powf(0.75, 2.0f), 0.0f),
305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(1.0f, kZeros, 3, 0.25f)
306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(powf(0.75, 3.0f), 0.0f),
307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(1.0f, kZeros, 12, 0.25f)
308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(powf(0.75, 12.0f), 0.0f),
309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(1.0f, kZeros, 13, 0.25f)
310f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(powf(0.75, 13.0f), 0.0f),
311f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(1.0f, kZeros, 14, 0.25f)
312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(powf(0.75, 14.0f), 0.0f),
313f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(1.0f, kZeros, 15, 0.25f)
314f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(powf(0.75, 15.0f), 0.0f),
315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         // Smoothing factor of 1/4, constant full-amplitude signal.
317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kOnes, 1, 0.25f).HasExpectedResult(0.25f, 1.0f),
318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kOnes, 2, 0.25f)
319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.4375f, 1.0f),
320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kOnes, 3, 0.25f)
321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.578125f, 1.0f),
322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kOnes, 12, 0.25f)
323f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.96832365f, 1.0f),
324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kOnes, 13, 0.25f)
325f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.97624274f, 1.0f),
326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kOnes, 14, 0.25f)
327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.98218205f, 1.0f),
328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kOnes, 15, 0.25f)
329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.98663654f, 1.0f),
330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         // Smoothing factor of 1/4, checkerboard signal.
332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kCheckerboard, 1, 0.25f)
333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.0f, 0.0f),
334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kCheckerboard, 2, 0.25f)
335f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.25f, 1.0f),
336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kCheckerboard, 3, 0.25f)
337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.1875f, 1.0f),
338f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kCheckerboard, 12, 0.25f)
339f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.55332780f, 1.0f),
340f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kCheckerboard, 13, 0.25f)
341f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.41499585f, 1.0f),
342f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kCheckerboard, 14, 0.25f)
343f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.56124689f, 1.0f),
344f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kCheckerboard, 15, 0.25f)
345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.42093517f, 1.0f),
346f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         // Smoothing factor of 1/4, inverse checkerboard signal.
348f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kInverseCheckerboard, 1, 0.25f)
349f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.25f, 1.0f),
350f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kInverseCheckerboard, 2, 0.25f)
351f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.1875f, 1.0f),
352f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kInverseCheckerboard, 3, 0.25f)
353f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.390625f, 1.0f),
354f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kInverseCheckerboard, 12, 0.25f)
355f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.41499585f, 1.0f),
356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kInverseCheckerboard, 13, 0.25f)
357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.56124689f, 1.0f),
358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kInverseCheckerboard, 14, 0.25f)
359f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.42093517f, 1.0f),
360f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kInverseCheckerboard, 15, 0.25f)
361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.56570137f, 1.0f),
362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         // Smoothing factor of 1/4, impluse signal.
364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kZeros, 3, 0.25f)
365f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .WithImpulse(2.0f, 0)
366f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.562500f, 4.0f),
367f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kZeros, 3, 0.25f)
368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .WithImpulse(2.0f, 1)
369f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.75f, 4.0f),
370f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kZeros, 3, 0.25f)
371f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .WithImpulse(2.0f, 2)
372f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(1.0f, 4.0f),
373f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kZeros, 32, 0.25f)
374f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .WithImpulse(2.0f, 0)
375f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.00013394f, 4.0f),
376f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kZeros, 32, 0.25f)
377f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .WithImpulse(2.0f, 1)
378f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.00017858f, 4.0f),
379f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kZeros, 32, 0.25f)
380f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .WithImpulse(2.0f, 2)
381f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.00023811f, 4.0f),
382f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)         EWMATestScenario(0.0f, kZeros, 32, 0.25f)
383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .WithImpulse(2.0f, 3)
384f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)             .HasExpectedResult(0.00031748f, 4.0f)
385f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ));
386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
388