滑动均值Moving Average与中值滤波Moving Median

来源:互联网 发布:知乎 怎么死最舒服 编辑:程序博客网 时间:2024/05/01 19:47

1. 滑动均值滤波(MovingAverage

方法:

把连续取N个采样值看成一个队列,队列的长度固定为N,每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)。把队列中的N个数据进行算术平均运算,就可获得新的滤波结果。

#include "iostream"#include "list"using namespace std;int main(){        int sum = 0;        double real = 0;        int Length = 4; // 四个一组int i[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};size_t sz = sizeof(i)/sizeof(int);        list<int> int_list(i, i + Length);cout << "list_size = "<<sz<<endl;        list<int>::iterator i0;        for( i0 = int_list.begin (); i0 != int_list.end (); i0++)        {//            cout << *i0 << endl;        sum += *i0;        }        real = sum / (double)Length;cout << "1 averg = "<<real << endl;//        sum = sum - *int_list.begin () ;//cout << "Remove begin "<<*int_list.begin ()<<" sum = "<<sum << endl;//        int_list.pop_front ();//        int_list.push_back (i[Length]); // 5//        sum = sum + int_list.back ();//        real = sum / (double)Length;//cout << "Add last "<<int_list.back ()<< " sum = "<<sum << endl;//cout << "2 real = "<<real << endl;int total_loop = sz -Length +1;        for (int var = Length; var < sz; ++var) // i[4] = 5        {            sum = sum - *int_list.begin () ;cout << "Remove begin "<<*int_list.begin ()<<" sum = "<<sum << endl;            int_list.pop_front ();            int_list.push_back (i[var]); // 5            sum = sum + int_list.back () ;cout << "Add last "<<int_list.back ()<< " sum = "<<sum << endl;        real = sum / (double)Length;cout << total_loop + var -sz +1<<" averg = "<<real << endl;        }return 0;}

==============================2017.02====================================

有源代码 MovingAverage

http://blog.csdn.net/u014365862/article/details/54380313


2. 加权滑动均值

#include "iostream"#include "deque"#include <algorithm>using namespace std;//const int Length = 4;//int coe[Length] = {2, 4, 8, 6};const int Length = 10;int coe[Length] = {1, 1, 2, 3, 3, 16, 17, 19 ,19, 19};// 100; 7.6 ~ 13.6int sum_coe = 0;int main(){        int sum = 0;        double real = 0;        for(int i =0; i < Length; ++i)        {            sum_coe += coe[i];        }cout<<"sum_coe = "<< sum_coe<<endl;                // 0  1  2  3  4  5  6  7  8   9   10  11  12  13  14  15        int i[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};//        int i[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 9, 10, 11, 10};        size_t sz = sizeof(i)/sizeof(int);        size_t n = sz / Length;        deque<int> int_list(i, i + Length);        for (int var = 0; var < Length; ++var)        {            sum += (int_list.at(var) )* coe[var];        }        real = sum / (double)sum_coe;cout << "sum1 = "<<sum << endl;cout << "1 real = "<<real << endl;int total_loop = sz -Length +1;        for (int var = Length; var < sz; ++var) // i[4] = 5        {            sum = 0;cout << "Remove begin "<<*int_list.begin () << endl;            int_list.pop_front ();            int_list.push_back (i[var]); // 5            for (int i = 0; i < Length; ++i)            {                sum += (int_list.at(i) )* coe[i];            }            real = sum / (double)sum_coe;cout << "Add last "<<int_list.back ()<< " sum = "<<sum << endl;cout << total_loop + var -sz +1<<" averg = "<<real << endl;        }return 0;}

3. 中值滤波(Moving Median)

选一个数周围的奇数个临近值,作为一组,排序,用中值替代原来那个数。

