C语言进阶第一弹:滤波算法
学习永无止境
C语言进阶第一弹:滤波算法前言一、学前必看二、正文1.加权平均递推法2.递推平均滤波法3:一阶低通滤波4:其他滤波算法前言
如果有对下面的教程有疑惑的同学,欢迎评论区提问。
温馨提示:以下内容为作者原创,全部免费,支持转载,但不得作商业用途
一、学前必看
所谓滤波,本质上是对数据的处理,我们在编写程序的时候,需要让我们的大脑时刻提醒自己目标是处理有可能不正常的数据,或者得到更加完美的数据。基于此基础上,无论我们如何修改滤波的程序,只要能得到自己的想要的数据,都算是合格的滤波 这次,我从网上找到了一些清一色的滤波模型,将这些算法编写成可以直接套用的模板。
温馨提示:以下教程小新仅仅挑选了小新认为有难度的几个算法。学会这几个算法,原则是已经掌握了其他算法
二、正文
1.加权平均递推法
假设我们有一个数组,该数组含有十个数据。现在我们需要处理这十个数据。为了达到某种滤波的效果,我们给每一个数据乘上一个权重(唯一的数字),十个数据就有十个权,将这个十个权(十个数字)依次相加,得到一个总的权,然后将十个数据和自己相乘之后的新的加权数据也依次相加,得到一个加权后的数据总和,数据总和和总权重相除,我们就得到一个全新的加权平均数。以后每十个数据进行依次加权。
提示:经过测试,加权平均的数据偏大一点,所以适合过滤那些跳动幅度较小的比较平滑的数据。
//加权平均递推法:同样以10个数组为例,这种方法滤得数值偏大int add_data[10]={1,2,3,4,5,6,7,8,9,10};//权的存放,不变int my_add_data[10]={0},flag;//数据存放数组,数据溢出标志double add_average(int a)//使用程序时,只需要将一个数据传入,本程序自动组建数组。{int sum=0,i=0,add_data_total=0;my_add_data[flag]=a;flag++;if(flag<10)return -1;//如果数组没有够10个的话,不允许下面的操作flag=0;//初始化标志位for(i=0;i<10;i++){add_data_total+=(i+1);sum+=my_add_data[i]*add_data[i];}return (double)sum/add_data_total;//返回平均值}//函数使用示范int main(){int a=0;double x=0.00;while(1){printf("请输入一个数字:");scanf("%d",&a);//每次只需要传入你要传的一个数据,不需要组成十个数据传入if((x=add_average(a))>0)printf("%.2f\n",x);//如果x=-1,说明十个数据还没有溢出,程序不作处理。if(a==90){return 1;}}return 1;}
2.递推平均滤波法
原理:将数据传入十个大小的数组之中,通过冒泡排序从小到大排序,取中间八个数据计算其平均值,处理完毕后剔除原数组(没有进行排序的数组)的第一个位置的数据,新数据添加至数组末尾,看着就像一个管道,从一边进去,另一边出来。
同原理算法:中位值平均滤波法,去掉下图管道那个部分,每次重新组十个数据,您只需要从下列程序中删掉保存数据的一部分程序,就是该算法的程序。
//除去最大值和最小值,计算平均//然后数组整体向前移一位//江湖人称:递推平均法滤波//同时:中位值平均滤波法将最后一部存储去掉就可以了,每次都重新写10个数据。int mydata[10]={0};double eliminate_max(int a){int i=0,j=0,data[10];mydata[9]=a;for(i=0;i<10;i++){data[i]=mydata[i];}//按从小到大排序,冒泡排序for(i=0;i<10;i++){for(j=i+1;j<10;j++){if(data[i]>data[j]){int temp=data[i];data[i]=data[j];data[j]=temp;}}}//从次小值域开始计算for(i=8;i>0;i--){data[0]+=data[i];}//数组前进一个位置for(i=0;i<9;i++){mydata[i]=mydata[i+1];}return (double)data[0]/8;}//使用方法int main(){int a=0;while(1){printf("请输入一个数字:");scanf("%d",&a);printf("%.2f\n",eliminate_max(a));//将数据扔进括号就行,是不是简单多了。if(a==90){return 1;}}}
以上算法包含了平均值滤波
3:一阶低通滤波
知道他的数学原理,就能简单写出程序!
低通滤波:f=A*X+(1-A)*Y:就是这个公式,照着抄就完事了。
X:当前的数据,Y为上一次的数据,在程序中只需要定义一个外部变量记录下就OK了。
A为滤波系数,根据你爱好设置A(0~1)之间。
之所以把这个滤波单独放出来说并不是因为他的程序很难理解,而是小新觉得网上的例子写的并不清楚,不适合萌新去学习。
4:其他滤波算法
剩下的算法其实在加权平均递推中都能找到自己的影子,下面我简单阐述下其他几种滤波的原理。
1:消抖滤波法:设置有效值后和传入数据做对比,目的是得到一条平滑的直线。简而言之,就是让你传入的数据始终在某个设定值之间晃动。
2:算数平均滤波:直接加起来求平均,可以每十个一组。
3:中位值滤波法:一个数组,只取最中间位置的一个值,然后清空数组。
下一章:不重复随机数【点击学习】
点击加入我们:QQ群:928357277