搜索
bottom↓
回复: 49

10个常用的滤波程序

  [复制链接]

出0入0汤圆

发表于 2016-5-25 23:15:43 | 显示全部楼层 |阅读模式
1、限幅滤波法***************************************************
*函数名称:AmplitudeLimiterFilter()-限幅滤波法
*优点:能有效克服因偶然因素引起的脉冲干扰
*缺点:无法抑制那种周期性的干扰,且平滑度差
*说明:
1、调用函数
GetAD(),该函数用来取得当前值
2、变量说明
Value:最近一次有效采样的值,该变量为全局变量
NewValue:当前采样的值
ReturnValue:返回值
3、常量说明
A:两次采样的最大误差值,该值需要使用者根据实际情况设置
*入口:Value,上一次有效的采样值,在主程序里赋值
*出口:ReturnValue,返回值,本次滤波结果
****************************************************/
#define A 10
unsigned char Value
unsigned char AmplitudeLimiterFilter()
{
unsigned char NewValue;
unsigned char ReturnValue;
NewValue=GatAD();
if(((NewValue-Value)>A))||((Value-NewValue)>A)))
ReturnValue=Value;
else ReturnValue=NewValue;
return(ReturnValue);
}
2、中位值滤波法

/****************************************************
*函数名称:MiddlevalueFilter()-中位值滤波法
*优点:能有效克服因偶然因素引起的波动干扰;对温度、液
位等变化缓慢的被测参数有良好的滤波效果
*缺点:对流量,速度等快速变化的参数不宜
*说明:
1、调用函数
GetAD(),该函数用来取得当前值
Delay(),基本延时函数
2、变量说明
ArrDataBuffer[N]:用来存放一次性采集的N组数据
Temp:完成冒泡法试用的临时寄存器
i,j,k:循环试用的参数值
3、常量说明
N:数组长度
*入口:
*出口:value_buf[(N-1)/2],返回值,本次滤波结果
*****************************************************/

#define N 11

unsigned char MiddlevalueFilter()

{
unsigned char value_buf[N];
unsigned char i,j,k,temp;
for(i=0;i<N;i++)
{
value_buf[i] = get_ad();
delay();
}
for (j=0;j<N-1;j++)
{
for (k=0;k<N-j;k++)
{
if(value_buf[k]>value_buf[k+1])
{
temp = value_buf[k];
value_buf[k] = value_buf[k+1];
value_buf[k+1] = temp;
}
}
}
return value_buf[(N-1)/2];
}


3、算术平均滤波法

/*********************************************************
说明:连续取N个采样值进行算术平均运算
优点:试用于对一般具有随机干扰的信号进行滤波。这种信号的特点是
有一个平均值,信号在某一数值范围附近上下波动。
缺点:对于测量速度较慢或要求数据计算较快的实时控制不适用。
**********************************************************/

#define N 12

char filter()
{
unsigned int sum = 0;
unsigned char i;

for (i=0;i<N;i++)
{
sum + = get_ad();
delay();
}
return(char)(sum/N);
}

4、递推平均滤波法(又称滑动平均滤波法)

/***************************************************
说明:把连续N个采样值看成一个队列,队列长度固定为N。
每次采样到一个新数据放入队尾,并扔掉队首的一
次数据。把队列中的N各数据进行平均运算,既获得
新的滤波结果。
优点:对周期性干扰有良好的抑制作用,平滑度高;试用于高频振荡的系统
缺点:灵敏度低;对偶然出现的脉冲性干扰的抑制作用较差,不适于脉冲干
扰较严重的场合
****************************************************/

#define N 12

unsigned char value_buf[N];

unsigned char filter()
{
unsigned char i;
unsigned char value;
int sum=0;

value_buf[i++] = get_ad(); //采集到的数据放入最高位
for(i=0;i<N;i++)
{
value_buf[i]=value_buf[i+1]; //所有数据左移,低位扔掉
sum += value_buf[i];
}
value = sum/N;
return(value);
}

