C++实现一维数组的移动均值滤波(Moving Average Filter)
移动平均滤波是一种简单的滤波方法,其核心思想是用数据序列中的若干个连续数据的平均值来代替该范围内的原始数据。这样可以减少噪声的影响,同时保留数据的趋势。
移动平均滤波的步骤如下:
- 确定滤波窗口大小,即要取多少个数据进行平均;
- 将窗口对准数据序列的第一个数据点,计算该窗口内数据的平均值,并将该平均值放置于窗口中心的位置;
- 移动窗口,计算下一个数据点的平均值,重复步骤2。
C++完整代码为:
#include<iostream>
#include <iomanip>
#include<math.h>
using namespace std;
int main()
{
int i = 0, j = 0;
double temp = 0.0;
double data[] = {1, 2.2, 3, 4, 5.1, 6, 7, 8, 8.9, 10,
11, 12, 13.2, 14, 15, 16, 17.1, 17.9, 19, 20};
double data_temp[] = {1, 2.2, 3, 4, 5.1, 6, 7, 8, 8.9, 10,
11, 12, 13.2, 14, 15, 16, 17.1, 17.9, 19, 20};
int size = sizeof(data)/sizeof(data[0]);
// 移动平均滤波
int kill = 3;
int Num = 1;
for (i=(kill-1)/2; i<(size-(kill-1)/2); i++)
{
Num = 1;
temp = data[i];
for(j=1; j<=(kill/2); j++)
{
temp += data_temp[i+j];
temp += data_temp[i-j];
Num += 2;
}
data[i] = temp / Num;
}
for(i=0; i<(kill-1)/2; i++)
{
temp = 0;
Num = 0;
for(j=0; j<i+1; j++)
{
temp += data_temp[j];
Num++;
}
data[i] = temp/Num;
}
for(i=(size-(kill-1)/2); i<size; i++)
{
temp = 0;
Num = 0;
for(j=0; j<size-i+1; j++)
{
temp += data_temp[i+j];
Num ++;
}
data[i] = temp/(Num-1);
}
for(i=0; i<size; i++)
cout << data[i] << endl;
return 0;
}