#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