C语言数据处理滤波算法,获得一组数据,排序后去掉最值,剩余值取均值输出

优点:去除部分扰动数据,均值化后数据更加准确!!!

此处使用一个缓存数组模拟队列(不是很准确的形容词),队列填满之后才开始进行运算,后一个数据总是取代队列中最早进入的数据,保持数据的实时性!

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/*******************************************************************************
* 函 数 :float SortAver_Filter(float value)
* 功 能 :去最值平均值滤波一组数据
* 参 数 :value 采样的数据
* *filter 滤波以后的数据地址
* 返回值 :无
* 备 注 : 无
*******************************************************************************/
void SortAver_Filter(float value,float *filter,uint8_t n)
{
static float buf[N] = {0.0};
static uint8_t cnt =0,flag = 1;
float temp=0;
uint8_t i=0;
buf[cnt++] = value;
if(cnt<n && flag)
return; //数组填不满不计算
else flag=0;
QuiteSort(buf,0,n-1);
for(i=1;i<n-1;i++)
{
temp += buf[i];
}

if(cnt>=n) cnt = 0;

*filter = temp/(n-2);
}

其中QuiteSort为快速排序算法,具体代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*******************************************************************************
* 函 数 :void QuiteSort(float* a,int low,int high)
* 功 能 :快速排序
* 参 数 :a 数组首地址
* low数组最小下标
* high数组最大下标
* 返回值 :无
* 备 注 : 无
*******************************************************************************/
void QuiteSort(float* a,int low,int high)
{
int pos;
if(low<high)
{
pos = FindPos(a,low,high); //排序一个位置
QuiteSort(a,low,pos-1); //递归调用
QuiteSort(a,pos+1,high);
}
}

FindPos为快排中重新排列数列,选取第一个元素作为基准元素,所有元素比基准小的摆放在基准的前面,所有比基准大的元素摆放在基准后面,这个分区退出之后 基准就处于数列的中间位置,称为分区操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/*******************************************************************************
* 函 数 :float FindPos(float*a,int low,int high)
* 功 能 :确定一个元素位序
* 参 数 :a 数组首地址
* low数组最小下标
* high数组最大下标
* 返回值 :返回元素的位序low
* 备 注 : 无
*******************************************************************************/
float FindPos(float*a,int low,int high)
{
float val = a[low]; //选定一个要确定值val确定位置
while(low<high)
{
while(low<high && a[high]>=val)
high--; //如果右边的数大于VAL下标往前移
a[low] = a[high]; //当右边的值小于VAL则复值给A[low]

while(low<high && a[low]<=val)
low++; //如果左边的数小于VAL下标往后移
a[high] = a[low]; //当左边的值大于VAL则复值给右边a[high]
}
a[low] = val;
return low;
}

wechat