Generic Moving Average Filter

#include <iostream>
#include <iomanip>

// TODO: Define Class Template 'MovingAverage'
// Template Parameters: typename T, int WindowSize
template <typename T, int WindowSize>
class MovingAverage {
private:
    T buffer[WindowSize];
    int count; // Number of valid samples currently in buffer (0 to WindowSize)
    int index; // Current insertion index (circular)

public:
    MovingAverage() : count(0), index(0) {}

    // TODO: Implement addSample(T sample)
    // 1. Store sample
    // 2. Update count and index
    // 3. Calculate and return average
    T addSample(T sample){
        count = std::min(count+1, WindowSize);
        buffer[index] = sample;
        index = (index + 1)% WindowSize;
        T avg = 0;
        for (int i=0; i<count; i++) {
            avg += buffer[i];
        }
        return avg/ (T)count;
    }
};

int main() {
    // Instantiate filter for float with window size 4
    MovingAverage<float, 4> filter;

    int N;
    if (!(std::cin >> N)) return 0;

    for (int i = 0; i < N; ++i) {
        float sample;
        std::cin >> sample;

        float avg = filter.addSample(sample);
        
        std::cout << "Avg: " << std::fixed << std::setprecision(2) << avg << std::endl;
    }
    return 0;
}

Solving Approach

 

 

 

 

 

Upvote
Downvote
Loading...

Input

5 10.0 20.0 30.0 40.0 50.0

Expected Output

Avg: 10.00 Avg: 15.00 Avg: 20.00 Avg: 25.00 Avg: 35.00