去最值均值滤波
【摘要】
C语言数据处理滤波算法,获得一组数据,排序后去掉最值,剩余值取均值输出
优点:去除部分扰动数据,均值化后数据更加准确!!!
此处使用一个缓存数组模拟队列(不是很准确的形容词),队列填满之后才开始进行运...
C语言数据处理滤波算法,获得一组数据,排序后去掉最值,剩余值取均值输出
优点:去除部分扰动数据,均值化后数据更加准确!!!
此处使用一个缓存数组模拟队列(不是很准确的形容词),队列填满之后才开始进行运算,后一个数据总是取代队列中最早进入的数据,保持数据的实时性!
主体代码如下
/*******************************************************************************
* 函 数 :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);
}
- 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
其中QuiteSort为快速排序算法,数据结构排序算法里面一个经典的算法,具体代码如下:
数据结构排序算法参考文章(写的不错):链接
/*******************************************************************************
* 函 数 :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);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
FindPos为快排中重新排列数列,选取第一个元素作为基准元素,所有元素比基准小的摆放在基准的前面,所有比基准大的元素摆放在基准后面,这个分区退出之后 基准就处于数列的中间位置,称为分区操作
/*******************************************************************************
* 函 数 :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;
}
- 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
文章来源: blog.csdn.net,作者:JeckXu666,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/qq_45396672/article/details/116399802
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)