Add MedianFilter class for moving-window median (#2136)

This kind of filter is extremely useful for signals that are susceptible to sudden
outliers - ultrasonics, 1-D LIDAR, and results from vision processing are all
good use-cases.

This also modifies the existing ultrasonic examples accordingly.
This commit is contained in:
Oblarg
2019-11-29 18:13:40 -05:00
committed by Peter Johnson
parent f79b7a058a
commit 5e97c81d80
9 changed files with 335 additions and 6 deletions

View File

@@ -0,0 +1,55 @@
/*----------------------------------------------------------------------------*/
/* Copyright (c) 2019 FIRST. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
#include "frc/MedianFilter.h"
#include "gtest/gtest.h"
TEST(MedianFilterTest, MedianFilterNotFullTestEven) {
frc::MedianFilter<double> filter{10};
filter.Calculate(3);
filter.Calculate(0);
filter.Calculate(4);
EXPECT_EQ(filter.Calculate(1000), 3.5);
}
TEST(MedianFilterTest, MedianFilterNotFullTestOdd) {
frc::MedianFilter<double> filter{10};
filter.Calculate(3);
filter.Calculate(0);
filter.Calculate(4);
filter.Calculate(7);
EXPECT_EQ(filter.Calculate(1000), 4);
}
TEST(MedianFilterTest, MedianFilterFullTestEven) {
frc::MedianFilter<double> filter{6};
filter.Calculate(3);
filter.Calculate(0);
filter.Calculate(0);
filter.Calculate(5);
filter.Calculate(4);
filter.Calculate(1000);
EXPECT_EQ(filter.Calculate(99), 4.5);
}
TEST(MedianFilterTest, MedianFilterFullTestOdd) {
frc::MedianFilter<double> filter{5};
filter.Calculate(3);
filter.Calculate(0);
filter.Calculate(5);
filter.Calculate(4);
filter.Calculate(1000);
EXPECT_EQ(filter.Calculate(99), 5);
}