《匠人手记》里的10种软件滤波,感觉不错,在此作为自己的一个笔记,也跟大家分享。感谢“程序匠人”的奉献。

一、限幅滤波法

1、

先根据经验判断,确定两次采样允许的最大偏差值,设为A。

每次检测到新采样值时进行判断:

(1)如果本次新采样值与上一次滤波效果之差<=A,则本次采样值有效,令本次滤波结果=新采样值;

(2)如果本次采样值与上次滤波结果之差>A,则本次采样值无效,放弃本次采样值,本次滤波结果=上次滤波结果。

2、例程

#define A 10

uchar Value;    //上次采样有效值

uchar AmplitudeLimiterFilter()

{

uchar NewValue,ReturnValue;

NewValue=GetAD();          //本次采样值

if(|NewValue-Value| > A){

return Value;

}else{

return NewValue;

}

}

二、中位值滤波法

1、连续采样N次值,把采样值按大小排列,取中间值为本次有效值。

2、例程

#define N 9

unchar MiddleValueFilter()

{

unchar i,j,k;

uchar temp;

uchar ArrDataBuffer[N];

for(i=0;i<N;i++)  //一次采集N个数据放入数组中

{

ArrDataBuffer[i]=GetAD();

Delay();

}

for(j=0;j<N-1;j++)//采样值由小到大排列

{

for(k=0;k<N-j-1;k++)

{

if(ArrDataBuffer[k]>ArrDataBuffer[k+1])

{

temp=ArrDataBuffer[k];

ArrDataBuffer[k]=ArrDataBuffer[k+1];

ArrDataBuffer[k+1]=temp;

}

}

}

return(ArrDataBuffer[(N-1)/2]);//取中间值

}

三、算术平均滤波法

1、连续取N个值进行算术平均运算。

N较大时,信号平滑度较高,但灵敏度较低;N较小,信号平滑度低,但灵敏度较高。

2、例程

#define N 12

uchar ArithmeticalAverageValueFilter()

{

uchar i;

uchar Value;

uchar sum;

sum=0;

for(i=0;i<N;i++)

{

sum+=GetAD();

Delay();

}

Value=sum/N;

return(Value);

}

四、递推平均滤波法

1、把连续N个采集值看成一个队列,每次采集到的新数据放入队尾,并扔掉原来队首的数据。把队列中的N个数据进行平均计算,即可获得新的滤波结果。

2、例程

#define N 12

uchar Data[];

uchar Gilde(Data[])

{

ucahr i,Value,sum;

sum=0;

Data[N]=GetAD();

for(i=0;i<N;i++)

{

Data[i]=Data[i+1];//所有数据左移,低位仍掉

sum+=Data[i];

}

Value=sum/N;

return(Value);

}

五、中位值平均滤波法

1、中位值平均滤波法又称脉冲干扰平均滤波法,相当于“中位值滤波法”+“算术平均滤波法”。

连续采集N个数据,去掉一个最大和最小值,然后计算N-2个数的平均值。

2、例程

#define N 12

uchar Middle()

{

ucahr i,j,k,l;

uchar temp;

uchar ArrDataBuffer[N];

uchar sum,Value;

for(i=0;i<N;i++)//一次采集N个数据,存入数组

{

ArrDataBuffer[i]=GetAD();

Delay();

}

for(j=0;j<N-1;j++)//采样值由小到大排列

{

for(k=0;k<N-j-1;k++)

{

if(ArrDataBuffer[k]>ArrDataBuffer[k+1])

{

temp=ArrDataBuffer[k];

ArrDataBuffer[k]=ArrDataBuffer[k+1];

ArrDataBuffer[k+1]=temp;

}

}

}

for(l=0;l<N-1;l++)

{

sum=ArrDataBuffer[l];

}

Value=Sum/(N-2);

return(Value);

}

六、递推中位值平均滤波法

1、相当于“中位值滤波法”+“递推平均滤波法”。这种方法把连续N个值看成一个队列,每次采集到一个新数据放入队尾,并扔掉原来队首的值。 把队列中的N个数据先去掉一个最大值和最小值,然后计算N-2个数据的平均值。

2、例程

char Filter()

{

char max.min;

int sum;

char i;

QUEUE[0]=NewData;

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+=QUEUE[i];

QUEUE[i]=QUEUE[i-1];

}

i=n-2;

sum=sum-max-min+i/2;//加入(n-2)/2目的为了四舍五入

sum=sum/i;

return(sum);

}

七、限幅平均滤波法

1、相当于“限幅滤波法”+“递推平均滤波法”。每次采样先进行限幅处理,再进行队列平均滤波处理。

2、例程

#define A 10

#define N 12

uchar Data[N];

uchar Limit()

{

ucahr i,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);

}

八、一阶滞后滤波法

1、本次结果滤波结果=a*本次采样值+(1-a)*上次结果。

a代表滤波系数,a=0--1。

2、例程

#define a 128

uchar Value;

ucahr OneFactorialFiler()

{

uchar NewValue;

uchar ReturnValue;

NewValue=GetAD();

ReturnValue=(255-a)*NewValue+a*Value;

ReturnValue/=255;

return(ReturnValue);

}

九、加权递推平均滤波法

1、加权递推平均滤波法是对递推平均滤波法的改进,即不同时刻的数据加以不同的权。通常是越接近现时刻的数据,权取得越大。给予新采样值的权系数越大,则灵敏度越高,但信号的平滑度越低。

2、例程

#define N 10

#define CoeSum 55

const Coefficient[N]={1,2,3,4,5,6,7,8,9,10};

uchar Data[N];

uchar AAGAFilter()

