滤波算法,看这个就够了

C语言进阶第一弹:滤波算法



前言

  如果有对下面的教程有疑惑的同学,欢迎评论区提问。


温馨提示:以下内容为作者原创,全部免费,支持转载,但不得作商业用途

一、学前必看

   所谓滤波,本质上是对数据的处理,我们在编写程序的时候,需要让我们的大脑时刻提醒自己目标是处理有可能不正常的数据,或者得到更加完美的数据。基于此基础上,无论我们如何修改滤波的程序,只要能得到自己的想要的数据,都算是合格的滤波
   这次,我从网上找到了一些清一色的滤波模型,将这些算法编写成可以直接套用的模板。


温馨提示:以下教程小新仅仅挑选了小新认为有难度的几个算法。学会这几个算法,原则是已经掌握了其他算法

二、正文

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

  • 5
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亿只萌新

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值