历史上的今天
今天是:2025年01月16日(星期四)
2019年01月16日 | 单片机 10种软件滤波方法的示例程序
2019-01-16 来源:eefocus
单片机学习笔记_10种软件滤波方法的示例程序
假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad();
1、限副滤波
/* A值可根据实际情况调整
value为有效值,new_value为当前采样值
滤波程序返回有效的实际值 */
#define A 10
char value;
char filter()
{
char new_value;
new_value = get_ad();
if ( ( new_value - value > A ) || ( value - new_value > A )
return value;
return new_value;
}
2、中位值滤波法
/* N值可根据实际情况调整
排序采用冒泡法*/
#define N 11
char filter()
{
char value_buf[N];
char count,i,j,temp;
for ( count=0; count { value_buf[count] = get_ad(); delay(); } for (j=0; j { for (i=0; i < N-1 ; 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; } } } return value_buf[(N-1)/2]; } 3、算术平均滤波法 /* */ #define N 12 char filter() { int sum = 0; for ( count=0; count { sum + = get_ad(); delay(); } return (char)(sum/N); } 4、递推平均滤波法(又称滑动平均滤波法) /* */ #define N 12 char value_buf[N]; char i=0; char filter() { char count; int sum=0; value_buf[i++] = get_ad(); if ( i == N ) i = 0; for ( count=0; count sum += value_buf[count]; return (char)(sum/N); } 5、中位值平均滤波法(又称防脉冲干扰平均滤波法) /* */ #define N 12 char filter() { char count,i,j; char value_buf[N]; int sum=0; for (count=0; count < N ; count++) { value_buf[count] = get_ad(); delay(); } for (j=0; j < N ; j++) { for (i=0; i < N-1 ; i++) { if ( value_buf>value_buf[i+1] ) { temp = value_buf; value_buf = value_buf[i+1]; value_buf[i+1] = temp; } } } for(count=1; count sum += value[count]; return (char)(sum/(N-2)); } 6、限幅平均滤波法 /* */ 略 参考子程序1、3 7、一阶滞后滤波法 /* 为加快程序处理速度假定基数为100,a=0~100 */ #define a 50 char value; char filter() { char new_value; new_value = get_ad(); return (100-a)*value + a*new_value; } 8、加权递推平均滤波法 /* coe数组为加权系数表,存在程序存储区。*/ #define N 12 char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12}; char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12; char filter() { char count; char value_buf[N]; int sum=0; for (count=0,count < N ; count++) { value_buf[count] = get_ad(); delay(); } for (count=0,count < N ; count++) sum += value_buf[count]*coe[count]; return (char)(sum/sum_coe); } 9、消抖滤波法 #define N 12 char filter() { char count=0; char new_value; new_value = get_ad(); while (value != new_value); { count++; if (count>=N) return new_value; delay(); new_value = get_ad(); } return value; } 10、限幅消抖滤波法 /* */ 略 参考子程序1、9 11、IIR滤波例子 int BandpassFilter4(int InputAD4) { int ReturnValue; int ii; RESLO=0; RESHI=0; MACS=*PdelIn; OP2=1068; //FilterCoeff4[4]; MACS=*(PdelIn+1); OP2=8; //FilterCoeff4[3]; MACS=*(PdelIn+2); OP2=-2001;//FilterCoeff4[2]; MACS=*(PdelIn+3); OP2=8; //FilterCoeff4[1]; MACS=InputAD4; OP2=1068; //FilterCoeff4[0]; MACS=*PdelOu; OP2=-7190;//FilterCoeff4[8]; MACS=*(PdelOu+1); OP2=-1973; //FilterCoeff4[7]; MACS=*(PdelOu+2); OP2=-19578;//FilterCoeff4[6]; MACS=*(PdelOu+3); OP2=-3047; //FilterCoeff4[5]; *p=RESLO; *(p+1)=RESHI; mytestmul<<=2; ReturnValue=*(p+1); for (ii=0; ii<3; ii++) { DelayInput[ii]=DelayInput[ii+1]; DelayOutput[ii]=DelayOutput[ii+1]; } DelayInput[3]=InputAD4; DelayOutput[3]=ReturnValue; // if (ReturnValue<0) // { // ReturnValue=-ReturnValue; // } return ReturnValue; }
史海拾趣
|
目前汽车车身电子系统大量采用电子技术,其目标是提高驾驶 舒适程度并为驾驶员提供车况信息。车身电子系统主要有电子控制安 全气囊、防撞警告系统、防盗系统、电子仪表、空调系统、电动车窗、 中控锁、座椅位置调节、车门控制装置等等。这些应用系 ...… 查看全部问答> |
|
一学期的课程 主要分为三个部分,半导体器件的工作原理 器件特性(MOSFET,BJT,VMOS,IGBT...GaAs) 半导体器件模型化 [ 本帖最后由 linda_xia 于 2010-4-18 08:31 编辑 ]… 查看全部问答> |
|
MC39I拨号GPRS成功分配IP后,无法进行UDP,TCP通信 我用的单片机控制MC39I,拨号CMNET成功分配IP地址和DNS1/DNS2后,发送UDP以及TCP数据包,为什么别人总收不到?当然上位机发的我也收不到.恳请那位大侠予以指点是不是在IPCP协商玩之后,发送UDP/TCP数据包之前还需要作些什么?我用Windows自带的PPP拨号发 ...… 查看全部问答> |
|
最近,用89C2051驱动CCD,晶振用12M,主要是控制P10,P11,P12时序,需要给P10,P11,P12连续赋值,一个周期给P1口赋值8次,发现怪现象,用示波器观察好像P1口经不住这样连续操作,中间出现停顿现象,大概有几十ms,不会是2051这么弱吧,经受不住吧?请高 ...… 查看全部问答> |
|
MSP430F2011发射38khz占空比为50%的方波红外线发射信号程序 用MSP430F2011发射38khz占空比为50%的方波红外线发射信号程序,谢谢邮箱com021@163.com,高手大侠们多多指教… 查看全部问答> |




