mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-20 00:51:42 +00:00
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:
55
wpilibc/src/test/native/cpp/MedianFilterTest.cpp
Normal file
55
wpilibc/src/test/native/cpp/MedianFilterTest.cpp
Normal 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);
|
||||
}
|
||||
Reference in New Issue
Block a user