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

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.6

int 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 - 4
int 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 halfSamplecount
cout << "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]);// 10
cout << "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;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yaked19

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值