Fixes to MovingMedian edge-cases and related tests
This commit is contained in:
@@ -212,14 +212,20 @@ public:
|
||||
int fn = mm.getSize();
|
||||
int lag = fn / 2;
|
||||
mm.reset();
|
||||
for (int i = 0; i < lag; ++i) {
|
||||
int i = 0;
|
||||
for (; i < lag; ++i) {
|
||||
if (i < n) mm.push(v[i]);
|
||||
}
|
||||
for (int i = lag; i < n; ++i) {
|
||||
for (; i < n; ++i) {
|
||||
mm.push(v[i]);
|
||||
v[i-lag] = mm.get();
|
||||
}
|
||||
for (int i = n; i < n + lag; ++i) {
|
||||
for (; i < lag; ++i) {
|
||||
// just for the unusual case where lag > n
|
||||
mm.push(T());
|
||||
(void)mm.get();
|
||||
}
|
||||
for (; i < n + lag; ++i) {
|
||||
mm.push(T());
|
||||
v[i-lag] = mm.get();
|
||||
}
|
||||
|
||||
@@ -42,15 +42,19 @@ BOOST_AUTO_TEST_SUITE(TestSignalBits)
|
||||
BOOST_CHECK_EQUAL(a[cmp_i], b[cmp_i]); \
|
||||
}
|
||||
|
||||
// NB our moving median has different lag behaviour from bsq - we
|
||||
// begin padded with zeros, while bsq begins with an empty vector. The
|
||||
// bsq behaviour is imho more correct, and this really shows up in the
|
||||
// n_1 case below (where the correct answer is surely {1.0} rather
|
||||
// than {0.0}) but ours is not wholly wrong, more efficient, "usually
|
||||
// fine"
|
||||
|
||||
BOOST_AUTO_TEST_CASE(moving_median_simple_3)
|
||||
{
|
||||
MovingMedian<double> mm(3);
|
||||
vector<double> arr { 1.0, 2.0, 3.0 };
|
||||
vector<double> expected { 2.0, 2.0, 3.0 };
|
||||
vector<double> expected { 1.0, 2.0, 2.0 };
|
||||
MovingMedian<double>::filter(mm, arr);
|
||||
for (int i = 0; i < arr.size(); ++i) {
|
||||
cerr << arr[i] << endl;
|
||||
}
|
||||
COMPARE_N(arr, expected, 3);
|
||||
}
|
||||
|
||||
@@ -58,23 +62,26 @@ BOOST_AUTO_TEST_CASE(moving_median_simple_4)
|
||||
{
|
||||
MovingMedian<double> mm(4);
|
||||
vector<double> arr { 1.0, 2.0, 3.0, 4.0 };
|
||||
vector<double> expected { 2.0, 2.0, 3.0, 3.0 };
|
||||
vector<double> expected { 2.0, 3.0, 3.0, 3.0 };
|
||||
MovingMedian<double>::filter(mm, arr);
|
||||
COMPARE_N(arr, expected, 4);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(moving_median_simple_3_4)
|
||||
{
|
||||
MovingMedian<double> mm(3);
|
||||
vector<double> arr { 1.2, 0.6, 1.0e-6, 1.0 };
|
||||
vector<double> expected { 0.6, 0.6, 0.6, 1.0e-6 };
|
||||
MovingMedian<double>::filter(mm, arr);
|
||||
for (int i = 0; i < arr.size(); ++i) {
|
||||
cerr << arr[i] << endl;
|
||||
}
|
||||
COMPARE_N(arr, expected, 4);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(moving_median_simple_5_4)
|
||||
{
|
||||
MovingMedian<double> mm(5);
|
||||
vector<double> arr { 1.2, 0.6, 1.0e-6, 1.0e-6 };
|
||||
vector<double> expected { 0.6, 1.2, 1.2, 0.6 };
|
||||
vector<double> arr { 1.2, 0.6, 1.0e-6, 1.0 };
|
||||
vector<double> expected { 1.0e-6, 0.6, 0.6, 1.0e-6 };
|
||||
MovingMedian<double>::filter(mm, arr);
|
||||
for (int i = 0; i < arr.size(); ++i) {
|
||||
cerr << arr[i] << endl;
|
||||
}
|
||||
COMPARE_N(arr, expected, 4);
|
||||
}
|
||||
|
||||
@@ -84,9 +91,6 @@ BOOST_AUTO_TEST_CASE(moving_median_order_1)
|
||||
vector<double> arr { 1.2, 0.6, 1.0e-6, 1.0e-6 };
|
||||
vector<double> expected = arr;
|
||||
MovingMedian<double>::filter(mm, arr);
|
||||
for (int i = 0; i < arr.size(); ++i) {
|
||||
cerr << arr[i] << endl;
|
||||
}
|
||||
COMPARE_N(arr, expected, 4);
|
||||
}
|
||||
|
||||
@@ -94,11 +98,8 @@ BOOST_AUTO_TEST_CASE(moving_median_n_1)
|
||||
{
|
||||
MovingMedian<double> mm(6);
|
||||
vector<double> arr { 1.0 };
|
||||
vector<double> expected = arr;
|
||||
vector<double> expected { 0.0 };
|
||||
MovingMedian<double>::filter(mm, arr);
|
||||
for (int i = 0; i < arr.size(); ++i) {
|
||||
cerr << arr[i] << endl;
|
||||
}
|
||||
COMPARE_N(arr, expected, 1);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user