1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// Copyright (c) 2012-2017 VideoStitch SAS
// Copyright (c) 2018 stitchEm
#include "gpu/testing.hpp"
#include "stabilization/iirFilter.hpp"
namespace VideoStitch {
namespace Testing {
void testFilterDummyIIR() {
unsigned int sampleRate = 2000;
unsigned int fLow = 1;
unsigned int fHigh = 500;
unsigned int duration = 10;
unsigned int nbSamples = sampleRate * duration;
std::vector<double> yLow(nbSamples); // low frequency wave
std::vector<double> yHigh(nbSamples); // high frequency wave
std::vector<double> yFull(nbSamples); // mixed low + high
std::vector<double> yFiltered(nbSamples); // filtered
Stab::IIRFilter iirUninitialized;
Stab::IIRFilter iirIdentity;
ENSURE(iirIdentity.initLowPass(1.));
Stab::IIRFilter iirLP;
ENSURE(iirLP.initLowPass(100, sampleRate));
for (std::size_t i = 0; i < nbSamples; ++i) {
yLow[i] = std::cos(2 * M_PI * fLow * i / static_cast<double>(sampleRate));
yHigh[i] = std::cos(2 * M_PI * fHigh * i / static_cast<double>(sampleRate));
yFull[i] = yLow[i] + yHigh[i];
yFiltered[i] = iirLP.filterValue(yFull[i]);
// check identity filters
ENSURE_APPROX_EQ(yFull[i], iirUninitialized.filterValue(yFull[i]), 1e-6);
ENSURE_APPROX_EQ(yFull[i], iirIdentity.filterValue(yFull[i]), 1e-6);
}
// start at index 10 to get out of the transitional regime
const unsigned int startIndex = 10;
bool foundValueOverThreshold = false;
for (std::size_t i = startIndex; i < nbSamples; ++i) {
if (std::abs(yFull[i] - yLow[i]) > 0.5) {
foundValueOverThreshold = true;
}
// make sure the filtered signal is close to the low frequency part
ENSURE_APPROX_EQ(yLow[i], yFiltered[i], 0.07);
}
// make sure the full signal (high + low) is different enough from the low only
ENSURE(foundValueOverThreshold, "No discrepancy between yFull and yLow");
}
} // namespace Testing
} // namespace VideoStitch
int main(int argc, char **argv) { VideoStitch::Testing::testFilterDummyIIR(); }