From 7e117d25585bb5c705d9a0cd0aab0dbe02a9b568 Mon Sep 17 00:00:00 2001 From: Torsten Dreyer Date: Thu, 5 Sep 2013 10:21:44 +0200 Subject: [PATCH] Fix #1186 moving average filter fix incorrect behaviour of the moving average filter as reported and patched by bmbroom. --- src/Autopilot/digitalfilter.cxx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Autopilot/digitalfilter.cxx b/src/Autopilot/digitalfilter.cxx index d0e4b9423..2754a27e2 100644 --- a/src/Autopilot/digitalfilter.cxx +++ b/src/Autopilot/digitalfilter.cxx @@ -224,11 +224,23 @@ void MovingAverageFilterImplementation::initialize( double initvalue ) double MovingAverageFilterImplementation::compute( double dt, double input ) { std::deque::size_type samples = _samplesInput.get_value(); - _inputQueue.resize(samples+1, 0.0); + + if (_inputQueue.size() != samples) { + // For constant size filters, this code executed once. + bool shrunk = _inputQueue.size() > samples; + _inputQueue.resize(samples, _output_1); + if (shrunk) { + _output_1 = 0.0; + for (int ii = 0; ii < samples; ii++) + _output_1 += _inputQueue[ii]; + _output_1 /= samples; + } + } double output_0 = _output_1 + (input - _inputQueue.back()) / samples; _output_1 = output_0; + _inputQueue.pop_back(); _inputQueue.push_front(input); return output_0; } -- 2.39.5