【资料分享】滤波算法程序

#include "Filter.h"


int N = 10 ;
/*==================================================================================================
限幅滤波法

优点:能有效克服因偶然因素引起的脉冲干扰
缺点:无法抑制周期性干扰;平滑度查

输入量:x 为采集值;A 为最大偏差值
输出量:sample_value为滤波后的采集值
==================================================================================================*/
int Limit_Filter(int x,int A)
{
    static int sample_value,last_value;

    sample_value=x;
    last_value=sample_value;
    
    if( (sample_value-last_value)<A || (sample_value-last_value)>A )
    {
        return sample_value;
    }
    else
    {
        return last_value;
    }
}

/*==================================================================================================
中位值滤波法

优点:能有效克服因偶然因素引起的脉冲干扰;为温度、液位等变化缓慢的被测参数又良好的滤波效果
缺点:对流量、速度等快速变化的参数不宜使用

输入量:x 为采集值;N 为连续采样次数
输出量:滤波后的采样值
==================================================================================================*/
int Median_Filter(int x,int N)
{
    int count=0,i=0,j=0,temp=0;
    int a[10]={0};

    for(count=0;count<N;count++)
    {
        a[N]=x;
    }

    for(j=0;j<N-1;j++)
    {
        for (i=0;i<N-j;i++)
        {
            if(a[i] >= (a[i+1]) )
            {
                temp=a[i];
                a[i]=a[i+1];
                a[i+1]=temp;
            }
        }
        
    }
    return a[(N-1)/2];
}

/*==================================================================================================
算数平均滤波法

优点:适用于对一般具有随机干扰的信号进行滤波;这样信号有一个平均值,信号在某一数值范围附件上下波动
缺点:对于策略速度较慢或要求数据计算速度较快的实时控制不适用;比较浪费RAM

输入量:x 为采集值;N 为连续采样次数
输出量:滤波后的采集值
==================================================================================================*/
int Arithmetic_Average_Filter(int x,int N)
{
    static int sum,count;

    for(count=0;count<N;count++)
    {
        sum+=x;
    }
    return (sum/N);
}

/*==================================================================================================
滑动平均滤波法

优点:对周期性干扰有良好的抑制作用,平滑度高;适用于高频振荡的系统;
缺点:灵敏度低;对偶然出现的脉冲性干扰的抑制作用较差;不易消除由于脉冲干扰所引
起的采样值偏差;不适用于脉冲干扰比较严重的场合;比较浪费RAM

输入量:x 为采集值;N 为连续采样次数
输出量:滤波后的采集值
static int a[N];
==================================================================================================*/
int Moving_Average_Filter(int x,int N)
{
    static int a[10]={0};
    static int i=0,count,sum;

    a[i++]=x;
    if(i==N)
    {
        i=0;
    }

    for(count=0;count<N;count++)
    {
        sum=a[count];
    }
    return (sum/N);
}

/*==================================================================================================
中位值平均滤波法

优点:融合了中位数滤波法和平均值滤波法的优点;对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差
缺点:测量速度较慢,和算术平均值滤波算法一样;比较浪费RAM

输入量:x 为采集值;N 为连续采样次数
输出量:滤波后的采集值
==================================================================================================*/
int Median_Average_Filter(int x,int N)
{
    static int count,i,j,a[10]={0},sum,temp;

    for(count=0;count<N;count++)
    {
        a[N]=x;
    }

    for(j=0;j<N-1;j++)
    {
        for(i=0;i<N-j;i++)
        {
            if(a[i]>a[i+1])
            {
                temp=a[i];
                a[i]=a[i+1];
                a[i+1]=temp;
            }
        }
    }

    for(count=1;count<N-1;count++)
    {
        sum+=a[count];
    }
    return (sum/(N-2));
}

/*==================================================================================================
限幅平均滤波法

优点:融合了限幅滤波法和递推平均滤波法的优点;对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差
缺点:比较浪费RAM

输入量:x 为采集值;A 为最大偏差值
输出量:sample_value为滤波后的采集值
==================================================================================================*/
void Limit_Average_Filter()
{
    
}

/*==================================================================================================
一阶滞后滤波法

优点:对周期性干扰具有良好的抑制作用;适用于波动频率较高的场合
缺点:相位滞后,灵敏度低;滞后程度取决于 a 值大小;不能消除滤波频率高于采样频率的 1/2 的干扰信号

输入量:x 为采集值;A 为最大偏差值
输出量:sample_value为滤波后的采集值
==================================================================================================*/
int FirstOrder_Lag_Filter(int x,int a)
{
    static int sample_value,last_value;

    sample_value=x;
    last_value=sample_value;
    
    return (100-a)*last_value+a*sample_value;
}

/*==================================================================================================
加权递推平均滤波法

优点:适用于有较大纯滞后时间常数的对象 和 采样周期较短的系统
缺点:对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号;不能迅速反应系统当前所受干扰的严重程度,滤波效果较差

输入量:x 为采集值;A 为最大偏差值
输出量:sample_value为滤波后的采集值
==================================================================================================*/
int Weighted_Recursive_Average_Filter(int x,int N)
{
    static int code_coe[12]={1,2,3,4,5,6,7,8,9,10,11,12};
    static int sum_coe=1+2+3+4+5+6+7+8+9+10+11+12;

    static int count=0,a[12]={0},sum=0;

    for(count=0;count<N;count++)
    {
        a[count]=x;
    }
    for(count=0;count<N;count++)
    {
        sum+=a[count]*code_coe[count];
    }
    return (sum/sum_coe);
}

/*==================================================================================================
消抖滤波法

优点:对于变化缓慢的被测参数有较好的滤波效果;可避免在临界值附近控制器的反复开/关跳动 或 显示器上数值抖动
缺点:对于快速变化的参数不宜;如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统

输入量:x 为采集值;A 为最大偏差值
输出量:sample_value为滤波后的采集值
==================================================================================================*/
int Debounce_Filter(int x,int N)
{
    static int count;

    static int sample_value,last_value;

    sample_value=x;
    last_value=sample_value;

    while(last_value!=sample_value)
    {
        count++;
        if(count>=N)
        {
            return sample_value;
        }
        sample_value=x;
    }
    return last_value;
}

/*==================================================================================================
限幅消抖滤波法

优点:继承了 限幅 和 消抖 的特点;改进了 消抖滤波法 中的某些缺陷,避免将干扰直接导入系统
缺点:对于快速变化的参数不宜

输入量:x 为采集值;A 为最大偏差值
输出量:sample_value为滤波后的采集值
==================================================================================================*/
void Limiting_Debounce_Filter()
{
    
}

#ifndef FILTER_H
#define FILTER_H


int Limit_Filter(int x,int A);
int Median_Filter(int x,int N);
int Arithmetic_Average_Filter(int x,int N);
int Moving_Average_Filter(int x,int N);
int Median_Average_Filter(int x,int N);
int FirstOrder_Lag_Filter(int x,int a);
int Weighted_Recursive_Average_Filter(int x,int N);
int Debounce_Filter(int x,int N);
#endif


  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值