#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
// mean filter is centered
std::vector<double> meanWindow(const std::vector<double>& arrayIn, int windowSize) {
int N = static_cast<int>(arrayIn.size());
std::vector<double> filteredOutput(N);
// YOUR CODE HERE
// return a vector (of same size as arrayIn) with the moving average filter output of arrayIn
// filteredOutput[i] contains the average of <windowSize> elements centered at i
// At endpoints, use a shortened window
std::vector<double> paddedArray(N + windowSize-1);
for(int j=0; j<N+windowSize-1;j++)
{
if(j<windowSize/2 || j > (N + windowSize/2 - 1) )
{
paddedArray[j] = 0;
}
else
{
paddedArray[j]=arrayIn[j-windowSize/2];
}
cout << paddedArray[j] << " ";
}
for(int j=0; j<N; j++){
double sum;
for(int i=0; i<windowSize; i++)
{
sum = 0.0;
sum += paddedArray[j - i +windowSize/2];
}
filteredOutput[j] = sum/windowSize;
}
return filteredOutput;
}
// To execute C++, please define "int main()"
int main()
{
auto words = { "Hello, ", "World!", "\n" };
for (const string& word : words) {
cout << word;
}
// Test input signals to use (constant time step in between values)
std::vector<double> test = {1,2,3,0,5,1,2,6,-1,-3,-10,-8};
std::vector<double> result;
int windowSize = 3;
result = meanWindow(test, windowSize);
// print output
for (size_t i = 0; i < result.size(); ++i){
std::cout << result[i] << std::endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8Y21hdGg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBtZWFuIGZpbHRlciBpcyBjZW50ZXJlZApzdGQ6OnZlY3Rvcjxkb3VibGU+IG1lYW5XaW5kb3coY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiYgYXJyYXlJbiwgaW50IHdpbmRvd1NpemUpIHsKICAgIAogICAgaW50IE4gPSBzdGF0aWNfY2FzdDxpbnQ+KGFycmF5SW4uc2l6ZSgpKTsKICAgIAogICAgc3RkOjp2ZWN0b3I8ZG91YmxlPiBmaWx0ZXJlZE91dHB1dChOKTsKICAgIAogICAgLy8gWU9VUiBDT0RFIEhFUkUKICAgIC8vIHJldHVybiBhIHZlY3RvciAob2Ygc2FtZSBzaXplIGFzIGFycmF5SW4pIHdpdGggdGhlIG1vdmluZyBhdmVyYWdlIGZpbHRlciBvdXRwdXQgb2YgYXJyYXlJbgogICAgLy8gZmlsdGVyZWRPdXRwdXRbaV0gY29udGFpbnMgdGhlIGF2ZXJhZ2Ugb2YgPHdpbmRvd1NpemU+IGVsZW1lbnRzIGNlbnRlcmVkIGF0IGkKICAgIC8vIEF0IGVuZHBvaW50cywgdXNlIGEgc2hvcnRlbmVkIHdpbmRvdwogICAgCiAgICBzdGQ6OnZlY3Rvcjxkb3VibGU+IHBhZGRlZEFycmF5KE4gKyB3aW5kb3dTaXplLTEpOwogIAogICAgZm9yKGludCBqPTA7IGo8Tit3aW5kb3dTaXplLTE7aisrKQogICAgewogICAgICBpZihqPHdpbmRvd1NpemUvMiB8fCBqID4gKE4gKyB3aW5kb3dTaXplLzIgLSAxKSApCiAgICAgIHsKICAgICAgICBwYWRkZWRBcnJheVtqXSA9IDA7CiAgICAgICAgCiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgcGFkZGVkQXJyYXlbal09YXJyYXlJbltqLXdpbmRvd1NpemUvMl07ICAKICAgICAgfQogICAgICBjb3V0IDw8IHBhZGRlZEFycmF5W2pdIDw8ICIgIjsgIAogICAgfQogICAgCiAgICAKICAgIGZvcihpbnQgaj0wOyBqPE47IGorKyl7CiAgICAgICAgCiAgICAgIGRvdWJsZSBzdW07CiAgICAgIAogICAgICBmb3IoaW50IGk9MDsgaTx3aW5kb3dTaXplOyBpKyspCiAgICAgIHsKICAgICAgICAKICAgICAgICBzdW0gPSAwLjA7CiAgICAgICAgc3VtICs9IHBhZGRlZEFycmF5W2ogLSBpICt3aW5kb3dTaXplLzJdOwogICAgICB9CiAgICAgIAogICAgICBmaWx0ZXJlZE91dHB1dFtqXSA9IHN1bS93aW5kb3dTaXplOwogICAgfQogIAogIAogICAgcmV0dXJuIGZpbHRlcmVkT3V0cHV0Owp9CgovLyBUbyBleGVjdXRlIEMrKywgcGxlYXNlIGRlZmluZSAiaW50IG1haW4oKSIKaW50IG1haW4oKSAKewogIGF1dG8gd29yZHMgPSB7ICJIZWxsbywgIiwgIldvcmxkISIsICJcbiIgfTsKICBmb3IgKGNvbnN0IHN0cmluZyYgd29yZCA6IHdvcmRzKSB7CiAgICBjb3V0IDw8IHdvcmQ7CiAgfQogIAogIC8vIFRlc3QgaW5wdXQgc2lnbmFscyB0byB1c2UgKGNvbnN0YW50IHRpbWUgc3RlcCBpbiBiZXR3ZWVuIHZhbHVlcykKICBzdGQ6OnZlY3Rvcjxkb3VibGU+IHRlc3QgPSB7MSwyLDMsMCw1LDEsMiw2LC0xLC0zLC0xMCwtOH07CiAgCiAgc3RkOjp2ZWN0b3I8ZG91YmxlPiByZXN1bHQ7CiAgCiAgaW50IHdpbmRvd1NpemUgPSAzOwogIAogIHJlc3VsdCA9IG1lYW5XaW5kb3codGVzdCwgd2luZG93U2l6ZSk7CiAgCiAgLy8gcHJpbnQgb3V0cHV0ICAKICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc3VsdC5zaXplKCk7ICsraSl7CiAgICBzdGQ6OmNvdXQgPDwgcmVzdWx0W2ldIDw8IHN0ZDo6ZW5kbDsKICB9CiAgCiAgcmV0dXJuIDA7Cn0K