完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
《匠人手记》里的10种软件滤波,感觉不错,跟大家分享。感谢“程序匠人”的奉献。
一、限幅滤波法 1、 先根据经验判断,确定两次采样允许的最大偏差值,设为A。 每次检测到新采样值时进行判断: (1)如果本次新采样值与上一次滤波效果之差<=A,则本次采样值有效,令本次滤波结果=新采样值; (2)如果本次采样值与上次滤波结果之差>A,则本次采样值无效,放弃本次采样值,本次滤波结果=上次滤波结果。 2、例程 #define A 10 uchar Value; //上次采样有效值 uchar AmplitudeLimiterFilter() { uchar NewValue,ReturnValue; NewValue=GetAD(); //本次采样值 if(((NewValue-Value)>A)||((Value-NewValue)>A)) { ReturnValue=Value; } else { ReturnValue=NewValue; } return(ReturnValue); } 二、中位值滤波法 1、连续采样N次值,把采样值按大小排列,取中间值为本次有效值。 2、例程 #define N 9 unchar MiddleValueFilter() { unchar i,j,k; uchar temp; uchar ArrDataBuffer[N]; for(i=0; i ArrDataBuffer[i]=GetAD(); Delay(); } for(j=0; j for(k=0; 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 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 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 ArrDataBuffer[i]=GetAD(); Delay(); } for(j=0; j for(k=0; k if(ArrDataBuffer[k]>ArrDataBuffer[k+1]) { temp=ArrDataBuffer[k]; ArrDataBuffer[k]=ArrDataBuffer[k+1]; ArrDataBuffer[k+1]=temp; } } } for(l=0; 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=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 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 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); } |
|
相关推荐
|
|
|
|
|
|
|
|
好东西啊,谢谢分享
|
|
|
|
|
|
《TMS320F28335DSP原理与开发编程》
|
|
|
|
|
|
学习一下,谢谢分享
|
|
|
|
|
|
基于 DSP5509 进行数字图像处理中 Sobel 算子边缘检测的硬件连接电路图
2328 浏览 0 评论
680 浏览 0 评论
普中科技F28335开发板中,如何使用aic23播放由代码生成的正弦波
2765 浏览 0 评论
3525 浏览 1 评论
1192 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 01:08 , Processed in 1.138916 second(s), Total 100, Slave 81 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号