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;
}
。
。
。