131b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org/*
231b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org *  Copyright 2014 The WebRTC Project Authors. All rights reserved.
331b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org *
431b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org *  Use of this source code is governed by a BSD-style license
531b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org *  that can be found in the LICENSE file in the root of the source
631b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org *  tree. An additional intellectual property rights grant can be found
731b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org *  in the file PATENTS.  All contributing project authors may
831b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
931b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org */
1031b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
1131b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org#include <math.h>
1231b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
1331b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org#include "webrtc/base/gunit.h"
1431b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org#include "webrtc/base/exp_filter.h"
1531b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
1631b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.orgnamespace rtc {
1731b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
1831b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.orgTEST(ExpFilterTest, FirstTimeOutputEqualInput) {
1931b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  // No max value defined.
2031b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  ExpFilter filter = ExpFilter(0.9f);
2131b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  filter.Apply(100.0f, 10.0f);
2231b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
2331b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  // First time, first argument no effect.
2431b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  double value = 10.0f;
2531b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  EXPECT_FLOAT_EQ(value, filter.filtered());
2631b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org}
2731b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
2831b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.orgTEST(ExpFilterTest, SecondTime) {
2931b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  double value;
3031b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
3131b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  ExpFilter filter = ExpFilter(0.9f);
3231b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  filter.Apply(100.0f, 10.0f);
3331b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
3431b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  // First time, first argument no effect.
3531b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  value = 10.0f;
3631b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
3731b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  filter.Apply(10.0f, 20.0f);
3831b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  double alpha = pow(0.9f, 10.0f);
3931b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  value = alpha * value + (1.0f - alpha) * 20.0f;
4031b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  EXPECT_FLOAT_EQ(value, filter.filtered());
4131b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org}
4231b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
4331b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.orgTEST(ExpFilterTest, Reset) {
4431b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  ExpFilter filter = ExpFilter(0.9f);
4531b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  filter.Apply(100.0f, 10.0f);
4631b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
4731b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  filter.Reset(0.8f);
4831b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  filter.Apply(100.0f, 1.0f);
4931b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
5031b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  // Become first time after a reset.
5131b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  double value = 1.0f;
5231b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  EXPECT_FLOAT_EQ(value, filter.filtered());
5331b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org}
5431b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
5531b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.orgTEST(ExpfilterTest, OutputLimitedByMax) {
5631b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  double value;
5731b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
5831b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  // Max value defined.
5931b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  ExpFilter filter = ExpFilter(0.9f, 1.0f);
6031b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  filter.Apply(100.0f, 10.0f);
6131b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
6231b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  // Limited to max value.
6331b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  value = 1.0f;
6431b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  EXPECT_EQ(value, filter.filtered());
6531b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
6631b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  filter.Apply(1.0f, 0.0f);
6731b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  value = 0.9f * value;
6831b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org  EXPECT_FLOAT_EQ(value, filter.filtered());
6931b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org}
7031b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org
7131b38da0e2ba9778d241267f0cf1ba8dd2f36e83minyue@webrtc.org}  // namespace rtc
72