/**************************** static number of array.***************************/#include "iostream"#include "deque"#include "list"#include <algorithm>using namespace std;const int Length = 7;const int halfSamplecount = Length /2 + 1; // 4//void outputArray ( int *i)//void outputArray ( int i[])void outputArray ( int (&i)[18]) // if use upper, the sz below compute strangely.//void outputArray ( int (&i)[13]) // if use upper, the sz below compute strangely.{    size_t sz = sizeof(i)/sizeof(int);//    cout << sizeof(i)<<" / "<<sizeof(int)<<endl;    for (int var = 0; var < sz; ++var)    {        cout << i[var] <<" ";    }    cout<< endl;}void output_List( deque<int> & int_deque){    for(deque<int>::iterator i0 = int_deque.begin (); i0 != int_deque.end (); ++i0)    {        cout << *i0<<" " ;    }    cout<<endl;}int main(){            // 0   1   2   3  4   5  6   7   8   9  10  11  12  13  14  15  16 17    int i[] = {10, 12, 11, 25, 9, 10, 9, 45, 13, 12, 10, 11, 78, 12, 12, 13, 10, 9};    int j[] = {10, 12, 11, 25, 9, 10, 9, 45, 13, 12, 10, 11, 78, 12, 12, 13, 10, 9};//    int i[] = {10, 12, 11, 25, 9, 10, 9, 45, 13, 12, 10, 11, 78};//    int j[] = {10, 12, 11, 25, 9, 10, 9, 45, 13, 12, 10, 11, 78};//    int i[] = {-10, -12, -11, -25, -9, -10, -9, -45, -13, -12, -10, -11, -78};//    int j[] = {-10, -12, -11, -25, -9, -10, -9, -45, -13, -12, -10, -11, -78};outputArray(i);    int count = 0;    size_t sz = sizeof(i)/sizeof(int);    size_t n = sz / Length;    deque<int> int_deque(i, i + halfSamplecount);//    int_deque.push_front (sz - 1);//    int_deque.push_front (sz - 2);//    int_deque.push_front (sz - 3);    for (int var = 1; var <= halfSamplecount - 1; ++var)    {        int_deque.push_front (i[sz - var]);    }//output_List (int_deque);deque<int> temp_deque(int_deque);output_List (temp_deque);    sort(temp_deque.begin (), temp_deque.end ());cout<<"after sort ";output_List (temp_deque);    cout<<"mid = "<<temp_deque.at (halfSamplecount -1)<<endl; // 9 10 10 11 12 13 25    i[0] = temp_deque.at (halfSamplecount - 1);outputArray(i);++count;cout<<"----------- 1-----------"<<endl;int total_loop = sz -halfSamplecount; // 18 - 4int var = 0;    for ( var = halfSamplecount; var < sz ; ++var) // i[4] = 9    {cout << "Remove begin "<<*int_deque.begin ()<<endl;        int_deque.pop_front ();output_List (int_deque);            int_deque.push_back (i[var]);//9 halfSamplecountcout << "Add last "<<int_deque.back ()<<endl;output_List (int_deque);        temp_deque = int_deque;        sort(temp_deque.begin (), temp_deque.end ());cout<<"after sort ";output_List (temp_deque);        i[total_loop + var -sz +1] = temp_deque.at (halfSamplecount - 1); //cout<<"after replace ";outputArray(i);cout<<"-- "<<total_loop + var -sz +2<<"--"<<endl;    }    if (var == sz )    {        var = 0;        for ( var; var < halfSamplecount -1; ++var) // [0 ~ 3)        {            cout << "Remove begin "<<*int_deque.begin ()<<endl;            int_deque.pop_front ();output_List (int_deque);            int_deque.push_back (j[var]);// 10cout << "Add last "<<int_deque.back ()<<endl;            output_List (int_deque);            temp_deque = int_deque;            sort(temp_deque.begin (), temp_deque.end ());cout<<"after sort ";output_List (temp_deque);            i[ sz - halfSamplecount + var + 1] = temp_deque.at (halfSamplecount - 1); //cout<<"after replace ";outputArray(i);cout<<"-- "<<total_loop + var +2<<"--"<<endl;        }    outputArray(j);    }    return 0;}





0 0
原创粉丝点击