5、中位值平均滤波法(又称防脉冲干扰平均滤波法)

/********************************************
说明:采一组队列去掉最大值和最小值
优点:融合了两种滤波的优点。对于偶然出现的脉冲性干扰,可消
除有其引起的采样值偏差。对周期干扰有良好的抑制作用,
平滑度高,适于高频振荡的系统。
缺点:测量速度慢
*********************************************/

#define N 12

uchar filter()

{
unsigned char i,j,k,l;
unsigned char temp,sum=0,value;
unsigned char value_buf[N],;

for(i=0;i<N;i++)
{
value_buf[i] = get_ad();
delay();
}
//采样值从小到大排列(冒泡法)
for(j=0;j<N-1;j++)
{
for(i=0;i<N-j;i++)
{
if(value_buf[i]>value_buf[i+1])
{
temp = value_buf[i];
value_buf[i] = value_buf[i+1];
value_buf[i+1] = temp;
}
}
}

for(i=1;i<N-1;i++)
sum += value_buf[i];

value = sum/(N-2);
return(value);
}

6、递推中位值滤波法
/************************************************
优点:对于偶然出现的脉冲性干扰,可消除由其引起的采样值偏差。
对周期性干扰有良好的抑制作用,平滑度高;试用于高频振荡
的系统
缺点:测量速度慢
*************************************************/

char filter(char new_data,char queue[],char n)
{
char max,min;
char sum;
char i;

queue[0]=new_data;
max=queue[0];
min=queue[0];
sum=queue[0];

for(i=n-1;i>0;i--)
{
if(queue[i]>max)
max=queue[i];
else if (queue[i]<min)
min=queue[i];
sum=sum+queue[i];
queue[i]=queue[i-1];
}

i=n-2;
sum=sum-max-min+i/2; //说明:+i/2的目的是为了四舍五入
sum=sum/i;

return(sum);
}

7、限幅平均滤波法

/************************************************
优点:对于偶然出现的脉冲性干扰,可消除有其引起的采样值偏差。
*************************************************/
#define A 10
#define N 12

unsigned char data[];
unsigned char filter(data[])
{
unsigned char i;
unsigned char value,sum;

data[N]=GetAD();
if(((data[N]-data[N-1])>A||((data[N-1]-data[N])>A))
data[N]=data[N-1];
//else data[N]=NewValue;
for(i=0;i<N;i++)
{
data[i]=data[i+1];
sum+=data[i];
}
value=sum/N;
return(value);
}


8、一阶滞后滤波法

/****************************************************
*函数名称:filter()-一阶滞后滤波法
*说明:
1、调用函数
GetAD(),该函数用来取得当前值
Delay(),基本延时函数
2、变量说明
Or_data[N]:采集的数据
Dr0_flag、Dr1_flag:前一次比较与当前比较的方向位
coeff:滤波系数
F_count:滤波计数器
3、常量说明
N:数组长度
Thre_value:比较门槛值
*入口:
*出口:
*****************************************************/

#define Thre_value 10
#define N 50

float Or_data[N];
unsigned char Dr0_flag=0,Dr1_flag=0;

void abs(float first,float second)
{
float abs;
if(first>second)
{
abs=first-second;
Dr1_flag=0;
}
else
{
abs=second-first;
Dr1_flag=1;
}
return(abs);
}

void filter(void)
{
uchar i=0,F_count=0,coeff=0;
float Abs=0.00;

//确定一阶滤波系数
for(i=1;i<N;i++)
{
Abs=abs(Or_data[i-1],Or_data[i]);
if(!(Dr1_flag^Dr0_flag)) //前后数据变化方向一致
{
F_count++;
if(Abs>=Thre_value)
{
F_count++;
F_count++;
}
if(F_count>=12)
F_count=12;
coeff=20*F_count;
}
else //去抖动
coeff=5;
//一阶滤波算法
if(Dr1_flag==0) //当前值小于前一个值
Or_data[i]=Or_data[i-1]-coeff*(Or_data[i-1]-Or_data[i])/256;
else
Or_data[i]=Or_data[i-1]+coeff*(Or_data[i]-Or_data[i-1])/256;

F_count=0; //滤波计数器清零
Dr0_flag=Dr1_flag;
}
}

9、加权递推平均滤波法

/************************************************************
coe:数组为加权系数表,存在程序存储区。
sum_coe:加权系数和
************************************************************/

#define N 12

const char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12};
const char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;

