去最值均值滤波

举报
JeckXu666 发表于 2022/01/16 00:21:30 2022/01/16
【摘要】 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。