174aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org/*
274aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org *  Copyright 2014 The WebRTC Project Authors. All rights reserved.
374aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org *
474aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org *  Use of this source code is governed by a BSD-style license
574aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org *  that can be found in the LICENSE file in the root of the source
674aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org *  tree. An additional intellectual property rights grant can be found
774aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org *  in the file PATENTS.  All contributing project authors may
874aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
974aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org */
1074aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org
1174aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org#include <math.h>
1274aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org
1374aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org#include "webrtc/base/gunit.h"
1474aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org#include "webrtc/base/exp_filter.h"
1574aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org
1674aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.orgnamespace rtc {
1774aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org
1874aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.orgTEST(ExpFilterTest, FirstTimeOutputEqualInput) {
1974aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  // No max value defined.
2074aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  ExpFilter filter = ExpFilter(0.9f);
2174aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  filter.Apply(100.0f, 10.0f);
2274aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org
2374aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  // First time, first argument no effect.
2474aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  double value = 10.0f;
2574aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  EXPECT_FLOAT_EQ(value, filter.filtered());
2674aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org}
2774aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org
2874aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.orgTEST(ExpFilterTest, SecondTime) {
2974aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  double value;
3074aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org
3174aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  ExpFilter filter = ExpFilter(0.9f);
3274aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  filter.Apply(100.0f, 10.0f);
3374aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org
3474aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  // First time, first argument no effect.
3574aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  value = 10.0f;
3674aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org
3774aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  filter.Apply(10.0f, 20.0f);
3874aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  double alpha = pow(0.9f, 10.0f);
3974aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  value = alpha * value + (1.0f - alpha) * 20.0f;
4074aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  EXPECT_FLOAT_EQ(value, filter.filtered());
4174aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org}
4274aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org
4374aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.orgTEST(ExpFilterTest, Reset) {
4474aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  ExpFilter filter = ExpFilter(0.9f);
4574aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  filter.Apply(100.0f, 10.0f);
4674aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org
4774aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  filter.Reset(0.8f);
4874aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  filter.Apply(100.0f, 1.0f);
4974aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org
5074aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  // Become first time after a reset.
5174aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  double value = 1.0f;
5274aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  EXPECT_FLOAT_EQ(value, filter.filtered());
5374aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org}
5474aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org
5574aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.orgTEST(ExpfilterTest, OutputLimitedByMax) {
5674aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  double value;
5774aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org
5874aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  // Max value defined.
5974aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  ExpFilter filter = ExpFilter(0.9f, 1.0f);
6074aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  filter.Apply(100.0f, 10.0f);
6174aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org
6274aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  // Limited to max value.
6374aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  value = 1.0f;
6474aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  EXPECT_EQ(value, filter.filtered());
6574aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org
6674aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  filter.Apply(1.0f, 0.0f);
6774aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  value = 0.9f * value;
6874aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org  EXPECT_FLOAT_EQ(value, filter.filtered());
6974aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org}
7074aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org
7174aaf29a0ff1b211dbfdbb6309791111a7871779minyue@webrtc.org}  // namespace rtc
72