{

uchar i,Value,sum;

sum=0;

Data[N]=GetAD();

for(i=0;i<N;i++)

{

Data[i]=Data[i+1];

sum+=Data[i]*Coefficient[i];

}

Value=sum/CoeSum;

return(Value);

}

十、消抖滤波法

1、将每次采样值与当前有效值比较,如果采样值=当前有效值,则计数器清零,否则计数器加1。然后,判断计数器是否>=上限N(溢出)。如果溢出,将本次值替换当前有效值,并清计数器。

2、例程

#define N 20

uchar count;

uchar Value;

uchar Avoid()

{

uchar NewValue;

if(NewValue==Value) count=0;

else

{

count++;

if(count>N)

{

count=0;

Value=NewValue;

}

}

return(Value);

}

《匠人手记》里的10种软件滤波相关推荐

  1. 单片机 10种软件滤波方法的示例程序

    单片机学习笔记_10种软件滤波方法的示例程序 假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad(); 1.限副滤波 /*  A值可根据实际情况调整     v ...

  2. AD数据采集的“数字滤波”:10个“软件滤波程序”

    在AD采集中经常要用到数字滤波,而不同情况下又有不同的滤波需求,下面是10种经典的软件滤波方法的程序和优缺点分析: 1.限幅滤波法(又称程序判断滤波法) 2.中位值滤波法 3.算术平均滤波法 4.递推 ...

  3. 几种软件滤波算法的原理和比较(带源码)

    第1种方法:限幅滤波法(又称程序判断滤波法) A方法: 根据经验判断,确定两次采样允许的最大偏差值(设为A),每次检测到新值时判断: 如果本次值与上次值之差<=A,则本次值有效,如果本次值与上次 ...

  4. c语言常用滤波算法,10种常用滤波算法C实现.c

    /* 10种简单的数字滤波C语言源程序算法 假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad(); 1.限副滤波 */ /*  A值可根据实际情况调整 val ...

  5. 自动驾驶算法-滤波器系列(六)——10+种经典滤波算法

    经典滤波器介绍 1.限幅滤波法(又称程序判断滤波法) 2.中位值滤波法 3.算术平均滤波法 4.递推平均滤波法(又称滑动平均滤波法) 5.中位值平均滤波法(又称防脉冲干扰平均滤波法) 6.限幅平均滤波 ...

  6. 11种经典软件滤波的原理和实现(牛记)

    1.限幅滤波法(又称程序判断滤波法)      A.方法:          根据经验判断,确定两次采样允许的最大偏差值(设为A)          每次检测到新值时判断:          如果本次 ...

  7. 匠人手记:单片机工作者的实践与思考

    匠人手记:一个单片机工作者的实践与思考匠人手记[完整高清版] 内容简介 本书是作者在从事单片机开发与应用的过程中,将实际经验教训和心得感悟加以总结.整理而成的工作手记.每篇手记论述一个专题,独立成篇, ...

  8. 软件滤波方法浅谈 (1)

    21icbb 上的程序匠人总结了10种软件滤波方法,简单实用,看得出是匠人自己对实际应用的归纳升华.不过如果能从理论角度分析一下, 更易于理解,因为 10 种方法大多数可以归结为一种做法:有限冲击响应 ...

  9. 十一种通用滤波算法(转)

    http://www.cnblogs.com/tdyizhen1314/archive/2010/08/02/1790683.html Easy Code (转)十一种通用滤波算法 一.十一种通用滤波 ...

  10. 滑动平均滤波c语言_11种经典软件滤波算法及其波形效果图(附C语言程序)

    (后页附带C语言程序) 注意注意注意:(图像中红线都是经过滤波的)1.限幅滤波法(又称程序判断滤波法) A.方法: 根据经验判断,确定两次采样允许的最大偏差值(设为 A) 每次检测到新值时判断: 如果 ...

最新文章

  1. 深入理解Java Class反射机制
  2. 手机版python3.6.6的requests库下载_Python爬虫之Python3.6 Requests库的基本使用方法
  3. ABP VNext从单体切换到微服务
  4. plupload与springmvc分段上传视频
  5. Makefile.am详解
  6. linux下oracle12C新建数据库,linux环境下手工创建oracle11g数据库(未完)
  7. linux ulipad,Python for Ulipad(总结ulipad使用)
  8. word中-文字尾部空格自动添加下划线的步骤
  9. 利用List集合实现简单的斗地主
  10. LaTeX 换行、换页、空白空间
  11. 用python监控互联网网速
  12. 服务器带外管理默认账号
  13. 光明区支持先进制造业高质量发展若干措施(征求意见稿)
  14. 总账科目往来批量导入程序
  15. SHUOJ 2333
  16. sql语句中as的意思是什么
  17. 边缘检测(opencv_python下)
  18. v免签对接易支付插件(已测试)
  19. Linux学习日志_虚拟化管理工具
  20. pycharm更换主题,pycharm更换皮肤,pycharm更换不同颜色

热门文章

  1. stc8a循迹小车程序编写实验:完成循迹功能,包括直角转弯,以及调头
  2. DWM1000 帧过滤代码实现
  3. 点云配准ICPNDT
  4. FFMPEG推流到RTMP服务器命令
  5. yyuc php,php版微信公众平台实现预约提交后发送email的方法
  6. java后台截图_Java+Selenium实现后台截图网页,可运行在树莓派上
  7. Win11软件兼容性怎么样?
  8. 电子商务B2C:尾巴上的比特生存法则
  9. 2023年辽宁大学原子与分子物理考研上岸前辈备考经验指导
  10. 电气技术与计算机技术结合,探析计算机与电气自动化技术有机结合.doc