From ff6816a1459248a46aceaa669928b6c6b9a4ebb7 Mon Sep 17 00:00:00 2001
From: "Sven (Sbte)" <svenb.linux@gmail.com>
Date: Sun, 24 Feb 2013 17:23:31 +0100
Subject: Implement an averaged frequency counter to get a more stable FPS rate
---
source/lib/frequency_filter.cpp | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/source/lib/frequency_filter.cpp b/source/lib/frequency_filter.cpp
index 4ae9905..a61837b 100644
a
|
b
|
|
23 | 23 | #include "precompiled.h" |
24 | 24 | #include "lib/frequency_filter.h" |
25 | 25 | |
26 | | static const double errorTolerance = 0.05f; |
| 26 | static const double errorTolerance = 0.25; |
27 | 27 | static const double sensitivity = 0.10; |
28 | 28 | |
29 | 29 | /** |
… |
… |
class FrequencyFilter : public IFrequencyFilter
|
192 | 192 | public: |
193 | 193 | FrequencyFilter(double resolution, double expectedFrequency) |
194 | 194 | : m_frequencyEstimator(resolution), m_controller(expectedFrequency), m_iirFilter(sensitivity, expectedFrequency) |
195 | | , m_stableFrequency((int)expectedFrequency), m_smoothedFrequency(expectedFrequency) |
| 195 | , m_stableFrequency((int)expectedFrequency), m_smoothedFrequency(expectedFrequency), m_averagedFrequency(expectedFrequency) |
196 | 196 | { |
197 | 197 | } |
198 | 198 | |
… |
… |
public:
|
205 | 205 | const int bias = m_controller.ComputeBias(m_smoothedFrequency, frequency); |
206 | 206 | m_smoothedFrequency = m_iirFilter(frequency, bias); |
207 | 207 | |
| 208 | // Keep an averaged frequency over the last 100 calls |
| 209 | const double difference = fabs(m_smoothedFrequency - m_averagedFrequency); |
| 210 | if (difference > errorTolerance*m_averagedFrequency) |
| 211 | m_averagedFrequency = m_smoothedFrequency; |
| 212 | else |
| 213 | m_averagedFrequency = (99.0 * m_averagedFrequency + m_smoothedFrequency) / 100.0; |
| 214 | |
208 | 215 | // allow the smoothed FPS to free-run until it is no longer near the |
209 | 216 | // previous stable FPS value. round up because values are more often |
210 | 217 | // too low than too high. |
211 | | const double difference = fabs(m_smoothedFrequency - m_stableFrequency); |
212 | | if(difference > errorTolerance*m_stableFrequency) |
213 | | m_stableFrequency = (int)(m_smoothedFrequency + 0.99); |
| 218 | m_stableFrequency = (int)(m_averagedFrequency + 0.99); |
214 | 219 | } |
215 | 220 | |
216 | 221 | virtual double SmoothedFrequency() const |
… |
… |
private:
|
230 | 235 | |
231 | 236 | int m_stableFrequency; |
232 | 237 | double m_smoothedFrequency; |
| 238 | double m_averagedFrequency; |
233 | 239 | }; |
234 | 240 | |
235 | 241 | |