unsigned char filter()
{
unsigned char i;
unsigned char value_buf[N];
int sum=0;

for (i=0;i<N;i++)
{
value_buf[i] = get_ad();
delay();
}

for (i=0,i<N;i++)
{
value_buf[i]=value_buf[i+1];
sum += value_buf[i]*coe[i];
}

sum/=sum_coe;
value=sum/N;
return(value);
}

10、消抖滤波法

/************************************************

*************************************************/
#define N 12

unsigned char filter()
{
unsigned char i=0;
unsigned char new_value;
new_value = get_ad();
if(value !=new_value);
{
i++;
if (i>N)
{
i=0;
value=new_value;
}
}
else i=0;
return(value);

阿莫论坛20周年了!感谢大家的支持与爱护!!

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入0汤圆

发表于 2016-5-26 00:28:37 | 显示全部楼层
其实你这些全都属于FIR LPF,何苦呢,正儿八经的直接用个Biquad做IIR LPF,计算量小多了

出0入0汤圆

发表于 2016-5-26 01:02:45 | 显示全部楼层
好象在那见过!   

出0入0汤圆

 楼主| 发表于 2016-5-27 17:15:42 | 显示全部楼层
这些是很常用的软件滤波器算法的,不是自适应滤波算法

出0入42汤圆

发表于 2016-5-27 17:49:19 | 显示全部楼层
不错 好像优化等级提高后   这些就有讲究了  

出0入0汤圆

发表于 2016-5-27 20:28:52 | 显示全部楼层
请问楼主有没有示例?任意一个函数做一个示例看看效果?谢谢

出0入0汤圆

发表于 2016-5-27 21:00:01 来自手机 | 显示全部楼层
谢谢楼主学习一下

出0入0汤圆

发表于 2016-5-27 21:02:24 | 显示全部楼层
x'x谢谢分享

出0入29汤圆

发表于 2016-5-27 21:39:24 | 显示全部楼层
正在做小家电的AD转换,比较实用

出0入0汤圆

发表于 2016-5-27 21:42:57 | 显示全部楼层
好东西,mark备用

出0入0汤圆

发表于 2016-5-27 21:52:09 | 显示全部楼层
好东西!

出0入45汤圆

发表于 2016-5-28 20:08:03 | 显示全部楼层
好东西,mark下!

出0入0汤圆

发表于 2016-5-28 20:43:17 | 显示全部楼层
有时间可以做一个gif看看

出0入0汤圆

发表于 2016-5-29 13:11:02 来自手机 | 显示全部楼层
谢谢分享(๑•ั็ω•็ั๑)

出0入4汤圆

发表于 2016-5-30 11:19:54 | 显示全部楼层
不错!比较实用!

出0入0汤圆

发表于 2016-5-30 11:23:55 | 显示全部楼层
好东西!  最近在找好的合适的滤波算法

出0入0汤圆

发表于 2016-5-31 13:17:34 | 显示全部楼层
好东西,谢谢楼主的分享

出0入0汤圆

发表于 2016-6-4 16:53:06 | 显示全部楼层
Scarlette 发表于 2016-5-26 00:28
其实你这些全都属于FIR LPF,何苦呢,正儿八经的直接用个Biquad做IIR LPF,计算量小多了 ...

造福下坛友呗

出0入0汤圆

发表于 2016-6-4 19:26:31 来自手机 | 显示全部楼层

出0入0汤圆

发表于 2016-6-4 22:16:35 | 显示全部楼层

你直接网上搜IIR就行了,各种实现大把大把的,关键步骤只是确定Biquad的系数而已

出0入0汤圆

发表于 2016-6-5 09:58:31 | 显示全部楼层
学习了,自己用一般也就是搞个去头去尾均值滤波

出0入0汤圆

发表于 2016-6-5 10:01:58 | 显示全部楼层
效果不错!

出0入0汤圆

发表于 2016-6-5 21:06:24 | 显示全部楼层
属于比较简单的算法。

出0入0汤圆

发表于 2016-6-5 21:08:41 | 显示全部楼层
以前有人发过,简单好用。

出85入85汤圆

发表于 2016-6-6 08:17:31 来自手机 | 显示全部楼层
好的文章需要收藏

出0入0汤圆

发表于 2016-6-8 15:03:22 | 显示全部楼层
看着程序不算太大,留着等有时间了研究研究都什么原理

出0入0汤圆

发表于 2016-6-8 15:07:59 | 显示全部楼层
中位值滤波还要冒泡排序我也是醉了

出0入54汤圆

发表于 2016-6-8 23:21:41 | 显示全部楼层
正是需要的东西

出0入0汤圆

发表于 2016-6-8 23:34:48 来自手机 | 显示全部楼层
先收藏,有空看看

出0入0汤圆

发表于 2016-6-9 19:56:56 来自手机 | 显示全部楼层
谢谢分享,我现在用的是排序取中值,然后再平均

出0入0汤圆

发表于 2016-6-11 21:31:27 | 显示全部楼层
谢谢分享   匠人手记

出0入0汤圆

发表于 2016-6-11 21:49:35 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2016-6-11 22:32:49 来自手机 | 显示全部楼层
不错,滤波程序,手机马克,电脑细看

出0入0汤圆

发表于 2016-6-12 23:02:45 | 显示全部楼层
好东西,收藏,

出0入0汤圆

发表于 2016-6-12 23:37:06 | 显示全部楼层
楼主abs这个函数定义有问题,无返回值
void abs(float first,float second)

出0入0汤圆

发表于 2016-6-13 14:22:52 | 显示全部楼层
抄来的!

出0入0汤圆

发表于 2016-6-14 11:32:42 | 显示全部楼层
滤波算法推荐大家去看<匠人手记>,里面有滤波算法的讲解,也是比较生动的

出0入0汤圆

发表于 2016-6-14 17:32:17 | 显示全部楼层
感谢无私分享。

出40入42汤圆

发表于 2016-6-17 11:53:55 | 显示全部楼层
旧帖子有这些东西:http://www.amobbs.com/thread-5421239-1-1.html

出0入0汤圆

发表于 2017-3-14 11:46:41 | 显示全部楼层
现在做温度,正好可以学习

出0入0汤圆

发表于 2017-3-14 20:13:26 来自手机 | 显示全部楼层
我们当时采集脉冲是存放一数组里求均值的

出0入4汤圆

发表于 2017-3-14 21:05:52 | 显示全部楼层
这个可以有  电工必备

出0入26汤圆

发表于 2017-3-15 09:09:48 | 显示全部楼层
赞一下,,

出0入0汤圆

发表于 2017-3-16 14:27:12 | 显示全部楼层
先Mark下,抽时间学习。

出0入4汤圆

发表于 2017-3-16 15:09:56 | 显示全部楼层
学习一下

出0入0汤圆

发表于 2017-3-16 16:06:16 | 显示全部楼层
谢谢分享, 收藏备用

出0入0汤圆

发表于 2017-3-16 16:25:50 | 显示全部楼层
好东西,谢谢了啊。

出0入0汤圆

发表于 2017-3-25 13:39:49 | 显示全部楼层
不错。等下看看。

出0入17汤圆

发表于 2017-3-25 14:28:48 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2017-6-16 11:00:43 | 显示全部楼层
谢谢分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-17 03:06

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表